wxbanker-0.9.1/0000755000175000017500000000000012243602115013300 5ustar mrooneymrooneywxbanker-0.9.1/.bzrignore0000644000175000017500000000012012243601243015274 0ustar mrooneymrooneypyunit.xml wxbanker.wpr bank.db tests/test.db wxBanker.cfg wpr wxbanker-0.8.wpr wxbanker-0.9.1/.gitignore0000644000175000017500000000001112243601243015261 0ustar mrooneymrooney*.pyc *~ wxbanker-0.9.1/.travis.yml0000644000175000017500000000047112243601243015414 0ustar mrooneymrooneylanguage: python python: - 2.6 - 2.7 before_install: sudo apt-get update && sudo apt-get install python-wxgtk2.8 language-pack-ru-base language-pack-fr-base install: ls script: deactivate && sudo pip install -r pip_requirements.txt && xvfb-run python -c "from wxbanker.tests import alltests; alltests.main()" wxbanker-0.9.1/bin/0000755000175000017500000000000012243601243014051 5ustar mrooneymrooneywxbanker-0.9.1/bin/wxbanker0000644000175000017500000000007412243601243015616 0ustar mrooneymrooney#!/usr/bin/env python from wxbanker.main import main main() wxbanker-0.9.1/bin/wxbanker.desktop0000644000175000017500000000055212243601243017267 0ustar mrooneymrooney[Desktop Entry] Name=wxBanker Finance Manager Name[fr]=Gestionnaire de finances wxBanker GenericName=Finance Manager GenericName[fr]=Gestionnaire de Finances Comment=A lightweight personal finance manager Comment[fr]=Un gestionnaire de finances personnelles léger Exec=wxbanker Icon=wxbanker Terminal=false Type=Application Categories=GNOME;Application;Office; wxbanker-0.9.1/CHANGELOG.txt0000644000175000017500000000253712243601243015340 0ustar mrooneymrooneywxbanker 0.7 [pending] * wxbanker 0.6.1 * fix db upgrades from wxbanker 0.4 to 0.6 (LP: #496341) wxbanker 0.6 * recurring transactions * summary graph date span is customizable * uses XDG directories by default if available * transfer options are now selected "in-line" * can enter new transaction in any locale format * up/down arrows in datectrl change date (LP #356750) * changing search options refreshes search (LP #362581) * new shipped currencies: UAH, SEK, MXN wxbanker 0.5 * refactor of infrastructure which greatly speeds up all operations, especially loading accounts and transactions * new, slicker transaction list control allowing for sorting and fixing many bugs in the previous grid * new CSV import tool (Tools->CSV Import) to import transactions from .csv files such as from online banks * ability to view a graph for a specific account in the summary tab * right-click option added for moving selected transaction(s) to another account * right-click menu can now operate on multiple transactions, allowing for batch removing and calculating * option to disable automatic saving (File->Auto-Save) * more user feedback options in Help such as translate and request a feature * new account button blinks when there are no accounts * improved locale support, and more translations * much improved testing framework wxbanker-0.9.1/COPYING.txt0000644000175000017500000010451312243601243015156 0ustar mrooneymrooney 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 . wxbanker-0.9.1/hooks/0000755000175000017500000000000012243601243014424 5ustar mrooneymrooneywxbanker-0.9.1/hooks/source_wxbanker.py0000644000175000017500000000031612243601243020177 0ustar mrooneymrooney#!/bin/python import apport def add_info(report): if not apport.packaging.is_distro_package(report['Package'].split()[0]): report['ThirdParty'] = 'True' report['CrashDB'] = 'wxbanker' wxbanker-0.9.1/hooks/wxbanker-crashdb.conf0000644000175000017500000000016012243601243020515 0ustar mrooneymrooneywxbanker = { 'impl' : 'launchpad', 'project' : 'wxbanker', 'bug_pattern_base' : None, } wxbanker-0.9.1/images/0000755000175000017500000000000012243601243014546 5ustar mrooneymrooneywxbanker-0.9.1/images/16/0000755000175000017500000000000012243601243014774 5ustar mrooneymrooneywxbanker-0.9.1/images/16/wxbanker.png0000644000175000017500000000140412243601243017322 0ustar mrooneymrooneyPNG  IHDRaIDAT8uoUcf3sg>?f(×ܛsR,MC}BQK;}É !VfP[4aڅc@vH yO'YY s&tZ$vE n3KLDW(fEcYpl#O)g`(>DSԂFZ"Y]Z;Y\d!RJ[*TPtю7X@rWe[rcH ں1GdoQn/\+i|@UԵ`e)B DZO\';cdW)f8V&+NvfvHFaa״0"Ӹ._[:)]ғ꣘ &u(̏#Eh݋(TRoޑm}H!9I.zuoIxS7Q\B~g㚕e>W1Q nI:PZv"o4ube,߼xϑO J86ɥhjm xZȖҥy؅%20umK^Kus+5YJXFB!ucn 20X$)T%݇=@&6Hjf\r#ut?V6`fxdqZ#l _]6jIF}}$:5 4g4tBq;ԵP~`.}pHZ-\O&x{woOj~[V1iCy ʜ%*,Wĺ{ye+Y[!9bIENDB`wxbanker-0.9.1/images/256/0000755000175000017500000000000012243601243015062 5ustar mrooneymrooneywxbanker-0.9.1/images/256/wxbanker.png0000644000175000017500000012362412243601243017421 0ustar mrooneymrooneyPNG  IHDR\rf IDATxw$}y/kfz$f(zQf) Q;E(^F{.nb]9DKC `z1=|},={@}#Uf~Vh颋.ޟ{]tC}.t]袋1Ect .@]a !x%9qR'L+!ZUkVW)P5~M" a7og[ &N51pzl?Z|ؕՃXˋ%_Ԗl'8MJsϱt5%}ȍ}tI.g-@SwxZ㞘Bn7Ah}ZϝjMɡK.<8& tmnϓٹBB$؂k-^LY$ Bo ߀=Y|C5f , `,Awpw M kҧК͏K(^Jb8SB/O$~*n }|!.f1] fnT­TjUF߲8?%X~(X+ /8)T ThN94.wFBB"'II 0D`0 jZf{gO7H$ ٝhٿ-*ej QǷ,q4`9h4 k^Q9 3!PKPoK3K oEʓጏb&s$7#=F0 0  9< B"{%DʭlDc;l9O|@HIjx,#R)6 >Z]ƩNSjΓϬt `%GW'^L$s+  aWQFt!n^@!2(ǚI}:u >҃{~B_P[Bm Yw$3c$zth>NuyJ>xҧԮ?z#+_@SBP͖ 0Z$AG<6R`{Q-q+ej^'ϐ;(I "ѿe*KPC@Ar`[t. @7`2OmrsypZkujϧAV]xȸ7 8T aiv30D\ƗJZI ""CkΞyܱ^]FhtY=;P]FyEPh݌h{?NߞۂU~~)wp,q{#yi8uû;t !WZZLۂ߹$+-Z{؊lB8h/B ߻$z7í/q.~&;_ycW^Jr_'!A:CnAt`8y~s+'ڍzK ϡI4L}o ΊY?יRz/ZŦt{(BsњR6wNƻx{,]>$/e!o/I`9fdw $R%5@V Lg8+o% tKT-4)$zag<Dah8}P_qk#?U]rD'}#M`% 4? ftݠT0!NO_*KBʓ@kd,zhko~иK4oj~ `? :x JYVFC3Rh÷m[/cFDǨW_ ow_tۡ͸+9|# <J5xa޿"0f$\u lMοNm.vcDZO`>eh%hX.(.NuPhl,N1Gݏ=p:oܯ(w& Hb0Xt.CyR:тowe=-70@jgf/Иq2paםsD[q+/#=oQZ`&t_#`_~JA<!"4]nHEjn2g݊ XH5CsVA0ca"@(yrMo ] `! F"מi>~/Ak9j cNwhաrk+`F0Epxܥe* gfv.o"\jsqkK 9Aoc6Rx'hIe|e߇& 0xX=Ĉj5 (4$Ȧg7kԗ.`YZ#Do>E|4M_$#> p(8H"-M@4K^gqR#F=Erl+?">R&DclH f20a{q(&>0D|`($co}t#BJѝV]XG(?h#÷m" MiFp(]ǪN>F;U=q#'@$BF"B 0^B9w1 +&>06C^2[xGXyz}DSTk;KXydH k_yHjD&}Hn!ѻ ^>",hM$A.bХuDk5*6k-Q/akPmR"@E6t&k# Fh2טkQM̽-{h&18Lxx޽2ZDRH$s? ZS29H-*ҫ%@@Y4RIfO%urA9 !%f:Mz6^wk pٺ?X+~#S$|w=b1XG.pUQV(B p,)[yZV_> hrmdžCQ=cd7=3=g~ 15D dG2A`؍Kh/Ij#',w$׿7}`Q*xl=._¯@FF`Mp5BA^X臎x;wHo@4C*1] AU@bZa]Èm!=Wٿ[W׾e{c> i$2IL.62(}h/d s,Fn6bl Th۷k5TԦ(G8F<~7}.<.^fADzz9x z w2 ]~  ̜R"DHMߞ R)0"$3G(]b~|7Vk^MvKJ{"#FjG=%p 8cē5Q,RJ!ag1Cˀtэ 1؊|V#ɐٹ 8HA.6PpLj*>AWpў1%BʀBKi^ $r0rܙ>%r{K4;E$7v9]Cq==dGbm!YLF?)xPXut !b5zv(7?T|<ʲf2FhZpmqkZE52\=q{9W?ǵ;g~CR#=A6;{co.TZ}850-]zZBJ4$Bb,D#3LVO?c7m[Pr{my_Ky@݀'04 giҵXi\% CM@hp%"L^_;Nӿ({%<77֧?͝_k_s<|M}~*4~1Sidf4*4MCX{d DF&tת:K[FX{A_cѾv%G^0> BJI n.c/ΰxGxԃff*3 =9+|¡@}üSUE,HrHS" +TXGoeNR)@DSř@M!# 7[|Zkzv'0Z;h堵֒ڝ4ff0b1dw_St |2$$vҷcX)] WV2h~N$ůqRBH$VV+ψ F, :Obt v"FB#9WkP`/L]}!ay@AK]BF"]_'t DC'cN 5DcaF- ߶[. Bd"H590 'yQ  B-@rp'$6g{ka/afv:ˆT{aDrC3HEKz0C"Q0wO@s͝#hVG4>}Э?(O  5|}2SWN(ki ?Gi.]XGX 2aZ J(A$2 "ÿWwnOys;*}7|SN}tMs7uzs:>%u,BKk \g ߯ eȢC:Բ.ܵ*/(]k4u&.>n:Bq#qk40W1s籭nt`$jur>ޮF܍"6Bđ2py%JAIU?O1_bU.HV!&VUih6&,elhcU{i""A bD3L0 3a0laE7;ĵ3W)<\nM~C7pQ)2r`7 WQȡ_b vE/Ca=.3ܺ[a챃x&HQK?2%uZ`">Y=lUF .QGrO#ۋi/F6zkw˦RqnŢ+}^a"uѽ S(_ ܠp2j.+7ٷ7LxC^h!JA5JvI#N*dWݫT''lXpFaʝY5Or8.mƌ .HLB:Eyvb xJd=dzpK%rɈ. W!íըN#1Dzd3 XfUJ׮Djx;C~9=ac" ᧋+wh,U}MfdGGy۷pX7p %GccgeIN=?iRK}~…I!=zAq3ij,B); UH#K磨txPJy~W)?8Av(]=G$2Xt R b[ȌB(SE}KTg/#~ 9=LlۃiDGA6**na:oc@Vra&F"+aҘ F4GPL`dݤ|o[}(_+ W'tiQʡxW #+{%tVzBɟBF0,B$BD2ٿ6wfSBP ^L 9(@rBkT + F"G1qT#ERiL+9 B$"FT[dFvNvt3M(ИI#Ww:ˆOe-O) #a"cG?e"Au<ى/8Vɮf6!f4aG"n-0 STi}_A7]/MO|<6=heC֏(ݜp[D7pu%u0$Zx+l 3+~Kef!:;Auf";<)@$\^ׯ4.>n)ٱCd56";\+XK4no;)_uW]XG RFw~j E ~қ7ѣ! /7A5@ l\{Z%l+I&g.'tX&,5,tBQW-U}j~.(7I#LFɈDf4$$cHön"adF!e5qT*\=*T]#wt `ugxv«ըL9Y+5xn_5W\uנ5ӎM$AƢ2S/\~C|d6Nsut =Ψ͔cGeH ! S[{Bz}j\Xa=޵?8lYId%byScl~ϭ,]C2qfϜ6_@WmS$3|T[=ŻWjj|Oa\hO{Z{q2tqB Q_Z M2c7i:ٮ|{J7?EO]NѬyiif)1إRc)4L854R|P#%MIÚ{]aa9T}lܿt_6l&H7x 𮹢φ .N!Dh!/܅V}Smgσz!$wQ~ ۷qkFݘ}!oo@c74y: ?nȜDZkLSamӄ,]FvVb8av}Tffh,q~2q=/Q~ 3:a՛LBciTjX5Wf 7*:Y!I8F(B$zw"A$1H$>L:"NTUb4ՊW1KTO!M8v|'n[juW̜eGbEI|M4>J$>B Ф{<5v} 6EH'њ[X frUʷnC Ɵ$"_2;҂ŋg)^ =nifEyS@@P0e'PT  ro[X| %5#wUo[Bm B݁32i5Wg/39mDzvac+ʁy9v[C7JIEkEp: Z+gF$1xRmY"BF0qcl<~)37bwR0|hл`ȦQjC I~a?+N+F@!ʑF4uҽ;}V+̈db!A([cO`p{!O{ b$z$ z!ڂ@=. Df@f!uYBҨ\2 "إ -@JR{H Gٴ5P @>h]ƩMS*S lhE$BF"Q.LX2HܑaOC$FbN#kXA 1A9.hR hyK IDATޟ b;(4{1"=˲'D(M8u#PtbC(,k2Y؈?/Q!=$vt}m[a??ZS+\V ZSmw|m>Nu:GmB@Zcf2$[7HBCa6`=7d&;HOvP<|ų WAtC8v@=?&0;fe$>6\ QQLa`HذB.3NUz ߲Hѿ3$pO~W8ء@˅e{t~&տd6-A~(22^6}$l<ܚUL E-hk-Sr|Lǘ>\"P7~A)aHF*G~ W`(^~Sw `PlCK N>:4 DzDŽ*8!L,Hi;(H|d Ǚ槵z։_˦;eК>Mfe U[f`wJm2{רܢ>=IO!e5QR˛~! Ǝf^Oa̿6ʽ׃ܼo @Bac SoZ.2C0ҕo+ĵn:*b] 7BBZH#$0t@Ԫr/:!HTZH#I1RE(|)J;T.m$GvQ!)mmM@k BHl#1╗qJ,L-w~u "Wݹ8ًiɎz?s!1@R)Y @k BbկۥVcР)W/qu>?X7_?:-DK#"fX_q3ڳEB7gXGs3ywD(U f#dH;?A=W[H noGSGfx%Xi l }qaSH>ׂ'Kv5&pZw|:5+|g{Z;/<+L#u@蘁M, [e7@$^bMF& H\g]@$C% %Ilƫo{B20MgT"Q@CݣHvL? @ <^c/J ?[qo/;Ub}!9t 4$$B* 7M"GRJn9𱧖ev{#&i ߚĖ7 L(Vag~kОOƿD41| mZy4h g0b)eRH&EvVz lAY$6F2}4.#zD!}$7|{m5d=Z#<Sg^X/oqܮ_"ѷtSēpaG;p(AlpȆ B{m 9`5;i.sEc2|7i*dh|+>b[q__btEXpcGȎ уn`3rjns5Ě?hO^x- qT?:Cj4Z47$UO`c@6i@`(U0rd{>c@ +!͞!pŒdo2Po0gi؋"^"k|ӨiinWbbDs= Pzl7gwA+FцB)?,>L yiQ*ӗ);lfBf~f6S(PzRv^')U |F*Mz67u$H:RiBw*?EdJ5)^pu&aHiW7?pv14h14ڐP/ܮd?²lMGһac~Whv:8=LCxs>M#NhD4TKj[5Ѿ~0$4X?ɑf/-+gZ.ڭvl R6k6 Jv_ErlfnCvl#?J30kR:휄nwÚGZ \fMeZ Id4BCn  9{Y8P72P+3 #2)pf k$fVbz[o ߙ޵!u|S24F}~DGزJ(:9SoތofhvkIoيFQU'm =h͟rRRC`"x8Ӯ(kn`A`/i 4$vF3;PiD╗ZZ_[okNn͢p G=R<?L 5S)op)!A<©PFIDbhF4Jn(C Mfyf|R+>3z%pǡ5vZUz "HUifI 8|OmZ 5]0bqt;LF@xn}K:wW~eߪ }>=v!c_ ߦG X6UA}N>t.@vDE `G{([pqK%d<(=u j+ߐs#%(ۢ((6, ć)Eq2yo+=ɡ^>;"@kle%2j7ͪ<Jx #^JRDs97b$)1B(Bk'm[l!h8mXIz}UҁZmGź; sg0p 8c8 /@YF"H_6 !h2 L$X[΋{#_Ct =),kl<@+%|'pvAKaSj"|, r\X8۶ڼ9pvƾOEa[7Z݁}W-ca"V`zO,HVFyeU<{vUgnsĺW*ߺEFCrx$7HEJ7"TuT*V S=H&&AZgw@edw#}ZpY_`B7n*7Ξ{`:栙äǎ<0u65,ˆ`!vRn:*㡔 cۂvgS]Z:2 Vi%qtXˮLb&$1ciD p .韣p&^[-PpA ּ@t;o([I lw A렳OyW/K%,G=O&ӓD9AsP#xhʄ@xP'x$9~!"/|!L'ܖrț>#ČFZvh{S kj$vIrp+--*rka:[T[z s%=Mj {ӁCD5Jx,EUWd"ȡ/TQ;ܹPw8Ko#BW*XV67x<|bZ3|Msm.NSdvz[D!.6dblʅ Jpx/ҁv쪞/<+ Zq%r>QDZFw;7os |7{Sl+iBV$2x'EοȆ}yx2FNiJ栾x0G0#PJ AkvU!IdUΠsi*ʯoC+Hdh|-W^yh8b$zs Dis+-ѿo/[W7FR|}ŞIg(%Ofca`Y*33g)aA:zlm43CnPY;7cⷃ}^P B`gh,ܤp X+u3cM;yeRe#{u )ߺ]Yw~҃ݶƯtͲ*>n90z0#d; vY3?{o$yyܗ*,}'()Bm5ۻ;bzcb<3㇉zgc&b^:ۋ,ٖM-YE-(R$*k5r_}\ (P"NDVެns9pooޞt<[gӹ7߽P3,?Z99,  Ə' W ܧ=J%>;_~ۯI( K~Dԇ+(]rIpO)kPv<V *4m4`Ek :sU~hA 9}ݾpѧ iyzw&>0@g?K,Ҡt&jP޽ (H&DZ?0#6AeLO 0yY2Y4xZ jZ%ס!$QtBƐ2qnA>%*\~mc O}#(\`"A!$/-X9;Cuij Pru}GFG*X^,gt>fS( D:A}Di)OlģQϼLf Ąg00臰? -8V[T,A>TpܸAZ#sIm/OX96h)_8M,)K?TpW۳$lj&L g۩8שZ rg7B0rڣ'3Ďh-`R>~~ްX%D4:p_QZHiiM0|hIdS))U<" =ڀ[`uoT6Dbf})$m.zs7(/\Œ)Rr}m۱SiRQŪ IDATJ@ QoT-r׬- +ADlXԤ‰8V"OHaRؑ޶(2H+CnMia:޶%c_bxP8~@ZI4H rcfKOр[`OA$A(BFXԖ/ep{)v;6~I3yxJtݧh-=>oAXeN"d,7#Ĩ"DUK.4ctZlaprt˶̏.)A:0;`Mp U6W3c&h(#  c>n*!(\x}*LBcr4*553ihA:4:ڀOV_:*56Rc}Ǩ JR#H@Wg(AY* ,w2" (뺛:ˬ`q?[ ݏ~7G}8fpkR:A|5_wڥo'geHFP ,)6(n߯έf,9DZiJs3oQ&όM`ɓh\ m_^~%K})|J5 * H+e|htXj]y:rT˯7 ̮a2Brm {?.4V* 6mqP%4!j2-a!T ŐG5HV7۳"f(ʹPm'?ɗ!Np E2 (m-2#M (m>.WMwB@E cG轚,'cm!H:Suc &Ԗ.t ~ܺDz(?@j RbhvV"FT8N>Oce!}p@hɌ!;,S\{iT_F}ŋOm<!ddžY2 K#Xw,m2ee uԖgH2كSD{?D(eS :`-l=z5Qoxk(@iN$;؞6GyuIw\ʹ-$zX(ܿHfS0M.Q.Hsl'IP07L_ ɃmwE;Umm!QG x(V~Pi\Q9CyM,.=ݶ录gH2v a&,ѿ {؇ϣ\[mHpo}5 Vsoi*oS|DF7P00a Z3qr§R /Ӹ[Lms<이Oaȃ{:8Ɂ~&?N,Nh4r Ez@fVÝtXq&ݟe]yy·k =b! X JU6ҍE-Lǟjn=ՙs~]ϐ =>ޤ_CWytAD3K2}Gc]o=U4i-1 c[ 7=+7Z|H)X[RcH ?K|p0 d)#5 @jo 'Ӽ2aBZHŽ ٿ .1߯WL=q]Y h'RGD"K8JJt;@1ydwBF$4k-~TG ԒIfl/BFM3sWJPp!E{gshbgXV& h/XS8]p S o,P@a/m VJ3ugȎM36aH@BT|+X^Ѩ4{^<͚!!!QO8Oq[d=L 7#HF|{v#D*fxC.1su{Ns+{id$(\:4\HFf̌fǟ!;=<{h"4.y6jkJݯ.mht/L9ynnRϗ(@? bslj #:~"3'ŶTkB"eie TPE؉/ D~!,eŒJ3XKb'^R-G*8Юķ&I@tWN";~|=P k iS_Fk<3o*Ç?uڀ8"^FfZuڀ 6e ڀ%~̽!(ؒc/0cX! jnX\lf?-Ue f${QA%b$6 #њlBkuqG`۷fiNj6- ;(I!x5zSU{u޵8(Ϛ%P6t(2ڀ6TCt6}*މ MKT双D:#-Vd,JlO@k/4#e)S(LuD/q65b`o1 츙}{۸,^Q!>+B@ʹv0hܢ @ 6l kx"[s;tDapSmپHc˧<m @mb1 6APV~YbHd('ѷzN\~f n3krEN|sQjOVOKPl_> (ZlHjLm~6_+7tzA@=wusjnm-صebdF.TG_zk jճm> X m#,dČJ;J@pG!j\=sJgMah!E$=z rlH8tOL=^vҧg8C!Z#-~K ҸUsߚzyj-˘wjurg3xpcWC<k\;w P9t*Fl`] .mh`G&݈ ^0!ZkUmޤݶ6ū=Sؖ 8}\Ʋ$ i ؏=F|emaZ }~LHnt~ ~J$2A4L =rhSM5Bp`=_i\ޔós%3i8Cǎ0Qߞ)Z8czaerQǩ딪F'4?vLO  iPY'xhm@'ڰZظB_~~_5oG|<Ǐc'i+~f]+!F"3E2L dx?PؿLoyX?aJAɉIChCFiF@bd]tn@@h _$7~zp?~֯j$:?ᑪ/b۩b%4VK ~Ie걭YZuFIr#{: *8NN$;IӪ@+E}.0S{%{hgqG T*4JXID4{C-uwWS]{lݍJp )5W6h*WwylѫΒѐ#=:EceoZ+7\o>ahϙǎ`Y[O"Lh"^PΕh]pR.32~8~[,@<#qn3% Ih岙i@@]3X׈'#HD$g  pF@0h1|ܭѤ>bnkhR'ە0OiO5oZWК>c4y'5<ơ_W=ٷRv"˗782CdƎaY"!gO,$UIj* K5mTÌ2zPV,MuydgBюIu9fAk&}V@ FB$~!$B-D^_ ZQ"{~ZQͽZ xuO౫ˈe "+g_WɟRɷ1 eC~[EG@ZM㗐$=LC̽U|ҹBi\s/up|ty(^aYqXda! a*'nŐCjh7h͞aShT?9jAW.}{^D- JyBmHž";~_D(K !,S` z^p숍iw#Z- nB7\+պ0PQZ?@vldwS\WXx JB0x( қE4AV ^/Zks(,² zn+VŽcgQ_SB#>8CP@tF4RhpOz7 g8 ]' J9L +m&==k@{w, ^ ZFwIu"+h_wJk_Od`Km/.?, ß$bPY8Cei,Lj{Wh-%Xأ <@!QGw',t~G~:~;[TWޥvMQ.MG U7D[PD#m8pA xMkH!q}}I3D+@ܾ+7ـLQKx{RF/Arp/v|zEXS]z} kN0X_ q0CH$P[^;֯:u [$z3ԋjԁlԁF8q$!uh;{Zw3owG8vK(jE*ZjMA&N~׬K?0Vݫׯl]B`G#$,ZHHjD=}2;~qo.^ig+X;WP蠊R]3&>hR[>׺)&9pkWЮtڅN8rVPhm,={R6nZz_'G|KfdJhܿ4*7+V4:b:xh L T|'ͧj'12$C)L<{iS]dٽ(?[*V}-hm!,\ S_ISC u`CBHf>05em!ZtO.WD]pacNk3o(^Yl:(Bb%m7>/# xĤw[3G$:JPY]G0dir;sY KAa]њµ:GXVF<ukw/ 6X .'ogqK%М}[ {xW-_RE>Q6#T] (sATw0{Xr=so~,$؉’]i w`uz}O~Fk(aH-d9d .76m`ףtۤǎOÎ P-}+E|pkI:kZnLt !NM}7 b$z;z3爦ԗs̗ O΃[X*Th8Fk|lyȪ]no)K!wdFB {>.jud#;uka$:;3<$b篙@ ؙTJ|eZ#G9M W~@j2^}̢}Pŋo2_6(ܳ(LbR0`J22}YxyV.}.8Rp`Z5jgB;zShBBڼF81w_gn/}7f 8BQA KTFڽዋN; v5 XhaPpJ9B9Mv|t.%(̙tEL)R FD"ԩ3_>;غflmL$ )V|յiiG[O)qՕ yЩ^!$v2<`i+e~틿m? "j{E[b8dgZsi {S,,qz34H;cGi:Mǖu2ET=WQ}0ϮKqHbc۟U&#-*:8 IDATXb?īVRcƭ6(^Ia2Kqu4d"x Sy֌4(CvY3.dEHQ 46 D%sY>qbTnЉ0`5"aF[pHEaY;Nk{ǧ@ :Sw= h"eKfpJ 47f<~?^J* _:Ǡ:$a `²]=Q•+ &B2K/rvNL,}IՁ{2VJ8@zd9 /x\$=1 py|k(IlhhpCu9lOPFڑ;Gpj8v2Nm/OX96()_8M 4#dƎ!H nt!b8[g_0Ԇ+D$^8-Z=>#,es{T6Y7KWY_/c5ẗ{|SL,$GFIJ{P!}H(q̈́nP,Xg,8shFϷwoIry?C䦿^=;+bXzqDF̽O8kk$z'M4۽__hm*!G‡.eѤ!;pr@}&~X͝3Dȱ_CkIJ{YAFh0wk۟/7Ę2H"D44(-\xu"P`Q# f)\Ll>v>KDLbbDq _?5ҷd+17nce=zvm7N %2Ak D]N!X)5+q__wp,ҳazF<~?!g]v|ඃHn &)?0-4h(4B)Ѫ 4R5SOBJ[彇=v>aC$6q6v|jBDY=} /g)MI,#>.m۱SiQ4]m~-8Fp`vou.8pnMiaL ؑWضޱXw]D+_"1|6GV}"BZGFB_c%fG*V`,bYx2}fRGQv?D=ݞV  <Öqh,)ށpˬmXg_} !S|݇P^RM,$dF"ێѲ~v՛VxM >3EDy"K+H!hnX%6ճO!HzH (\wdr ^TLDZY@8Z[LJM/]T(]Azbx?²sHaŧl%6fb#kM+X$^tQVȀ?lN^.|GH@Z Ǚǯ4na# ؋ J8w-5 ,WYHKTRmS>w󰶵@g-@a~#DUK@ N)(Fwr~Xe$bI=mZCG59E]Kb3Aruf)%B63ճ gu5Ѿ>2;wb3]g~Ah>B>UEFi|J5 *>NKyy֊Z~}fXyĹΰ!c!mr iPYKfG; aIl+> ںUko$&94@}='(_=G@D 22a @K2k@8/@kE<ʯJN2/0 nLg*dƏ2x9ss-"n@u=DcJGMP-.Qk07m@ "!&ر4~Jm~.G?Ap=kirhlKԶK߹Kvtq ԫ?oVk6@lIFצBR³qz0anToЬx;}j"D)6iGrh'  -+:Z#w&~ŐzX +zz : Zk]@a::b AJ78(IFle:&juz Ưi}1v&18iڹ5\agYQ.NtL{ɵG I2v Ê MVϝY^A=O-<ʅ*|@{3;y&3KxOciǧcM(#2#>|S;k>MLH}R`O2I) T9ao TR[qfwa}[7kuj0C޻^wߤtջӾ_H&WϞgQ⃃$ٟo̯+M< " Ǚ%>D"WxI2}#t"=||ώ TTЪRϰWw0Gx~wpjT[w9ȑ_sRÇHn;3\Imi|ʹss?B el8'@HO+ɟ;kj 4ى7KƶM=Bۣ6LYwUi4R * -]!7~6K HƑ2VldH9o 'Ӽe`rP؎ ٿ .1ߣ}Jbh=Qb}aR6F?R[mǩq+@1[?I7\=szSvg~c+RbYf$?СOSYe  g;BBг9riT +JwܩYTJV 0|h"̽ -ׁwmsx{9G J%چ|諭R$,>[*I-,O(YZmt_}5'`0<>1HCH ghRBRŷf;7kPpA ɀS.pZ  ܡ^!X)eIz'3#l;|,h(^z' ?>wL(hޏK'J R*hÁ<z8{Ákq>zfƲS[+;uZw;L<;ΰc'@ p RC{IfaH~sg.͠U(B;`BNDkmx `5,:,_IJg|wr78^BP V*FP ~&h*ƛ ?Frx^ *|RB5]aY5ͺKx?Ф۶"p`k(Mjr/z,\ǿp'F^$RDǻDTL& Qwj4>A`>F^hwfnSqyjpB@p<5a+r80@}e&92#9?"͵P`[}Xv !H'Lƒh V ;?Wr4Vm ߦxR#H%=v1S@|k료 ;Nsk9zτ͊ RH&:R9@&Ҏ#Nw3}=F=( IN`?!4AB)}GnFQb<'*kPϣiM ECx&D.0{廌"W[? ~e׮8(w @z I*ty$.;P|gV^~:ѹ8 ۺ#e*?`EZjT A15MC>#o&9yM&S{`L6f|NN}Ӗ0JHe "t4 4ͣ;`]Gx􅀠<{OS#6 xatoqV4ɗ_RޫcKֵ[1Z: 7L&:|ƹ!+\VKrVZ Ms.\ bL]Scs$AF B>\y@S^*#RiNCpܹނ@в-?7HL^#9yĥ#=umį] éEh^dm4ˇ麣|t-t9r0#Q2n\W[ҿoy.'=}h}.J@YIC N_@u@UئL@jof+HL9lɕʖO&8R.[awƶ4itMGb2 $ϒ8[0&gFR]t#l9jw $,ͪثS@^mpT[xG^3W>Aj:kN2ҁcS;We\{jzOt}L^Av>HLlBmc,٬:s`v6ڔOZ_>AٝАV S&f|az}??nqe[8Cb-R} 1u7,pJm|>XI#{T,+o䍺 .\;|G QA@ї*𶵱1 Ӑ6_[=CЃx4-L#wϸDXASs). H.@bG}eX;`zeM&^^3&&;,ϥ6$_IJ%n#adl`)Ph_R)"Wig&?Ρt˧>q-wVl#L2{f[zQ|mӭ,@Z8Įmą+Z_A&shӼ1wk${na?4i(+j+!==l7>)*9%2|+_FaW~ z) ]}ڻPJ GoJ` <ĉx[-kec3VMoz yIb]Y@#%<%JÌE^Ӹ  :c%R̜?G6:Oێ[nB$c)fgIN*C4!M_{Gyܣ.KJ P|^DďбG? 9uذSM &O( 5(ihM^p045' @-dfHM ѓ_+ǣG޾@g[<Ԙ%:|>P SgD >n@r,rWȍvm!IMel[A qktIeZjXm۰Ƴ$2 ˖;ػ04}~deEYeai(ޯkP ?M|cwQJ0u()*"q.V |^l]{+DQY zrvIA/C?N]:8:gf-|/ ZQ4&'Nf lHi#,k,G_`z;JPwƞ?Abb|Ц-7<~VI#n9(MǶ,b fJ6NPD: J<uPO(^ 0sA9>ƒp~Bg3_EI/#m; & L$ɑG2 >d>-sH@:!=H0ѵ'>ИK(46?#}I,K"56MSW'm c`/bbwPMfHR#i,q{|x-myOtsjrM@Xif ӂOoFitk 'V)(QD2yn 9ux#a9rA$:K`Q#&J9KFIRSIM\_?/^ @WJJ翻 CU" %qUghm@#+> ˒$gM;NÄ4ql$z3BacxMaD s7FHGilW}^]o}-}y7.J&&>V/L  ~ǎdiJ#4B.i*:D^( $sZk] ˘&42ƞ[ [a@Ʌ*@K>78osmn-=]mP"}wM/o6S)׮Ѽ}3s(!-є`³_z5I ;Böc+B/pÈJ9Mt| RA׶}L.SN%LOP9zZ.iAV;PʡЗ/FSGTW$ѶHs" hGzA |Yp9/rgLcdD`pٳD"'ՂE>}piQpg{ہfOCٮ5:?FdEכs tM0y[L6Bzށ{3 |5'Fc>Q 2i(P3Ai(ˤ{O/4M)uJNL)Sߎb>DٹP۹URP[DGj5"4sG$ysHN\^XA(=9ܖR+i[0lt`[gHO𑘸JtbO+]wҿC8]G>w?C^f.~RLF7G +͛qR[!@'dW)*%LI˴,v,`ƓsASh ǣ1pm45t{kY( Fffdg';W̾pZ_iz_ V T@i[.Tw!#sѵoCpּbϡm($3z)UŋW.y8Lsyvx;B1pϢ /S羆mNΨ^{m_R&~o0P>v ȬdR`u1vl;BS><E |(_z{0rFmcgK$Pv`r׭;A 8.Ul#I|Ԫדtv/vǖ.$ ߚe{-- XM"AL4V{޾%;BFRT]JiB:6RsJmǰ1 !_8~[tUa98F=,4$/b#+:).-XSBu.*^!4nJM:N|?_|U=7R0|:p.=X>5B"`08Nt-ۚ)u 'pA:{˯>23k%33Ge:"#\+^^qEAm7E$c]!vC`mB۶ӴiS~wADK*5)ˇ5_e+7@7q4WߍXL҂o| 7Oaۊ=U/k}RB{i}aԵ^03w4Ms!4}Gއ^б(˜B{M _( O8ö l#̵Fbf8-ثDk AR \aR%Hx~m-+d#QF{A:ޜJY&GgMaے& M@WW{^Wֽ:p9B]hs?ѫg^=?%5Q̗8wh`AVҺ>4xAV*# % o]1F0RnYK#R0vHi1rrnw~>߃] A ;;[Qj9p6vDhjoރLrKn"c~Z%sp:)qt֙ >4D e8TuVP(g-4U"BO}cDO0|@5Q2 @H@:z𵵡l-XJ!-{|'=3>W],/$ |x}>3sn(e.DFncg2U{0j|Mxy%s󨤁 bbfh?i ͱmT"Kil{aOd~db2I $f_`+ 0+5XLuC4w,su}Iڅpf/-B=t_!=2髤8!vS F 1Jm#pZu9(@-a!U& SZL"_H,|(xu<-Ρl+p/3dfN:V! Ռ~zRrKi۽m[Az~H OcHk1: כۉ35y4 "NyGrh0}L)VKg(TNTrq9a>+F2 i@#ԳpA[Q&5=Lr Bإ%UA\QyΕV c!r,隓l5|q^{$Je ArQR/Bͷ(oVeޛ|<+L͒#2|Ρ to'j2PB鿵encd1&gIňb2Oڳ}C9sfFdE|%UWM.ؕĕԹ 9˹B- NB#{{IL#9P2W[vNlOvzEŐ$ܻ{W'A#6r #A~3XzTx!DB8>v-74瘻C4M$w#i! ҊQt X;͑e#ou24׾eҙ"m[z}KR$nd&s%V=ls-9Ϟz޸l{E ShzE +-]PBS AP5!>XXRq_ΈEQJoqJu-Dv%ҋGFXzdfn̹²l*TLA>7c7R(@o #<:xE|Ҷ!\1@v>Fvv bc/xs|޾@1ߣL>Gv~fI>{#R)Y`.!~>HϱLX3BDd+d귋A*@RN)d707J"^dm ]/^"2ق(r/ TXT<фBw/M#سP~ WIL^"9qi;]į_Y`x!d$)(\ E,X$-Xؠ[\Bu=$еؐ@ A)23cuh%) NV o~ʃAft A}i A.~uY UV*G3Ϟ}⯯|aj~ׁCu!=S:{NS>B}>4#9u:O|tYܗԅ^c ޵l,fw.~A@ Mݻrk/Fzv='  ?TVՐRs|+}[[  z5*2ZAl6noz+/|ή@!<64=Q@#}p|~![/+J_` ONۖ#z:[t Je<7#9A& &ܵ;&P>0aZ~=_z.}~̫{pLl n̨J($mI$a۽z9 hgOϽgumQYH;>4=Mbr}G˅ecdo]'}eb3.S~wfӕEjd}))ն18*dI%$ Ep"_.]&Z79煵-k$bOcoSͲv!ԵvFɫ@$9X=>\?e'$1O; m{MDkDx=h"u.!Hw_wLۖ:x|[++/=Or5)4-iG_?x[hӁHOb$%SO<w`S|?Y^{.=__B$nAي'>rkMݫv67cےxzӇ,#z<%AF‘R?{'+p-{\i"Bpan()!?'9uIfǍ۶$4OMgO:*LWcP8_=_=Oö^M /(|Qsa[O.w?E*y-~qXd>-lX>˴HR$ ˖S'ڕ+z*ZFj3"{S=p3x&&H_$9qi!PDwt|,&ʱ,$TL2{RrFb)L${OW:j5{LYe >{u}%?f$C[Ckc0k!mI&%˒ɂmK,[O'~OF}ã~!VsDXN[} þ5mT2pt#Ǽ^'ղe`K0 @xN@׭ŌU) -!5+'?+'ܳ4AlIDATJiՌЯ躣uM}p{932;-\.GnJű<+p5/,#`%/S@m17I^LG\B@Ze%6p]ڙ|}'XCWjeZV%P^J!D8y)*)ΡLY)UЮ<0Ҝ綥"^g_R΋Tr_JSrX?|-z[Їt-ޭzws0BkB/FS*!|efo:d;3,|Oܟ5FPx(jU]p:ZN4rB_J#b|&7|;s9Vr¿VYّ1mE}_PG&σ 4M Aw;@k+ŶcH+i`efqLcffS(e" F"(6g~ ab-5ZljG_P~ߏ i ($B)tO">DKDFTDcv6-!ՠJ?oG*ۥZRB\Ozr>t |8pmx[Qp>d+d:^\'XI1yy[N!7')Ț~aWޫM~vʠZj+ZKRj, ʡyb+m z*D2(n羠iEypר `s8rm[l[O|5]׊W(D-#2d/wLcWo)A(g^k Hp_\U@ Te9l[=iT7}z>wwⵢ Qȿ^#~^ԔV]T6ŏMGp<[ZF{['MK>LcI* ]'x-*B"W{_J y-eX+-G T;ұ^k |)Vֽ6`( T:k)mgRZb9_mUgu֣hXݮJQB>K" R`!eA-KV*NKjSE!Tj_j^nҾeA`5f x+Rzʿ2r尜TCSeԯַ൦a)@ZFzj^qEzg˵5} =4(lۯԷSr6WjuP!諌p݉@ZR_˿C!BYg']wuRP=Sz}5Ҷ("Od e+]HČ Cڗ44M m!iBŖmY^dYfܹs>Dv9ms|GÐ v'{at8i[tt͑M! "0޽/LJ5q+>uFu{ԧwXF;Ne~ mR/^hbUiz90fCx^ iЩ,!㟿qmvE`{Z˱}yk2nm։݅ ٸvkm%5+4WIL{iH|x~#¼kZ]]ĭ""Nˠq;%I7q--*b[т9m.\' FBy9*Jy} Y 8ӮX$]ء@R'=zXv=(`x!bB!\ @r7Fn(@TBҴF@NX26ũ1|PP@©ZD#ĺq6,g^BzH8֮h4vuQBQZQ(vH dV*m5|/>󸾀P@ԢX CPY: Ne"W1[6!#<ܺMs j):z E쪉}׶kh7Z$z,,(4 rO-l%Bs:=w#TKlR$Br(ca;GaIBO})Xw"KS?~#xn0mU>7p7}!zp߄v|{Dyt*4?ijC{trd$zS{=\H"A}aA(") ;9`mD-Fbd;Ob ^S|(RiZkX 8f^_N8&wEbb7MWy 59D*Fޠu'@""Ct A` `CT=KI︵>R2J41˳HeSku}GF(7oYLrI+( q0zB?p5%"7n60L4i^]DZ@X, m6#%:Z6IfgF@$HPS[ t9 X"uJ6tމo J d5CW!rhS7(^zpP\ED}7*P%L_"݋W)7O=G@&דUx%|ש"Ht6h *H@$%dtU< |qӯӨTHy_k{WX *IA=X=eJl-fay %XqºFKI{F26/VVeKscs2`U.S_?OŠ[l[p/\Z9~njIĈT)'<7(7 Ow~6'lF[fldV_m*I 7]̈́'?n>׆@$jIENDB`wxbanker-0.9.1/images/48/0000755000175000017500000000000012243601243015001 5ustar mrooneymrooneywxbanker-0.9.1/images/48/wxbanker.png0000644000175000017500000000753712243601243017344 0ustar mrooneymrooneyPNG  IHDR00W&IDAThk\W}5sgvwf3~{B6@xT jE P *TQAi*> Q$mHilH qgzwg?Y'NxWWw?s(ynG!~*UcveqL^&pR|mQyY?[듿^[ycj#_Ҋr\@BB",`X@w]Y)t OķZK {/Zb7iU"굾a۷ǛsgOtEzS 6z=zӕÌ3˽ Hɔ;$ R*ĭ]ynuц>D~!dDw?js8>R#u"Ž(J nRbjMOQjH Fe;9<s }ۑ%$i:jw0]@'q[Ө\si :I#5*]x7+TZUhy)5,ìvD]i#p]VD1ӣܪG_I"oTxgO8S\30XU48],$yt*GD02:Cp! ]hb R\EToo7De@ ?k~ */'YD<]$:8%ؾ i@\%7MNY[y{{4K?$^Ltb6g=k!Ƥ ~3} LzқwW^u8}uq=A gt l_ƵWe -7 ?#0"ϡߚ#t; 1i2^BhgKo^,BaU!0Na n]bfSi)QT}ƉgM(AL%(kz l @QԑZvLv1´5Ho#tS"0t/! B_ @&rrʳ/%2q2HtDZ=,W [Βfq 闉 xlfIBi;-3h;ȏ?DX",]x֩QigI!fRi^|0ѪBVNt8iA*`uғwRt30< PN( d)I==TPi׏0=L"%|wU!ȗdFyc|\D7I8By{UZsueKyqb Siy&-2]2,F=&I=Eg%~?C 4m j 5[ICQږ DRIL|:gN|J|A,x6<Ȏ@j+Û-qP) ?U:+,xnQ^VN|D-wXS*O\!)[FB_Ћ<=2{;õ^[OGQ$ܤ>Noqӹ1 %RcDQwp-O(XW-@~߼LX[識Q\g} -Eb,H#+yR4*ߠ~i^0KϞ u \ .ywGNnf(@h-럯Qc~?ƿ)x"f >DQZv|tϯp# rddgiu}oYϰ$X.E]=\xŋ/* P|ca[׿O{!S]wnY'~m-vyR U _~qrs\&IENDB`wxbanker-0.9.1/images/ico/0000755000175000017500000000000012243601243015320 5ustar mrooneymrooneywxbanker-0.9.1/images/ico/wxbanker.ico0000644000175000017500000132745612243601243017657 0ustar mrooneymrooney ( v ( @@ (B(00 %j   > hƪ(                 !!!!!!!!!!!!!!!!!!!!!!!!!!! 8}OAABBFGGGGGFFFFFEEDCA„A@@  !!!!!"""""""#######$$$$$$$$$$$$$$$#######"""""""!!!!! ??@FGGHHIIIIJJJJJIIIHHHGGFFEDDCBBA?>  !!!!""""####$$$%%%%&&&&&&&&&&&&'''''''''&&&&&&&&&&&%%%%$$$$###"""""!!! =>EFGGHIIJKKLLLGEDCBBCDEGJMPTXHGGFEDDCBA@?><  !!!"""###$$%%%&&&&&'''((((())))))))))))))))))))))))))))(((((''''&&&&%%%$$$##"/jY=;9C 4tT??>>>>== !!"""##$$%%%&&&'''(()))))******+++,,,,,,,,,,,,,,,,,,,,,,,,,++*******))))((('''&-f\:CDEFGHk{od[PKGECBBCFINSY`iq{jA@?>=<97|C ?@@@GGGGHHHHHHGGGFFFEEDDC::9-c]''(()))****++,,,,-------..//////////////////////...------,,,,,++****8~?CDEFG{g_XRNKHGGHJNSX_fnwZ?=<;98~ ?@DFGGHIIIJJJKKKKKJJJJIIHHGFFEEDCCBA=6{5y,,,----..////00000001111111122222222211111110000000/////.----7|BCDEczog_XRNKHGGHJNSX_fnwtUG=;:96| ??EFGGHIJJKKPPMJHF@;:9:4v'Xwc00001111222333333344444444444444444444433333322221110006yABCEozog_XRNKHGGHJNSX_fnw~tkbb^[H<:97~5y 5wO>DEFFGHIJwqk~rg]UNHC@<;:9:=81o33444445555666666666677777777766666666655554444433(Ywf<;6{#Plh66777778889999999999999999999999999887777766664u@BC[nzog_XRNKHGGHJNSX_fnw~tkbYPHGGGC998~6{4x 4tO=<:5y.h9::::::;;;;;;;;;<<<<<<<<;;;;;;;;;;:::::9999;ABFUzog_XRNKHGGHJNSX_fnw~tkbYPHGGGGGD>7~6{4w0oD 4sO?BCDE|}riaYTOLIGGGIMQV]dlu~tn\M<;:8-f<<<======>>>>>>>>>>>>>>>>>>>======<<<;;%Sol;A?@fzog_XRNKHGGHJNSX_fnw~tkbYPHGGGGGHML86{4w0mD >ACDV}riaYTOLIGGGIMQV]dlu~wne\WSVF;:87}Gbn????@@@@@@@@AAAAAAAA@@@@@@@@@????>>>>;A=@wzog_XRNKHGGHJNSX_fnw~tkbYPHGGGGGHMSZC6z4w/mE 3rO@BCNl}riaYTOLIGGGIMQV]dlu~wne\SJGHG@:87}1qD^pABBBBBBBCCCCCCCCCCCCBBBBBBBBAAAA@@;A@Tjwzog_XRNKHG~tkbYPHGGGGGHMSZ`Z5z4v >ABHXk}riaYTOLIGGGIMQV]dlu~wne\SJGGGG@987}5zC\rDDDEEEEEEEEEEEEEEEEEEEEDDDDDCCCB2qAFQ^jw~tkbYPHGGGGGHMSZ`g_5y3u 2qO>ABF`}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGB97}5z/mFFGGGGGGGGGGGGGGGGGGGGGFFFFEEEEA>DQ^jw~tkbYPHGGGGGHMSZ`gmd4x/jF 2pP@A>:r}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRH75y/lIIIIIIIIIJJJJJIIIIIIIIHHHHHGG2qF;DQ^jwHGGGGGGGGGFFFFEEDDt|YPHGGGGGHMSZ`gmth2s  ?A8Ks}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRXUB5y.kKKKKKLLLLLLLLLLLKKKKKJJJJIIISI;DQ^jwvFFGHHIIIJJJJJJJJJIIHHGGFFEEDCCBAFdGGGGGHMSZ`gmtzV  >AGRgs}riaYTwne\SJGGGGGGKRX_eC5x'Z}MMMNNNNNNNNNNNNNMMMMMLLLLKS]I;DQ^jwqGFFGHHIJJKKLLIGFDCCCCDFHJMPTX]TGFEEDCBBA@?iy_GGHMSZ`gmtzyم  :AEMZgswne\SJGGGGGGKRX_elb4w=T{OOOPPPPPPPPPPOOOOOOONNNMMR]I;DQ^jwFDEFGHIJJoicod[SLGB?<:99:=@DJPW_hr~kCCBA@?=?\HMSZ`gmtzx׆  A=<>w^SZ`gmtzx׆  2qQJ;AMZgsMNNNNNOOOOOJJJLONNNNMMMLySJGGGGGGKRX_elryC}SSSSTTTTTTTTSSSSSSRRRQQQPR]I;DQ^jaBCEFGoog_XRNKHGGHJNSX_fnwn?><;:XzZ`gmtzx׆  ]O;AMZgsMMNNLJKKIGGGGGHHGGGGFFFFEEDDFHHGMLLKK}GGGGGKRX_elryrUUUUUUVVVVUUUUUUUTTTSSSSRQ]I;DQhuCBCDE~zog_XRNKHGGHJNSX_fnwtaP=;:9T|ggmtzwև  bO;AMZgssLMNIJHFGGHHIIJJJJJKJJJJJIIHHGGFFEDDCBBAGFIKKJw^GGKRX_elryVVWWWWWWWWWWWWWVVVVUUUTTSQ]I;DiZABDVozog_XRNKHGGHJNSX_fnw~tkb^Y[N@:98~b}xpmtzwև  bO;AMZgsLLMHIEFFGHIIJKKLNMJHFDD>9:=CGJI|}`X_elryYYZZZZZZZZZZZZYYYXXXWWWVVP]Ify~RABI[nzog_XRNKHGGHJNSX_fnw~tkbYPHGGGD=986{FtojizwՇ  bO;AMZg}KLGEDEFGGI~r`XRMIFGGIMQV]dlu~A@?=<;BEI^l_elryZZ[[[[[\\\[[[[[ZZZYYXXWWWP~]erwmCABHUzog_XRNKHGGHJNSX_fnw~tkbYPHGGGGGD>86{5x^hctwՇ  bO;AMdwKLGBCEFGriaYTOLIGGGIMQV]dlu~tP>=<:=EHZtjlry[[\\\]]]]]]]\\[[[ZZZYXXXWP~`jpg@A?>fzog_XRNKHGGHJNSX_fnw~tkbYPHGGGGGHML@6{4xYa\wՇ  bO;ArpKLGBCDE|}riaYTOLIGGGIMQV]dlu~|nRE<;98@Hh~ysmry[\\]]]^^^^]]]]\\[[ZZZYXXWP~chb@A5Nwzog_XRNKHGGHJNSX_fnw~tkbYPHGGGGGHMSZL6{4wSZc͈  bO;j~[KFABDVm}riaYTOLIGGGIMQV]dlu~wne\\XVF;:8;DV|wrlpy[\\]]]]]]]]]]\\[[[ZZYYXXWJafKAFTjwzog_XRNK~tkbYPHGGGGGHMSZ`[5z4wWNƈ  bOew|sKH@BCNl}riaYTOLIGGGIMQV]dlu~wne\SJGKG>:87}:Tupjes[[[[\\\\\\\\\[[[ZZZYYXXWWD_QAEQ^jw~tkbYPHGGGGGHMSZ`gmD  chnsLCABFR|}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGB97}5yGfa\vXXYYYYZZZZYYYYYXXXXWWVVVU@MF;DQ^jwvFGGGGHHHGGGGFFFEEEDDrYPHGGGGGHMSZ`gmth1q  cflQCA>:c}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRH7|5y@_ZkWWWXXXXXXXXXXWWWWWVVVUUTT*Vj~ZI;DQ^jwvHFGGHHIIJJJJKKKJJJJIIHHGGFFEDDCBBAqGGGGGHMSZ`gmtzU  _dbCA>Ks}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRXUB5x=XSUVVVVVVVVVVVVVVVUUUTTTSSSQ]I;DQ^jwFEFGGHIJJKKLOLJGFDC99:=@DJMPTX]bWFFEDCCBA@?A_GGHMSZ`gmtzwև  FP]bIAGRgs}riaYTOwne\SJGGGGGGKRX_eC4xMQTTTTTTTUUTTTTTTTTSSSSRRQQQ]I;DQ^jwjDEFFGHIJuoi{od[SLGB?<:99:=@DJPW_hr~nCBA@?>=boHMSZ`gmtzxֆ  PÊZWAFMZgswne\SJGGGGGGKRX_elD4wNRRRSSSSSSSSSSSRRRR4u4u5u5u5u4t4tV]I;DQ^jweCDEFGHo{k^VPKGGGHJNSX_fnwA@>=<;\lSZ`gmtzx׆  DOXG=;:Tpyd`gmtzx׆  PJ;AMZgsvHGGGHHHHHHHGGGFFFEEDDCEvSJGGGGGGKRX_elry(\NNO4u5vFFGHHIIJJKKKKKKKKJJJZ]I;DQhuCBCEFzog_XRNKHGGHJNSX_fnw~tlPE<:9<|~lgmtzy؅  ]O;AMZgsIFFGHHIIJJJKKKKKKKJJJIIHHGGFEEDCCBA@pbGGGGGKRX_elrys4uEFGGHIJKKRTPMJB><:9:;>CH\]I;DuCBCDWzog_XRNKHGGHJNSX_fnw~tkbYYVND;98Lr}wpmtzyم  bO;AMZgsFEFGGHIJJKLTPMJHC<;:9:?BDGKPW^h]I;lVABCY{zog_XRNKHGGHJNSX_fnw~tkbYPHGJF<986|[{vqltzyڄ  bO;AMZgsjDEFFGHIcwqy~rg]UNHC@<;:9:=?ZKRX_elryvkaTOKHGGHKOT[cktt]Ify~qBABIbnzog_XRNKHGGHJNSX_fnw~tkbYPHGGGD@986|Fcoiizzڄ bO;AMZgsdCDEFGH~i`XRLIGGGIMQV]dlu~g@?>=;>x}RX_elryukbZTOKHGGHKOT[cktt]erwl@ABHdzog_XRNKHGGHJNSX_fnw~tkbYPHGGGGGHC86|5y^hbmzۃ bO;AMZg{DCDEFk}riaYTOLIGGGIMQV]dlu~]>=<;9Vl_elryukbZTOKHGGHKOT[ckttdjpg@A:Luzog_XRNKHGGHJNSX_fnw~tkbYPHGGGGGHMSA6{5xY`[{܃ bO;AMdtCBCDF|}riaYTOLIGGGIMQV]dlu~tn\M<;:8ftjlryukbZTOKHGGHKOT[ckttcha@A5\wzog_XRNKHGGHJNSX_fnw~tkbYPHGGGGGHMSZU6{4xSYSς bO;ArBACDV}riaYTOLIGGGIMQV]dlu~wne\WSVF?:87}`~ysmryukbZTOKHGGHKOT[cktpaf@AF^jwzog_XRz~tkbYPHGGGGGHMSZ`gC4wNRρ bO;j~U@BCWx}riaYTOLIGGGIMQV]dlu~wne\SJGHG@:87}IjwrmpyukbZTOKHGGHKOT[cktk^IADQ^jw~tkbYPHGGGGGHMSZ`gmDIr}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRH75y@b\vukbZT{ZI;DQ^jwnEFGGHIJKK]XSPLGB?<:99:=@DJPW_hroipwaEDCBBA@?ebGGGGHMSZ`gmtzcfl@A8Ks}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRX_B5y>Zk]I;DQ^jwDEEFGHIe{u{od[SLGB??BCFINSY`iq_hr~BBA?>==;:uoHMSZ`gmtzX@]PAEMZgswne\SJGGGGGGKRX_elb4wIMNNNNOOMJJJJJJJJ[]I;DQ^jw{BCDEhzog_XRNKHGGHJNSX_fnwYJ=<;9nlSZ`gmtzWZA:87}_~sgmtz]O;AMZgsuHFGGHIIJJJKKKKKKKKKKJJIIHGGFFEDDCBAAC}GGGGGKRX_elryrGEFGGHIJKUZTQMHB><:9:;>CH\]I;DtxTACLe{zog_XRNKHGGHJNSX_fnw~tkbYPHGGF@987}IjwpmtzbO;AMZgsHEFFGHIIJKKYTQMJC@<;:9:=<:Z}`X_elryukbZTOKHGGHKOT[cktt]dqM@=7Zzog_XRNKHGGHJNSX_fnw~tkbYPHGGGGGHMSR75y@bmbO;AMZp_DCDEFk}riaYTOLIGGGIMQV]dlu~]K=<;:Vw_elryukbZTOKHGGHKOT[ckttdjW@@?jwzog_XRNKHGGHJNSX_fnw~tkbYPHGGGGGHMSZ`B5y>[bO;AMp[ABCE^|}riaYTOLIGGGIMQV]dlu~wpneMC;:8NyzjlryukbZTOKHGGHKOT[ckttc]@DN^jwzog~tkbYPHGGGGGHMSZ`gQ4xOUbO;ArmCBCDe}riaYTOLIGGGIMQV]dlu~wne\SSRK?:97}_~xsmryukbZTOKHGGHKOT[cktp`I@DQ^jw~tkbYPHGGGGGHMSZ`gmc4wSbO;j~SABCWx}riaYTOLIGGGIMQV]dlu~wne\SJGGGB:97~6zjwqlpyukbZTOKHGGHKOT[cktkWB;DQ^jwzNNMMMkbYPHGGGGGHMSZ`gmtF4wbOew|pBABJ^z}riaYTOLIGGGIMQV]dlu~wne\SJGGGGC<87~6zDpjesukbZTOKHGGHKOT[cktjSI;DQ^jwzMNNNOOOOOOOOOOOOOOOONNNNMMLLylHGGGGGHMSZ`gmtz5ybepuk@AAF`}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGF?7}6zBhceukbZTOKHGGHKOT[cktn]I;DQ^jwLMMNNOOPPP`abbbcccdddddddddddcYONNMMLLKK|`GGGHMSZ`gmtzchne@A9Ir}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRP@5z@a\vukbZT]I;DQ^jwLMMNNOV]^_opqrtuvwwxyvos{{{|||{{{{zzyxncbWMLLKJJ]GHMSZ`gmtzcf`@A8Ys}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRX_C5y>Z`]I;DQ^jwLLMNNZ\iklnpqstuwxyz~qe[SLHGVegu~~}}|{zyxwbaVKKJImMSZ`gmtz_dJAGZgs}riawne\SJGGGGGGKRX_e^5y@ACDEFkus^JIZ{~xkmtzU?RJ;AMZgsvFGGHHHHIIIIIHHHHGGFFFEDDCCEnJGGGGGGKRX_elryQEFFGHIJKX`ZUUMGB><:9:;>CH\]I;Q]KLT^`cegjlnqsuwyz}jjtBCwYQKGGH]St{ijjjkk\NOMRYpus^IHg|wqmtz]O;AMZgsGFFGHHIJJJKKKLLLLLKKKKJJIIHGGFEEDCBBA@E}aGGGGKRX_elrypGHIth]ULGDBBBDGKPW^h]IIzjKLS\^adfhkmprtvxzimJqbYQKGGILR)a*b*d+e+f,g-h-i5|=FOQSTzq~xmnm{ywuiSIVzupjqzbO;AMZgsmFEFGGHIJKK_YUQNHC@<;:9:CtGGKRX_elrypbZTOKHGGHKOT[cktt]Ssx}XLMW\_bdgiloqsvxzmQWqRmaXPKGGIMSH-j.kXbkt|aglygab`}{xvtTITsnhctbO;AMZgshCDEFGHIf}w~rg]UNHC@BBCEHMQW^fnxfp{oBA@?>=<;Zu`X_elryukbZTOKHGGHKOT[ckttdin_LPZ]`cfhknqsvxzlg_l`WPJGG`l5z6{fbFweS@D`{{yvUJYe_ZjbO;AMZp_BCDEF}riaYTOLIGGGIMQV]dlu~oV><;:Z`vFFFFFFEE|VWYjrux|LfsvMIGHKOWzeVUQҿ_d@AGZgs}riwne\SJGGGGGGKRX_e^5y<:9:;>CHNV^hsu^`hyq~qeGHXbp^]\?RO;AMZgsEFGGHIIJKKLLLGFDCCBCDEGILOSWQGGFEEDCBBA@jJGGGGGGKRX_elryPGHthXRLGDBEKOT[ckt~zbdv}pdZ{nHLQYba`ؿ_?bO;AMZgsDEFGGHIJ]je_g]UNHC@<;:9:baGGGGKRX_elryqukbZTOKHGGHKOT[ckt~efh||ocZRtH@>???@@@@ffedbbO;AMZgsCDEFGHl~rg]RMIECBBCEV]dl^fnxB@?>=<\ztGGKRX_elryukbZTOKHGGHKOT[ckt~ijl|QKGH@jEEjihfbO;AMZgsaCDEFG~iaYTOLIGGGIMQV]dlu~t?><;:rmKRX_elryukbZTOKHGGHKOT[ckt~mno~fjlonmljbO;AMZgsvACDEF}riaYTOLIGGGIMQV]dlu~|bQ=<:9QmX_elryukbZTOKHGGHKOT[ckt~qrst____G^zmbXPtsrqoo?bO;AMZzABCDl}riaYTOLIGGGIMQV]dlu~wnee\]PA;98MwfelryukbZTOKHGGHKOT[ckt~yvwxyzZ[\\Z__jymaXPzyxwvtsbO;AMz|UABD^}riaYTOLIGGGIMQV]dlu~wne\SJJKE=986|]zmlryukbZTOKHGGHKOT[ckt~~tjmr|}~~GHJld[~}}|{yy?bO;Nw@BCQk}riaYTOLIGGGIMQV]dlu~wne\SJGGGE=986|GfsnryukbZTOKHGGHKOT[ckt~~tjaWMGccrp_}{~俀bOJx}P@BDRm}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGC=86|5yaljyukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGLlptks濇bWqvN@B=U~}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKL@6|5x\esu~tjaWMGGGGGGLSZahC4wLbdoLA>=e}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRXT6{4xW^~tjaWMGGGGGGLSZahoE;ehU@AHgs}riaYTOLIuwne\SJGGGGGGKRX_ZB4wQlHGGGGGGGFFFEEEDuaWMGGGGGGLSZahovFa\@BMZgswne\SJGGGGGGKRX_elD4v`HFGGHHIIJJJJJJJJIIIHHGFFEEDCBBCcGGGGGLSZahovj^I?AMZgswne\SJGGGGGGKRX_elrEBHEFGGHIJJKLLLIGEDCCCCEGILPTX]cGFEEDCBA@?DwGGGLSZahov}X?\C;AMZgsFGGHHHHHHHHHHHGGFFFEEDDCB\SJGGGGGGKRX_elryAFFGHIJslfth]UMGB><:9:;>CHNV^hsmCBA@?>@apGLSZahov}VSO;AMZgsFFGGHIIJJJKKKKKKKKKKJJIIHHGFFEDDCBAAmGGGGGGKRX_elrydHkaXRLHGGHKOT[ckt~A@>=<>vlSZahov}bO;AMZgsEFFGHIIJKLYTQMIC@<;:9:<;:Wdahov}bO;AMZgshDEFGHIJ}w~rg]UNHC@<;:EHMQW^NU]fp{CBA@?==<:ulRX_elryukbZTOKHGGHKOT[ckt~~tjaWROLB:97~_|woov}bO;AMZg{y_CDEF}riaYTOLIGGGIMQV]dlu~]K=<;:nzc_elryukbZTOKHGGHKOT[ckt~~tjaWMGGGB:97~6ziuokv}bO;AMerABDE^}riaYTOLIGGGIMQV]dlu~wzpieMC;:8NytelryukbZTOKHGGHKOT[ckt~~tjaWMGGGGG@87~6zTmhg}bO;AYWBCDe}riaYTOLIGGGIMQV]dlu~wne\SSRK?:97}`~yqlryukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGLF75zAf`ubO;]SABCWx}riaYTOLIGGGIMQV]dlu~wne\SJGGGB:97~6{jwrmryukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGLSR@5y?^bbOfx}qQABJ^z}riaYTOLIGGGIMQV]dlu~wne\SJGGGGC<87~6zDpkiyukbZTOKHGu~tjaWMGGGGGGLSZaO5y=VbWpvk@AAF`}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGF?7}6zBidf~tjaWMGGGGGGLSZah`5xKbinf@A9Ir}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRP@5zAb]vFGGHHHHHHHHGGGFFEEDDCr~tjaWMGGGGGGLSZahoe4weg`@ABYs}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRX_N5y>[lFFGHHIJJJKKKKKKKKKJJIIHGGFEEDCBBAnWMGGGGGGLSZahovF`eJAGZgs}riawne\SJGGGGGGKRX_e^5y<:9:;>CHNV^h^cjr_EDDCBA@?e~GGGGGLSZahov}]QABMZgswne\SJGGGGGGKRX_elc4xJFGHIzth]UMGB@BBDGKPW^fozhsoBA@>=<w^GGLSZahov}W[A=;XsZLSZahov}V?SJ;AMZgsvFGGHHHHIIIIIIHHHGGFFFEEDCCBsnJGGGGGGKRX_elry{ukbZTOKHGGHKOT[ckt~YI=<:9k}aZahov}]O;AMZgstGFFGHHIJJKKKKLLLLLLKKKJJIIHGGFEEDCCBA@E}aGGGGKRX_elryukbZTOKHGGHKOT[ckt~~tji``JA;98~dmahov}bO;AMZgsmFEFGGHIJKK_YUQNHC@<;:9:CtGGKRX_elryukbZTOKHGGHKOT[ckt~~tjaWMJLF=98Jp~skov}bO;AMZgshDDEFGHI~w~rg]UNHCBBBCEHMQW^fnxtp{oBA@?>=?|mKRX_elryukbZTOKHGGHKOT[ckt~~tjaWMGGGE=986{Fvqnv}bO;AMZgsbDCDEFG~si]TOLIGGGIMQV]dlu~c?>=<;ZumX_elryukbZTOKHGGHKOT[ckt~~tjaWMGGGGGC=86{E`ir}bO;AMZp_BCDEF}riaYTOLIGGGIMQV]dlu~oV><;:XbOJx~xBABKbx}riaYTOLIGGGIMQV]dlu~wne\SJGGFB:97~6{Yvqlny~tjaWMGGGGGGLSZahoDDbOqv|p@ACO^}riaYTOLIGGGIMQV]dlu~wne\SJGGGGG@97~6{DojesuGGGGGFFFFEEDjaWMGGGGGGLSZahoe4xbdotk@AAFo}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKE86{4w[c^FFGHHIIIJJJJJJJIIHHGGFFEDDCBAMGGGGGGLSZahovjchme@A5W}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRPA6z4wU\lrFFGHIJJKKLLIGEDCBCCEGILPTX]GGFEDDCBA@?{GGGGLSZahov}bf_@ACYs}riaYTOLIGGGIMQV]dlu~wne\SJGGGGGGKRX_Y5z4vZ`EFGHIJ^lfih]UMGB><:9:;>CHNV^hsDCBA@?>`tGGLSZahov}_c@AGZgs}riwne\SJGGGGGGKRX_e^5y=<;:olZahov}VZC;AMZgsNNNNNNMMMe\SJGGGGGGKRX_elrg@ukbZTOKHGGHKOT[ckt~~niO=;:8gghov}RO;AMZgszMNNNOOOOOOOPPPPOOOOOONNNMMMLLJGGGGGGKRX_elryukbZTOKHGGHKOT[ckt~~tjaWWSL?:97}`}xkov}bO;AMZgsLMMNNOOPPP`abbbcccmvwwneeeddddcOONNMMLKKrzGGGGKRX_elryukbZTOKHGGHKOT[ckt~~tjaWMGGHB:97}Hivplv}bO;AMZgsLLMNNOV]^fopqrtuvwwxywqt{{||||||{{{zyyxccbMMLKKJktGGKRX_elryukbZTOKHGGHKOT[ckt~~tjaWMGGGGC@87}6zdnhr}bO;AMZgsKLMNNZ\ijlryqstuwxyzth]UcIGGdgj~~}|{{zywla`LKJIemKRX_elryukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGL?7}5zBfaubO;AMZgsgLLMSYegikg^kxocgqcIGGJOasZNNNNddxvk`KJIHymX_elryukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGLSR@5y?_cbO;AMZzzKLLQWbdfikmoc^kxO8czjMIGHjzk^RRRS^ihH]]]]vj_JIHrfelryukbZTOKHGGHw~tjaWMGGGGGGLSZaB5yGWbO;AMzKKLU_acfhjloqstkpyi88`kW=mSMHGHpppTUUVVVWWg`>@ABDEFSvt_TIHkzmlry~tjaWMGGGGGGLSZah`4xLbO;N}]KLT]`begilnprtvxz~9vaDg[SLHGHKaejjjkkkkkkROPQYivthJHWs}xsnry~tjaWMGGGGGGLSZahoe;bOJx}xKLP[^`cfhkmortvxzrg}J_e[SLHGHKP)a*b*d+e,f,g-h-i.j=>?QRk|s~xmmtzxvsTIHnvqljyvGGGGGGGGGGFFFEEDDr{WMGGGGGGLSZahovFbWqv{sKLV\_adfilnqsuxz|MQmRpdZRLHGHLQ]-j.kV_hqzvfk~kYe^s}{ywuiIHiojesvFFGHHIIJJJKKKKJJJJIIHGGFFEDCCBACcGGGGGLSZahov}bdotnLMW\_begjmortwy{ySCHNPTY]cjFFEDCBA@?AhwGGGLSZahov}ehmhLMW]_behkmpsuxzul_ocYQKGGH5z6{NaF|jWE=Xt|ywkJQfa\lFGHIJzslth]UMGB><:9:;>CHNV^hsoBA@?>=bZLSZahov}`ejMNU]`cehknqsvy{_ncYQKGG89`aKjtnjtjTZv}{xVKV_Y_rvkaXPKHGGHKOT[ckt~f@?=<;[}aZahov}^cZNO]`cfiloqtwy}_nbYQKGu<=aPcZp~{cLP\WRukbZTOKHGGHKOT[ckt~X>=;:Smahov}X\aTPW`cfiloruwzg_maXPKb?JYUfuvtp|NLZUPukbZTOKHGGHKOT[ckt~~tiiXJ<:9Nx~shov}VY^PQYcfilorux{}QqylaXPJ_B]ZzeV|ONXSqukbZTOKHGGHKOT[ckt~~tjaWMONB;97~J|wqnv}W\QS[filorux{~Sxl`WOHAEFUulHQOUPukbZTOKHGGHKOT[ckt~~tjaWMGGGD:97~6{huoir}UԿYST^hlorux{~wwk`WOJEFGHIJ[bmRQRtukbZTOKHGGHKOT[ckt~~tjaWMGGGGG@97~6{Cmgg}VVVWkorux{~Z:wj_VOJGHJLQVy~bTROukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGLF86zAe`mV?WWXdqux{~MLvjxNJGGJNUxtVURukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGLSZA5z?^XX?XZ[nw{~^uitIGGJNsYXUukbZTOKv~tjaWMGGGGGGLSZa[5y=VZ?[]^t}__uhpGG{}\[{~tjaWMGGGGGGLSZah`5xK]?^׿_ayuth]GGmV_q_]tjaWMGGGGGGLSZahoe4waؿbcmsg]}GKOVca`vFGGHHHHHHHHGGGFFEEDDCrWMGGGGGGLSZahovXd?efg|sg\TvHC<==>>???@@@@AgedIFFGHHIJJJKKKKKKKKKJJIIHGGFEEDCBBAC~GGGGGLSZahov}gijkxoMHGHEmFkihuFEFGGHIJKLZTQMHB><:9:;>CHNV^h^cjr_EDDCBA@?A^GGLSZahov}kmnopdhjxpomljwhEDEFGHIzth]UMGB@BBDGKPW^fozhsoBA@>=<_mLSZahov}oq޿rstu___F3|~pe[RKutrqeW[i~DCDFGHvk^TOKHGGHKOT[ckt~a?>=;=vaZahov}tvwxyz{Z[\{__g}pdZRvzyxwvnc=@N[{^BCDEfukbZTOKHGGHKOT[ckt~YI=<:9jvahov}yz|}}~cGHho]~}|{zy?gR=@Z{ZABDEsukbZTOKHGGHKOT[ckt~~tji``JA;98~c~xkov}?^r~{~俀gR=N{CBCPrukbZTOKHGGHKOT[ckt~~tjaWMJLF=98Jn|vqnv}?濉gRLx}TABI]rukbZTOKHGGHKOT[ckt~~tjaWMGGGE=986{Ftoir}gYpv{OABIfukbZTOKHGGHKOT[ckt~~tjaWMGGGGGC=86{D^ga}ghnsNA?=vukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGLL@6{4wX_mgflLA;MwukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGLSZM6z4wRXbdIAFSiwukbZT~tjaWMGGGGGGLSZa[5z=U\XAEN[iw~tjaWMGGGGGGLSZahoDBYH=@N[iwtFGHHHIIIIIIIIHHHGGFFEDDCCqjaWMGGGGGGLSZahoe4xWL=@N[iwtFGGHIIJKKLLLLDCBCCDGILOIHHGFEEDCBA@?MGGGGGGLSZahovjeѿR=@N[iwlEFGGHIJ[f`Z]UMGB><:9:;>CHNV^hszDCBA@?>c{GGGGLSZahov}gR=@N[iwgDEFGHkth]RLGDBBBDGKPW^fozA@?>=;{tGGLSZahov}gR=@N[iw`CDEFnkbZTOKHGGHKOT[ckt~Y?=<;VmLSZahov}gR=@N[i~\BDEaukbZTOKHGGHKOT[ckt~rTG<;:QlZahov}gR=@NfXBCDjukbZTOKHGGHKOT[ckt~~tja\WXF;:8Muvghov}gR=@ZiABD[ukbZTOKHGGHKOT[ckt~~tjaWMGIH@:87}H}xkov}gR=\sRACMdukbZTOKHGGHKOT[ckt~~tjaWMGGGG@<87}5yeplv}gRfwm@ABJuukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGG?7|5y_hr}gYpg@A6ZukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGLSI6|5xZaughb@AB[wukbZTOKHGGHKOT[ckt~~tjaWMGGGGGGLSZaB4xTcffJAK[iwuk~tjaWMGGGGGGLSZahC4wN^Q>AN[iw~tjaWMGGGGGGLSZahoE<[C=@N[iwzNNNNNNNNNMMMaWMGGGGGGLSZahovF[R=@N[iwzMNNNOOOOPPPPPPPPPPOOOONNNMMLLxGGGGGGLSZahovjgR=@N[iwuMMNNOOPX_aabjtuuvwwxxxyyyxxdddccNNMMLKKp_GGGLSZahov}gR=@N[iwLMMNOU]^lnpqrtuvwxztaieca}}}}}||{zzyxmbaMLKJJpGLSZahov}gR=@N[iwKLMNYZgifhpxxzmal{JGGKPk~}dccnxva`KKJI}lSZahov}gR=@N[reKLMW]egikmWdra7leIGGK^zviOPPPQQ[yxvj`KJI_zdahov}gR=@NqaKLQ[adfikmorfes_S:hlNIGHnnSSTTUUlN?@BCQ^uiTIHo~shov}gR=@s]KLT]`cehjmoqsvxzx9jl]AttUNIGH\ccrrrO`qubtcWLIGIYhuiTIHw}woov}gR=j~yKLPX^adfilnqsuxzur{H\^UMIGHLQO^^*c+e+f^LCLNPRSUpnmm[dywuhSHU{uplv}gRew|tKLW\_behjmpruwy|SZuQi^TMHGHLR7x-i@ZcmwWHdjpwmiq}{yvtTITsnhh}geotnLMW]`cfhknqsvx{uICxZvi]TMHGHLy1p1r]~vbO>????edcٿa?g?hikrNIHE@jEhjhgڿf?jlܿno}}ilnonlkܿj?o?p޿rstu___F2zxj_UMtsrqotvwxyz{YZZ|__~wj^UMzyxwvtt?z?{|}~rCEVzt`~}|{z~係?翋?????? ??(       ::>H?HAWDDŽDDŽDǃCs@E@D?D CY$;^AFGIJJKHFFGJHGFDCB@=R4t  !!!"""""""""""""!!! &To9<DGPdrpbVJB??DLYi}zW@>;r6z# 7z<@jCˆEɵGHIIIIHHGFCA=9~/hX""#$$%%&&''''(((((((''''&&%%$$#/iY@Erq\PJGIQ\j}N<:6{B 1l,>iDƴFHSY\SKD@>@DKUbkrqiCA<5x$PlQ**++,,,----...----,,,++**&UqQ?Jpk\PJGIQ\j}pcUF<8~3t3 =iBôEeyeTKFIOZhzgB:/j".=11222233333333222110/6yBWk\PJGIQ\j}p^MGE?84x ;iBNn]RKGIOZhzlSC9.i (C7778899999887776659@ak\PJGIQ\j}p^MGGHM@4w -f-@Ikn]RKGIOZhzsaOHD;5y#Pox===>>>>>>>===<<;4uE_~~p^MGGHQ^S3u 3r<@J~n]RKGIOZhzsaOGGGF9*`BCCCCCCCCCBBAA)L@Kd~^MGGHQ^kY/k5 2q]hH  \‰PwzQDJsn]RKGIOZhzsbVJ?9Hpor^[\]]]\[ZYXWVWQFb~p^MGGHQ^VBJH  ]ĈjoHBYn]RKGIOZhzsaOGG@9=eb[YYZZZYYXWVUTN@Kd~eMGGHQ^k]5uH  [ʈgI?^n]RKGIOZhzsaOGGGMI>ZHUVVVVVUUTSRQTBKd~uTIJKJHGGGHJMQFEDOooGHQ^kwaG  YдQE_zsaOGGGO\^?=~QQRRRQQQPOONYBKd~rFGjw{thVJBAELVel}k@?hoU^kwrG S̖CGaznOGGGO\ii@XyLBXo/g6xABIIIIIH[BKmsKL{k\PJGIQ\j}UABmhkwsF XhEGazuHIJKKIGGCFJMPQEDCdvMGO\ivZEH`a]UKC=:=F]BgpHQzk\PJGIQ\j}p`TG=ClzowuE ^džEGazrFGkylXKDBDKUctT?XyW\ivybSJGJR_pibwZD^k\PJGIQ\j}p^MGF@9JhovE ^ȅEGjxKLn]RKGIOZhz^D[oC_ɄEaoHP{n]RKGIOZhzsaUJ?>^{oup^RJGJR_pgQIb~p^MGGHQ^VCPB`˃_yYC\n]RKGIOZhzsaOGGB;Bfkp^RJGJR_p`@Kd~ukIIJJJJIHGFE[reMGGHQ^k];@cЂkT?en]RKGIOZhzsaOGGGOK;VBKd~[HU^f\UKA<:>aip^rwuwvX[ipv||cRLyUTtyPQMcՀgJCln]RKGIOZhzsaOGGGOP;VVZou|zzQHJPgSOP^׏PFazsaOGGGO\eBkHIJKJFFHIKYf{cyH[}YTPVԯAGazu_IJJKHFFGIJGFECrUGGGO\imGHfvpfWJB?@FP_rqlwj[fv^\0`ЀEGazmFPetneXLC??CKWfzb@Zz_GO\ivu^RJGJR_pjzcHVkcـbЀEGa}iE`s]RKGIOZhzT?P{c\ivp^RJGJR_pw}ink`ibЀEGrYGjn]RKGIOZhzsdWH=Cstjvp^RJGJR_puvTlzs]xus0bЀIklBSn]RKGIOZhzsaOGF?9Olup^RJGJR_pp\QYdduτ忂䏁p@bЀbU=[n]RKGIOZhzsaOGGGME?cp\JGGJWeKH€ @@cՀZEZzsaOGGGO\UBvvvIHHGRtsQGGJWesYĀ]׏BGazuuutaOGGGO\i`Y\HIYWSKC?>AGP]anh_CAhcJWes}ZџEGazuHIJMKICBCFKOQUPDCdoGGO\iv|eSJEJR_pc=Tces}bЀEGazqFQsiXKEBDKUct^?WpS\ivp^RJGJR_p~cN?Eqos}bЀEGhxKSn]RKGIOZhz`I;`hivp^RJGJR_pp\JGB9Hnm}bЀEZtHVn]RKGIOZhzsaRK@9Ywovp^RJGJR_pp\JGGIG=Yl܀bЀYvUCen]RKGIOZhzsaOGGC=Bbmp\JGGJW[AR΀dӀkJAln]RKGIOZhzsaOGGGON;WvkIIJIIHGFEs~\JGGJWejA_؀QGazsaOGGGO\bE`RH`e]UKC<:=FQ]m|zcASgGJWes}WԿAGazvvvuuut{OGGGO\iiybSJGJR_pqDKreWes}`ЀEGazSHINOLGDCCFKQWU\ECBlYGO\ivp^RJGJR_prbPB?bvis}bЀEGa|VF\|iWKEBDKUctg?Fl_\ivp^RJGJR_pp\JGC=Dgr}bЀEGr^DYn]RKGIOZhzbK;T}tjvp^RJGJR_pp\JGGJM<\ubЀEgdCVn]RKGIOZhzsaQK@9Tvpup\JGGJWbBNɀbЀcuMCen]RKGIOZhzsaOGGD>:aivvvTHSutspJGGJWenFcՀgJCln]RKGIOZhzsaOGGGOP;VrGIUTRKD?>AGPY`nbUBV{zRJWes}^׏PFazsaOGGGO\eBk}fTJEFQ_pxV=bvZes}VԯAGaz{{{{{{{{zUGGGO\imp^RJGJR_pdM>Qwks}`ЀEGazyNTW`bglmmmpppoed^XMj_GO\ivp^RJGJR_pp\JHA9Lnp}bЀEGa}zUU]bhvnnQNYs~jihb[Mmc\ivp^RJGJR_pp\JGGIG@`ubЀEGucQZdinnhRKHxxjZTUUKS^bYSvjvp}p\JGGJW[@R΀bЀIkePZbglquwxSWKHV_]]]Ehlfc]^upT^wpu\JGGJWefAbЀevVU_diosxrU}voVJHS]?eVr~wbQlfjHIJJHGGGIKOOFDCpgGJWestۀcՀjVV`ekpvxiVJZQueրSFc~p\JGGJWeKJÀ[րDGc~{{{|e{{{zQGGJWesPdҀHGc~mPV_ajlnttozsqpmd`WVy^JWes}gҀHGcwVV^gcwulyHIgzfededSdaes}gҀHNlPYdinsm|hdXH^zzpbcc^QKVj\U{ns}gҀRwsRYaglqvsnctQHJNEWF?LtqinzpTcrn}gӀifO\cinty{^cQHV@eYEzx[[cl܀bրeQ\djpvbPT>rpbslxN]VԀZրZUdjqwxaO[X~sZUQӀV`VYjqw~wy`NLdIv[RM@W՟Ynw~wNHLmUQ`[֟b{tvG_X``pf|tfxJta^0g i۟q}[yjf`o qޏt߆^x^{rޟo@z |`~㟀lfu}~|py0 @@p瀋瀋瀋瀋瀊瀉@@ ???????(@     =Q':_C˜HNJGGKRWC@YCÇGʴIGEGJDA:,dZ%&'())))))('& H`@>g\JK_Z@91p 0l+BaoSFLaqF5x6JK3444444321m}U}ZJK_nMD>2r3 >]kQHQk^G?,d>????>>*_yMnMGSX.h$ =_^GIU:tIJJIHGLOlQJFCKR]r^SmsE Ny-GewmKJJJkuoI^mSSSSQPO]_p[JK_aHjunqG ]LHtdHoxgRGFWu`BijxZ[[ZXVZdU}ZJK_nMDC`gH ]Lf]LkQHQk_B>ar[\\ZYVJMnMGSX>H QKTVkrv}^GIKRTUUTSQMOdQKCDLR]giSmpG NJFewwvuUI^\2o=CDFFS]^pZJK_aA`yorFcGHi`vxfREFWx[Xxcx`JLbieX}ZJK_nMEC`mDgE\mQkQHQk^DEgv\JLb\Nvw{tMGSXDAcBZUk|v}^GIKZlOoifVJGRfkvpiSm}@]@FewwvuUI^euJLJFGS]jb}ZJK_sHGeo}@o@HkavxiRFLaeX}cx`JLbfNm}ZJK_nMGHKt@o@\lXkQHQk^CFfv\JLb\O[GShO@f@ZX|v}^GINXmOqZst{byrd[w~_m}@]@DewwwuUI^it^SJGNYkmYgpjqdNc]OKSfdpp}@o@Hnzb~|iRFLa_T{}fx\JLbjW_k|sR[JU{Qh^a@o@\hTkQHQk_CGbv\JLb_]lxoPQQQ@f@TY|v}^GIPXpbxkKR\@DenMHGIMVn{[I^irnZKHTmu|Reُo@Hn{apQHQk~OYkfx\JLbpi o@XVrkQHQk^FBPuwa`V~z濢뿯ꏀp|@e@Jb^GI[WwxvtwuZMgài@HekWNGIQ\YdpS^q{`JGY|jMpyl|o@Ltr_kQHQkTJpox\JLbYED]uo@eS~kQHQk^GDKlww|YGMYMĀ[@Gd^GI^XlcXJHTlzg{jRgrۀi@He|eWOHIQ`edc|]^\JLbX@Yk|o@L{gXkQHQkUDjsxrwxYGKMgրo@aO~kQHQk^GDGkxxxwuTMgdрZ@GddGI^`}`JGY|hSppi|h@Hefgl{hgeqeu]^}\JLbYDD]xo@L{nYfponP_z]ONTcotxYGMYNĀo@eUalyk|J[>U`oam~oRKEMPUepyRgrۀY@Vbnpez[vl_\JLbzLJro|R Un{sHPp\JLbYGENl܀Z0j{vfGMcMenݟ}|vlcXJHTl}zgydg|uxP䏁㿆ߋ{~쿖xݏ\pX\JLbV@[m|n@ZWrwxYGKM^Ӏ]@GgvoJGGLTy~TMgdрu@Jqrd_JLbtJcei|u@cT\JLbYFB\xg@Jg_GM\Om@Jiwdrg^rkb_g|u@Uxa_lkoaRbRTWZjoo|o@bVfqpOk6|dS|[cـU@VfssLyc^QpVԿpiOYLeڏIhڏ\m ~⏗ߪmy|m @`瀋耋瀊瀈P@???????????(0`   >6BDBC 'Ws=K??>=1n`v_GRM EyYH\0]sMMLJIg{\UJRcvy{uaq hKMt[YLGNape`xqeZXXWUSalYIXZAYm  hLdQuwPJcLC`S[\ZWF`eGRZ  QJKtRHT;vR$Oh~%Pi~%Qj|Jg]UKRgzv{zaqcHM{{YMGNbp{{m`qmTHPc`lYIX]BYmsD[iuwPJcMIe\I[U`gvzeGR[gAKwRHT|egz{nYJVvqo`dr޿q@M|WOHNburscqkTHP_TYIX_EKjؿ{@^`xwPJcMIe\I[TcGTeӿh@KwvRHV{emm^u_veXkor޿q@M~xXOHNb{}r~scXGSg[bvolONe}\{cjۿ{@b_wPJcMJa\kedtxYni{Sӿ`@KwoT|zRHV{vtZnM~QPp@M~~sdQH[vd_fc]I[a {@[\wPJcQBUoZϓ|`v _@Jyx_H\o\IJZs_im@{@M|tlQGZagnh\I[yIQj@{@c]wPJcRCRIRiOJUV@_@JymH`jo[JX|^_ek@{@P~okrPGZ\`wk\I[OC_@{@c]wPJcRDTxuwwJdO@_@JytH`^I[oRao@{@PxcaxkapVSlxkvOHNi@{@e[i}kPN7DDDBA!:9FņIňCEš>.gX%'(('&3rfzӸwTOytB6z!5x9nPV~C,_|w===<~}yNON# Qyh^QQPUswTOy}fflF alPVsIgZ[XH߅~yNQQG Sy{\Z3p;|DZswUOz}ffmE_wPVsNiZQTgLhUQXARy{\ZzxbsVOSaw@_zPVuMeZQUbT`@Rz|\W|zfnbmyOZXjmq@_|PVvMe{|dlwO}uV@RNQsxT[[Mn~q}[}PVJ_|yas⿶0Uy{{_^}SOogm[PVE[MGZSz|ebXQn\i^PVEZ|{[]SffZQ{Mib`~}Jfmlk{zzd`^v]uf|Ibh0ߪ}M~di|0UP퀡@f֟blNF]]πh|TP|SfX̀n|HZbрgkgxV_VsqWՀf|QbS0tߜnbPP߀{߯Pq(0 KKKKKKJJ!! IPKKKKKJ̮JڗQmvF $I>:KTQypKSo`{SRW@h}LdRLsKKQzLKKKLydKTn^LO[WQ{kLlSLSVKTyQyTZLyRKQ{LTUOeWRXnKTy[LN\[SkYzmK}KSY[PV^`VpP[U\WKKKKVUbTPWTM^XKYN\YKTTmSPeYKKwla\kK^~KYuxKK̈́VKKKKK`}LLTVKKS^zKxKbWqQxt~ccb_NĈv]KvL͚KKKKMKhhhg??(  QIIDIQQQԌQIIDIQQԲQ]qQISISQIiQIS^I_ZIIZPENuQ9IX}IqZIIevftQlQXIzQI}iQ~QUxIVVQQoJNQQeQQQ}_tQpQQQo_QQcQQQQQQQoZMTuQ{yQRQzQo_tIQIyQQlQ^IQQ^h[`Q]cIYQQRQQQQqIQnaGQQfQW+QQQQ^Vֲ ڀД7h7hДwxbanker-0.9.1/locale/0000755000175000017500000000000012243601243014540 5ustar mrooneymrooneywxbanker-0.9.1/locale/ar/0000755000175000017500000000000012243601243015142 5ustar mrooneymrooneywxbanker-0.9.1/locale/ar/LC_MESSAGES/0000755000175000017500000000000012243601243016727 5ustar mrooneymrooneywxbanker-0.9.1/locale/ar/LC_MESSAGES/wxbanker.mo0000644000175000017500000000414312243601243021107 0ustar mrooneymrooney%@AJ \i p{ +,&B^ cq.64 JWj" 6C+$o-79 BO X     AccountsAdd a new accountAll accountsAmountCSV importCSV import errorDateDecimal separatorDeleteDescriptionHide CalculatorImportPlease enter a number such as 12.34 or -20.Please select an account and then try again.Remove the selected accountRename the selected accountSaveSave changes?Show CalculatorSorry, an account by that name already exists.SummaryTotalTransferWarningProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-02-03 00:18-0800 PO-Revision-Date: 2009-04-07 12:42+0000 Last-Translator: Kaïs Bejaoui Language-Team: Arabic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5; X-Launchpad-Export-Date: 2010-02-04 04:46+0000 X-Generator: Launchpad (build Unknown) الحساباتأضف حسابا جديداكل الحساباتالمبلغإستيراد CSVخطأ في إستيراد CSVالتاريخفاصلة الكسر العشرياحذفالوصفأخف الحاسبةإستيرادالرّجاء إدخال عدد مثل 12.34 أو -20الرّجاء إختيار حساب و إعادة المحاولةإحذف الحساب المختارأعد تسمية الحساب المختارإحفظحفظ التّغييرات؟أظهر الحاسبةعفوًا يوجد حساب يحمل نفس الإسمموجزالناتجحوّلإنذارwxbanker-0.9.1/locale/bg/0000755000175000017500000000000012243601243015130 5ustar mrooneymrooneywxbanker-0.9.1/locale/bg/LC_MESSAGES/0000755000175000017500000000000012243601243016715 5ustar mrooneymrooneywxbanker-0.9.1/locale/bg/LC_MESSAGES/wxbanker.mo0000644000175000017500000004571712243601243021111 0ustar mrooneymrooneyT  O *0 6 DNTp    ,=Zj     3(=f   ! .= |%#5  V cqy % 'H N[(o" Z;, @J+R,~9C BL)c"$+Pc'v  >Td.7%]bglv+,j<5MQ+B} Pb$ C    !!!!2!&A!h! n!{!!! ! !&!!! !! !! ""L%"Mr""O"Q#i#p#x#### #### # ##%s%& & ,& 6&'B&j& ~&%&7&&Q' Y'6f'"'+'$'(+(U4(9(#(/())AB) )&))+)) *-*H**[*;**H*1'+Y+b+'+++++ +.+-,,Z,:r,,,-----*.G=..s/ /://"/50LS00&00 0E1`1g191 1;12L2Id2 22#2>2.<3k3;393%30!4-R44S5-T6 66?6H6.7=7g[77M8)b8Q8898:-9/h979=9":1:QG:$:8:O:G;N;_;+r;V;);(<5H<@~<8<,<I%=?o='=X= 0>6>> u> >>>> 6?D?S?m?I,@Nv@@[YAAHBBkCrC CC7DE)E#E4F7FLF]FvF9FFFFF G""GEGFaGGGGGG;H9?HyHzH IIIjJ K K )K7KHKXK]KuKKKKKq)S$Bpi?`dW=x.UfC H ~0ztKL+_']8\;9r&4n#/w glEkvOG<({2JuayY>XDmTc}N[*AM j "o^7:1-6bR,%hV3s eIQ5ZF@|P! and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.Not synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2011-08-28 14:52+0000 Last-Translator: Dimitar Dimitrov Language-Team: Bulgarian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2011-08-29 04:31+0000 X-Generator: Launchpad (build 13794) и %s%(num)i повтаряеми транзакции имат готови общо %(totalnum)i транзакции.&Относно&Валута&Файл&Помощ&Съобщаване за грешка&Настройки&Изглед'%s' не е валидна сума.В момента има активно търсене.Име на сметкатаИмената на сметките не могат да бъдат празниСметкиДобавяне на %s към калкулатораДобавяне на етикетДобавяне на нова сметкаДобавяне на етикетиВсички сметкиСумаПо време внасянето на csv файла възникна грешка.ЕжегодишноНа всеки %(num)d годиниЗадавен на a &въпросЗадаване на въпрос онлайнАвтоматично запазванеАвтоматично запазване на променитеБалансНастройки на CSV файлаВнасяне на CSVГрешка при внасяне на CSVCSV профилиОтказИзчистване на търсенето?ЗатварянеРазделител на колонитеНастройване на избраната сметкаАвторски праваСъответстваща регистрация в Mint за %(name)s:ЕжедневноНа всеки %(num)d дниДатаФормат на дататаДесетичен разделителИзтриванеОписаниеОтхвърлянеКодиранеКрай:Въведете тази транзакцияНа всеки %(num)d седмици в %%sИзнасяне в CSVИзнасяне на транзакции в SCV файлФайл за внасянеНапример слагайки отметка и въвеждайки транзакция от 50 лв. в тази сметка, ще се извадят 50 лв. от сметката, която сте избрали като източник.ПетПетъцитеОтДиаграмаЗабавлявайте се!Скриване на калкулаторСкриване на разширени опции за търсенеАко е поставена отметка при добавяне на транзакция, ще бъдете запитани за сметка, която да се използва като източник на трансфера.ВнасянеВнасяне от CSV файлВнасяне на транзакции от CSV файлНачален балансИнтегриране с Mint.comНевалидна сума на транзакцияИзглежда, че за първи път използвате wxBanker!По-малко опцииРедове за пропусканеСъвпадение: Интеграция с Mint.comУдостоверяване за самоличност в Mint.com:ПонПонеделницитеЕжемесечноНа всеки %(num)d месецаМесециДопълнителна информация за wxBankerОще опцииПреместване на тези %i транзакции в сметкаПреместване на тази транзакция в сметкаНикогаСледваща сметкаНе е избрана сметкаВ полето 'Сума' няма въведено нищо.Все още няма общи етикетиНяма описаниеЗа валутата "%s" няма обменен курсНяма съответстващи транзакции.Все още няма етикетиНе са въведени транзакции.Без синхронизация с Mint.comОбърнете внимание, че включването на автоматично запазване от менюто Файл, ще премахне нуждата от ръчно запазване.Веднъж създали сметка, можете да добавите транзакции към нея (напр. вашият начален баланс), използвайки контролите под мрежата, долу в дясно.Презаписване на профила?Парола:ИзпълнениеМоля въведете число като 12.34 или -20.Моля изберете сметка и опитайте отново.ПрегледПредишна сметкаВече съществува профил с името '%s' exists already. Презаписване?Библиотеката на Python simplejson е необходима за зареждане/запазване на csv профил.ПовтаряемаПовтаряеми транзакцииПовтаряемата транзакции е добавена успешно.ПремахванеПремахване на избраната сметкаПремахване на тези %i транзакцииПремахване на този етикетПремахване на тази транзакцияПреименуване на избраната сметкаПовтаря се в дните:Повторения:Онлайн съобщаване за грешка на разработчикаИзискване на валутаИскане за нова &функционалностИскане за включване на нова функционалностСъбСъботитеЗапазванеЗапазване на промените?Запазване на името и паролата в ключодържателяТърсене за този етикетТърсене на транзакцииИзберете валута за показванеИзберете файл и натиснете "Преглед"Изпращане на %s към калкулатораПоказване на калкулаторПоказване на разширени опции за търсенеПоказване на сметки с нулев балансПрости лични финанси.Съжаляваме, вече съществува сметка с такова име.Начало:Изваждане на %s от калкулатораРезюмеРезюме:НедНеделитеСинхронизиране на балансите по сметките със съществуваща регистрация в Mint.comЕтикет:ЕтикетиЦелева сметкаБутоните в контрола за сметки ви позволяват да добавяте, преименувате, настройвате и премахвате сметки.Изглежда, че кодирането на файла не е '%s'.Първата транзакция ще се осъществи на %(date)sПовтаряемата транзакция "%(description)s" има %(num)i готови транзакции за %(amount)s на %(datelist)s.В момента тази сметка няма повтаряеми транзакции.Тази транзакция е маркирана като трансфер. Моля изберете сметката на трансфера.Това ще премахне безвъзвратно сметката '%s' и всичките нейни транзакции. Продължаване?Това ще премахне безвъзвратно тази повтаряема транзакция. Продължаване?ЧетЧетвъртъцитеВремеЗа да започнете, добавете сметка, като използвате контрола за сметки в горният ляв ъгъл.За да премахнете този етикет по-късно, просто го премахнете от описанието или цъкнете с десен бутон върху транзакцията.За да използвате библиотеката за изчертаване '%s', инсталирайте следните модули на python: %s.Общ баланс във времето&Превеждане на wxBankerПодробности за транзакциятаТранзакцииТрансферТрансфер от %sТрансфер към %sПревеждане на wxBanker на друг езикТенденцияТенденцияВтоВторницитеОбновяванеПотребителско име:Преглед на &ЧЗВВижте често задаваните въпроси онлайнВниманиеСряСредитеЕжеседмичноЕжеседмично в %sЕжеседмично през делничните дниЕжеседмично през почивните дниДобре дошли!Когато е изключено, сметки с баланс 0.00 ще бъдат скривани от списъкаЖелаете ли да изтриете текущото търсене и да направите тази транзакция в "%s"?ЕжегодишноМожете също така да сложите етикет на транзакция, като поставите #именаетикет навсякъде в описанието й.Направили сте промени от последното запазване. Желаете ли да ги запазите преди да излезете?_Общобалансденднизасеченона всекиотмесецмесецаежемесечнонадо %sседмицаседмицигодинагодиниwxbanker-0.9.1/locale/bs/0000755000175000017500000000000012243601243015144 5ustar mrooneymrooneywxbanker-0.9.1/locale/bs/LC_MESSAGES/0000755000175000017500000000000012243601243016731 5ustar mrooneymrooneywxbanker-0.9.1/locale/bs/LC_MESSAGES/wxbanker.mo0000644000175000017500000000254012243601243021110 0ustar mrooneymrooney\   ' , 8DK[c iv    29 @L U    &About&Help&SettingsAccountsAmountBalanceCSV file settingsCSV importCopyrightDateDate formatDescriptionImportShow CalculatorSummaryTotalTransactionsTransferWarningProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-02-03 00:18-0800 PO-Revision-Date: 2010-02-03 09:27+0000 Last-Translator: Michael Rooney Language-Team: Bosnian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2010-02-04 04:46+0000 X-Generator: Launchpad (build Unknown) O progr&amu&Pomoć&PostavkeRačuniIznosBalansPostavke CSV datotekeCSV UvozAutorska pravaDatumFormat datumaOpisUvozPrikaži digitronRezimeUkupnoTransakcijeTransferUpozorenjewxbanker-0.9.1/locale/ca/0000755000175000017500000000000012243601243015123 5ustar mrooneymrooneywxbanker-0.9.1/locale/ca/LC_MESSAGES/0000755000175000017500000000000012243601243016710 5ustar mrooneymrooneywxbanker-0.9.1/locale/ca/LC_MESSAGES/wxbanker.mo0000644000175000017500000000704112243601243021070 0ustar mrooneymrooney7I    ,$Q ak      & -: BOck' )?O.l+      % 2 : V l } ;      ( H R W f p |        & D `   .    % "; /^   -    56,$ 41& ()/ 0"37 %2-' +.*#!&About&Currency&Help&Report a Bug&SettingsAccountsAdd %s to calculatorAdd a new accountAll accountsAmountAn error ocurred during the csv file import.Ask a &QuestionAuto-saveAutomatically save changesBalanceCSV importClear search?Configure the selected accountCopyrightDateDate formatDeleteDescriptionEncodingFile to importHave fun!Hide CalculatorImportLess optionsMatch: More optionsNo account selectedPreviewRemove the selected accountRemove this transactionRename the selected accountRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSaveSelect currency to displaySend %s to calculatorShow CalculatorShow advanced search optionsSorry, an account by that name already exists.Subtract %s from calculatorSummaryThe file encoding does not seem to be '%s'.TotalTransactionsTransferTrendWarningWelcome!Project-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-08-20 00:01-0700 PO-Revision-Date: 2010-08-20 21:10+0000 Last-Translator: Dept.Técnico (Extreme Micro S.L.) Language-Team: Catalan MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-08-21 03:48+0000 X-Generator: Launchpad (build Unknown) &Quant a&MonedaA&juda&informeu dßun error&ParàmetresComptesAfegeix %s a la calculadoraAfegeix un nou compteTots els comptesQuantitatHa esdevingut un error durant l'importació de l'arxiu csv.Feu una &preguntaAuto-desaAutomaticament desa canvisSaldoImportació CSVVoleu netejar la cerca?Configura el compte seleccionatCopyrightDataFormat de dataSuprimeixDescripcióCodificacióFitxer a importarPasseu-vos-ho bé!Oculta la calculadoraImportarMenys opcionsCoincideix amb: Més opcionsNo s'ha seleccionat cap compteVista prèviaElimina el compte seleccionatEsborra aquesta transaccióRenombra el compte seleccionatSol·licita una MonecaSol·licita una funcionali&tatsSol·licita implementar una nova funcionalitatDesarSeleccioneu la moneda a mostrarEnvia %s a la calculadoraMostra la calculadoraMostra opcions de cerca avançadesHo sento, un compte amb aquest nom ja existeix.Treu %s a la calculadoraResumLa codificació de l'arxiu no sembla ser '%s'TotalTransaccionsTransferirTendènciaAvísUs donem la benvingudawxbanker-0.9.1/locale/cs/0000755000175000017500000000000012243601243015145 5ustar mrooneymrooneywxbanker-0.9.1/locale/cs/LC_MESSAGES/0000755000175000017500000000000012243601243016732 5ustar mrooneymrooneywxbanker-0.9.1/locale/cs/LC_MESSAGES/wxbanker.mo0000644000175000017500000002343412243601243021116 0ustar mrooneymrooney       0 N [ z    ,   6>R do      %1:@ W!e #/5J  %  ((<e"t +,AI9ZC )#*Fc{$  5K[.x+5M5QB &P+C|   $ .&9`h lw ~Q#) .;CF O Ze NZa iu  ! &0EU^}   ,8@T]r.   $-B#Tx + # .D4b  % )!6<K,i "#  2 %S y  $ V !!+8! d!n!!!! !#! " """+"C"'_"""-"&" # ###&#'6#H^#\#0$<5$r$v$$T$S$-% D%N% V% c%q%w%{% %%!%(% %%%& &&8& K&V&G^&& &&&& && && '?WM/ (20k1hK;_FY&lpgC^ e~6ZSQ7`w,z8 qys>'RvimLJE"d}3@APx DG[:!cr)O{Io+ #=u]VntX<jN$|\%*9-4.b5faHUBT&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd a new accountAll accountsAmountAn error ocurred during the csv file import.Ask a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightDailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionEncodingEnds:Enter this transactionExport to CSVExport transactions to a CSV fileFile to importFriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsImportImport from CSVImport transactions from a CSV fileInitial balanceInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsMatch: MonMondaysMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No descriptionNo exchange rate for currency "%s"No matching transactions.No transactions entered.Overwrite profile ?Password:Please enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this transactionRename the selected accountRepeats:Report a bug to the developer onlineSatSaturdaysSaveSave changes?Search transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsSorry, an account by that name already exists.SummarySummary:SunSundaysTarget accountThe file encoding does not seem to be '%s'.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To use '%s' plotting library, install following python modules: %s.Transaction detailsTransactionsTransferTransfer from %sTransfer to %sTrendTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!YearlyYou have made changes since the last save. Would you like to save before exiting?_Totaldaydayseveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2012-08-06 04:09+0000 Last-Translator: Michael Rooney Language-Team: Czech MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; X-Launchpad-Export-Date: 2012-08-07 04:45+0000 X-Generator: Launchpad (build 15745) &O aplikaci&Měna&SouborNá&povědaO&známit chybu&Nastavení&Zobrazit'%s' není platná částka.Právě probíhá vyhledávání.Název účtuNázvy účtů nemohou být prázdné.ÚčtyPřidat %s do kalkulačkyPřidat nový účetVšechny účtyČástkaChyba při importu csv souboruPoložit &otázkuPoložit otázku onlineAuto-uloženíAutomaticky uložit změnyZůstatekFormát sloupců CSV souboruNastavení souboru CSVCSV importChyba CSV importuCSV profilyZrušitVymazat hledání ?ZavřítOddělovač sloupcůKonfigurovat vybraný účetAutorská právaDenněKaždé %(num)d dnyKaždé %(num)d dnyDatumFormát dataOddělovač desetinných místOdstranitPopisKódování znakůKončí:Zadat tuto transakciExportovat do CSVExportovat transakce do CSV souboruSoubor pro importováníPáPátkyZGrafBavte se !!Skrýt kalkulačkuSkrýt pokročilé možnosti vyhledáváníImportovatImportovat z CSVImportovat transakce ze souboru CSVPočáteční bilanceNeplatná částka transakce.Zdá se, že spouštíte aplikaci wxBanker poprvé !SkrýtHledat v: PoPondělkyDalší informace o aplikaci wxBankerDalší volbyPřesunout transakce na účet, počet %iPřesun této transakce na účetNikdyDalší účetNení vybrán žádný účetPole 'Částka' neobsahuje žádnou hodnotu.Bez popisuNení stanoven kurs měny "%s"Žádné odpovídající transakceNejsou vloženy žádné transakce.Přepsat profil ?Heslo:Zadejte číselnou hodnotu, např. 12,34 nebo -20.Vyberte účet a proveďe akci znova.NáhledPředchozí účetProfil '%s' již existuje. Přepsat?Pro načítání/ukládání csv profilů je zapotřebí simlejson knihovna pro PythonOpakující seOpakující se transakceOpakovaná transakce úspěšně přidána.OdstranitOdstranit vybraný účetOdstranit transakce, počet %iOdstranit transakciPřejmenovat vybraný účetOpakování:Oznámit vývojářům chybu onlineSoSobotyUložitUložit změny?Vyhledat v transakcíchZvolit měnu pro zobrazeníVyberte soubor a klikněte na "Náhled"Poslat %s do kalkulačkyZobrazit kalkulačkuZobrazit pokročilé možnosti vyhledáváníÚčet s tímto názvem již existuje.SouhrnShrnutí:NeNeděleCílový účetKódování znakův souboru není '%s'.Tento účet nemá v současné době žádné opakující se transakce.Tato transakce je označena jako převod mezi používanými účty. Vyberte prosím účet.Účet '%s' bude natrvalo smazán. Pokračovat ?Tato opakovaná transakce bude trvale zrušena. Pokračovat?ČtČtvrtkyČasZačněte tím, že přidáte nový účet pomocí tlačítka v levém horním rohu.K použití grafické knihovny '%s', nainstalujte následující python moduly: %s.Transakční informaceTransakcePřevodPřevod z %sPřevod na %sTrendÚtÚterkyAktualizovatUživatelské jméno:Zobrazit ča&sto kladené otázkyZobrazit ča_sto kladené otázky onlineVarováníStStředyTýdněTýdně ve %sTýdně o běžných dnechTýdně o víkenduVítejte !RočněProvedli jste změny. Chcete změny uložit před ukončením aplikace?_Celkemdendnydnůkaždýzměsícměsíceměsícůměsíčnědoaž do %stýdentýdnytýdnůrokrokyletwxbanker-0.9.1/locale/da/0000755000175000017500000000000012243601243015124 5ustar mrooneymrooneywxbanker-0.9.1/locale/da/LC_MESSAGES/0000755000175000017500000000000012243601243016711 5ustar mrooneymrooneywxbanker-0.9.1/locale/da/LC_MESSAGES/wxbanker.mo0000644000175000017500000003520712243601243021076 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #$%J%& &(&-&5&E&T&Y&y& &&&&&&& ''- 'N'k'}'''''' ' ( (+( 4(B(F(W( o($y((( ((( (( () )#)=)#O)s)).*2*:*>*C*S*#f**++ *+ K+X+n+9+++ ++,1,5,$=,b,"k,,%, ,, ,,1-B-^-3p------l../ -/:/)A/(k///L/L0O0X0"o00000001 "1',1T1d1&w11111111 2$#2H2a2!r22242 23 3,34393?B3333e3% 4304td4-4X5]`5P5666_ 6x6O6I7`7s7 7 777!77 777 8 88$&8K8T8X8 `8j8{88 8O8Q9W9`_9_9 :':/: 8:D:I:M: ]:h: l:v::s*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2011-05-24 13:02+0000 Last-Translator: mjjzf Language-Team: Danish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2011-05-25 04:33+0000 X-Generator: Launchpad (build 12959) og %s%(num)i gentagne transaktioner har totalt %(totalnum)i transaktioner klar.&Om&Valuta&Fil&Hjælp&Rapporter fejl&Indstillinger&Vis'%s' er ikke et gyldigt beløb.Der er en søgning i gang.KontonavnKonti kan ikke være uden navn.KontiLæg %s til i regnemaskineTilføj mærkeTilføj ny kontoTilføj mærkeAlle kontiBeløbDer opstod en fejl under import af CSV-filen.ÅrligtFor hver %(num)d årStil &spørgsmålStil et spørgsmål onlineGem automatiskGem ændringer automatiskBalanceOpstilling af CSV-kolonnerIndstillinger for CSV-filImport af CSVFejl i CSV-importCSV-profilerAnnullerRyd søgning?LukKolonneadskillerOpsæt den valgte kontoOphavsretTilhørende Mint-konto for %(name)s:DagligtFor hver %(num)d dageDatoDatoformatDecimaladskillerSletBeskrivelseAfvisTegnkodningSlutter:Indsæt denne transaktionHver %(num)d uger på %%sEksporter til CSVEksporter transaktioner til CSV-filFil til importFor eksempel: Hvis du markerer denne boks og indtaster en transaktion på 50 kroner til denne konto, så vil det trække 50 kroner fra den konto, som du vælger som kilde.FreFredageFraGrafHa' det skægt!Skjul regnemaskineSkjul avancerede søgeindstillingerHvis denne boks er markeret når en transaktion oprettes, så vil du blive spurgt om, hvilken konto du ønsker som kilde til overførsel.ImportImport fra CSVImport transaktioner fra CSV-filStartbalanceIntegrer med Mint.comUgyldigt transaktionsbeløbDet ser ud til at være første gang, du bruger wxBanker!Færre valgmulighederLinier, der springes overTræffer: Integration af Mint.comOplysninger til Mint.com:ManMandageMånedligtFor hver %(num)d månederMånederYderligere oplysninger om wxBankerFlere valgmulighederFlyt disse %i transaktioner til kontoFlyt denne transaktion til kontoAldrigNæste kontoIngen konto valgtDer er ikke indført et beløb i feltet 'Beløb'.Ingen fælles mærker endnuIngen beskrivelseDer er ingen vekselkurs defineret for valutaen "%s"Ingen matchende transaktioner.Endnu ingen mærkerIngen transaktioner indlagt.IngenIkke synkroniseret med Mint.comBemærk, at der ikke vil være behov for at gemme manuelt, hvis det i Filmenuen vælges at gemme automatisk.Når du har oprettet en konto, kan du tilføje transaktioner til den (såsom startbalance) ved hjælp af felterne under oversigten nederst til højre.Overskriv fil?Adgangskode:UdførVælg venligst et tal som 12,35 eller -20Vælg venligst en konto og forsøg igen.ForhåndsvisningTidligere kontoDer findes allerede en profil med navnet '%s'. Ønsker du at overskrive den?Biblioteket Python simplejson er påkrævet import og eksport af CSV-profil.GentagesGentagne transaktionerFast transaktion oprettet korrekt.FjernFjern den valgte kontoFjern disse %i transaktionerFjern dette mærkeFjern denne transaktionOmdøb den valgte kontoGentages på dage:Gentages:Rapporter en fejl til udvikleren onlineAnmod om valutaAnmod om &funktionAnmod om implementering af ny funktionLørLørdageGemGem ændringer?Gem oplysninger i nøgleringSøg efter dette mærkeSøg i transaktionerVælg valuta til visningVælg fil og tryk "Forhåndsvisning"Send %s til regnemaskineVis regnemaskineVis avancerede søgeindstillingerVis konti med nulbalanceEnkle personlige finanserBeklager, der findes allerede en konto med det navn.Begynder:Træk %s fra regnemaskineOpsummeringResume:SønSøndageSynkroniser kontobalance med en eksisterende konto hos Mint.comMærke:MærkerDestinationskontoKnapperne på kontokontrollen tillader tilføjelse, omdøbning, opsætning og fjernelse af en kontob.Tegnsættet synes ikke at være '%s'.Den første transaktion vil finde sted den %(date)sDen gentagne transaktion "%(description)s" har %(num)i transaktioner klar, svarende til %(amount)s på %(datelist)s.Denne konto har ingen gentagne transaktioner.Denne transaktion er opgivet som overførsel. Indgiv venligst et beløb til overførsel.Dette vil fjerne kontoen '%s' og alle dens transaktioner permanent. Ønsker du at fortsætte?Dette vil fjerne denne gentagne transaktion permanent. Ønsker du at fortsætte?TorTorsdageTidFor at komme i gang skal du tilføge en konto under kontokontrollen i øverste venstre hjørne.For at fjerne dette mærke senere kan det ganske enkelt fjernes fra beskrivelsen eller ved højreklik på transaktionen.For at bruge plot-biblioteket '%s', så installer følgende Python-moduler: %s.Total balance over tidOver&sæt wxBankerTransaktionsoplysningerTransaktionerOverførselOverfør fra %sOverfør til %sOversæt wxBanker til andet sprogTrendTendensgradTirTirsdageOpdateringBrugernavn:Vis &OSSVis Ofte Stillede Spørgsmål onlineAdvarselOnsOnsdageUgentligtUgentligt på %sUgentligt på hverdageUgentligt på weekenderVelkommen!Hvis deaktiveret, så vil konto med en balance på 0,00 blive skjult fra listenØnsker du at rydde den nuværende søgning og foretage denne transaktion i "%s"?ÅrligtDu kan også mærke en transaktion ved at sætte #navn_på_mærke hvor som helst i beskrivelsen.Du har lavet ændringer siden der sidst blev gemt. Ønsker du at gemme inden programmet lukkes?_TotalbalancedagdageregistrerethverframånedmånedermånedligttilIndtil %sugeugerårårwxbanker-0.9.1/locale/de/0000755000175000017500000000000012243601243015130 5ustar mrooneymrooneywxbanker-0.9.1/locale/de/LC_MESSAGES/0000755000175000017500000000000012243601243016715 5ustar mrooneymrooneywxbanker-0.9.1/locale/de/LC_MESSAGES/wxbanker.mo0000644000175000017500000003637512243601243021111 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #$%]%.& 5&?&F& M&[&j&s&& &&&!&''7' R'^'4e'''''!' (%(?( W(b( t( (( (($( ()()0) 6)D)Y) b)o)x)))))*)*%***** **"+++ ++-+,1,J,1j,,, ,,,,,-"-")- L-+Z-'----3-'.=.1P.'....!.c/k/0 (0202;0An000K0Z1 q1151 111 2%2!A2c2y20222A2+333 <3F3!]3333+344 44U4h4344"4445 5E5 Z5 e5 s5~53 60A6ur6-6W7Sn7H7 8 8"8F'8~n8n8\9x999 999+9: ":-: 6:@: O: ]:k::: : :::: :b;Ng; ;q;c2<< <<<<< < <<< < <s*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2012-04-12 14:16+0000 Last-Translator: Sebastian Rahlf Language-Team: German MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2012-04-13 05:24+0000 X-Generator: Launchpad (build 15070) und %s%(num)i wiederkehrende Überweisungen haben ein Total von %(totalnum)i Überweisungen bereit.&Über&Währung&Datei&HilfeFehler melden&Einstellungen&Ansicht'%s' ist kein gültiger Betrag.Eine Suche ist derzeit aktiv.KontonameKontoname darf nicht leer sein.KontenFüge %s zum Taschenrechner hinzuSchlagwort hinzufügenEin neues Konto hinzufügenEin Schlagwort hinzufügenAlle KontenBetragWährend des CSV-Imports ist ein Fehler aufgetreten.jährlichAlle %(num)d JahreEine Frage stellenStellen Sie online ihre FrageAutospeicherungAutomatisch Änderungen speichernKontostandCSV WirtschaftsteilkartenCSV Datei EinstellungenCSV ImportCSV-Import-FehlerCSV-ProfileAbbrechenSuche löschen?SchließenSpaltentrennzeichenDas ausgewählte Konto konfigurierenUrheberrechtDas zugehörige Mint Konto für %(name)s:TäglichAlle %(num)d TageDatumDatums-FormatDezimal-TrennzeichenLöschenBeschreibungAblehnenZeichenkodierungEndet:Diese Transaktion eingebenJede %(num)d Wochen am %%sExportiere in eine CSV DateiExportiere Transaktionen in eine CSV DateiZu importierende DateiZum Beispiel, wählen Sie diese Box und geben Sie eine Überweisung von 50$ ein. In dieses Konto wird auch 50$ weggenommen dass Sie als Quelle gewählt haben.FreitagFreitagsvonDiagrammViel Spaß!Taschenrechner ausblendenErweiterte Suchoptionen ausblendenWenn diese Box ausgewählt ist wenn Sie eine Überweisung hinzufügen, werden Sie gefragt welchen Account genutzt werden sollte als Quelle für die Überweisung.ImportierenAus CSV importierenTransaktionen aus einer CSV-Datei importierenEröffnungskontostandIntegrieren mit Mint.comUngültiger ÜberweisungsbetragAnscheinend benutzen Sie wxBanker zum ersten Mal!Weniger OptionenZu überspringende ZeilenTreffer: Mint.com EinbindungMint.com Daten:MontagMontagsMonatlichAlle %(num)d MonateMonateMehr Informationen über wxBanker.Mehr OptionenDiese %i Transaktionen verschieben zu KontoVerschieben dieser Transaktion zu KontoNieNächstes KontoKein Benutzerkonto ausgewähltSie haben keinen Betrag im "Betrag"-Feld angegeben.Keine allgemeinen Schlagwörter gesetztKeine BeschreibungKein Umrechnungkurs für Währung "%s" vorhanden!Keine übereinsprechenden TransaktionenKeine SchlagwörterKeine Transaktionen eingegeben.NichtsNicht mit Mint.com synchronisiertAnmerkung : Wenn Sie die Auto-Speicherung vom Datei Menu aktivieren, müssen Sie manuell speichern.Sobald Sie ein Konto angelegt haben, können Sie Transaktionen zuweise (wie z.B. Ihren anfänglichen Kontostand), indem Sie die Kontrollfelder unten rechts benutzen.Profil überschreiben?Kennwort:ArbeitenBitte tragen Sie eine Zahl wie 12.34 oder -20 ein.Bitte wählen Sie ein Konto aus und versuchen Sie es noch einmal.VorschauVorheriges KontoEs gibt schon ein Profil mit dem Namen '%s'. Soll es überschrieben werden?Das Python-Modul simplejson wird benötigt, um CSV-Profile laden und speichern zu können.WiederkehrendDaueraufträgeWiederkehrende Überweisung erfolgreich hinzugefügt.EntfernenEntferne ausgewähltes KontoDiese %i Transaktionen löschenLösche dieses SchlagwordDiese Transaktion entfernenDas ausgewählte Konto umbenennenWiederholen an Tagen:Wiederholungen:Melden Sie einen Fehler online an die EntwicklerEine Währung anfordernEin Fea&ture anfordernEin neues Feature vorschlagen, welches implementiert werden soll.SamstagSamstagsSpeichernÄnderungen speichern?Daten im Schlüsselbund speichernSuche nach diesem SchlagwordTransaktionen durchsuchenAngezeigte Währung auswählenDatei auswählen und auf "Vorschau" klickenSende %s an TaschenrechnerTaschenrechner anzeigenErweiterte Suchoptionen anzeigenZeige leere KontenEinfache FinanzverwaltungLeider exsistiert schon ein Konto mit diesem Namen.Beginnt:Subtrahiere %s vom Taschenrechner.ZusammenfassungZusammenfassung:SonntagSonntagsSynchronisiere Kontostände mit einem existierendem Mint.com Account.SchlagwordSchlagwörterZiel-KontoDiese Buttons in der Kontokontrolle erlauben es ihnen, Konten um zubenennen, hinzuzufügen, Einstellungen festzulegen und Solche zu entfernen.Die Datei scheint nicht mit '%s' encodiert zu sein!Die erste Überweisung wird erfolgen am %(date)sDie wiederkehrende Überweisung "%(description)s" hat %(num)i Überweisungen bereit für %(amount)s an %(datelist)s.Dieses Konto hat momentan keinen DauerauftragDiese Überweisung ist markiert als Umbuchung. Bitte wählen Sie den Umbuchungsaccount.Alle Überweisungen des Kontos '%s' werden unwiederbringlich gelöscht. Fortfahren?Diese Aktion wird die wiederkehrende Überweisung entfernen. Fortfahren?DonnerstagDonnerstagsZeitUm zu beginnen, legen Sie oben links im Bedienfeld ein neues Konto an.Um dieses Schlagwort später zu entfernen, entfernen Sie es von der Beschreibung oder klicken Sie rechts auf die Überweisung.Um '%s' grafische Darstellungsbibliothek nutzen zu können, installieren Sie bitte folgende Python Module: %s.Gesamtbetrag über die ZeitwxBanker übersetzenDetails der TransaktionKontobewegungenÜberweisenÜberweisen von %sÜberweisen an %swxBanker in eine andere Sprache übersetzenTrend / VerlaufTrend GradDienstagDienstagsAktualisierungBenutzername:&FAQ anzeigenLesen Sie die FAQs onlineAchtungMittwochMittwochsWöchentlichWöchentlich an %sWöchentlich an WochentagenWöchentlich an WochenendenWillkommen!Wenn diese Box deaktiviert ist, werden Konten mit einem leeren Kontostand von der Liste verborgen.Wollen Sie die aktuelle Suche löschen und diese Überweisung machen in "%s" ?JährlichSie können ein Schlagwort einer Überweisung hinzufügen indem Sie #tagname irgendwo in die Beschreibung setzen.Sie haben Änderungen vorgenommen seit dem letztem Speichern. Wollen Sie speichern bevor Sie gehen?_TotalKontostandTagTageentdecktjedervonMonatMonatemonatlichzubis %sWocheWochenJahrJahrewxbanker-0.9.1/locale/el/0000755000175000017500000000000012243601243015140 5ustar mrooneymrooneywxbanker-0.9.1/locale/el/LC_MESSAGES/0000755000175000017500000000000012243601243016725 5ustar mrooneymrooneywxbanker-0.9.1/locale/el/LC_MESSAGES/wxbanker.mo0000644000175000017500000000516712243601243021114 0ustar mrooneymrooney%D5l@AIRdk   '/4:AIfm |     0,*%W} .!)-@*Y$* ! , J Y j y   " 6 :) d i  #% "$   ! and %sAccountsAdd a new accountAmountAnnuallyEvery %(num)d yearsCSV file settingsCSV importCancelDailyEvery %(num)d daysDateDate formatDecimal separatorDescriptionEncodingEvery %(num)d weeks on %%sFile to importFridaysFromGraphImportMondaysMonthlyEvery %(num)d monthsMonthsNo descriptionSaturdaysSundaysThursdaysTransfer from %sTransfer to %sTuesdaysWednesdaysWeekly on %sWeekly on weekdaysWeekly on weekendstountil %sProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2011-08-17 12:38+0000 Last-Translator: vassilis Language-Team: Greek MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2011-08-18 04:32+0000 X-Generator: Launchpad (build 13697) και %sΛογαριασμοίΠροσθήκη νέου λογαριασμούΠοσότηταΕτησίωςΚάθε %(num)d χρόνιαΡυθμίσεις αρχείου CSVεισαγωγή CSVΆκυροΗμερησίωςΚάθε %(num)d μέρεςΗμερομηνίαΜορφή ημερομηνίαςΔιαχωριστής δεκαδικώνΠεριγραφήΚωδικοποίησηΚάθε %(num)d βδομάδα την %%sΑρχείο για εισαγωγήΠαρασκευέςΑπόΓράφημαΕισαγωγήΔευτέρεςΜηνιαίαΚάθε %(num)d μήνεςΜήνεςΚαμία περιγραφήΣάββαταΚυριακέςΠέμπτεςΜεταφορά απο %sΜεταφορά πρός %sΤρίτεςΤετάρτεςΕβδομαδιαίως την %sΕβδομαδιαίως τις καθημερινέςΕβδομαδιαίως τα σαββατοκύριακασεμέχρι %swxbanker-0.9.1/locale/en_GB/0000755000175000017500000000000012243601243015512 5ustar mrooneymrooneywxbanker-0.9.1/locale/en_GB/LC_MESSAGES/0000755000175000017500000000000012243601243017277 5ustar mrooneymrooneywxbanker-0.9.1/locale/en_GB/LC_MESSAGES/wxbanker.mo0000644000175000017500000003442612243601243021466 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #$%O%?& F&P&V& \& j&t&z&& &&&&&' ' "'/',6'c''' ''''' '( ("( )(7(=(N( m((w((( ((( ((())) 8)!F)h)w)***!* '*1*A*{^***#*+%+=+5X+ + +++++++, , ,,%9, _,, ,,(,,,0,#- <-H-a-f-Z--v. ..+.,...9/CH/ //)////0'0?0[0l0$u000'00 00 0 1%191M1h111111.1.262R2Z2c2g27o2222l2+-3,Y3j353M'4Qu4B4 5 55P5bn5C56-6A6 U6b6k6|6&66 6666 6 6&677 !7,7 37@7S7f7Lo7M7 8O8Qa8888888 8888 9 9s*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2012-08-06 04:09+0000 Last-Translator: Michael Rooney Language-Team: English (United Kingdom) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2012-08-07 04:45+0000 X-Generator: Launchpad (build 15745) and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, ticking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is ticked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionCopy text No exchange rate for currency "%s"No matching transactionsNo tags yetNo transactions entered.NoneNot synchronised with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearswxbanker-0.9.1/locale/es/0000755000175000017500000000000012243601243015147 5ustar mrooneymrooneywxbanker-0.9.1/locale/es/LC_MESSAGES/0000755000175000017500000000000012243601243016734 5ustar mrooneymrooneywxbanker-0.9.1/locale/es/LC_MESSAGES/wxbanker.mo0000644000175000017500000003611712243601243021122 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #$%W% 2&=&E&N&U& k&u& z&&&1&&''+'D'Y'k'=t'''' ($ (1(9(U( q(~( (((((!( )*)=)[)a)r)) ) ) )))))')&*9*******'+0++++++,.%,0T,,, ,,,,,,- - 5-%C- i---"-9--.)%."O. r.&..!.v.H// 002!07T0 00?0O0 91D1.^111111 2$2 825F2|22522222(3<3Q3f3-333'3"4+44J4 444444D4 5 55v,505-5o6>r6e6Z7>r7777^7l"8Y8899 29 @9K9_9o9 9999 99 9/9:: : %:2:!E:g: :V:D: 1;X<;Q;;; ; < << < <*<,<5< D<s*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2012-08-06 04:09+0000 Last-Translator: DiegoJ Language-Team: Spanish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2012-08-07 04:45+0000 X-Generator: Launchpad (build 15745) y %s%(num)i transacciones recurrentes tienen un total de %(totalnum)i transacciones listas.&Acerca de&Moneda&ArchivoA&yuda&Informar de un errorOpcione&s&Ver'%s' no es una cantidad válida.Hay una búsqueda activa.Nombre de cuentaLos nombres de cuenta no pueden quedar en blanco.CuentasSumar %s a la calculadoraAñadir etiquetaAñadir una cuenta nuevaAñadir una etiquetaTodas las cuentasCantidadHa ocurrido un error durante la importación del archivo CSV.AnualmenteCada %(num)d añosHacer una &preguntaHaga una pregunta en líneaAutoguardarGuardar automáticamente los cambiosBalanceAsociación de columnas CSVPreferencias de archivo CSVImportar CSVError de importación del CSVPerfiles CSVCancelar¿Limpiar búsqueda?CerrarDelimitador de columnasConfigurar la cuenta seleccionadaCopyrightCuenta de Mint correspondiente a %(name)s:DiariamenteCada %(num)d daysFechaFormato de fechaSeparador decimalEliminarDescripciónDescartarCodificaciónTermina:Introducir transacciónCada %(num)d semanas de %%sExportar a CSVExportar transacciones a un archivo CSVArchivo a importarPor ejemplo, al marcar la casilla al introducir una transacción de 50$ en esta cuenta le quitará 50$ de la cuenta que haya escogido como origen.VieViernesDeGráfica¡Páselo bien!Ocultar calculadoraOcultar opciones avanzadas de búsquedaSi esta opción está seleccionada cuando se realice una transacción, se le preguntará cuál es la cuenta de la que viene el dinero.ImportarImportar desde CSVImportar transacciones desde un archivo CSVBalance inicialIntegrar con Mint.comCantidad inválidad para realizar transacción¡Parece que es la primera vez que usa wxBanker!Menos opcionesLíneas a omitirCoincide: Integración con mint.comCredenciales de Mint.com:LunLunesMensualmenteCada %(num)d mesesMesesMás información sobre wxBankerMás opcionesMover estas %i transacciones a cuentaMover esta transacción a cuentaNuncaSiguiente cuentaNo hay ninguna cuenta seleccionadaNo se ha introducido ningún valor en el campo 'Cantidad'Sin etiquetas comunesSin descripciónNo hay tipo de cambio para la moneda "%s"No hay traducciones que coincidan.Sin etiquetasNo se ha introducido una transacción.NingunoNo está sicronizado con Mint.comTenga en cuenta que activar el autoguardado desde el menú de archivos eliminará la necesidad de guardar manualmente.Una vez que haya creado una cuenta, le puede añadir transacciones como por ejemplo, su balance inicial, usando los controles por debajo de la rejilla, abajo a la derecha.¿Sobrescribir perfil?Contraseña:EjecutarPor favor, introduzca un número como 12.34 o -20.Por favor, seleccione una cuenta e inténtelo de nuevo.Vista previaCuenta anteriorYa existe un perfil con el nombre '%s'. ¿Desea sobrescribirlo?Se necesita la librería de Python simplejson para cargar/guardar perfiles CSV.RecurrenteTransacciones recurrentesTransacción recurrente añadida exitosamente.EliminarEliminar la cuenta seleccionadaEliminar estas %i transaccionesEliminar esta etiquetaEliminar transacciónRenombrar la cuenta seleccionadaSe repite en días:Repeticiones:Informar de un error a un desarrollador vía internetSolicitar una monedaSolicitar una cara&cterísticaSolicitar que se implemente una nueva característicaSábSábadosGuardar¿Guardar los cambios?Guardar credenciales en anillo de clavesBuscar esta etiquetaBuscar transaccionesSelecionar moneda a mostrarSeleccione un archivo y pulse "Previsualizar"Enviar %s a la calculadora.Mostrar calculadoraMostrar opciones avanzadas de búsquedaMostrar cuentas con balance a ceroFinanzas personales sencillas.Lo siento, pero ya existe una cuenta con ese nombre.Comienza:Restar %s de la calculadoraResumenResumen:DomDomingosSincronizar balances de cuenta con una cuenta existente de Mint.com.Etiqueta:EtiquetasCuenta objetivoLos botones en el control de cuenta le permiten añadir, renombrar, configurar y eliminar una cuenta, respectivamente.La codificación del archivo parece no ser '%s'.La primera transacción ocurrirá el %(date)sLa transacción recurrente "%(description)s" tiene %(num)i transacciones listas por %(amount)s en %(datelist)s.Esta cuenta no tiene transacciones recurrentes por el momento.Esta transacción está marcada como una transferencia. Por favor, seleccione la cuenta a transferir.Se eliminará permanentemente la cuenta '%s' y todas sus transacciones. ¿Desea continuar?Esto eliminará esta operación recurrente. ¿Desea continuar?JueJuevesTiempoPara empezar, añada una cuenta usando el control de cuentas en la esquina superior izquierda.Para eliminar esta etiqueta, elimínela de la descripción o pulse con el botón derecho en la transacción.Para usar la biblioteca para dibujar '%s', instale los siguientes módulos de Python: %s.Balance total del periodoTradu&cir wxBankerDetalles de la transacciónTransaccionesTransferirTransferir desde %sTransferir a %sTraducir wxBanker a otro idiomaTendenciaGrado de tendenciaMarMartesActualizarNombre de usuario:Ver PU&FsVer Preguntas Usualmente Frecuentes en internetAvisoMiéMiércolesSemanalmenteSemanalmente en %sSemanalmente en días laborables:Semanalmente en fines de semana¡Bienvenido!Si está desactivado, las cuentas con un balance de $0.00 no se mostrarán en la listaDesea limpiar la búsqueda actual y hacer esta transacción en "%s"?AnualmenteTambién puede etiquetar una transacción añadiendo #nombreetiqueta en la descripción.Ha hecho cambios desde la última vez que guardó. ¿Dese guardar antes de salir?_Totalbalancedíadíasdetectadocadademesmesesmensualmenteahasta %ssemanasemanasañoañoswxbanker-0.9.1/locale/et/0000755000175000017500000000000012243601243015150 5ustar mrooneymrooneywxbanker-0.9.1/locale/et/LC_MESSAGES/0000755000175000017500000000000012243601243016735 5ustar mrooneymrooneywxbanker-0.9.1/locale/et/LC_MESSAGES/wxbanker.mo0000644000175000017500000000142312243601243021113 0ustar mrooneymrooneyT '   DescriptionEnds:Request a new feature to be implementedSuntoweekweeksProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-08-20 00:01-0700 PO-Revision-Date: 2010-08-20 08:16+0000 Last-Translator: Michael Rooney Language-Team: Estonian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-08-21 03:48+0000 X-Generator: Launchpad (build Unknown) KirjeldusLõppebUue lisavõimaluse telliminePkuninädalwxbanker-0.9.1/locale/fa/0000755000175000017500000000000012243601243015126 5ustar mrooneymrooneywxbanker-0.9.1/locale/fa/LC_MESSAGES/0000755000175000017500000000000012243601243016713 5ustar mrooneymrooneywxbanker-0.9.1/locale/fa/LC_MESSAGES/wxbanker.mo0000644000175000017500000000645512243601243021103 0ustar mrooneymrooney$<5\01 8B H V6`    $54j$'BRaZP   &.7 $;2K~#%-' 9 D O *a | / '9 #a $ - F  89 *r m       #  "! $&About&Currency&Help&Report a Bug&SettingsA lightweight personal finance management application.AccountsAdd a new accountAsk a &QuestionAsk a question onlineBalanceConfigure the selected accountCopyrightDateDescriptionHave fun!Hide CalculatorIt looks like this is your first time using wxBanker!More information about wxBankerNo account selectedRemove the selected accountRemove this transactionRename the selected accountReport a bug to the developer onlineSearch transactionsSelect currency to displayShow CalculatorSummaryThe buttons in the account control allow you to add, remove, and rename an account, respectively.To get started, add an account using the account control in the top left corner.TotalTransactionsTrendWarningWelcome!Project-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-02-03 00:18-0800 PO-Revision-Date: 2009-02-16 19:43+0000 Last-Translator: Opatan Language-Team: Persian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2010-02-04 04:46+0000 X-Generator: Launchpad (build Unknown) درباره&واحد پول&کمک&خطایی را گزارش دهید&تنظیمات&برنامه مدیریت مالی شخصی سبکحساب‌هاافزودن یک حساب جدیدپرسشی بپرسیدپرسسی را برخط بپرسیدترازپیکربندی حساب انتخاب شدهکپی‌رایتتاریختوصیفخوش بگذرهماشین‌حساب را نشان ندهبه نظر می‌آید که نخستین باری است که این نرم‌افزار را بکار می‌گیرید.اطلاعات بیشتر درباره wxBankerهیچ حسابی انتخاب نشدهحذف حساب انتخاب شدهاین تراکنش را حذف کنتغییرنام حساب انتخاب شدهخطایی را برخط به برنامه‌سازگزارش دهیدجستجوی تراکنشواحد پول را برای نمایش بگزینید.ماشین‌حساب را نشان بدهخلاصهدکمه‌های روی کنترل حساب به شما اجازه می‌دهد که به‌ترتیب یک حساب را اضافه کنید،حذف کنید یا تغییر نام دهید.برای شروع،با استفاده از کنترل حساب در گوشه سمت چپ بالا یک حساب اضافه کنید.جمعتراکنشرونداخطارخوش آمدیدwxbanker-0.9.1/locale/fi/0000755000175000017500000000000012243601243015136 5ustar mrooneymrooneywxbanker-0.9.1/locale/fi/LC_MESSAGES/0000755000175000017500000000000012243601243016723 5ustar mrooneymrooneywxbanker-0.9.1/locale/fi/LC_MESSAGES/wxbanker.mo0000644000175000017500000003167712243601243021117 0ustar mrooneymrooney      & 4>D` ~  ,-JZ pz    #(-Vo t  !-19> DN^|{#3C[5v  #* J%W } ("3 MYrwZ +,9CY ) (8Pl}$'  6J^y.?Gcktx7l+>,j5QBb fpPu -&<cimv } &   L`Qg     !! ! !"" $" /"!9" [" |""""""" "#" #!.#P#`#}#"### ## ##$$%$8$P$%_$%$$$$$$$$ %%.%I%\%z%% %%%%%$%d%X&\&p& &!& &F&#'8'J'\'q'' ''' '''$' ( 9( D(R(0q(( ( (())9)'I){q)z)h* ~**/*'* **6+H9+++)++++,,0,N,k,!t,*,,#,- ---2-R-c-s-)-----..1E.w.~. . .. .=. . / /i/2/+/-/S0<e00 0060 001 1+121F1(Y1 11 1 111.1222 $2 02>2Q2 l2=x2 2x2 :3E3K3]3f3k3t3 3 33 3('\k4wI*D2SK6=@+T hgY t8F:oj51v!#cQdxu9l. `i 3A</)HUz7 ?be[yqB-~ Z0VC]&m{rfN"REa}pOMWGJ^L,%>nXP_$s;| and %s&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThis account currently has no recurring transactions.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listYearlyYou have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlyuntil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2011-10-28 12:48+0000 Last-Translator: Jiri Grönroos Language-Team: Finnish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2011-10-29 05:13+0000 X-Generator: Launchpad (build 14197) ja %s&Tietoja&Valuutta&Tiedosto&Ohje&Ilmoita ohjelmistovirheestä&Asetukset&Näkymä'%s' ei ole kelvollinen määrä.Haku on parhaillaan aktiivisena.Tilin nimiTilin nimi ei voi olla tyhjä.TilitLisää %s laskimeenLisää tunnisteLisää uusi tiliLisää tunnisteKaikki tilitMääräCSV-tuonnin aikana tapahtui virhe.Vuosittain%(num)d vuoden väleinEsitä &kysymysEsitä kysymys InternetissäAutomaattinen tallennusTallenna muutokset automaattisestiSaldoCSV-tiedoston asetuksetCSV-tuontiCSV-tuontivirheCSV-profiilitPeruutaTyhjennetäänkö haku?SuljeSarakkeiden erotinMuokkaa valittua tiliäTekijänoikeusTiliä %(name)s vastaava Mint-tunnus:Päivittäin%(num)d päivän väleinPäivämääräPäivämäärän muotoDesimaalierotinPoistaKuvausHylkääMerkistökoodausPäättyy:Syötä tämä tapahtuma%(num)d viikon välein %%sVie CSV-tiedostoonVie tapahtumat CSV-tiedostoonTuotava tiedostoPeperjantaisinAlkaenKuvaajaViihtyisiä hetkiä!Piilota laskinPiilota laajennetut hakuominaisuudetTämän ollessa valittuna, tilitapahtumaa lisättäessä kysytään miltä tililtä siirto tapahtui.TuoTuo CSV-tiedostostaTuo tapahtumat CSV-tiedostostaAlkusaldoIntegroi Mint.com-palvelun kanssaTapahtuman summa on virheellinenVaikuttaa siltä, että wxBanker käynnistyy nyt ensimmäistä kertaa!Vähemmän valintojaOhitettavat rivitHae sarakkeesta: Mint.com-integraatioMint.com-tunnukset:MamaanantaisinKuukausittain%(num)d kuukauden väleinKuukausiaLisätietoja wxBankeristaLisää valintojaSiirrä nämä %i tapahtumaa tililleSiirrä tämä tapahtuma tililleEi koskaanSeuraava tiliYhtään tiliä ei ole valittuSummaa ei ole kirjoitettu "Määrä"-kenttään.Ei yleisiä tunnisteita vieläEi kuvaustaEi vaihtokurssia valuutalle "%s"Ei vastaavia tapahtumia.Ei tunnisteita vieläTapahtumia ei ole kirjattu.Ei määriteltyEi synkronoitu Mint.com-palvelun kanssaOta huomioon, että automaattisen tallennuksen käyttöönotto Tiedosto-valikosta poistaa manuaalisen tallennuksen tarpeen.Kun olet luonnut itsellesi tilin, voit lisätä maksutapahtumia (kuten alkusaldon) käyttäen oikean alakulman toimintoja.Korvataanko profiili?Salasana:SuoritaAnna kelvollinen lukuarvo, kuten 12,34 tai -20.Valitse tili ja yritä sitten uudelleenEsikatseleEdellinen tiliProfiili nimeltä '%s' on jo olemassa. Korvataanko se?CSV-profiilin lataus ja tallennus vaativat Python-kirjasto simplejsonin.ToistuvaToistuvat tapahtumatToistuva tapahtuma lisätty onnistuneestiPoistaPoista valittu tiliPoista nämä %i tapahtumaaPoista tämä tunnistePoista tämä tapahtumaNimeä valittu tili uudelleenToista seuraavina päivinä:Toistuu:Ilmoita virheestä kehittäjälleEsitä valuuttaa lisättäväksi ohjelmaanPyydä &uutta ominaisuuttaPyydä uutta ominaisuutta ohjelmaanLalauantaisinTallennaTallennetaanko muutokset?Tallenna tunnukset avainnippuunEtsi tunnistettaEtsi tapahtumiaValitse näytettävä valuuttaValitse tiedosto ja napsauta "Esikatsele"Lähetä %s laskimeenNäytä laskinNäytä haun lisävalinnatNäytä nollasaldon tilitYksinkertaista henkilökohtaista varainhoitoa.Valittu nimi on jo käytössä toisella tilillä.Alkaa:Vähennä %s laskimestaYhteenvetoYhteenveto:SusunnuntaisinSynkronoi tilitiedot käytössä olevan Mint.com-tilin kanssaTunniste:TunnisteetKohdetiliPainikkeet tilihallinnassa mahdollistavat tilin lisäyksen, uudelleennimeämisen, muokkauksen ja poiston.Tiedoston merkistökoodaus ei vaikuta olevan '%s'.Ensimmäinen tapahtuma suoritetaan %(date)sTällä tilillä ei ole toistuvia tapahtumia.Tämä poistaa pysyvästi valitun tilin '%s' ja kaikki sen tapahtumat. Jatketaanko?Tämä poistaa pysyvästi toistuvan tapahtuman. Jatketaanko?TotorstaisinAikaLisää aluksi vasemmasta yläkulmasta itsellesi tili.KokonaissaldoKää&nnä wxBankerTapahtuman tiedotTapahtumatSiirtoSiirrä tililtä %sSiirrä tilille %sKäännä wxBanker haluamallesi kielelleKehityssuuntaTitiistaisinPäivitäKäyttäjätunnus:&Lue usein kysytyt kysymyksetLue usein kysyttyjä kysymyksiä InternetissäVaroitusKekeskiviikkoisinViikoittainViikottain %sViikottain arkisinViikottain viikonloppuisinTervetuloa!Jos pois käytöstä, piilotetaan tilit joiden saldo on nollaVuosittainOlet tehnyt muutoksia viimeisimmän tallennuskerran jälkeen. Halutko tallentaa muutokset, ennen kuin ohjelma suljetaan?_Yhteensäsaldopäiväpäiväähavaittujokatililtäkuukausikuukauttakuukausittainpäättyen %sviikkoviikkoavuosivuottawxbanker-0.9.1/locale/fr/0000755000175000017500000000000012243601243015147 5ustar mrooneymrooneywxbanker-0.9.1/locale/fr/LC_MESSAGES/0000755000175000017500000000000012243601243016734 5ustar mrooneymrooneywxbanker-0.9.1/locale/fr/LC_MESSAGES/wxbanker.mo0000644000175000017500000003652612243601243021126 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #$%T% &*&2&;&A& T& a&!l&&& &*&&*&!'0'J'Y'j'?r''''',(B(H(`({(( ((((("( ))) E)f)k)})) ))) ))#))-*=*Q** ** * ++(.+W+++9+ 1,?,U,3u,,,,,, ---6- ;-\-,k-*----,-!.:.*M."x.."...o.l/00 &04002e00060_0 J1U1.o1 1!1111 262N2*k2229233 331:3l3~3#313)34*64&a4$434 4-45 #5.5 25C<555 5y5/6.B6lq6:6D7f^7X78"8)8r/8v8Z9t999 9999'9: #:D:H:O:^: r:(: :: : ::(: ; (;k4;V;;W;V<<< < = == =%=-= 2=>=O=s*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2010-10-12 06:33+0000 Last-Translator: Thomas C. Language-Team: French MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2010-10-13 04:55+0000 X-Generator: Launchpad (build Unknown) et %s%(num)i transactions récurrentes ont un total de %(totalnum)i transactions prêtes.&À propos&Devise&Fichier&Aide&Signaler un Bogue&Paramètres&Affichage'%s' n'est pas un montant valide.Une recherche est actuellement active.Nom du compteLe nom d'un compte ne peut pas être vide.ComptesAjouter %s à la valeur de la calculatriceAjouter un tagAjouter un nouveau compteAjouter un tagTous les comptesMontantUne erreur s'est produite lors de l'importation du fichier CSV.AnnuelTous les %(num)d ans&Poser une QuestionPoser une question en ligneSauvegarde automatiqueEnrgistrer automatiquement les modificationsSoldeFormat des colonnes CSVParamètres du fichier CSVImportation CSVErreur d'importation CSVProfils CSVAnnulerAnnuler la recherche ?FermerDélimiteur de colonnesConfigurer le compte sélectionnéCopyrightCompte Mint correspondant pour %(name)s :QuotidienTous les %(num)d joursDateFormat de la dateSéparateur décimalEffacerDescriptionAnnulerEncodageTermine :Ajouter cette transactionToutes les %(num)d semaines sur %%sExporter en CSVExporter les transactions vers un fichier CSVFichier à importerPar exemple, cocher cette case et entrer une transaction de 50 $ dans ce compte soustraira aussi 50 $ sur le compte que vous aurez choisi comme source.VenVendredisDepuisGraphiqueAmusez-vous !Masquer la CalculatriceCacher les options de recherche avancéeSi cette case est cochée quand vous ajoutez une transaction, il vous sera demandé quel compte utiliser comme source du virement.ImporterImporter depuis CSVImporter des transactions depuis un fichier au format CSVSolde initialIntégrer à Mint.comMontant de transaction invalideC'est la première fois que vous utilsez wxBanker !Moins d'optionsLignes à ignorerChercher dans : Intégration à Mint.comIdentifiants Mint.com :LunLundisMensuelTous les %(num)d moisMoisPlus d'informations sur wxBankerPlus d'optionsDéplacer ces %i transactions vers le compteDéplacer cette transaction vers le compteJamaisCompte suivantAucun compte sélectionnéLa case 'Montant' ne contient pas de valeur.Pas encore de tag communPas de descriptionPas de taux d'échange pour la devise "%s"Aucune transaction correspondante.Aucun tag pour l'instantAucune transaction sélectionnée.AucunPas synchronisé avec Mint.comNotez qu'activer la sauvegarder automatique depuis le menu Fichier éliminera le besoin de sauvegarde manuelle.Après avoir créé un compte, vous pouvez y ajouter des transactions (comme votre solde initial), en utilisant les boutons situés en bas à droite.Écraser le profil ?Mot de passe :EffectuerMerci d'entrer un nombre, par exemple 12,34, ou -20.Merci de sélectionner un compte et de réessayer.AperçuCompte précédentUn profil avec le nom '%s' existe déjà. L'écraser ?La bibliothèque Python simplejson est nécessaire pour charger ou sauvegarder des profils CSV.RécurrentTransactions RécurrentesTransaction récurrente ajoutée avec succès.SupprimerSupprimer le compte sélectionnéSupprimer ces %i transactionsSupprimer ce tagSupprimer cette transactionRenommer le compte sélectionnéJours de répétition :Fréquence de répétition :Signaler en ligne un bogue au développeurProposer une deviseProposer une &FonctionnalitéProposer l'implémentation d'une nouvelle fonctionnalitéSamSamedisEnregistrerEnregistrer les modifications ?Sauvegarder les identifiants dans le porte-clés.Rechercher ce tagChercher dans les transactionsSélectionnez la devise à afficherSélectionnez un fichier et cliquez sur "Aperçu"Mettre la valeur de la calculatrice à %sAfficher la CalculatriceAfficher les options de recherche avancéeMontrer les comptes ayant un solde nulGestion simple de comptes personnelsDésolé, un compte utilisant ce nom existe déjà.Démarre :Soustraire %s de la valeur de la calculatriceRésuméRésumé :DimDimanchesSynchroniser les soldes de comptes avec un compte Mint.com existantTag :TagsCompte cibleLes boutons dans le contrôle du compte vous permettent d'ajouter, de renommer, de configurer, et de supprimer un compte.L'encodage du fichier ne semble pas être '%s'.La première transaction aura lieu à %(date)sLa transaction récurrente "%(description)s" a %(num)i transactions prêtes pour %(amount)s à %(datelist)s.Ce compte n'a actuellement aucune transaction récurrente.Cette transaction est un virement. Merci de choisir le compte cible.Ceci va définitivement supprimer le compte '%s' et toutes ses transactions. Désirez-vous continuer ?Ceci supprimera définitivement cette transaction récurrente. Désirez-vous continuer ?JeuJeudisTempsPour commencer, ajoutez un compte en utilisant le panneau de contrôle des comptes dans le coin en haut à gauche.Pour supprimer ce tag plus tard, supprimer le simplement de la description ou faites un clic droit sur la transaction.Pour utiliser la bibliothèque de tracé '%s', installez les modules python suivants : %s.Solde Total sur Temps&Traduire wxBankerDétails de la transactionTransactionsVirementVirement depuis %sVirement vers %sTraduire wxBanker dans une autre langueTendanceDegré de lissage de la tendanceMarMardisMettre à jourNom d'utilisateur :&Voir la FAQRegarder la Foire Aux Questions en ligneAttentionMerMercredisHebdomadaireHebdomadaire sur %sHebdomadaire sur les jours de la semaineHebdomadaire sur les weekendsBienvenue !Si désactivé, les comptes dont le solde est de 0.00 € ne seront pas affichés dans la liste de comptes.Désirez-vous annuler la recherche en cours et effectuer cette transaction dans "%s" ?AnnuelVous pouvez taguer une transaction en mettant un #tag n'importe ou dans la description.Vous avez effectué des modifications depuis votre dernier enregistrement. Voulez-vous enregistrer ces modifications avant de fermer l'application ?_Totalsoldejourjoursdétectéchaquedepuismoismoismensuelversjusqu'à %ssemainesemainesananswxbanker-0.9.1/locale/he/0000755000175000017500000000000012243601243015134 5ustar mrooneymrooneywxbanker-0.9.1/locale/he/LC_MESSAGES/0000755000175000017500000000000012243601243016721 5ustar mrooneymrooneywxbanker-0.9.1/locale/he/LC_MESSAGES/wxbanker.mo0000644000175000017500000003642612243601243021112 0ustar mrooneymrooney4L hiOq    6Cbk  , (2MUi {   ("; @L^ eqy ! |^e#u5  -5J`dl %  (+Tg"v ZR +,:go9C )Ie$'+S Wa ft 6Q.j7++,Wj5M%QsB PCl   && M S ` d m t ~ &      !L !MW!!Q!!"""" #"0"8";" D" O"Z"'$b/$ $ $ $ $$ $ $ $%0%@B%%%%%%% &;&%P&v&-&&,&' '''A'P'j' }''''%''1( 9( Z(e({( ( (( (((!( )/)N)d))) * * *&*3C*w* * +&$+K+a+'y+Q++ , %,0,&H,o, v,&, ,%,,.,"+-N-^-r-+-)--6-!0.R.o.#.z.+// / 0/0.B0q00D0o0V1_10y1#1112(2A2 X2Ab222623 3 3""3<E333'3A34341N4+4#4>45 5 ?5 J5 V5a5Ns5 5 5525< 6]6A6a$7j7S7 E8P8b8yi88'c999 9 999%9: : 4:?: Q:\:#o:<: : :: :;#;#<;`;Ly;X;<f(<<<<<<<<<<<=<f+g%OS Zu_Lrxh2,i> {pEM~BDY(\l-^o;|:NXaeP]=svt49V08n Cw71 Fc)bz@ G&#/!6} 'JKRq5?.Aj"[*Q$HkdmITU`yW3 and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.Not synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.Remove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou have made changes since the last save. Would you like to save before exiting?balancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2012-08-06 04:09+0000 Last-Translator: Michael Rooney Language-Team: Hebrew MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2012-08-07 04:45+0000 X-Generator: Launchpad (build 15745) ו־%sל־%(num)i העברות חוזרות ישנן סך הכל %(totalnum)i העברות מוכנות.&אודות&מטבע&קובץע&זרהדיווח על &תקלהה&גדרות&תצוגה'%s' אינו סכום תקני.החיפוש פעיל כרגעשם החשבוןשמות חשבונות לא יכולים להיות ריקים.חשבונותהוסף את %s למחשבוןהוספת תגיתהוסף חשבון חדשהוספת תגיתכל החשבונותסכוםארעה שגיאה במהלך ייבוא קובץ ה־csv.בכל שנהבכל %(num)d שניםלשאול ש&אלהלשאול שאלה באתר האינטרנטשמירה אוטומטיתשמירת השינויים אוטומטיתמאזןמיפוי עמודות CSVהגדרות קובץ CSVייבוא CSVשגיאת ייבוא csvפרופילי CSVביטוללרוקן את החיפוש?סגורמפריד עמודותהגדר את החשבון הנבחרזכויות יוצריםחשבון ה־Mint התואם עבור %(name)s:יומיבכל %(num)d ימיםתאריךתבנית תאריךמפריד עשרונימחיקהתיאורסגורקידודמסתיים ב־:כניסה לעסקה זובכל %(num)d שבועות ב%%sיצוא ל־CSVיצוא תזרים הכספים לקובץ CSVקובץ לייבואלדוגמה, סימון תיבה זו והזנת עסקה בסך 50$ לחשבון זה תחסיר 50$ מהחשבון שנבחר כמקור.שישיימי שישימאתתרשיםתהנה!הסתר את המחשבוןהסתר אפשרויות חיפוש מתקדמותאם תיבה זו מסומנת בעת הוספת עסקה, אתה תשאל באיזה חשבון להשתמש כמקור ההעברה.ייבואייבוא מקובץ CSVייבוא העברות מקובץ CSVמאזן ראשונישילוב ב־Mint.comסכום ההעברה אינו תקנינראה כי זאת הפעם הראשונה בה אתה משתמש ב־wxBanker!פחות אפשרויותשורות לדילוגתואם: שילוב ב־Mint.comפרטי האימות מול Mint.com:שניימי שניחודשיבכל %(num)d חודשיםחודשיםמידע נוסף אודות wxBankerאפשרויות נוספותהעברת %i עסקאות אלו לחשבוןהעברת העסקה לחשבוןלעולם לאהחשבון הבאלא נבחרו חשבונותלא הוזן סכום בשדה 'סכום'.עדיין אין תגיות נפוצותללא תיאוראין שער המרה עבור סוג המטבע "%s"אין העברות תואמות.עדיין אין תגיותלא הוזנו עסקאותלא בסנכרון מול Mint.comנא לשים לב ששמירה אוטומטית מהתפריט קובץ תחסוך ממך שמירה באופן ידני.לאחר שיצרת חשבון תוכל להוסיף לו עסקאות (כגון מאזן התחלתי) באמצעות הפקדים שמתחת לטבלה שמצד שמאל למטה.לשכתב פרופיל ?סיסמה:ביצועאנא הזן מספר כגון 12.34 או -20.אנא בחר חשבון ואז נסה שוב.תצוגה מקדימההחשבון הקודםפרופיל עם השם '%s' כבר קיים. לשכתב אותו ?ספריית ה־Python ‏בשם simplejson נדרשת לצורך טעינה/שמירה של פרופיל csv.חוזרעסקאות חוזרותהעסקה החוזרת נוספה בהצלחה.הסר את החשבון הנבחרהסרת %i עסקאות אלוהסר תגית זוהסר עסקה זושנה את שם החשבון הנבחרחוזרת בימים:חזרה:דיווח על תקלה למפתחים באתר האינטרנטבקשת מטבעבקשת &תכונהבקשה להטמיע תכונה חדשה בתוכנהשבתימי שבתשמירהלשמור את השינויים ?שמירת פרטי הזיהוי במפתח הסיסמאותחפש תגית זוחפש עסקאותבחירת סוג המטבע להצגהבחירת הקובץ ולחיצה על "תצוגה מקדימה"שלח את %s למחשבוןהצג את המחשבוןהצג אפשרויות חיפוש מתקדמותהצגת חשבונות בעלי מאזן 0כלכלה אישית בפשטות.אנו מתנצלים, חשבון בשם זה כבר קיים.מתחיל ב־:חיסור %s מהמחשבוןתקצירתקציר:ראשוןימי ראשוןסנכרון מאזני חשבונות מול חשבון קיים ב־Mint.comתגיות:תגיותחשבון היעדנראה כי קידוד הקובץ אינו '%s'.ההעברה הראשונה תתבצע בתאריך %(date)sלעסקה החוזרת "%(description)s" ישנן %(num)i העברות מוכנות על סך %(amount)s בתאריך %(datelist)s.לחשבון זה אין עסקאות חוזרות לעת עתה.עסקה זו מסומנת כהעברת כספים. יש לבחור את חשבון ההעברה.פעולה זו תסיר לצמיתות את החשבון '%s' על כל עסקאותיות. להמשיך?פעולה זו תסיר לצמיתות את העסקה החוזרת. להמשיך?חמישיימי חמישישעהבתור התחלה, הוסף חשבון באמצעות בקרת החשבונות בפינה הימנית העליונה.כדי להשתמש בספריית השרטוט '%s', יש להתקין את המודולים הבאים של פייתון: %s.המאזן הכללי במשך הזמן&תרגום wxBankerפרטי העסקהעסקאותהעברההעברה מ־%sהעברה אל %sתרגום wxBanker לשפה אחרתמגמהאחוזי מגמהשלישיימי שלישיעדכוןשם המשתמש:עיון ב&שאלות נפוצותעיון בשאלות נפוצות באתר האינטרנטאזהרהרביעיימי רביעישבועימדי שבוע ב%sמדי יום בימות השבועמדי יום בסופי השבועברוכים הבאים!כשמבוטל, חשבונות בעלי 0.00₪ יוסתרו מהרשימה.האם למחוק את החיפוש הנוכחי ולהפוך עסקה זו תוך "%s"?שנתינערכו שינויים מאז השמירה האחרונה. האם לשמור בטרם היציאה?מאזןיוםימיםזוההכלמאתחודשחודשיםמדי חודשאלעד %sשבועשבועותשנהשניםwxbanker-0.9.1/locale/hi/0000755000175000017500000000000012243601243015140 5ustar mrooneymrooneywxbanker-0.9.1/locale/hi/LC_MESSAGES/0000755000175000017500000000000012243601243016725 5ustar mrooneymrooneywxbanker-0.9.1/locale/hi/LC_MESSAGES/wxbanker.mo0000644000175000017500000002213512243601243021106 0ustar mrooneymrooneyZ   6 CL^eu       (     | j 5        ( 7 F  + , > F b z $      . < D H aP Q  Pci  & #*38 ; FQ ""-Pd>|<t & ,/&7CD{7 .+ZjzIgbr 45)1g[  ,0:Gt&Mg=53=.ql %f44tE Xbuy $!1!G! !B!B"+U"5"5"" ##,#*E#p# ######$$%$C$,/*&@E8%?(DYHMP' 24!=1ZC:WB )I#F69 X< K+0S5G".V3 QU7LONR$>-A;TJ and %s&About&Currency&Help&Report a Bug&Settings'%s' is not a valid amount.A lightweight personal finance management application.AccountsAdd a new accountAmountAsk a &QuestionAsk a question onlineBalanceClear search?Configure the selected accountCopyrightDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnter this transactionFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromHave fun!Hide CalculatorIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.Invalid Transaction AmountIt looks like this is your first time using wxBanker!LoadMatch: MonMondaysMore information about wxBankerNeverNo account selectedNo amount entered in the 'Amount' field.No descriptionOnce you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.PasswordPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewRemove the selected accountRemove this transactionRename the selected accountReport a bug to the developer onlineSatSaturdaysSaveSearch transactionsSelect currency to displayShow CalculatorSorry, an account by that name already exists.SummarySunSundaysThe buttons in the account control allow you to add, remove, and rename an account, respectively.This will permanently remove the account '%s' and all its transactions. Continue?ThuThursdaysTo get started, add an account using the account control in the top left corner.TotalTotal Balance Over TimeTransactionsTransferTransfer from %sTransfer to %sTrendTueTuesdaysView &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWelcome!YearlydaydaysfromtoweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-02-03 00:18-0800 PO-Revision-Date: 2009-11-30 02:28+0000 Last-Translator: ankur_the_king Language-Team: Hindi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-02-04 04:46+0000 X-Generator: Launchpad (build Unknown) और %sके बारे में (&A)&मुद्रासहायता (&H)बग के बारे मे सूचित करेंविन्यास (&S)'%s' वैध राशि मूल्य नही हैएक हल्का व्यक्तिगत वित्त प्रबंधन अनुप्रयोगखातॆनया खाता खॊले॔राशिअपने सवाल पूछियेऑनलाइन सवाल पूछिएबकाया राशीखोज परिणाम साफ़ करें?चयनित खाते मे फेर-बदल करेंसर्वाधिकार सुरक्षिततारीख़दिनांक रचनादशमलव अलगानेवालामिटाओविवरणखारिज करेंएनकोडिंगइस लेनदेन कॊ सम्मिलित कीजिएउदाहरण के लिए, इस बक्से पर सही का निशान है और 50 डॉलर के एक सौदे का प्रवेश इस खाते में करते है तो स्रोत के रूप में चुने गये खाते से $ 50 घट जायेंगेशुक्रशुक्रवारके द्वाराआनंद लीजिये!कैलक्यूलेटर छुपाएँअगर इस बॉक्स को चयनित किया जाता है, तो आपको इस हस्तांतरण के स्रोत के रूप में उपयोग करने के लिए एक खाते के लिए पूछा जायेगाअवैध राशि मूल्यwxBanker के पहले इस्तेमाल में आपका स्वागत है!लोड करेंमेल: सोमसोमवारwxBanker कि और जानकारीकभी नहींकोई खाता चयनित नही॔ हैकोई राशि 'राशि' फ़ील्ड में प्रवेश नही की गई हैकोई विवरण नहींएक बार आपने एक खाता बना लिया फिर आप उसमे लेनदेन जोड़ सकते हैं (जैसे प्रारंभिक शेष राशि) ,आप इसे करने के लिए निचली-दाईं तरफ के ग्रिड के नीचे के नियंत्रणों का उपयोग कर सकते है.पासवर्डकृपया गणा॔क जैसे 12.34 या -20 डाले॔कृपया एक खाता चुने॔ और फिरसे कोशिश करे॔पूर्वदृश्यचुनावित खाता मिटाँएइस लेनदेन को मिटाँएचयनित खाते का नाम बदलेंबग के बारे मे निर्माता को ऑनलाइन सूचित करेंशनिशनिवारसहेजेंलेनदेन खोजियेप्रदर्शित किए जाने के लिए मुद्रा चुनेंकैलक्यूलेटर दिखाएँमाफ कीजिये, इस नाम से एक खाता पहले से मौज़ूद हैसारांशरविरविवारखाता नियंत्रण के बटन आपको अनुमति देते हैं ,क्रमशः, नया खाता जोड़ने, मिटाने एवम् खाते का नाम बदलने कीयह स्थायी रूप से खाता '%s' और उसके सभी लेनदेन को मिटा देगा. जारी रखें?गुरुगुरुवारशुरु करने के लिए, उपर बाँए हाथ मे॑ खाता नियंत्रण से नया खाता खोलियेकुलसमयानुसार कुल बकाया राशीलेनदेनहस्तांतरित करें%s से हस्ता॔तरित करे॔%s को हस्ता॔तरित करे॔प्रवृत्तिमंगलमंगलवार&FAQs देखियेऑनलाइन FAQs देखियेचेतावनीबुधबुधवारसाप्ताहिकसुस्वागतम्!वार्षिकदिनदिनोंसेकोसप्ताहसप्ताहवर्षवर्षwxbanker-0.9.1/locale/hr/0000755000175000017500000000000012243601243015151 5ustar mrooneymrooneywxbanker-0.9.1/locale/hr/LC_MESSAGES/0000755000175000017500000000000012243601243016736 5ustar mrooneymrooneywxbanker-0.9.1/locale/hr/LC_MESSAGES/wxbanker.mo0000644000175000017500000002220112243601243021111 0ustar mrooneymrooneyDl8 9 A H R X ^ l v 6     $ 6 C ,J w        2 < A M _ f r z   CGO T^n|#C5^  % .4(Hq/CL+T,9 (@$\  4.Ds{a+QH P +8AR&a &   Qclu z     ;)e# '$=Lgn  " )5K\  y+ !( , 4A E%R x&#" #>%- 71?q0    * @ &[   !  . !!7!@! D!N!W`!+!I!." 3"W>"""" "" " ""#!#%#-#=#,N# {#### # # #[# $ ($2$5$L$O$V$l$ AI`W1:6g eK2=Yi>-rq!HJm3|BNo fd\]9,4& p+#jz0<v%$~hVU{lQ}EMw @OxCR"?FG* 8kDta_n/'bSu.Z7c;5)TX^[(PyLs and %s&About&Currency&File&Help&Report a Bug&Settings'%s' is not a valid amount.A lightweight personal finance management application.A search is currently active.Account names cannot be blank.AccountsAdd %s to calculatorAdd a new accountAll accountsAmountAn error ocurred during the csv file import.Ask a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV file settingsCSV importCSV import errorCSV profilesClear search?Configure the selected accountCopyrightDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnter this transactionFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLoadMatch: MonMondaysMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNo account selectedNo amount entered in the 'Amount' field.No descriptionNo transactions entered.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?PasswordPerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewProfile with the name '%s' exists already. Overwrite it ?Remove the selected accountRemove these %i transactionsRemove this transactionRename the selected accountReport a bug to the developer onlineSatSaturdaysSaveSave changes?Search transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsSkip first lineSorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySunSundaysTarget accountThe buttons in the account control allow you to add, remove, and rename an account, respectively.The file encoding does not seem to be '%s'.This will permanently remove the account '%s' and all its transactions. Continue?ThuThursdaysTo get started, add an account using the account control in the top left corner.TotalTotal Balance Over TimeTran&slate wxBankerTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTueTuesdaysUsernameView &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWelcome!YearlyYou have made changes since the last save. Would you like to save before exiting?daydaysdetectedfrommonthmonthstountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-02-03 00:18-0800 PO-Revision-Date: 2009-11-30 02:28+0000 Last-Translator: Miro Glavić Language-Team: Croatian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2010-02-04 04:46+0000 X-Generator: Launchpad (build Unknown) i %sO &programu&Valuta&Datoteka&PomoćPrijavite po&grešku&Postavke'%s' nije ispravan iznos.Program lake kategorije za upravljanje osobnim financijama.Pretraga je trenutno aktivna.Nazivi računa ne mogu biti prazni.RačuniDodaj %s u kalkulatorDodaj novi računSvi računiIznosGreška se dogodila prilikom CSV uvoza.Postavite &pitanjePostavite pitanje onlineAuto-spremanjeAutomatski spremi promjeneStanjePostavke CSV datotekeCSV uvozGreška kod CSV uvozaCSV profiliPoništiti pretragu?Podesite označeni računAutorska pravaDatumFormat datumaDecimalni separatorObrišiOpisOdbaciŠifriranjeUnesi ovu transakcijuDatoteka za uvozNa primjer, označivanje ove kućice i unos transakcije od 50 kn će također oduzeti 50 kn sa računa koji odaberete kao izvor.PetPetkomOdDobru zabavu!Sakrij kalkulatorSakrij napredne opcije pretrageAko je ova kućica označena pri dodavanju transakcije, biti ćete upitani za račun koji se koristi kao izvor transfera.UvozUvezi iz CSVUvezi transakcije iz CSV datotekeNeispravan iznos transakcijeIzgleda da prvi puta koristite wxBanker!Manje opcijaUčitajPoklapanje: PonPonedjeljkomViše informacija o wxBanker programuViše opcijaPremjesti ove %i transakcije na računPremjesti ovu transakciju na računNikadNije odabran niti jedan račun.Nije unešen iznos u polje 'Iznos'Bez opisaTransakcija nije unešena.Kada ste stvorili račun, možete mu dodati transakcije (na primjer početno stanje) koristeći kontrole ispod mreže desno dolje.Prepisati profil?LozinkaIzvršiMolim unesite broj kao 12.34 ili -20.Molim odaberite račun, pa pokušajte ponovo.PregledProfil sa imenom '%s' ve ćpostoji. Prepisati ga?Ukloni označeni računUkloni ove %i transakcijeUkloni ovu transakcijuPreimenuj označeni računPrijavite pogrešku online razvijatelju programaSubSubotomSpremiSpremi promjene?Pretraži transakcijeOdaberite valutu za prikazOdaberi datoteku i klikni na "Pregled"Pošalji %s na kalkulatorPrikaži kalkulatorPrikaži napredne opcije pretragePreskoči prvi redNažalost, račun pod tim imenom već postoji.Počinje:Oduzmi %s iz kalkulatoraSažetakNedNedjeljomOdredišni računGumbi u kontroli račun omogućavaju vam dodavanje, uklanjanje i preimenovanje računa.Šifriranje datoteke ne izgleda da je '%s'.Ovime se trajno uklanja račun '%s' i sve njegove transakcije. Nastaviti?ČetČetvrtkomKako biste započeli, dodajte račun koristeći kontrolu račun u gornjem lijevom kutu.UkupnoUkupno stanje kroz vrijemePre&vedi wxBankerTransakcijePrijenosPrenesi sa %sPrenesi na %sPrevedi wxBanker na drugi jezikTrendUtoUtorkomKorisničko imePogledajte &ČPPPogledajte često postavljana pitanja onlineUpozorenjeSriSrijedomTjednoTjedno na %sDobrodošli!GodišnjeNapravili ste promjene nakon zadnjeg spremanja. Da li hoćete da ih spremite prije izlaska?dandanadanaotkrivenoodmjesecmjesecamjesecidodok %stjedantjednatjedanagodinagodinegodinawxbanker-0.9.1/locale/hu/0000755000175000017500000000000012243601243015154 5ustar mrooneymrooneywxbanker-0.9.1/locale/hu/LC_MESSAGES/0000755000175000017500000000000012243601243016741 5ustar mrooneymrooneywxbanker-0.9.1/locale/hu/LC_MESSAGES/wxbanker.mo0000644000175000017500000002053612243601243021125 0ustar mrooneymrooneyy8 9 A H R X ^ l v |     ,  & < F a i }       * < C O X f u y        5 + 8 F N R Z w ~   (  " +,#9+Ce$  '3[ _i n|.-59AlP+Q; ?PI &!&*QY ]hoQ   8 CM my) $3 LW gt!  ,@UWfmv. ">Vk } &/G-V 1%4W *W) Gh0/M3k!."  0u<0\@C\X    % C I K 7W        [ N!S!X!0\Xk1(-fa! V]?oiWSDudtCI#yYgxQAHsnJE e.l$79[,NTF"PBw_`+R2L:ch;@=M<)*3rU/pGK %q'>jm8v6&5 O4 Zb^ and %s&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.Account nameAccountsAdd %s to calculatorAdd a new accountAll accountsAmountAn error ocurred during the csv file import.Ask a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesClear search?Column delimiterConfigure the selected accountCopyrightDailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionEncodingExport to CSVFile to importFriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsImportImport from CSVInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsNeverNo account selectedNo amount entered in the 'Amount' field.No descriptionNo exchange rate for currency "%s"Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Please enter a number such as 12.34 or -20.Please select an account and then try again.PreviewProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RemoveRemove the selected accountRename the selected accountReport a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Select file and click "Preview"Show CalculatorShow advanced search optionsSimple personal finance.Sorry, an account by that name already exists.Subtract %s from calculatorSummarySunSundaysTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.This will permanently remove the account '%s' and all its transactions. Continue?ThuThursdaysTo get started, add an account using the account control in the top left corner.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTranslate wxBanker to another languageTrendTueTuesdaysView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on weekdaysWeekly on weekendsWelcome!YearlyYou have made changes since the last save. Would you like to save before exiting?frommonthlytoProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2011-03-29 05:08+0000 Last-Translator: gergely87 Language-Team: Hungarian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2011-03-30 04:35+0000 X-Generator: Launchpad (build 12559) és %sNév&jegy&Pénznem&Fájl&Súgó&Hiba bejelentése&Beállítások&NézetA '%s' összeg nem valós.Fiók neveSzámlákAdjunk a számításhoz a %s-t.Új számlaMinden számlaÖsszegHiba történt a csv importálás során.Kér&dezekInterneten kérdezekAutomatikus mentésVáltoztatások automatikus mentéseEgyenlegCSV oszlop-egyeztetésCSV fájl beállításaiCSV importCVS import hibaCSV profilokTöröljük a keresést?Oszlop elválasztóA kijelölt számla beállításaCopyrightNapiMinden %(num)d napDátumDátum formátumTizedesjelTörlésLeírásKarakterkódolásExportálás CSV-beImportálandó fájlPPéntekenkéntEttőlGrafikonJó szórakozást!Számológép ElrejtéseRészletes keresési beállítások elrejtéseImportálásImportálás CSV-bőlÉrvénytelen tranzakciós összegÚgy tűnik, ez az első alkalom, hogy használja a wxBankert!Kevesebb lehetőségSorok kihagyjásaEgyezik: HHétfőnkéntHaviMinden %(num)d hónaphónapokTovábbi információk a vxBanker-rőlTöbb lehetőségSohaNem választottál számlát.Nem adtál meg összeget az 'Összeg' mezőben.Nincs leírásNincs váltószám megadva a "%s" valutához.Miután létrehozott egy számlát, felveheti a tranzakciókat (például induló egyenleg), használva a gombokat a jobb alsó sarokbanFelülírjuk a profilt?Kérlek, számot írj. Például: 12.34 vagy -20.Kérlek, válassz egy számlát és próbáld újra.ElőnézetA '%s' profil már létezik. Felülírjuk?A Python simplejson könyvtár szükséges a csv profilok betöltéséhez/mentéséhez.EltávolításA kijelölt számla törléseA kijelölt számla átnevezéseHiba bejelentése internetenPénznem kéréseÚj szolgáltatás kéréseÚj szolgáltatás megvalósításának kéréseSzoSzombatonkéntMentésMentsük a változtatásokat?Válassz fájlt és kattints az "Előnézet"-reSzámológép MegjelenítéseRészletes keresési beállítások megjelenítéseEgyszerű személyes pénzügyek.Bocsi, az adott névvel már létezik számla.Vonjunk ki a számításból %s-t.ÖsszesenVVasárnaponkéntCélszámlaA gombokkal a számlabeállításoknál hozzáadhat, átnevezheti, beállíthatja, és eltávolíthatja a számláit.A fájl karakterkódolása valószínűleg '%s'.Ezzel véglegesen letöröljük a '%s' számlát és az összes tranzakcióját. Folytassuk?CsCsütörtökönkéntA kezdéshez, adjon hozzá egy számlát a számlabeállításoknál, a bal felső sarokban.Teljes egyenleg az adott időbenA vxBanker le&fordításaTranzakció részletekTranzakciókÁtvitelA vxBanker lefordítása más nyelvreTrendKKeddenkéntA Gyakran Ismételt Kérdések megtekintése internetenFigyelmeztetésSzeSzerdánkéntHetiHeti hétköznapokonHeti hétvégénÜdvözöljük!ÉvesVáltozások történtek az utolsó mentés óta. Szeretné, hogy menteni kilépés elõtt?tólHavieddigwxbanker-0.9.1/locale/it/0000755000175000017500000000000012243601243015154 5ustar mrooneymrooneywxbanker-0.9.1/locale/it/LC_MESSAGES/0000755000175000017500000000000012243601243016741 5ustar mrooneymrooneywxbanker-0.9.1/locale/it/LC_MESSAGES/wxbanker.mo0000644000175000017500000003565212243601243021132 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #$%R% +&9&A&G&N& ^& l& x&!& &.&&&'/'I' _'m'4u'''''# (-(6(L( b(p( (((((( ('();) A)N)b) j)v)~)))))%)****** **$*+++"+++$ ,11, c,p,,,,,,,,!, -%-"B-e-i-|-+---*-.8.J. g.q.o.// //)/// 0'07:0Ur0 00,011=1[1t1111'11202N2R2Y2_2$u2222&2 3%3%<3!b3313333 4 44E4 ^4 i4s4~4,5).5qX5)5c5WX6L667 7e7iu7N7!.8P8a8 |8888#8 88889 9 9+$9 P9[9 _9 i9u9+9!9 9Q9B5:x:V:b::;B; K;Y;b;g; j; t;; ;; ;s*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2012-10-09 16:27+0000 Last-Translator: Da Lio Maurizio Language-Team: Italian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2012-10-10 04:43+0000 X-Generator: Launchpad (build 16112) e %s%(num)i transazioni ricorrenti hanno un totale di %(totalnum)i transazioni pronte.&Informazioni&Valuta&File&Aiuto&Segnala un bug&Impostazioni&Visualizza«%s» è un importo non valido.Una ricerca è attiva al momento.Nome contoI nomi degli account non possono essere vuoti.AccountsAggiungi %s alla calcolatriceAggiungi EtichettaAggiungi un nuovo accountAggiungi un'etichettaTutti i contiImportoC'è stato un'errore nell' importazione del file csvAnnualmenteOgni %(num)d anniPoni una &DomandaPoni una domanda onlineSalvataggio automaticoSalva automaticamente i cambiamentiBilancioMappatura Colonne CSVImpostazione file CSVImportare CSVErrore nell'importazione CSVCSV profiliAnnullaPulire ricerca?ChiudiDelimita colonneConfigura l'account selezionatoCopyrightConto Mint corrispondente per %(name)s:GiornalieroOgni %(num)d giorniData:Formato dataSeparatore decimaleEliminaDescrizioneRimuoviCodificaFinisce:Inserisci questa transazioneOgni %(num)d settimane, di %%sEsporta in CSVEsporta le transazioni in un file CSVFile da importarePer esempio, selezionando questa casella e inserendo una transazione di $50 in questo account, verranno sottratti $50 dall'account che selezionerai come sorgenteVenVenerdiDaGraficoDivertiti!Nascondi la calcolatriceNascondi opzioni avanzate di ricercaSe questa opzione è selezionata aggiungendo una transazione, verrà richiesto l'inserimento del conto da utilizzare come sorgente del trasferimento.ImportaImporta da CSVImporta transazioni da un file CSVBilancio inizialeIntegra con Mint.comAmmontare della transazione invalidoA quanto pare è la prima volta che usi wxBanker!Meno opzioniLinee da saltareCorrispondenza: Integrazione Mint.comCredenziali Mint.com:LunLunediMensilmenteOgni %(num)d mesiMesiMaggiori informazioni su wxBankerAltre opzioniSposta queste %i transazioni al contoSposta questa transazione al contoMaiAccount successivoNessun account selezionatoNessun importo inserito nel campo 'Importo'Nessuna etichetta comuneNessuna descrizioneNessun tasso di scambio per la valuta "%s"Nessuna transazione trovata.Nessuna etichettaNessuna transazione inseritaNessuno/aNon sincronizzato con Mint.comRicorda che abilitare il salvataggio automatico dal menu File eliminerà la necessità di salvare manualmente.Una volta che hai creato un account puoi aggiungerci transazioni (come il tuo bilancio iniziale) usando i controlli sotto la griglia in basso a destra.Sovrascrivere il profilo?Password:EseguiInserisci un numero come 12.34 oppure -20Per favore, scegli un account e prova di nuovo.AnteprimaAccount precedenteEsiste già un profilo con il nome '%s'. Sovrascrivere?la libreria simplejson di python è necessaria per leggere/salvare il CSV del profiloRicorrenteTransazioni ricorrentiTransazione periodica aggiunta con successo.RimuoviRimuovi l'account selezionatoRimuovi queste %i transazioniRimuovi questa etichettaRimuovi questa transazioneRinomina l'account selezionatoRipeti nei giorni:Ripete:Segnala un bug allo sviluppatore onlineRichiedi valutaRichiedi una funzionali&tàRichiedi di implementare una nuova funzionalitàSabSabatoSalvaSalvare le modifiche?Salva le credenziali nel portachiaviCerca questa etichettaRicerca movimentiSeleziona la valuta da mostrareSeleziona un file e clicca "Anteprima"Invia %s alla calcolatriceMostra la calcolatriceMostra le opzioni di ricerca avanzateMostra account con bilancio nulloSemplice finanza personale.Spiacente ma esiste già un conto con questo nomeInizia:Sottrai %s alla calcolatriceSommarioRiepilogo:DomDomenicaSincronizza i bilanci degli account con un account Mint.com esistenteEtichetta:EtichetteConto in esameI pulsanti nel controllo del conto ti permettono di aggiungere, rinominare, configurare e rimuovere un conto, rispettivamente.La codifica del file non sembra essere '%s'.La prima transazione avverrà il %(date)sLa transazione ricorrente "%(description)s" ha %(num)i transazioni pronte per %(amount)s nei giorni %(datelist)s.Qesto conto non ha transazioni ricorrentiQuesta transazione è marcata come trasferimento. Per favore, seleziona l'account di trasferimento.Ciò cancellerà permanentemente l'account '%s' e tutte le sue transazioni. Continuare?Questo cancellerà in modo permanente la transazione ricorrente. Continuare?GioGiovediTempoPer cominciare, aggiungi un account usando i pulsanti per gli account nell'angolo in alto a sinistra.Per rimuovere questa etichetta, rimuoverla dalla descrizione o clicca col tasto destro sulla transazione.Per usare la libreria di stampa '%s', installare i seguenti moduli python: %s.Bilancio Totale nel Lungo PeriodoTraduci wxBankerDettagli della transazioneTransazioniBonificoTrasferisci da %sTrasferisci a %sTraduci wxBanker in un'altra linguaAndamentoGrado di AndamentoMarMartediAggiornaNome utente:Mostra &FAQsMostra le Frequently Asked Questions onlineAttenzioneMerMercolediSettimanaleOgni settimana di %sOgni settiamana nei giorni infrasettimanaliOgni settimana nel fine settimanaBenvenuto!Quando disattivati, i conti con un bilancio di $0.00 saranno nascosti dalla listaVuoi pulire la ricerca corrente e eseguire la transazione in "%s"?AnnualeSi può anche etichettare una transazione mettendo #nometag ovunque nella descrizione.Hai effettuato delle modifiche dall'ultimo salvataggio. Vuoi salvare le modifiche prima di uscire?_Totalebilamciogiornogiornirilevatoognidamesemesimensilmenteafino a %ssettimanasettimaneannoanniwxbanker-0.9.1/locale/ko/0000755000175000017500000000000012243601243015151 5ustar mrooneymrooneywxbanker-0.9.1/locale/ko/LC_MESSAGES/0000755000175000017500000000000012243601243016736 5ustar mrooneymrooneywxbanker-0.9.1/locale/ko/LC_MESSAGES/wxbanker.mo0000644000175000017500000000077112243601243021121 0ustar mrooneymrooney$,89Project-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-08-10 00:01-0700 PO-Revision-Date: 2010-08-14 12:38+0000 Last-Translator: FULL NAME Language-Team: Korean MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2010-08-15 06:13+0000 X-Generator: Launchpad (build Unknown) wxbanker-0.9.1/locale/nb/0000755000175000017500000000000012243601243015137 5ustar mrooneymrooneywxbanker-0.9.1/locale/nb/LC_MESSAGES/0000755000175000017500000000000012243601243016724 5ustar mrooneymrooneywxbanker-0.9.1/locale/nb/LC_MESSAGES/wxbanker.mo0000644000175000017500000000112712243601243021103 0ustar mrooneymrooney4L` al{ @ MCSV importTarget accountProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2011-05-20 10:28+0000 Last-Translator: mabynke Language-Team: Norwegian Bokmal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2011-05-21 04:42+0000 X-Generator: Launchpad (build 12959) Importer CSVMålkontowxbanker-0.9.1/locale/nds/0000755000175000017500000000000012243601243015324 5ustar mrooneymrooneywxbanker-0.9.1/locale/nds/LC_MESSAGES/0000755000175000017500000000000012243601243017111 5ustar mrooneymrooneywxbanker-0.9.1/locale/nds/LC_MESSAGES/wxbanker.mo0000644000175000017500000000146612243601243021276 0ustar mrooneymrooney\    # -3All accountsBalanceDateFromTotal Balance Over TimeTrendtoProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-02-03 00:18-0800 PO-Revision-Date: 2010-02-03 09:22+0000 Last-Translator: Patrick Eigensatz Language-Team: Low German MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-02-04 04:46+0000 X-Generator: Launchpad (build Unknown) Alle KontenAusgleichDatumVonGesamter Kontostand über die Zeit:TrendZuwxbanker-0.9.1/locale/nl/0000755000175000017500000000000012243601243015151 5ustar mrooneymrooneywxbanker-0.9.1/locale/nl/LC_MESSAGES/0000755000175000017500000000000012243601243016736 5ustar mrooneymrooneywxbanker-0.9.1/locale/nl/LC_MESSAGES/wxbanker.mo0000644000175000017500000003572612243601243021131 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #$%U% .&9&A&J&P& f&t&!z&$& &$& &&'('F'Y'i'Bp'''' '!(#()(>( W(e( w( ((((%( ()()9) ?) L) Z) f) s)})))))*)*** *** **!*+ ++)+ ++ ,B', j,x,,,,, , ,,- -,*-'W----!-"--! . +.L.[.w."|.t.// / /1/G/ D0N03^0R0 00+1 21#<1`1~11#11 101!2!62/X22 2222222(313L3_3#}3!3333 4 4 4#4@,4m4t4 {44+#51O5k585]&6W6F6#7 &727U77d7j7]8t88 8 888%88 89 9 99"/9"R9 u99 9 99999X9M9: :j:n:k;s; z; ;;; ; ;;; ; ;s*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2012-08-06 04:09+0000 Last-Translator: Michael Rooney Language-Team: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2012-08-07 04:45+0000 X-Generator: Launchpad (build 15745) en %s%(num)i herhalende transacties hebben een totaal van %(totalnum)i transacties gereed.Info &over&Valuta&Bestand&HelpEen fout &rapporteren&Instellingen&Toon'%s' is geen geldige hoeveelheid.Momenteel is een zoekopdracht bezig.RekeningnaamRekeningnamen kunnen niet leeg zijn.RekeningenTel %s op in rekenmachineLabel toevoegenEen nieuwe rekening toevoegenVoeg een label toeAlle rekeningenBedragEr is een fout ontstaan tijdens het importeren van het CSV-bestandJaarlijksElke %(num)d jaarStel een vraagStel een vraag onlineAuto-opslaanAutomatisch veranderingen opslaanSaldoCSV kolommenindelingCSV bestandsinstellingenImporteer CSVCSV importeerfoutCSV profielenAnnulerenZoekveld wissen?SluitenKolomn scheidingstekenConfigureer de geselecteerde rekeningAuteursrechtOvereenkomend Mint account voor %(name)s:DagelijksElke %(num)d dagenDatumDatumnotatieDecimaaltekenVerwijderenOmschrijvingVerwerpenCoderingEindigt:Voeg deze transactie toeElke %(num)d weken op %%sExporteer naar CSVExporteer transacties naar een CSV-bestandTe importeren bestandBijvoorbeeld, als dit vakje is aangevinkt voor een transactie van $50 naar deze rekening, zal er $50 worden afgeschreven van de rekening die u heeft aangegeven.VrVrijdagenVanGrafiekVeel Plezier!Rekenmachine verbergenGeavanceerde zoekopties verbergenAls dit vakje is aangevinkt tijdens het toevoegen van een transactie, wordt u gevraagd aan te geven van welke rekening het geld komt.ImporteerImporteer uit CSVImporteer transacties uit een CSV-bestandStartbedragIntegreer met Mint.comOngeldige transactie hoeveelheidHet lijkt erop dat dit de eerste keer is dat je wxBanker gebruikt!Minder optiesRegels om over te slaanKomt overeen met: Mint.com IntegratieMint.com gegevens:MaMaandagenMaandelijksElke %(num)d maandenMaandenMeer informatie over wxBankerMeer optiesVerplaatse deze %i transacties naar rekeningVerplaats deze transactie naar rekeningNooitVolgende rekeningGeen rekening geselecteerdGeen bedrag ingevuld bij 'Bedrag'Nog geen gemeenschappelijke labelsGeen beschrijvingGeen wisselkoers voor valuta "%s"Geen overeenkomende transacties.Nog geen labelGeen transacties toegevoegdGeenNiet gesynchroniseerd met Mint.comMerk op dat het aanzetten van auto-opslaan in het bestandsmenu er voor zorgt dat u niet meer zelf hoeft op te slaan.Zodra je een rekening hebt toegevoegd kun je transacties (zoals beginsaldo) toevoegen met behulp van de knoppen in het grid rechtsonder.Profiel overschrijven?Wachtwoord:UitvoerenVoeg alstublieft een bedrag in zoals 12.34 of -20Alstublieft eerst een rekening selecteren, probeer het daarna nogmaals.VoorbeeldVorige rekeningProfiel met de naam '%s' bestaat al. Overschrijven?Python simplejson bibliotheek is nodig voor het laden/opslaan van een CSV profiel.HerhalendHerhalende transactiesHerhalende transactie succesvol toegevoegd.VerwijderVerwijder de geselecteerde rekeningVerwijder deze %i transactiesVerwijder dit labelVerwijder deze transactieDe geselecteerde rekening hernoemenHerhaalt op dagen:Herhalingen:Een fout online rapporteren aan een ontwikkelaarVraag een valuta aanVraag nieuwe func&tionalitiet aanVraag niet bestaande nieuwe functionaliteit aanZaZaterdagenOpslaanWijzigingen opslaan?Sla gegevens op in sleutelringZoek naar dit labelZoek transactiesSelecteer valutaSelecteer bestand en klik op 'Voorbeeld'Stuur %s naar rekenmachineRekenmachine tonenGeavanceerde zoekopties tonenLaat rekeningen met nul-balans zienSimpele, persoonlijke financiën.Sorry, rekeningnaam bestaat alBegint:Trek %s af in rekenmachineSamenvattingSamenvatting:ZoZondagenSynchroniseer rekeningbalansen met een bestaand Mint.com-accountLabel:LabelsDoelrekeningDe knoppen in het rekeningenbeheer geven u de mogelijkheid om een rekening respectievelijk toe te voegen, te hernoemen, te configureren en te verwijderen.De bestandscodering lijkt geen '%s' te zijnDe eerste transactie zal plaatsvinden op %(date)sDe herhalende transactie "%(description)s" heeft %(num)i transacties klaar voor %(amount)s op %(datelist)s.Dit account heeft momenteel geen herhalende transacties.Deze transactie is gemarkeerd als overboeking. Selecteer alstublieft de overboekingsrekening.Dit zal de rekening '%s' met bijbehorende transacties definitief verwijderen. Doorgaan?Dit zal deze terugkerende transactie definitief verwijderen. Doorgaan?DoDonderdagenTijdOm te beginnen, maak een rekening aan in via rekeningenbeheer in de linker bovenhoek.Om dit label later te verwijderen, verwijder het uit de omschrijving of rechtsklik op de transactie.Om de '%s' plotting-bibliotheek te gebruiken, moeten de volgende python modules worden geïnstalleerd: %s.Totaal saldo over tijdVertaal wxBankerTransactiedetailsTransactiesOvermakenVerplaats van %sVerplaats naar %sVertaal wxBanker naar een andere taalTrendTrendgraadDiDinsdagenVernieuwenGebruikersnaam:Bekijk veel gestelde vragen (&FAQ)Bekijk veel gestelde vragen onlineWaarschuwingWoWoensdagenWekelijksWekelijks op %sWekelijks op werkdagenWekelijks in weekendenWelkom!Indien uitgeschakeld worden rekeningen met een balans van €0,00 verborgen van de lijstZou u de huidige zoekopdracht willen wissen en deze transactie maken in "%s"?JaarlijksU kan ook een label toevoegen aan een transactie door #labelnaam ergens in de omschrijving neer te zetten.U heeft wijzigingen gemaakt sinds de de laatste keer dat u opgeslagen heeft. Wilt u nu opslaan voor afsluiten?_Totaalbalansdagdagengedetecteerdelkevanmaandmaandenmaandelijksnaartot %sweekwekenjaarjarenwxbanker-0.9.1/locale/oc/0000755000175000017500000000000012243601243015141 5ustar mrooneymrooneywxbanker-0.9.1/locale/oc/LC_MESSAGES/0000755000175000017500000000000012243601243016726 5ustar mrooneymrooneywxbanker-0.9.1/locale/oc/LC_MESSAGES/wxbanker.mo0000644000175000017500000001432212243601243021106 0ustar mrooneymrooneyw  ! ( 2 8 > H N l y         . 4 E O h m y            & 6 F ^ y          " 6 @ ,H u }         -Jcks| & "& - 7BJNU^elt}       # ";MSh| .>[o   (%NWm|  +5Dby 5 0 FQf j t)#& .9= FR [hls  &     / =H M Zhpw ~ -W*]d.\ 'm+Z0$ iE2=Fa^RNYk>?/_oLrhGXB!qQs "5SI 67VveOgC;K@H)MA18 p`tD:wJ9ln(P,uU [j&<b4#%c3Tf and %s&About&Currency&File&Help&Settings&ViewA search is currently active.Account nameAccountsAdd a new accountAll accountsAmountAsk a &QuestionAuto-saveBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterCopyrightDailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionExport to CSVFile to importFriFromGraphHave fun!Hide advanced search optionsImportImport from CSVInitial balanceIntegrate with Mint.comInvalid Transaction AmountLess optionsLines to skipMatch: Mint.com credentials:MonMonthlyEvery %(num)d monthsMonthsMore optionsNeverNext accountNo account selectedNo descriptionNoneOverwrite profile ?Password:PerformPlease select an account and then try again.PreviewPrevious accountRecurringRemoveRemove the selected accountRepeats on days:Repeats:Request a CurrencySatSaturdaysSaveSave changes?Search transactionsShow CalculatorShow advanced search optionsSimple personal finance.Starts:SummarySummary:SunSundaysTag:TagsTarget accountThuTimeTran&slate wxBankerTransaction detailsTransactionsTransferTranslate wxBanker to another languageTrendTrend DegreeTueUpdateUsername:View &FAQsWarningWedWeeklyWelcome!Yearly_TotalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytoweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2011-11-23 16:55+0000 Last-Translator: Cédric VALMARY (Tot en òc) Language-Team: Occitan (post 1500) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2011-11-24 04:38+0000 X-Generator: Launchpad (build 14336) e %s&A prepaus&Devisa&Fichièr&Ajuda&Paramètres&AfichatgeUna recèrca es actualament activa.Nom del compteComptesApondre un compte novèlTotes los comptesTotal&Pausar una QuestionSalvament automaticBalançaFormat de las colomnas CSVParamètres del fichièr CSVImportacion CSVError d'importacion CSVPerfils CSVAnullarAnullar la recèrca ?TamparDelimitador de colomnasDreches d'autorCada jornCada %(num)d jornsData de publicacionFormat de la dataSeparador decimalSuprimirDescripcionTamparEncodatgeFin :Apondre aquesta transaccionExportar en CSVFichièr d'importarDivPeriòde delGrafAmusatz-vos !Amagar las opcions de recèrca avançadaImportarImportar dempuèi CSVSòlde inicialIntegrar a Mint.comMontant de transaccion invalidMens d'opcionsLinhas d'ignorarCercar dins : Identificants Mint.com :DilCada mesCada %(num)d mesesMesesMai d'opcionsPas jamaiCompte seguentCap de compte pas seleccionatPas cap de descripcionPas capEspotir lo perfil ?Senhal :JogarMercés de seleccionar un compte e de tornar ensajar.PrevisualizacionCompte precedentRepeticionSuprimirSuprimir lo compte seleccionatJorns de repeticion :Repetir :Prepausar una devisaDisDissabtesEnregistrarSalvar los cambiaments ?Cercar dins las transaccionsAfichar la CalculadoiraAfichar las opcions de recèrca avançadaGestion simpla de comptes personalsS'avia :ResumitResumit :DimDimengesEtiqueta :AtributsCompte ciblaDijMoment&Traduire wxBankerDetalhs de la transaccionTransaccionsTransferirTraduire wxBanker dins una autra lengaTendénciaGra de lissatge de la tendénciaDimMesa a jornNom d'utilizaire :&Veire la FAQAvertimentMècCada setmanaBenvenguda !Cada an_Totalsòldejornjornsdetectatcadadempuèimesmesescada mesfins asetmanasetmanasananswxbanker-0.9.1/locale/pl/0000755000175000017500000000000012243601243015153 5ustar mrooneymrooneywxbanker-0.9.1/locale/pl/LC_MESSAGES/0000755000175000017500000000000012243601243016740 5ustar mrooneymrooneywxbanker-0.9.1/locale/pl/LC_MESSAGES/wxbanker.mo0000644000175000017500000003414512243601243021125 0ustar mrooneymrooneyL |     .;Zcx  ,  *EMa s~   (3 8DV ]iqz ! |V]#m5  %-BX\d %  (#L_"n ZO + ,7dl9}C )FMi$ '/W [e jx :U.n7 l/+,5M+Qy Pb/C  # , = &L s y    &    !!'!L0!M}!!O!Q""t"{""""" """" " ""$ $$$$% % %'%E% c% o%%% %% %%%!%& &2&A&V&o&&&& && &&&'' '<'!L'(n'' ''''' ''''("%(H(_( ) ))) )/)$@)ze))))*0*D*6_* ** *****5+ <+F+ d+r+++++!++ ,",?, \,h,,,y,$----)----.6..G.Iv. ....// -/;/ M/n//#///%/00 00$0?0P0 f0#000&0 01!81Z1k1 1 11 171111m14m2%222E2ZA33 33L3n3_k4$445 5)5 15 >5$L5q5w55 5 55515 566 66.6K6b6^i6H67a7`z7 777 788 8 (85888>8 X8r)S$Bqj?aeW=y.U]gC H 0{ uKL+`'^8\;9s&4o#/x hmElwOG<(|2JvbzY>XDnTd~N[*AMk "p_7:1-6cR,%iV3t fIQ5ZF@}P! and %s&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThis account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2012-03-31 13:54+0000 Last-Translator: Antoni Kudelski Language-Team: Polish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2012-04-01 04:36+0000 X-Generator: Launchpad (build 15032) i %s&O programie&Waluta&Plik&Pomoc&Zgłoś Błąd&Ustawienia&Widok'%s' nie jest ważną kwotą.Włączone jest wyszukiwanie.Nazwa kontaNazwy kont nie mogą być puste.KontaDodaj %s do kalkulatoraDodaj tagDodaj nowe kontoDodaj tagWszystkie kontaKwotaPodczas importu wystąpił błądRocznieCo %(num)d lataCo %(num)d latZadaj &PytanieZadaj pytanie onlineAutomatyczne zapisywanieAutomatycznie zapisuj zmianySaldoMapowanie kolumn CSVUstawienia pliku CSVImport CSVBłąd importu CSVProfile CSVAnulujWyczyścić wyszukiwanie?ZamknijSeparator kolumnKonfiguruj zaznaczone kontoPrawa autorskieKonto Mint powiązane z %(name)s:CodziennieCo %(num)d dniCo %(num)d dniDataFormat datySeparator dziesiętnyUsuńOpisOdrzućKodowanieKoniec:Wprowadź tę transakcjęCo %(num)d tygodni w %%sEksport do CSVEksportuj transaakcje do pliku CSVPlik do zaimportowaniaDla przykładu zaznaczenie tego pola wyboru i wprowadzenie do tego konta transakcji na 50PLN odejmie jednocześnie 50PLN z konta, które zostało wybrane jako źródło.PtW piątkiOdWykresMiłej zabawy!Ukryj kalkulatorUkryj zawansowane opcje wyszukiwaniaBędziesz pytany którego konta użyć jako źródła przelewu, jeśli ta opcja jest aktywna podczas dodawania transakcji.ImportujImportuj z pliku CSVImportuj transakcje z pliku CSVSaldo początkoweIntegruj z Mint.comNieważna Kwota TransakcjiWygląda na to, że używasz wxBanker po raz pierwszy!Mniej opcjiLinie do pominięciaDopasuj: Integracja z Mint.comDane logowania do Mint.com:PnW poniedziałkiCo miesiącCo %(num)d miesiąceCo %(num)d miesięcyMiesięcyWięcej informacji o wxBankerWięcej opcjiPrzesuń %i transakcji na kontoPrzesuń transakcję na kontoNigdyNastępne kontoNie wybrano kontaNie wpisano kwoty w polu 'Kwota'.Brak wspólnych tagówBrak opisuBrak kursu wymiany dla waluty "%s"Brak pasujących transakcji.Brak tagówBrak wprowadzonych transakcjiBrakBrak synchronizacji z Mint.comNależy pamiętać, że włączenia automatycznego zapisywania z menu Plik eliminuje konieczność ręcznego zapisywania.Po utworzeniu konta możesz do niego dodawać transakcje (np. początkowy stan konta) używając przycisków pod paskiem w prawym dolnym rogu.Nadpisać profil?Hasło:WykonajProszę wpisać liczbę np. 12.34 or -20.Proszę wybrać konto i spróbować ponownie.PodglądPoprzednie kontoProfil o nazwie '%s' już istnieje. Nadpisać?Zapisywanie i wczytywanie profili CSV wymaga biblioteki Python simplejsonPowtarzanieTransakcje okresoweDodano transakcje okresowa.UsuńUsuń zaznaczone kontoUsuń %i transakcjiUsuń ten tagUsuń transakcjęZmień nazwę zaznaczonego kontaPowtarza się w dniach:Powtarza się:Zgłoś błąd do dewelopera onlineWymagana WalutaWymagana FunkcjaWymagana nowa funkcja do załączeniaSoW sobotyZapiszZapisać zmiany?Zapisz dane w bazie kluczySzukaj tego taguPrzeszukaj transakcjeWybierz walutę do wyświetleniaWybierz plik i naciśnij "Podgląd"Wyślij %s do kalkulatoraPokaż kalkulatorPokaż zaawansowane opcje wyszukiwaniaPokazuj konta o zerowych saldachProste finanse osobiste.Konto o tej nazwie już istnieje.Rozpoczyna się:Odejmij %s z kalkulatoraPodsumowaniePodsumowanie:NdW niedzieleSynchronizacja sald kont z istniejącym kontem Mint.comTag:TagiKonto docelowePrzyciski kontroli konta pozwalają odpowiednio na dodawanie, zmianę nazwy, konfigurowanie i usuwanie konta.Kodowanie pliku nie wydaje się być w formacie '%s'Pierwsza transakcja nastąpi %(date)sBrak obecnie transakcji okresowych dla tego konta.Ta transakcja jest oznaczona jako przelew. Wynierz konto do przelewu.Konto '%s' zostanie trwale usunięte wraz ze wszystkimi transakcjami. Chcesz kontynuować?CzW czwartkiCzasAby rozpocząć, dodaj konto używając kontroli konta w lewym górnym rogu.Aby usunąć ten tag później, po prostu usuń go z opisu lub kliknij prawym przyciskiem myszy na transakcji.Aby używać biblioteki kreślenia wykresów '%s', zainstaluj następujące moduły python: %s.Przebieg całkowitego salda w czasiePrzetłu&macz wxBankerSzczegóły transakcjiTransakcjePrzelewPrzelej z %sPrzelej do %sPrzetłumacz wxBanker na inny językTrendStopień trenduWtWe wtorkiAktualizujNazwa użytkownika:Przeglądaj &FAQsPrzeglądaj najczęściej zadawane pytania onlineOstrzeżenieŚrW środyCo tydzieńCo tydzień w %sCo tydzień w dni powszednieCo tydzień w weekendyWitaj!Gdy ta opcja jest wyłączona, konto o saldach wynoszących 0,00 będą niewidoczne na liścieCzy chcesz usunąć aktualne szukanie i uczynić tę transakcję w "%s"?Co rokMożesz także oznaczyć transakcję poprzez umieszczenie #nazwatagu w dowolnym miejscu w opisie.Wykonałeś zmiany od ostatniego zapisu. Czy chcesz zapisać dane przed zakończeniem aplikacji?_Łączniesaldodzieńdnidniwykrytychcoodmiesiącmiesiącemiesięcymiesięczniedodo %stydzieńtygodnietygodniroklatalatwxbanker-0.9.1/locale/pt/0000755000175000017500000000000012243601243015163 5ustar mrooneymrooneywxbanker-0.9.1/locale/pt/LC_MESSAGES/0000755000175000017500000000000012243601243016750 5ustar mrooneymrooneywxbanker-0.9.1/locale/pt/LC_MESSAGES/wxbanker.mo0000644000175000017500000003564512243601243021143 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #$%[%'&.& 5&?&F& X&f& k&"& &,&&&'$'='P'`'6h''''' (!('(B( ^(k( (((((((.(&)F)K)[)m) t)) ) ))"))+)*0***** **(+z*+++&+ ++! ,7/,g,v,,,,,, ,,$, -),-$V-{---,---*-!(. J. X.y.$.t.////)/-/-0=0/L0P|0 0010$1,1I1h1~111 1/122012b2g2p2x222223203M3(a3%33-334#4*424645?4 u4 4 4p405095pj555Y6Sk6J6 777X7pt7D7*8H8[8 t8888$8 888899 '9-19_9e9i9 q9~999 9B9G": j:_u:i:?;F;L; U;_;f; i; t;;;;;s*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2012-02-09 16:11+0000 Last-Translator: Fugiwara Language-Team: Portuguese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2012-02-10 04:42+0000 X-Generator: Launchpad (build 14771) e %sAs %(num)i transacções recorrentes têm um total de %(totalnum)i transacções agendadas.&Sobre&Moeda&Ficheiro&Ajuda&Reportar um erro&Definições&Ver'%s' não é uma quantia válidaJá está a decorrer uma pesquisa.Nome da contaOs nomes das contas não podem estar vazios.ContasAdicionar %s para a calculadoraAdicionar EtiquetaAdicionar uma nova contaAdicionar etiquetaTodas as ContasQuantiaOcorreu um erro durante a importação do ficheiro csvAnualmenteA cada %(num)d anosFazer uma &PerguntaFazer uma pergunta na InternetGravação automáticaSalvar automáticamenteSaldoMapeamento das colunas CSVDefiniçoes do ficheiro CSVImportar CSVErro ao importar o CSVPerfis CSVCancelarLimpar pesquisa?FecharDelimitador de colunasConfigurar a conta seleccionadaDireitos de AutorA conta correspondente de %(name)s no Mint.comDiariamenteA cada %(num)d diasDataFormato da dataSeparador decimalApagarDescriçãoRejeitarCodificandoAcaba em:Introduza esta transacçãoA cada %(num)d semanas às/aos %%sExportar para CSVExportar transacções para um ficheiro CSVFicheiro a importarPor exemplo, se marcar esta caixa e indicar uma transacção de $50 para esta conta, simultaneamente serão retirados $50 da conta escolhida como origem.SexSextasDeGráficoDivirta-se!Ocultar CalculadoraOcultar as opções de procura avançadaSe seleccionar esta caixa, no momento da transacção, ser-lhe-á solicitada a conta a servir como origem da transacção.ImportarImportar de CSVImportar transacções de ficheiro CSVSaldo inicialIntegração com Mint.comQuantia da Transacção InválidaParece que é a primeira vez que está a usar wxBanker!Menos opçõesLinhas a ignorarCorrespondências: Integração Mint.comCredencias Mint.comSegSegundasMensalmenteA cada %(num)d mesesMesesMais informação acerca do wxBankerMais opçõesMover estas %i transacções para a contaMover esta transacção para a contaNuncaConta seguinteNenhuma conta seleccionadaNenhum montante indicado no campo "Quantia".Sem etiquetas comunsSem descriçãoNão há taxa de câmbio para a moeda "%s"Nenhuma transacção coincidente.Sem etiquetasNenhuma transação introduzida.NenhumaNão está sincronizado com Mint.comTenha em atenção que se activar a gravação automática no menu Ficheiro, já não precisa de gravar manualmente.Assim que criar uma conta, pode adicionar transacções (por ex: saldo inicial) utilizando os controlos por baixo da grelha no canto inferior direito.Substituir perfil?Senha:ExecutarAdicione um número do tipo 12.34 ou -20.Por favor, escolha a conta e tente novamente.Pré-visualizarConta anteriorJá existe o perfil '%s'. Deseja substituí-lo?A biblioteca Python simplejson é necessária para gravar/carregar o perfil csv.RecorrenteTransacções RecorrentesAdicionada com sucesso a transacção recorrente.RemoverRemover a conta seleccionadaRemover estas %i transacçõesRemover esta etiquetaRemover esta transacçãoRenomear a conta seleccionadaRepete nos dias:Repete em:Reportar um erro para o programador na internetRequisitar uma MoedaPedir uma &funcionalidadePedir uma nova funcionalidade a ser implementadaSábSábadosGuardarGravar alterações?Gravar credenciais no "keyring"Pesquisar por esta etiquetaProcurar transacçõesSeleccionar moeda a mostrarSeleccione o ficheiro e clique em "Pré-visualizar"Enviar %s para a calculadoraMostrar CalculadoraMostrar as opções de procura avançadaMostrar a(s) conta (s) com saldo nuloGestor de finanças pessoais.Desculpe, já existe uma conta com esse nome.Inicia:Subtrair %s para a calculadoraResumoResumo:DomDomingosSincronizar os saldos bancários com a conta Mint.comEtiqueta:EtiquetasConta destinoOs botões no controlo de conta permitem-lhe adicionar, nomear, configurar e remover uma conta, respectivamente.A codificação do ficheiro não parece ser '%s'A primeira transacção irá ocorrer em %(date)sA transacção recorrente "%(description)s" tem %(num)i transacções de %(amount)s agendadas para %(datelist)s.Esta conta já não possui transacções recorrentes.Esta transacção está identificada como uma transferência. Por favor, escolha a conta.Isto apagará permanentemente a conta'%s' e todas as suas transacções. Continuar?Isto irá remover permanentemente esta transacção recorrente. Continuar?QuiQuintasHoraPara começar, adicione uma conta usando o controlo de contas no canto superior esquerdoPara apagar esta etiqueta, remova-a da descrição ou faça clique com o botão direito do rato na transacção.Para utilizar a biblioteca '%s' , instale os seguintes módulos: %s.Saldo Total Ao Longo do Tempo&Traduzir wxBankerDetalhes da transacçãoTransacçõesTransferênciaTransferir de %sTransferir para %sTraduzir wxBanker para outra línguaTendênciaGrau de tendênciaTerTerçasActualizaçãoNome de Utilizador:Ver &FAQsVer respostas a perguntas frequentes (online)AvisoQuaQuartasSemanalmenteSemanalmente na(o) %sSemanalmente nos dias de semanaSemanalmente nos fins de semanaBem-vindo!Se inactivo, as contas com um saldo nulo serão ocultadas da listaPretende apagar a pesquisa actual e efectuar esta transacção em "%s"?AnualmenteTambém pode adicionar uma etiqueta colocando #nomedaetiqueta em qualquer lugar da descrição.Ocorreram algumas alterações desde a última gravação. Pretende gravar as alterações antes de sair?_Totalsaldodiadiasdetectadaa cadademêsmesesmensalmenteparaaté %ssemanasemanasanoanoswxbanker-0.9.1/locale/pt_BR/0000755000175000017500000000000012243601243015546 5ustar mrooneymrooneywxbanker-0.9.1/locale/pt_BR/LC_MESSAGES/0000755000175000017500000000000012243601243017333 5ustar mrooneymrooneywxbanker-0.9.1/locale/pt_BR/LC_MESSAGES/wxbanker.mo0000644000175000017500000003536212243601243021522 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #$%S%.&5&<&E&L&_& n& z&!& &$&&& ' '5'G'W'5_'''' ' ''(!( >(K( g(r( {(((( (((()),)>) F) R) \) j)t)))()))* *** **$*y*m+v+'+++"+5+.,=, Q,\,r,,, ,,", ,&,!-=-C-R- l---#-!-- .&.-.`L.q./4/;/.A/1p///7/K/ =0H0.`00000001 %1)31]1q1.11111%122#+2)O2y22$22*2-3@3I3c3l3t3x3>333 3u3/K4,{4l485fN5K5P6R6V6e6Pj66S=7777 777 8#8 @8K8^8b8 q8{8 8%8 888 8 88 9 39M>9E9 9[9T9:::: ::: : :::::s*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2011-11-24 12:39+0000 Last-Translator: Rafael Neri Language-Team: Brazilian Portuguese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2011-11-25 05:20+0000 X-Generator: Launchpad (build 14376) e %s%(num)i transações recorrentes tem um total de %(totalnum)i transações prontas.&Sobre&Moeda&Arquivo&Ajuda&Notifique um erro&Preferências&Visualisar'%s' não é uma quantia válidaUma busca está atualmente ativa.Nome da contaNomes de conta não estar em branco.ContasAdicionar %s a calculadoraAdicionar TagAdicionar nova contaAdicionar uma tagTodas as contasQuantiaOcorreu um erro durante a importação do arquivo csvAnualCada %(num)d anosFaça uma &PerguntaPergunte onlineAuto-salvarSalvar mudanças automaticamenteBalançoMapeamento de colunas CSVPreferências de arquivo CSVImportar CSVErro de importação do CSVPerfis CSVCancelarLimpar busca?FecharDelimitador de colunaConfigure a conta selecionadaCopyrightConta Mint correspondente para %(name)s:DiariamenteA cada %(num)d diasDataFormato de DataSeparador decimalDeletarDescriçãoDescartarCodificaçãoFinaliza:Adicionar esta transaçãoCada %(num)d semanas em %%sExportar para CSVExportar transação para um arquivo CSVArquivo a importarPor exemplo, habilitando este campo e adicionando a transação que adiciona $50 na conta, será subtraido $50 da conta que voce escolher como origem.SexSextas-feirasDeGráficoDivirta-se!Ocultar CalculadoraOcultar opções avançadas de buscaSe este campo estiver habilitado quando adicionar a tranferencia, será perguntado qual conta é a origem da transação.ImportarImportar de CSVImportar transações de um arquivo CSVBalanço inicialIntegrar com Mint.comQuantia inválida para transaçãoEstá é a primeira vez que você executa o wxBanker!Menos opçõesLinhas para ignorarCombinar: Integração Mint.comCredenciais Mint.com:SegSegundas-feirasMensalmenteA cada %(num)d mesesMesesMais Informação sobre o wxBankerMais opçõesMover essas %i transações para contaMover essa transação para contaNuncaPróxima contaNenhuma conta selecionadaNenhum valor no campo 'Quantia'.Nenhuma tag comum aindaSem descriçãoSem taxa de câmbio para moeda "%s"Sem transações correspondentes.Sem tags aindaNenhuma transação entradaNenhumNão sincronizado com Mint.comObserve que habilitar o auto-salvar pelo menu irá eliminar a necessidade de salvar manualmente.Uma vez que a conta foi criada, você pode adicionar transações utilizando os controles no rodapé do programa.Sobrescrever perfil?Senha:FazerPor favor forneça um valor como: 12.34 ou -20Por favor, selecione uma conta e tente novamente.AmostraConta anteriorJá existe um perfil chamado '%s'. Deseja sobrescrever?Biblioteca python simplejson é necessária para carregar/salvar perfis csvRecorrenteTransações frequentesTransação recorrente adicionada com sucesso.RemoverRemover a conta selecionadaRemover essas %i transaçõesRemover esta tagRemover transaçãoRenomear a conta selecionadarepetir nos dias:Repetições:Notifique um erro ao desenvolvedor onlineSolicitar uma moedaSolicitar uma fu&nçãoSolicitar uma nova função a ser implementadaSábSábadosSalvarSalvar mudanças?Salvar credenciais no banco de chavesProcurar esta tagBuscar transaçõesSelecione a moeda que será exibidaSelecione o arquivo e clique em "Amostra"Enviar %s a calculadoraExibir calculadoraMostrar opções avançadas de buscaMostrar contas com saldo zeroSimples gerenciador de finanças pessoais.Desculpe, já existe uma conta com este nome.Começa:Subtrair %s a calculadoraSumárioResumo:DomDomingosSincronizar saldo da conta com uma conta existente em Mint.comTag:TagsConta alvoOs botões de controle da conta permite a você adicionar, renomear, configurar e remover uma conta, respectivamente.A codificação do arquivo não parece ser '%s'A primeira transação ocorrerá em %(date)sA transação recorrente "%(description)s" tem %(num)i transações prontas para %(amount)s em %(datelist)s.Esta conta atualmente não tem transações recorrentes.Esta transação está marcada como uma transferência. Por favor selecione a conta de transferência.Isto removerá a conta '%s' e suas transações permanentemente. Continuar?Isto irá remover permanentemente esta transação recorrente. Deseja continuar?QuiQuintas-feirasHoraPara iniciar, adicione uma conta usando os controles no conto esquerdo superior.Para remover esta tag posteriormente, basta remover a partir da descrição ou com o botão direito do mouse sobre a transação.Para usar a biblioteca de plotagem '%s', instale os seguintes módulos python: % s.Balaço total ao longo do tempoTra&duzir wxBankerDetalhes da transaçãoTransaçõesTransferênciaTransferir de %sTransferir para %sTraduzir wxBanker para outro idiomatendênciaGrau de TendênciaTerTerças-feirasAtualizarNome de usuário:Ver &FAQsExibir as perguntas frequentes onlineAtençãoQuaQuartas-feirasSemanalmenteSemanal em %sSemanalmente nos dias úteisSemanalmente em finais de semanaBem-Vindo!Quando desativada, as contas com um saldo de $0,00 serão escondidas da listaGostaria de limpar a pesquisa atual e fazer esta transação em "%s"?AnualmenteVocê também pode marcar uma transação, colocando #tag em qualquer lugar na descrição.Você efetuou mudanças desde o ultimo salvamento. Gostaria de salvar antes de sair?_TotalSaldodiadiasdetectadocadaDemêsmesesmensalmenteparaaté %ssemanasemanasanoanoswxbanker-0.9.1/locale/ro/0000755000175000017500000000000012243601243015160 5ustar mrooneymrooneywxbanker-0.9.1/locale/ro/LC_MESSAGES/0000755000175000017500000000000012243601243016745 5ustar mrooneymrooneywxbanker-0.9.1/locale/ro/LC_MESSAGES/wxbanker.mo0000644000175000017500000003272512243601243021134 0ustar mrooneymrooney O1 8BH N \fl6  ' 9F,Mz   ,9 @NTe    &5 |#5 8EJRV^{ %  (?"NqZ{+,9CL ),HY$b'   %E[k.7#[aj+,j%5MQf jtPyC,@ Taj{&  &  # *7J]LfMQZclr w U "O"e"m"u"~""" "!"-""#!+#M#U#n###0#<#$$7$I$ i$s$$ $$$ $$$ $%%:%5L%% %%% %% % %%&%&3&&&&&&% 'h/'''+''"'>(V( k( u(((=(%(($)#)) M)X)g)/|)))))j*p*++ #+./+(^+++=+Q+ 9,D,,Z,,,,,, -.-I-_-?~--- ---!.5".X.q.(..... //,/2/9/=/DF//j/10)90rc0.0R1WX1111g1N&2u2{222 2222(2 3 '32363=3N3*_333 3 33333E4FM44\445 55!545 75*B5Ym5 5!I]_+4*o M$ RUcze@2SCTOtvq{F8 %BZsJV=LQD0)~y<^A5ix( E,[3. G79dY#N;X>6kW/lHr-ugb&} :'\1`jKpnP|"mfhwa? and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A lightweight personal finance management application.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd a new accountAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightDailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLoadMatch: MonMondaysMonthlyEvery %(num)d monthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No descriptionNo exchange rate for currency "%s"No transactions entered.Note that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?PasswordPerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.Remove the selected accountRemove these %i transactionsRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Search transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSkip first lineSorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTarget accountThe buttons in the account control allow you to add, remove, and rename an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To use '%s' plotting library, install following python modules: %s.TotalTotal Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUsernameView &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou have made changes since the last save. Would you like to save before exiting?daydaysdetectedeveryfrommonthmonthstountil %sweekweekswxBanker can synchronize account balances online if you have an account with mint.comyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-02-27 01:56-0800 PO-Revision-Date: 2010-03-21 05:19+0000 Last-Translator: ValentinV Language-Team: Romanian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 == 0) && (n != 0))) ? 2: 1)); X-Launchpad-Export-Date: 2010-03-22 04:45+0000 X-Generator: Launchpad (build Unknown) si %s%(num)i tranzactii recursive au un total de %(totalnum)i tranzactii pregatite.&DespreValută&FișierAjutorRaportați o eroare&Setări&Vizualizare„%s” nu este o sumă validă.Un manager simplificat de finanțe personale.O căutare este în cursDenumirea contuluiNumele conturilor nu pot fi goaleConturiAdaugă %s la calculatorAdaugă un cont nouToate conturileSumăO eroare a avut loc la importul fișierului CSV.AnnuallyLa fiecare %(num)d de aniLa fiecare %(num)d de aniPuneți o întrebarePuneți online o întrebareSalvează automatSalvează modificările automatBalanțăIndentificare coloane CSVSetări fișier CSVImport CSVEroare la importarea fișierului CSVProfiluri CSVRevocareȘtergeți căutarea?InchidereDelimitator coloaneConfigurează contul selectatDrepturi de autorDailyLa fiecare %(num)d zileLa fiecare %(num)d zileDatăFormat datăSeparator zecimaleȘtergeDescriereÎnchideCodificareSe termină:Introdu această tranzacțieLa fiecare %(num)d de saptamani pe %%sFişier de importatDe exemplu, daca bifati aceasta casuta si introduceti o tranzactie de 50RON in acest cont , va substrade deasemenea 50RON din contul pe care il alegeti ca sursa.VinVinereaDe laDistrați-vă!Ascunde calculatorAscunde opțiuni avansate de căutareDaca aceasta casuta este bifata vi se va solicita contul pe care sa il folositi ca sursa pentru transferImportăImportă din CSVImportă tranzacțiile dintr-un fișier CSVIntegrare cu Mint.comSumă invalidă pentru tranzacțieSe pare că aceasta este prima oară cănd folosiți wxBanker!Mai puține opțiuniÎncarcăPotrivește: LunLuneaLunarLa fiercare %(num)d de luniLa fiercare %(num)d de luniMai multe informații despre wxBankerMai multe opțiuniMută aceste %i tranzacții în contMută această tranzacție în contNiciodatăContul urmatorNiciun cont selectatNicio sumă introdusă în câmpul „Sumă”.Fără descriereNici o rată de schimb pentru valuta "%s"Nicio tranzacție introdusă.Rețineți că, activând salvarea automată din meniul Fișier, nu va mai fi necesară salvarea manuală.Odată ce ați creat un cont, îi puteți adăuga tranzații (cum ar fi balanța inițială) utilizând controalele din dreapta jos, de sub grilă.Suprascrieți profilul?ParolaEfectueazăIntroduceți un număr cum ar fi 12.34 sau -20Alegeți un cont și încercați din nouPrevizualizeazăContul precedentUn profil cu numele „%s” există deja. Îl suprascrieți?Biblioteca Python simplejson este necesară epntru a încărca/salva profile CSV.RecurentăTranzacții recurenteTranzacție recurentă adăugată cu succes.Șterge contul selectatȘterge aceste %i tranzacțiiȘterge această tranzacțieRedenumește contul selectatSe repetă în zilele:Se repetă:Raportați online o eroare către dezvoltatoriSolicitați o valutăSolicitați o funcționalitateSolicitați o funcționalitate nouă care să fie implementatăSâmSambataSalveazăSalvați modificările?Caută tranzacțiiSelectați valuta pentru afișareSelectați fișierul și apăsați "Previzualizează"Trimite %s la calculatorArată calculatorAfișează opțiuni avansate de căutareArata conturile cu balans zeroSari prima linieDin păcate un cont cu acest nume există dejaÎncepe:Scade %s din calculatorSumarSumar:DumDuminicaSincronizeaza balansul cuntului cu un cont deja existent la Mint.comCont destinațieButoanele din controlul counturilor vă permit să adăugați, să ștergeți și să redenumiți un cont.Codificarea fișierului pare să nu fie „%s”.Prima tranzacție va avea loc pe %(date)sTranzacția recurentă „%(description)s” are %(num)i tranzacții pregătite pentru %(amount)s pe %(datelist)s.Acest cont nu are nicio tranzacție recurentăAceastă tranzacție este marcată drept un transfer. Alegeți contul destinație.Aceasta va șterge definitiv contul „%s” și toate tranzacțiile sale. Continuați?JoiJoiaTimpPentru a începe, adăugați un cont folosind panoul de control al conturilor, din colțul stânga sus.Pentru a folosi '%s' plotting library , instalati umatoarele module phython %sTotalBalanța totală în timpTraduceți wxBankerDetalii tranzacțieTranzacțiiTransferTransfer de la %sTransfer la %sTraduceți wxBanker într-o altă limbăTendințăGrad TrendMarMarteaNume utilizator:Vedeți &FAQ-uriVedeți online întrebările puse frecventAtențieMieMiercureaSăptămânalSaptamanal pe %sSaptamanal in zilele lucratoareSaptamanal in weekendBine ați venit!Cand dezactiva , conturile cu balans de 0.00 vor fi ascunse din listaAti dori sa stergeti cautarea curenta si sa faceti tranzactia in "%s"?AnualAți efectuat modificări de la ultima salvare. Doriți să le salvați înainte de a ieși?zizilede ziledetectatla fiecarede lalunălunide lunilapana la %ssăptămânăsăptămânide săptămâniwxBanker poate sincroniza online balanța conturilor dacă dețineți un cont la mint.comananide aniwxbanker-0.9.1/locale/ru/0000755000175000017500000000000012243601243015166 5ustar mrooneymrooneywxbanker-0.9.1/locale/ru/LC_MESSAGES/0000755000175000017500000000000012243601243016753 5ustar mrooneymrooneywxbanker-0.9.1/locale/ru/LC_MESSAGES/wxbanker.mo0000644000175000017500000004441012243601243021134 0ustar mrooneymrooney\  O) 0:@ F T^d   , Mjz     !'8 Waz   !)8 | #5 Q ^lt % "C IV(j" Z;, @J+R,~9C BL)c"$+Pc'v  >Td.7%]bglv+,j<5MQ+B} Pb$ C    !!!!2!&A!h! n!{!!! ! !&!!! !! !! ""L%"Mr""O"Q#i#p#x#### #### # ##%|%h& ~& &&"&&&3&"'7'AS' '-''$'(+( =(DH(J((&()@7) x)")!))&)* *"*>*#M*.q**L* ++0*+[+j+{+++$+*+ ,3!,U,t,)-.-=-B- U-'a-<-- ..?.. /,)/5V/2/// /0,010ZJ00-0/0L 1<W111171,2?27W2022+2213G3K3(G5 p5~5S5S596R6Ip6W67+'7MS77*7)78&86F8}88H88"9O19999&999 :=(:Ff:/:':G;>M;?;J;</-<]< f<t<y<w< = ==9=7>?O>>O/?l?q?^@@@ @AAhBGCICfCCCCC6C DD-D2DCD XD yDRDD E EE1E3PE,E EzEqMFFFrG *H 6HCH\H qH~H&HHHH&HHr)S%Bqj?aeW=y.U]gC H!0{ uKL+`^8\;9s'4o$/x hmElwOG<(|2JvbzY>XDnTd~N[*AM k #p_7:1-6cR,&iV3t fIQ5ZF@}P" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightDailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2012-08-06 04:09+0000 Last-Translator: Michael Rooney Language-Team: Russian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2012-08-07 04:45+0000 X-Generator: Launchpad (build 15745) и %s%(num)i повторяющихся операций имеют в сумме %(totalnum)i готовых переводов.О программе&Валюта&Файл&СправкаСообщить об ошибкеНастройки&Просмотр'%s' является неверной суммойИдет поиск.Название счетаНазвание счета не может быть пустымСчетаДобавить %s в калькуляторДобавить меткуДобавить новый счётДобавить меткуВсе счетаСуммаПроизошла ошибка при импорте csv файлаЕжегодноКаждые %(num)d годаКаждые %(num)d летЗадать &вопросЗадать вопрос онлайнАвтосохранениеАвтоматически сохранять измененияБалансПривязка полей в CSVПараметры файла CSVИмпорт CSVОшибка при импорте CSVПрофиль CSVОтменаОчистить поискЗакрытьРазделитель колоннНастроить выбранный счётАвторские праваЕжедневноКаждые %(num)d дняКаждые %(num)d днейДатаФормат датыРазделитель дромной частиУдалитьОписаниеОтменитьКодировкаЗаканчивается:Ввести эту операциюКаждые %(num)d недель по %%sЭкспорт в CSVЭкспорт транзакций в файл CSVФайл для импортаНапример, выбор этого поля и ввод 500р на этот счёт вычтет 500р из счёта, выбранного Вами как источник.ПтПятницыИзДиаграммаУдачи!Спрятать калькуляторУбрать дополнительные параметрыЕсли этот флажок отмечен, то при добавлении транзакции Вы будете должны указать счёт-источник перевода.ИмпортИмпорт из CSVИмпортировать операции из CSV файлаНачальный балансИнтеграция с Mint.comНеверная сумма переводаВы запустили wxBanker первый раз!Показать меньше параметровПропустить линииСовпадение: Соединение с Mint.comMint.com credentialsПнПонедельникиЕжемесячноКаждые %(num)d месяцаКаждые %(num)d месяцевМесБольше информации о wxBankerДополнительные параметрыПереместить эти %i операций на другой счетПереместить эту операцию на счётНикогдаСледующий счётНе выбран счётНе введена сумма в поле "Сумма"Пока что нет общих тэговБез описанияНет курса обмена для валюты "%s"Нет подходящих транзакцийНет метокНет введённых операций.ОтсутствуетНе синхронизировано с Mint.comЗаметьте, что включение автосохранение в меню Файл избавит от необходимости сохраняться вручную.Однажды создав счёт, вы можете добавлять в него транзакции (такие как внутренний баланс), используя средства управления, расположенные под координатной сеткой в правом нижнем углу.Перезаписать профиль?Пароль:ВыполнитьПожалуйста, введите число, например, 12.34 или -20Пожалуйста, выберите счёт и попробуйте снова.ПредпросмотрПредыдущий счётПрофиль '%s' уже сеществует. Заменить его?Для работы с CSV необходима библиотека Python simplejson.ПовторениеПовторяющиеся операцииПовторяющаяся операция успешно добавленаУдалитьУдалить выбранный счётУдалить эти %i операцийУдалить меткуУдалить эту операциюПереименовать выбранный счётПовторяется:Повторы:Сообщить разработчику об ошибке онлайнЗапросить валютуЗапросить фун&кциюЗапросить запрограммировать новую функциюСбСубботыСохранитьСохранить изменения?Сохранить доступПоиск по меткеИскать операцииВыберите тип отображаемой валютыВыберите файл и нажмите "Предпросмотр"Отправить %s в калькуляторПоказать калькуляторПоказать расширенные параметры поискаПоказать счета с нулевым балансомПростая персональная бухгалтерия.Извините, такое имя счёта уже существуетНачинается:Вычесть %s из кулькулятораИтогСводка:ВсВоскресеньяСинхронизировать баланс счетов с существующим аккаунтом на Mint.comМетка:МеткиОсновной счетКнопки управления учетными записями позволяют добавлять, переименовывать, настраивать и удалять счета, соответственно.Кодировка файла не похожа на %sПоследний перевод произойдёт %(date)sПовторяющаяся операция "%(description)s" имеет %(num)i готоывых переводов в размере %(amount)s %(datelist)s.На данном счете нет повторяющихся операцийОперация помечена для перемещения, Выберите счёт перевода.Это полностью удалит счёт '%s' и все его транзакции. Продолжить?Это действие навсегда удалит эту повторяющуюся транзакцию. Продолжить?ЧтЧетвергиВремяДля начала добавьте счёт, используя средства управления счетами в левом верхнем углу.Чтобы удалить этот тег позже, просто удалите его из описания или щелкните правой кнопкой мыши на транзакции.Чтобы использовать библиотеку вычерчивания '%s', установите следующие модули Python: %s.Общая сумма баланса с течением времениПере&вести wxBankerДетали операцииОперацииПеревестиПередать из %sПередать в %sПеревести wxBanker на другой языкТрендТенденцияВтВторникиОбновлениеИмя пользователя:Просмотреть &ЧаВоПросмотреть Часто Задаваемые Вопросы онлайнПредупреждениеСрСредыЕженедельноЕженедельно по %sЕженедельно по рабочим днямЕженедельно по выходнымДобро пожаловать!Если не выбрано, то счета с нулевым балансом будут скрыты из спискаХотите ли Вы очистить текущий поиск и выполнить операцию в "%s"?ЕжегодноВы можете добавить тег (пометку) к транзакции, напечатав #имятега в любом месте описания.У вас есть изменения с момента последнего сохранения. Желаете ли сохранить изменения перед выходом?_ВсегобалансденьдняднейобнаруженокаждыеизмесяцмесяцамесяцевежемесячноВдо %sнеделянеделинедельгодгодалетwxbanker-0.9.1/locale/sk/0000755000175000017500000000000012243601243015155 5ustar mrooneymrooneywxbanker-0.9.1/locale/sk/LC_MESSAGES/0000755000175000017500000000000012243601243016742 5ustar mrooneymrooneywxbanker-0.9.1/locale/sk/LC_MESSAGES/wxbanker.mo0000644000175000017500000001575512243601243021135 0ustar mrooneymrooneyXO#,*Wk }      $ * A P     |    5    ( , I P ] c (w 6 J +R ,~  9 C 1 ); e v         a+d,jM(vPz MGNW] bo r }Sa,4 KV iu~   &@Q + ."9A#Dhp)|M`7i*=U i,w '. NX[Wl!"l NvN.1 4?QH  .(,K'C4&5GW JU?1S9P/E#6F H>"+B:* LV<ITX=- 2 $N;R07@Q3M8A%!OD )%(num)i recurring transactions have a total of %(totalnum)i transactions ready.'%s' is not a valid amount.A search is currently active.AmountAn error ocurred during the csv file import.CSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?Column delimiterDailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionEncodingEnds:Enter this transactionFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFromGraphHave fun!Hide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportInitial balanceInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: MonMonthlyEvery %(num)d monthsMonthsMore optionsNeverNo account selectedNo amount entered in the 'Amount' field.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring transaction successfully added.Repeats on days:Repeats:SatSaveSave changes?Search transactionsSelect file and click "Preview"Show advanced search optionsStarts:SunTarget accountThe buttons in the account control allow you to add, remove, and rename an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This transaction is marked as a transfer. Please select the transfer account.ThuTo get started, add an account using the account control in the top left corner.TransferTrend DegreeTueWedWeeklyWelcome!Would you like to clear the current search and make this transaction in "%s"?YearlydaydayseveryfrommonthmonthstoweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-08-20 00:01-0700 PO-Revision-Date: 2010-08-20 15:25+0000 Last-Translator: JohnyN Language-Team: Slovak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0; X-Launchpad-Export-Date: 2010-08-21 03:48+0000 X-Generator: Launchpad (build Unknown) %(num)i opakujúce sa operácie majú spolu %(totalnum)i pripravených transakcií.'%s' nie je platná hodnota.Prebieha vyhľadávanie.SumaPri importovaní CSV súboru došlo k chybe.mapovanie stĺpcov CSVNastavenia CSV súboruimport CSVChyba importu CSV.Profily CSVZrušiťVymazať vyhľadávanie?Oddeľovač stĺpcovDenneKaždých %(num)d dníDátumFormát dátumuOddeľovač desatinného miestaOdstrániťPopisKódovanieKončí:Vložiť túto transakciuSúbor na importNapríklad, ak je táto možnosť povolená, pri prevode $50 na váš účet sa zo zdrojového účtu odoberie rovnaká suma $50.PiOdGrafBavte sa!Skryť pokročilé možnosti vyhľadávaniaAk je táto možnosť pri vykonávaní transakcie povolená, je potrebné zadať číslo zdrojového účtu, z ktorého sa financie prevedú.ImportovaťPočiatočný zostatokNeplatná hodnota transakcieZdá sa, že ste spustili wxBanker prvýkrát!Menej možnostíRiadky na preskočenieZhoda: PoMesačneKaždých %(num)d mesiacovMesiaceViac možnostíNikdyŽiadny účet nie je vybratý.V poli hodnota chýba hodnota transkacie.Po vytvorení účtu môžete pridať transakcie (napríklad aktuálny zostatok) využitím ovládacieho panelu vpravo dole.Prepísať profil?VykonaťProsím vložte hodnotu ako napríklad 12.34 alebo -20.Prosím vyberte účet a skúste to znova.NáhľadProfil s názvom '%s' už existuje. Prajete si ho prepísať?Na načítanie alebo uloženie CSV profilu je potrebná knižnica Pythonu simplejson.Opakujúca saTransakcia s opakovaním úspešne pridaná.Opakovať po dňoch:Opakovať:SoUložiťUložiť zmeny?Vyhľadanie transakcieVyberte súbor a kliknite na "Náhľad"Zobraziť pokročilé možnosti vyhľadávaniaZačína:NeCieľový účetTlačidlá na paneli účtov umožňujú pridať, odstrániť alebo premenovať účet.Kódovanie súboru nie je v '%s'.Prvá transakcia prebehne %(date)sOpakujúca sa operácia "%(description)s" má %(num)i transakcie pripravené pre %(amount)s na %(datelist)s.Táto transakcia je označená ako transfer. Prosím vyberte cieľový účet.ŠtNa začiatok pridajte svoj účet pomocou panelu účtov v ľavom hornom rohu.PrenosStupeň trenduUtStTýždenneVitajte!Prajete si vymazať súčasné vyhľadávanie a vykonať túto transakciu v "%s"?Ročnedeňdnidníkaždýodmesiacmesiacovdotýždeňtýždnerokrokovwxbanker-0.9.1/locale/sl/0000755000175000017500000000000012243601243015156 5ustar mrooneymrooneywxbanker-0.9.1/locale/sl/LC_MESSAGES/0000755000175000017500000000000012243601243016743 5ustar mrooneymrooneywxbanker-0.9.1/locale/sl/LC_MESSAGES/wxbanker.mo0000644000175000017500000002172412243601243021127 0ustar mrooneymrooney$,        6: q     ,  ' 7 M W r z        ! ( 4 < E K b q   .|K#5 Tafnr ("+,(90Cj $>Q'd .+ZbjnvaQ9P= &#' 0&;bjn u     *2 BN0g 3>'f{  2C?T   iF KWw6 ##*E b$m#5;-B,p ,E $;Sk$  ! )9 c #v  )     b!Oi!!V!""5" L"X" _" m"#{"""""/"# ###&#=# R#_#e# u#######g'pv[rP`Ixb Swj]1Q7uH|$&iV_:c0J3>#O}k~"dUE)a5 /YlFt{L!8e-Bh4\% z@s R=;Tn6y?Z+fXC.*(^ 9m2DNKq,<AW MoG and %s&About&Currency&File&Help&Report a Bug&Settings'%s' is not a valid amount.A lightweight personal finance management application.A search is currently active.Account names cannot be blank.AccountsAdd a new accountAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorClear search?Column delimiterCopyrightDailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFromHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLoadMatch: MonMore information about wxBankerMore optionsNeverNo account selectedNo amount entered in the 'Amount' field.No descriptionNo exchange rate for currency "%s"Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?PasswordPerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRemove the selected accountRemove this transactionRename the selected accountRepeats on days:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSaveSave changes?Search transactionsSelect currency to displaySelect file and click "Preview"Show CalculatorShow advanced search optionsSkip first lineSorry, an account by that name already exists.Starts:SummarySunSundaysTarget accountThe buttons in the account control allow you to add, remove, and rename an account, respectively.This will permanently remove the account '%s' and all its transactions. Continue?ThuTo get started, add an account using the account control in the top left corner.TotalTotal Balance Over TimeTran&slate wxBankerTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTueUsernameView &FAQsView Frequently Asked Questions onlineWarningWedWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!Yearlydaydaysdetectedfrommonthmonthstountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-02-03 00:18-0800 PO-Revision-Date: 2009-11-30 02:28+0000 Last-Translator: Michael Rooney Language-Team: Slovenian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0); X-Launchpad-Export-Date: 2010-02-04 04:46+0000 X-Generator: Launchpad (build Unknown) in %s&O programu&Obtok&Datoteka&PomočSporoči napakoNa&stavitve'%s' ni veljaven znesek.Preprosta aplikacija za urejanje osebnih financ.Izvaja se iskanje.Račun mora biti poimenovanRačuniDodaj nov računVsi računiZnesekPri uvažanju iz CSV datoteke je prišlo do napake.LetnoVsakih %(num)d letVsakih %(num)d letVsakih %(num)d letPostavite vprašanjePostavite vprašanje na spletuSamodejno shranjevanjeSamodejno shrani nastavitveSaldoImena CSV stolpcevNastavitve datoteke CSVUvoz iz CSVNapaka pri CSV uvozuPočistim iskanje?Ločilo stolpcevAvtorske praviceDnevnoVsakih %(num)d dniVsakih %(num)d dniVsakih %(num)d dniDatumOblika zapisa datumaDecimalno ločiloBrišiOpisOpustiKodiranjeKonec:Vnesi to transakcijoDatoteka za uvozNa primer, če omogočite to kljukico in vnesete $50 na ta račun, bo samodejno odštelo $50 iz računa, katerega ste izbrali kot izvor.petOdVeliko zabave!Skrij KalkulatorSkrij napredne možnosti iskanjaČe je ta kljukica omogočena, ko dodajate transakcijo, boste morali izbrati račun za izvor transakcije.UvozUvoz iz CSVUvoz transakcij iz datoteke CSVNapačen znesek transakcijeKot kaže, je to vaša prva uporaba programa wxBanker!Manj možnostiNaložiPrimerjaj ponVeč informacij o programu wxBankerVeč možnostiNikoliIzbran ni bil noben računPolje za 'Znesek' je prazno.Brez opisaZa valuto "%s" ni menjalnega tečajaKo imate račun narejen mu lahko dodajate transakcije (npr. vaše začetno stanje) z uporabo orodij pod razpredelnico v spodnjem desnem predelu.Prepišem profil?GesloIzvediProsim vnesite številko, npr. 12.34 ali -20.Prosim izberite račun in poskusite ponovno.PredogledProfil z imenom '%s' že obstaja. Prepišem?Za upravljanje z CSV profili potrebujete python knjižnico simplejsonPonovi seIzbriši izbran računOdstrani to transakcijoPreimenuj izbran računPonavlja se na dneve:Sporoči napako razvijalcu na spletuZahtevajtev valuto&Zahtevajte funkcionalnostZahtevaj dodatne funkcionalnostiShraniShrani spremembe?Išči transakcijeIzberite valuto prikazaIzberite datoteko in kliknite "Predogled"Pokaži KalkulatorPrikaži napredne možnosti iskanjaPreskoči prvo vrsticoOprosti, račun s tem imenom že obstaja.Začne:PovzeteknedNedeljeCiljni računGumbi v nadzorni plošči računov omogočajo dodajanje, odstranjevanje in preimenovanje računov.To bo trajno izbrisalo račun '%s' in vse pripadajoče transakcije. Nadaljujem?četZa začetek dodajte račun z uporabo nadzorne plošče računov v zgornjem levem kotu.SkupajSkupno stanje skozi čas&Prevedite wxBanker-jaTransakcijePrenosPrenesi iz %sPrenesi na %sPrevedite wxBanker-ja v drugi jezikTrendtorUporabniško ImePoglej Pogosta vprašanjaPoglej Pogosto Zastavljena Vprašanja na spletuPozorsreTedenskoTedensko ob %sTedensko ob delavnikihTedensko ob vikendihDobrodošli!Letnodandnidnidniprepoznanodmesecmesecevmesecevmesecevvdo %stedentednovtednovtednovletoletletletwxbanker-0.9.1/locale/sr/0000755000175000017500000000000012243601243015164 5ustar mrooneymrooneywxbanker-0.9.1/locale/sr/LC_MESSAGES/0000755000175000017500000000000012243601243016751 5ustar mrooneymrooneywxbanker-0.9.1/locale/sr/LC_MESSAGES/wxbanker.mo0000644000175000017500000004533012243601243021134 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #K$Q&X&& &' ' %'F'X'.h'6''<' #(%0(V("n((( (Z(P') x)/))) )$*(,*U*"k** ****,*++AG+F+ +++, , ),6,G, ^,),,B,$-(-B. I.V. [.h.!z.?.. //B/&0!@0.b0[00&1*1(A1+j111P1 252F2?\2<2 22"3>#31b33?3;3$41A4 s4.~44n5$_66 6M6\6L7c7Z7~7[8+t8M8 8,8-(9 V9*w929 99D :O:$k:;:::::L;"];%;;;T;&7<#^<A<:<5<P5= =+=====b= Z> h>u>>HW?G??\@@~AqBtB{B BB-CD)D&D#D"E9EJEaE@xEEEEE FF,FSKFFF FFF,F.GGG]GGtHH1I I IIJ+J;J&@JgJvJ{J&J&Js*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2011-11-15 11:43+0000 Last-Translator: Мирослав Николић Language-Team: Launchpad Serbian Translators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2011-11-16 05:20+0000 X-Generator: Launchpad (build 14291) Language: sr и %s%(num)i периодичне(их) трансакције(а) имају укупно %(totalnum)i спремних трансакција.О &програму&Валуте&ДатотекаПо&моћПријавите &грешкуПо&ставкеПре&глед„%s“ није исправан износ.Претрага је тренутно активна.Назив налогаНазив налога не може бити празан.НалозиДодај %s у калкулаторДодај ознакуДодајте нови налогДодајте ознакуСви налозиИзносДошло је до грешке приликом увожења цсв датотеке.ГодишњеСваке %(num)d годинеСваких %(num)d годинаПо&ставите питањеПоставите питање на мрежиСам сачувајСам чува изменеСтањеМапирање ЦСВ колонаПоставке ЦСВ датотекеЦСВ увожењеГрешка ЦСВ увожењаЦСВ профилиОткажиОчисти претрагуЗатвориГраничник колонеПодесите изабрани налогАуторска праваОдговарајући Минт налог за „%(name)s“:ДневноСвака %(num)d данаСваких %(num)d данаДатумОблик датумаДецимални зарезИзбришиОписОткажиКодирањеЗавршава се:Унеси овај преносСваке %(num)d° недеље — %%sИзвези у ЦСВИзвезите трансакције у ЦСВ датотекуДатотека за увожењеНа пример, ако означите овај квадратић и унесете трансакцију од 50 дин. у тај налог, онда ће такође бити умањено 50 дин. са налога који сте изабрали као извор.ПетпеткомОдГрафикУживајте!Сакриј калкулаторСакријте напредне опције претрагеАко је овај квадратић означен приликом додавања трансакције, бићете упитани који налог ће бити коришћен као извор преноса.УвезиУвези из ЦСВ-аУвезите трансакције из ЦСВ датотекеПочетно стањеУједини са Mint.com-омНеисправан износ преносаИзгледа да је ово први пут да користите вхБанкара!Мање опцијаЛиније за прескакањеПодударање: Минт.ком обједињавањеМинт.ком кредибилитети:ПонпонедељкомМесечноСвака %(num)d месецаСваких %(num)d месециМесециВише информација о вхБанкаруВише опцијаПремести ове %i трансакције у налогПремести ову трансакцију у налогНикадаСледећи налогНалог није изабранНије унешен износ у поље „Износ“.Још нема заједничке ознакеНема описаНема односа размене за валуту „%s“Нема одговарајућих трансакција.Још нема ознакаНема унешених трансакција.НиштаНије усклађено са Mint.com-омЗнајте да ће укључивање аутоматског чувања из изборника „Датотека“ уклонити потребу за ручним чувањем.Када сте направили налог онда му можете додати и трансакцију (као што је ваше почетно стање) користећи контроле у доњем десном углу.Да препишем профил ?Лозинка:ИзвршиМолим унесите бројеве као што су 12,34 или -20.Молим изаберите неки налог и затим покушајте опет.ПретпрегледПретходни налогПрофил са именом „%s“ већ постоји. Да га препишем?Потребна је „Python simplejson“ библиотека за учитавање/чување цсв профила.ПериодичностПериодичне трансакцијеПериодична трансакција је успешно додата.УклониУклоните изабрани налогУклони ове %i трансакцијеУклони ову ознакуУклони ову трансакцијуПреименујте изабрани налогПонављање данима:Понављања:Пријавите грешку програмеру на мрежиЗатражи валутуЗатражите &функцијуЗатражите примену нове функцијеСубсуботомСачувајСачувати измене?Сачувај кредибилитете у привезак кључеваПотражи ову ознакуПотражи трансакцијеИзаберите валуту за приказивањеИзаберите датотеку и кликните „Претпреглед“Пошаљи %s калкулаторуПрикажи калкулаторПрикажите напредне опције претрагеПрикажи налоге са нултим стањемЈедноставне личне финансије.Извините, налог са овим називом већ постоји.Почни:Одузми %s из калкулатораИзвештајИзвештај:НеднедељомУскладите стања налога са постојећим „Mint.com“ налогомОзнака:ОзнакеЦиљни налогДугмад у контроли налога вам омогућавају да додате, преименујете, подесите и да уклоните налог, свако понаособ.Кодирање датотеке изгледа да није „%s“.Прва трансакција ће бити извршена %(date)sПериодична трансакција „%(description)s“ има %(num)i спремне(их) трансакције(а) у износу од %(amount)s за %(datelist)s.Овај налог тренутно нема периодичних трансакција.Ова трансакција је означена као пренос. Молим изаберите налог за пренос.Ово ће трајно уклонити налог „%s“ и све његове трансакције. Да наставим?Ово ће трајно уклонити ову периодичну трансакцију. Наставити?ЧетчетврткомВремеДа започнете, додајте један налог користећи контролу налога у горњем левом углу.Да касније уклоните ову ознаку, једноставно је уклоните из описа или кликните десним тастером миша на трансакцију.Да бисте користили „%s“ библиотеке за исцртавање, инсталирајте следеће питонове модуле: „%s“.Укупно стање у временуПреве&дите вхБанкараДетаљи трансакцијеТрансакцијеТрансферПребаци са %sПребаци на %sПреведите вхБанкара на други језикОчекивањеСтепен очекивањаУтоуторкомОсвежиКорисничко име:&Прегледајте ЧПППрегледајте често постављана питања на мрежиУпозорењеСресредомНедељноНедељно — %sНедељно — радним данимаНедељно — данима викендаДобродошли!Када је искључено, налози са стањем од $0.00 неће бити приказани у спискуДа ли бисте хтели да очистите тренутну претрагу и да направите овај пренос у „%s“?ГодишњеМожете да означите трансакцију тако што ћете поставити „#tagname“ (назив ознаке) било где у опису.Направили сте измене од последњег чувања. Да ли бисте желели да их сачувате пре него што завршите?Ук_упностањеданаданаданаоткривеносваке/огодмесецамесецамесецимесечнодосве до %sнедељенедељенедељагодинегодинегодинаwxbanker-0.9.1/locale/sv/0000755000175000017500000000000012243601243015170 5ustar mrooneymrooneywxbanker-0.9.1/locale/sv/LC_MESSAGES/0000755000175000017500000000000012243601243016755 5ustar mrooneymrooneywxbanker-0.9.1/locale/sv/LC_MESSAGES/wxbanker.mo0000644000175000017500000003061312243601243021136 0ustar mrooneymrooney O   $@ ^k  ,"2 HRmu    2 7CU \hpy !os{ |:A#Qu5  18 X%e  (" .HZaR fp+x,9C$ hr) '8$Afy'  $:J.g+,j?5MQ. P $1:K&Z  &  !L*MwQ'06 ;HK T _j# S+         ' !!4!;!T!n! ~!!1!!!!""8"?"]" s"" """""" "" # ##0# 8#D#M#U#]#r#'###\$`$i$o$w$$$$ K%U%(i%%%E% &&&&;& @&J&h&q&&(&#&& &&''7'"I'l''q'(( ((6(,)-)A)6T)G) ))8)6*>*"W*z*** ***+++,+X+ ]+g+m+++$+++,1,Q,Z, w,,, , ,#,8,s-E{-_-Y!.{. ..\..// +/ 9/F/Y/)k///// /////// 0!0 50OA0F00O0 11 ;1E1K1Q1a1f1 v11 %}E$wm) 35OdHCQzlF>@ yheSRc"0v [oB(n,L-/MY+ur=Z^6igWUkKsf|D&:.2xNq~Aj?V` J]b<TX{p4P'97 a;*t_IG18#!\ and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightDailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsMatch: Mint.com IntegrationMonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No descriptionNo exchange rate for currency "%s"No matching transactions.No transactions entered.Note that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Search transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsSorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysTarget accountThe file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTueTuesdaysUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou have made changes since the last save. Would you like to save before exiting?daydaysdetectedeveryfrommonthmonthstountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2013-03-18 01:17+0000 Last-Translator: Umut Language-Team: Swedish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2013-03-19 05:31+0000 X-Generator: Launchpad (build 16532) och %s%(num)i återkommande transaktioner har totalt %(totalnum)i färdiga transaktioner.&Om&Valuta&Arkiv&Hjälp&Rapportera en buggIn&ställningar&Visa'%s' är inget giltigt belopp.En sökning är för tillfället aktiv.KontonamnKontonamn kan inte vara tomma.KontonAddera %s i miniräknareLägg till ett nytt kontoLägg till taggAlla kontonBeloppEtt fel uppstod under importeringen av CSV-filen.ÅrligenVart %(num)d årStäll en &frågaFråga en fråga onlineAutomatisk sparningSpara ändringar automatisktBalansKartläggning av CSV-kolumnerCSV filinställningarImportera CSVCSV importeringsfelCSV-profilerAvbrytRensa sökning?StängKolumnavskiljareKonfigurera valt kontoCopyrightDagligenVar %(num)d dagDatumDatumformatDecimalavgränsareTa bortBeskrivningAvfärdaKodningSlutar:Fyll i transaktionenExportera till CSVExportera transaktioner till en CSV-filFil att importerat.ex. kryssa i rutan och skriv in en transaktion på $50 på det här kontot kommer också att dra ifrån $50 från kontot som du valde som ursprungs konto.FreFredagarFrånDiagramHa det så kul!Göm miniräknareDölj avancerade sökalternativOm denna ruta är i kryssad när du lägger till en transaktion, kommer du behöva ange kontot som ska vara ursprungs kontot för överföringen.ImporteraImportera från CSVImportera transaktioner från en CSV-filIntegrera med Mint.comOgiltigt transaktionsbeloppDet ser ut som om det här är första gången du använder wxBanker!Färre alternativTräff: Mint.com integrationMånMåndagarMånadsvisVar %(num)d månadMånaderMer information om wxBankerFler alternativFlytta dessa %i transaktioner till kontoFlytta denna transaktion till kontoAldrigNästa kontoInget konto valtInget belopp ifyllt i "Belopp"-fältet.Ingen beskrivningIngen växelkurs för valutan "%s"Ingen matchade transaktionInga transaktioner angivan.Notera att aktiveringen av automatisk sparning från Arkiv-meyn kommer att eliminera behovet av manuell sparning.När du väl skapat ett konto kan du lägga till transaktioner (t.ex. ett initialt värde) genom att använda kontrollerna nere till höger.Skriv över profil ?Lösenord:UtförVänligen fyll i ett nummer som t.ex. 12.34 eller -20.Vänligen välj ett konto och försök igen.FörhandsgranskningFöregående kontoProfilen med namnet '%s' existerar redan. Skriv över?Pythons simplejson-bibliotek behövs för CVS-profilsladdning/sparning.ÅterkommandeÅterkommande TransaktionerÅterkommande transaktion har framgångsrikt lagts till.Ta bortTa bort det valda kontotTa bort följande %i transaktionerTa bort den här transaktionenÄndra namn på valt kontoÅterkommer på dagarna:Återkommer:Rapportera en bugg till utvecklaren onlineBegär en ny valutaBegär en egenskapBegär en ny funktion som ska implementerasLörLördagarSparaSpara ändringar?Sök transaktionerVälj valuta som ska visasVälj fil och klicka "Förhandsvisa"Skicka %s till miniräknareVisa miniräknareVisa avancerade sökalternativLedsen, ett konto med det namnet existerar redan.Börjar:Subtrahera %s i miniräknareSummeringSammanfattning:SönSöndagarMålkontoFilkodningen verkar inte vara '%s'.Den första transaktionen kommer att göras den %(date)sDen återkommande transaktionen "%(description)s" har %(num)i transaktioner klara för %(amount)s på %(datelist)s.Det här kontot har för närvarande inga återkommande transaktionerDen här transaktionen är markerad som en överföring. Var vänlig välj överföringskontot.Det här kommer att permanent ta bort kontot '%s' och alla dess transaktioner. Fortsätt?TorTorsdagarTidFör att komma igång, lägg till ett konto via kontrollpanelen i översta vänstra hörnet.Total balans över tidÖver&sätt wxBankerTransaktionsdetaljerTransaktionerÖverföringÖverför från %sÖverför till %sÖversätt wxBanker till ett annat språkTrendTisTisdagarAnvändarnamn:Visa &FAQVisa Vanliga frågor onlineVarningOnsOnsdagarVeckovisVeckovis på %sVeckovis på vardagarVeckovis på helgerVälkommen!När avaktiverad kommer konton med ett saldo av $0.00 att döljas från listan.Vill du rensa nuvarande sökning och utföra denna transaktion i "%s"?ÅrligenDu har gjort ändringar sedan du sparade sist. Vill du spara innan du avslutar?dagdagarupptäcktvarjefrånmånadmånadertilltill och med %sveckaveckorårårwxbanker-0.9.1/locale/tr/0000755000175000017500000000000012243601243015165 5ustar mrooneymrooneywxbanker-0.9.1/locale/tr/LC_MESSAGES/0000755000175000017500000000000012243601243016752 5ustar mrooneymrooneywxbanker-0.9.1/locale/tr/LC_MESSAGES/wxbanker.mo0000644000175000017500000000776512243601243021147 0ustar mrooneymrooneyUql018> D R\ box     += DPXa gu       0 : A ] y                ' + 2 ; B K T Z _ l o z  A L S \ i r ~           1 7 = K _ c n x            .CRZ i s " !'.2 8D IS Yem q{   ,C$N4<S(P%7)#LJ"/1'!KEI5OU @G T9M>-;8 ?6+R03F H2D B&Q.A :*=&About&File&Help&Report a Bug&Settings&ViewAccount nameAccountsAdd a new accountAll accountsAmountBalanceCSV columns mappingCSV file settingsCSV importCSV profilesCancelCloseConfigure the selected accountCopyrightDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Export to CSVFile to importFriFridaysFromGraphHave fun!ImportImport from CSVMatch: MonMonthsNeverNext accountNo account selectedNo descriptionPassword:PerformPreviewPrevious accountRecurringRemoveRemove the selected accountRename the selected accountRequest a Fea&tureSatSaturdaysSaveSave changes?Starts:SummarySummary:SunSundaysTarget accountThuThursdaysTimeTransactionsTransferTueUpdateUsername:WarningWedWeeklyWelcome!YearlydaydaysdetectedeveryfrommonthmonthstoweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2011-10-12 20:04+0000 Last-Translator: Burak Maleri Language-Team: Turkish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2011-10-13 04:36+0000 X-Generator: Launchpad (build 14124) &Hakkında&Dosya&Yardım&Hata bildir&Ayarlar&GörünümHesap adıHesaplarYeni bir hesap ekleTüm hesaplarMiktarBakiyeCSV Kolon HaritasıCSV Dosya AyarlarıCSV İçe AktarCSV ProfiliİptalKapatSeçilen hesabı yapılandırTelifTarihTarih biçimiOndalık ayırıcıSilAçıklamaİptal EtKodlamaSonlandırmaCSV'ye dışa aktarİmport edilecek dosyaCumCumaKimdenÇizgeİyi eğlenceler!İçeri alCSV'den içe aktarEşleşme: PtsAyHiçbir zamanSonraki hesapSeçilmiş hesap yokAçıklama yokParola:GerçekleştirÖnizlemeÖnceki hesapTekrarlayanKaldırSeçilen hesabı silSeçilen hesabı yeniden adlandır_Yeni özellik talebiCtsCumartesiKaydetDeğişiklikler kaydedilsin mi?BaşlamaÖzetÖzet:PzrPazarHedef HesapPrşPerşembeZamanAktarımlarAktarmaSalGüncelleKullanıcı adı:UyarıÇrşHaftalıkHoş geldiniz!Yıllıkgünalgılandıherkimdenay(lar)kimehaftayıl(lar)wxbanker-0.9.1/locale/uk/0000755000175000017500000000000012243601243015157 5ustar mrooneymrooneywxbanker-0.9.1/locale/uk/LC_MESSAGES/0000755000175000017500000000000012243601243016744 5ustar mrooneymrooneywxbanker-0.9.1/locale/uk/LC_MESSAGES/wxbanker.mo0000644000175000017500000001345112243601243021126 0ustar mrooneymrooneyC4YL  ,>FZ lw     )8Hel  % ( "2Un+,9 9 V n        . E a +p          < )K &u   J )'=e!v#6#,)Bl{()E  O,\!GD9"~8A()EGoWZ 0{-*:@!QDs/'C,TL-= Z1g@)6=,/  4105 -><" A9*B32 ;C#% .&?+87'(!:$'%s' is not a valid amount.AccountsAdd %s to calculatorAdd a new accountAll accountsAmountAn error ocurred during the csv file import.BalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesClear search?Column delimiterConfigure the selected accountDateDate formatDecimal separatorDeleteDescriptionEncodingEnter this transactionFile to importHide CalculatorHide advanced search optionsImportInvalid Transaction AmountLess optionsLoadMatch: More optionsMove these %i transactions to accountMove this transaction to accountNo account selectedNo amount entered in the 'Amount' field.No exchange rate for currency "%s"No transactions entered.Overwrite profile ?Please enter a number such as 12.34 or -20.Please select an account and then try again.PreviewProfile with the name '%s' exists already. Overwrite it ?Remove the selected accountRemove these %i transactionsRemove this transactionRename the selected accountSaveSearch transactionsSelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsSkip first lineSorry, an account by that name already exists.Subtract %s from calculatorTarget accountThe file encoding does not seem to be '%s'.TotalTotal Balance Over TimeTransactionsTransferTransfer from %sTransfer to %sTrendWarningProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-02-03 00:18-0800 PO-Revision-Date: 2009-04-16 16:59+0000 Last-Translator: Eugene Babiy Language-Team: Ukrainian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2010-02-04 04:46+0000 X-Generator: Launchpad (build Unknown) '%s' - невірна сума.РахункиДодати %s в калькуляторДодати новий рахунокУсі рахункиСумаВиникла помилка під час імпорту файлу CSV.БалансПризначення колонок CSVНалаштування файла CSVІмпорт CSVПомилка імпорту CSVПрофілі CSVОчистити пошук?Розділювач колонкиНалаштувати вибраний рахунокДатаФормат датиДесятковий розділювачЗнищитиОписКодуванняВведіть цю транзакціюФайл для імпортуПриховати КалькуляторПриховати розширені параметри пошукуІмпортНевірна Сума ТранзакціїМеньше параметрівЗавантажитиВідповідає: Більше опційПеремістити ці %i транзакції на рахунокПеремістити цю транзакцію на рахунокРахунок не вибраноНе введено суму в полі ’Сума’.Немає обмінного курсу для валюти "%s"Не введено транзакціюПерезаписати профіль ?Будьласка введіть цифру типу 12.34 або -20.Будьласка виберіть рахунок та спробуйте ще раз.ПереглядПрофіль з назвою '%s' вже існує. Перезаписати його ?Видалити вибраний рахунокВидалити ці %i транзакціїВидалити цю транзакціюПерейменувати вибраний рахунокЗберегтиШукати транзакціїВиберіть файл та натисніть "Перегляд"Надіслати %s в калькуляторПоказати КалькуляторПоказати розширені параметри пошукуПропустити перший рядокВибачте, рахунок з такою назвою вже існує.Відняти %s з калькулятораЦільовий рахунокКодування файлу не відповідає '%s'.ВсьогоЗагальний Баланс за ПеріодТранзакціїТрансферПеремістити їз %sПеремістити на %sТенденціяПопередженняwxbanker-0.9.1/locale/vi/0000755000175000017500000000000012243601243015156 5ustar mrooneymrooneywxbanker-0.9.1/locale/vi/LC_MESSAGES/0000755000175000017500000000000012243601243016743 5ustar mrooneymrooneywxbanker-0.9.1/locale/vi/LC_MESSAGES/wxbanker.mo0000644000175000017500000003740412243601243021131 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #$%V%)& /&<& C&P&g&w&6|&.&&-& "'/' H'T's'' '=' ''& (2(%D(j(s(( (( ( ((()$) 7)-E) s)))))))) ))) ***D*W** ** + ++/*+Z+++,,/,C,+^,A,,,,--1- 5- ?-L-S-r-.-+---,.G>."..4.#./,(/ U/+`/z/00 0 141=E1 11>1G1 -2:25S2 2$2222$333 S3?`333934 4'4,4'F4n44%4&44515.H5#w5?5 55 6 66 6U)66666:375n7p7H8k^8m8N899 9 9p9z:R: :;;+;<;M;f;*; ;;;; ;;;5< 6<B< F< P<]<.r<%< <c<b6= ==l%> >>>>>>> >> >>>s*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2011-10-23 09:25+0000 Last-Translator: Hoàng Ngọc Long Language-Team: Vietnamese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2011-10-24 05:12+0000 X-Generator: Launchpad (build 14185) and %s%(num)i giao dịch định kỳ có tổng số %(totalnum)i giao dịch sẵn sàng.&Về&Tiền tệ&Tệp&Trợ giúp&Báo cáo một lỗi&Thiệt đặt&Xem'%s' không phải là một số lượng hợp lệ.Một tìm kiếm hiện tại hoạt động.Tên tài khoảnTên tài khoản không thể để trống.Tài khoảnThêm %s vào máy tínhThêm thẻThêm một tài khoản mớiThêm một thẻTất cả tài khoảnTổng sốMột lỗi đã xảy ra trong quá trình nhập tệp csv.Hàng nămĐặt một &Câu hỏiĐặt một câu hỏi trực tuyếnTự động-lưuTự động lưu những thay đổiSố dưSắp xếp các cột CSVCác thiết đặt tệp CSVNhập CSVLỗi nhập CSVHồ sơ CSVHuỷ bỏLàm sạch tìm kiếm?ĐóngPhân cách cộtCấu hình tài khoản đã chọnBản quyềnTài khoản Mint tương ứng cho %(name)s:Hàng ngàyNgàyĐịnh dạng ngàyDấu thập phânXoáMô tảBỏ quaMã hoáKết thúc:Nhập giao dịchMỗi %(num)d tuần vào %%sXuất ra CSVXuất các giao dịch ra một tếp CSVTệp để nhậpVí dụ, kiểm ô này và nhập một giao dịch 50$ vào tài khoản này cũng sẽ trừ 50$ từ tài khoản mà bạn chọn làm nguồn.SáuThứ SáuTừĐồ thịChúc vui!Ẩn Máy tínhẨn những tuỳ chọn tìm kiếm nâng caoNếu ô này được kiểm khi thêm một giao dịch, bạn sẽ được nhắc về tài khoản dùng làm nguồn cho chuyển khoản.NhậpNhập từ CSVNhập các giao dịch từ một tệp CSVSố dư ban đầuTích hợp với Mint.comSố Lượng Giao Dịch Không Phù HợpĐây có vẻ là lần đầu tiên bạn sử dụng wxBanker!Ít tuỳ chọn hơnSố dòng để bỏ quaKhớp: Tích hợp Mint.comChứng danh Mint.com:HaiThứ HaiHàng thángThángThông tin thêm về wxBankerNhiều tuỳ chọn hơnChuyển %i giao dịch này vào tài khoảnChuyển giao dịch này vào tài khoảnKhông bao giờTài khoản kế tiếpKhông có tài khoản nào được chọnKhông có số lượng được nhập trong trường 'Tổng số'.Chưa gắn thẻ thông thườngKhông có mô tảKhông có tỷ lệ quy đổi cho tiền tệ "%s"Không có giao dịch nào khớp.Chưa gắn thẻKhông có giao dịch nào được nhập.không cóKhông được đồng bộ với Mint.comLưu ý rằng cho phép tự động-lưu từ thực đơn Tệp sẽ loại bỏ việc cần thiết lưu thủ công.Một khi bạn tạo một tài khoản bạn có thể thêm các giao dịch vào nó (như số dư ban đầu của bạn) sử dụng các điều khiển bên dưới lưới ở góc dưới bên phải.Ghi đè lên hồ sơ ?Mật khẩu:Thực hiệnVui lòng nhập vào một số như 12,34 hay -20.Vui lòng chọn một tài khoản và sau đó thử lại.Xem trướcTài khoản trướcHồ sơ với tên '%s' đã tồn tại. Ghi đè lên nó ?Thư viện Python simplejson cần cho việc tải/lưu hồ sơ csv.Định kỳGiao dịch Định kỳGiao dịch định kỳ được thêm thành công.Loại bỏLoại bỏ tài khoản đã chọnLoại bỏ %i giao dịch nàyLoại bỏ thẻ nàyLoại bỏ giao dịch nàyĐổi tên tài khoản đã chọnLặp lại vào những ngày:Lặp lại:Báo cáo một lỗi cho người phát triển trực tuyếnYêu cầu một Tiền tệYêu cầu một Tính nă&ngYêu cầu một tính năng mới được hiện thứcBảyThứ BảyLưuLưu những thay đổi?Lưu các chứng danh vào vòng khoáTìm kiếm thẻ nàyTìm kiếm giao dịchChọn tiền tệ để hiển thịChọn tệp và nhấn "Xem trước"Gửi %s tới máy tínhHiện Máy tínhHiện những tuỳ chọn tìm kiếm nâng caoHiện những tài khoản không còn tiềnTài chính cá nhân đơn giản.Xin lỗi, một tài khoản với tên đó đã tồn tại.Bắt đầu:Trừ %s từ máy tínhTóm tắtTóm tắt:CNChủ NhậtĐồng bộ những số dư tài khoản với một tài khoản Mint.com đã cóThẻ:ThẻTài khoản đíchCác nút trong điều khiển tài khoản cho phép bạn thêm, đổi tên, cấu hình, và loại bỏ một tài khoản, theo thứ tự.Mã hoá của tệp có vẻ như không phải là '%s'.Giao dịch đầu tiên sẽ diễn ra vào %(date)sGiao dịch định kỳ "%(description)s" có %(num)i giao dịch sẵn sàng cho %(amount)s vào %(datelist)s.Tài khoản này hiện tại không có giao dịch định kỳ nào.Giao dịch này được đánh dấu như một chuyển khoản. Vui lòng chọn tài khoản chuyển.Việc này sẽ loại bỏ hẳn tài khoản '%s' và tất cả các giao dịch của nó. Tiếp tục?Việc này sẽ laoij bỏ hẳn giao dịch định kỳ này. Tiếp tục?NămThứ NămThời gianĐể bắt đầu, thêm một tài khoản sử dụng điều khiển tài khoản ở góc trên bên trái.Để loại bỏ thẻ này sau, đơn giản loại bỏ nó khỏi mô tả hay nhấn-chuột phải vào giao dịch.Để sử dụng thư viện vẽ '%s', cài đặt các mô-đun python sau: %s.Tổng Số dư Theo Thời gianDị&ch wxBankerChi tiết giao dịchCác giao dịchChuyển khoảnChuyển khoản từ %sChuyển khoản tới %sDịch wxBanker ra một ngôn ngữ khácXu hướngCấp Xu hướngBaThứ BaCập nhậtTên người dùng:Xem &FAQXem Những Câu hỏi Thường gặp trực tuyếnCảnh báoTưThứ TưHàng tuầnHàng tuần vào %sHàng tuần vào ngày thường trong tuầnHàng tuần vào ngày cuối tuầnXin chào!Khi bị vô hiệu, những tài khoản với số dư là 0,00$ sẽ bị ẩn khỏi danh sáchBạn có muốn xoá bỏ tìm kiếm hiện tại và thực hiện giao dịch này trong "%s"?Hàng nămBạn cũng có thể gắn thẻ cho một giao dịch bằng cách đặt #tagname ở bất kỳ đâu trong phần mô tả.Bạn đã tạo những thay đổi kể từ lần lưu cuối. Bạn có muốn lưu trước khi thoát?_Tổng sốsố dưngàyđược phát hiệnmọitừthánghàng thángđếncho đến %stuầnnămwxbanker-0.9.1/locale/zh_CN/0000755000175000017500000000000012243601243015541 5ustar mrooneymrooneywxbanker-0.9.1/locale/zh_CN/LC_MESSAGES/0000755000175000017500000000000012243601243017326 5ustar mrooneymrooneywxbanker-0.9.1/locale/zh_CN/LC_MESSAGES/wxbanker.mo0000644000175000017500000003365312243601243021516 0ustar mrooneymrooneyd  O9 @JP V dnt   ),0]z    #17H g(q   2!@bq  ",<|Y#!95T   (%5 [| (" +7PUZte y+,9C7 {).J[$d'  (<Ww.%AIRV7^l+,Hju5MQdB  P b] C !!0! D!Q!Z!k!&z!! !!!! ! !&!" " "" ""/"B"U"L^"M""O#QP####### #### # #$%O% 4& ?& J& U&`& w& &#&& &&&& ''2' E'R'&Y''' ' ''''' '' ((%(5( <(I(_((f((( ((((((((( )#")F)wV)))))))*o ***)* ****+ 2+ ?+ L+W+g+z+~++++ +(++, ,,2-,`, p,},,,,,,S,Q-- --/-!-.O.V.Bf.N. .//4/;/Q/n/// //'//00-01080?0O0n000"0000!161*R1}1111111 11 1T1#J2'n2n2*3B03Ks393334W 4cc4@455 .5 ;5H5 O5 ]5 j555555 55!56 666 6&6 66 @6BJ6>66B6N7 e7p7w7{777777 777s*T%Crk@bfX>z/V^hD I!1| vLM,a(_9]<:t'5p$0y inFmxPH=)}3Kwc{Z?YEoUeO\+BN l #q`8;2.7dS-&jW4u gJR6[GA~Q" and %s%(num)i recurring transactions have a total of %(totalnum)i transactions ready.&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd TagAdd a new accountAdd a tagAll accountsAmountAn error ocurred during the csv file import.AnnuallyEvery %(num)d yearsAsk a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightCorresponding Mint account for %(name)s:DailyEvery %(num)d daysDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionEvery %(num)d weeks on %%sExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLines to skipMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthlyEvery %(num)d monthsMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No common tags yetNo descriptionNo exchange rate for currency "%s"No matching transactions.No tags yetNo transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:PerformPlease enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.RemoveRemove the selected accountRemove these %i transactionsRemove this tagRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureRequest a new feature to be implementedSatSaturdaysSaveSave changes?Save credentials in keyringSearch for this tagSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTag:TagsTarget accountThe buttons in the account control allow you to add, rename, configure, and remove an account, respectively.The file encoding does not seem to be '%s'.The first transaction will occur on %(date)sThe recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To remove this tag later, simply remove it from the description or right-click on the transaction.To use '%s' plotting library, install following python modules: %s.Total Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTrend DegreeTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou can also tag a transaction by putting #tagname anywhere in the description.You have made changes since the last save. Would you like to save before exiting?_Totalbalancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-10-04 03:01-0700 PO-Revision-Date: 2012-08-06 04:09+0000 Last-Translator: Michael Rooney Language-Team: Simplified Chinese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2012-08-07 04:46+0000 X-Generator: Launchpad (build 15745) 和 %s%(num)i 经常发生的交易已经有一个总计为 %(totalnum)i 的交易。关于(&A)货币(&C)文件(&F)帮助(&H)报告程序错误(&R)设置(&S)查看(&V)'%s' 不是一个有效的金额。目前指定了搜索条件。账户名帐户名称不能为空帐户将%s加到计算器添加标签添加一个新帐户添加一个标签所有帐户金额在导入 CSV 文件时发生错误。每年提出问题(&Q)在线提问自动保存自动保存修改余额CSV 列对应关系CSV 文件设置导入 CSVCSV 导入错误CSV 配置文件取消清除搜索?关闭列分隔符配置选中的帐户版权与 %(name)s 相对应的 Mint 账户:每天日期日期格式十进制分隔符删除描述忽略编码结束:输入此条交易记录每隔 %(num)d 周的 %%s导出到 CSV将交易记录导出到 CSV 文件被导入文件例如,勾选这个选项框并输入一笔金额为 50 元的交易,将会同时从来源帐户中扣除 50 元。五周五从图表祝用的开心!隐藏计算器隐藏高级搜索选项如果此选项框被勾选,当增加一笔交易时,您将会被提示输入作为转移来源的帐户。导入从 CSV 导入从一个 CSV 文件中导入交易项目初始余额与 Mint.com 集成无效的交易金额这似乎是您第一次使用 wxBanker!较少选项忽略行数匹配: Mint.com 集成Mint.com 凭证:一周一每月月关于wxBanker的更多信息更多选项将这 %i 项交易记录转移到帐户将此项交易转移到帐户从不下一个账户没有选择帐户没有在 “金额” 栏中输入交易金额。无共有标签没有描述没有为货币"%s"设置汇率没有匹配的结果尚未设定标签没有输入交易项。无无法与 Mint.com 同步注意:勾选 “文件” 菜单中的自动保存选项会禁止手动保存。一旦您创建了一个帐户,您可以通过右下角的控件向其中增加交易记录(例如您的帐户初始金额)。覆盖配置文件?密码:执行请输入一个数字,例如 12.34 或 -20。请选择一个帐户并重试。预览上一个账户名为 '%s' 的配置文件已经存在。要覆盖原文件吗?需要安装 Python simplejson 库文件以载入或保存 CSV 配置文件。循环利息经常性交易经常性交易添加成功。删除删除选中的帐户删除这 %i 项交易记录移除这个标签删除此项交易重命名选中的帐户重复:重复:向开发人员在线报告程序错误需要其他货币类型需要新功能(&T)请求实现新的功能六周六保存保存修改?将凭证存储到密钥环中搜索相同标签搜索交易记录选择显示的货币类型选择文件并点击 “预览”将%s发送到计算器显示计算器显示高级搜索选项显示收支差额为零的账户简单的个人财务管理抱歉,已经存在相同名称的帐户开始:从计算器中减去%s摘要摘要:日周日与 Mint.com 上的帐户同步标签:标签目标帐户用账户控制中的按钮,您可以添加、重命名、配置、删除账户。此文件的编码不像是 '%s'。第一次交易将会发生在 %(date)s经常发生的交易 "%(description)s" 有 %(num)i 项交易在 %(amount)s 的 %(datelist)s 已经发生。这个账户目前没有经常性交易。当前操作被设置成转账,请选择一个转账的账户。将会永久删除帐户 '%s' 和它所有的交易记录。要继续吗?即将永久删除这条经常性交易。是否继续?四周四时间要开始使用本软件,请先在左上角的帐户控制区中增加一个帐户。以后若要删除标签,只需要将它从描述中去除,或者在交易上点击鼠标右键要使用 '%s' 绘图库,请先安装以下 python 模块:%s余额历史记录翻译wxBanker(&S)交易细节交易记录转账从 %s 转移转移到 %s将wxBanker翻译到其他语言趋势拟合曲线阶数二周二更新用户名:查看常见问题解答(&F)在线查看常见问题与解答警告三周三每周每周 %s每周工作日每周末欢迎!当被禁用时,收支差额为零的账户将从列表中隐藏您愿意清除当前搜索结果并执行“%s”操作吗?每年您也可以在描述中添加 #标签名 来为交易添加标签自从上一次保存后您做了一些修改。想要在退出前保存吗?合计(_T)余额天找到每从月每月至直到 %s周年wxbanker-0.9.1/locale/zh_TW/0000755000175000017500000000000012243601243015573 5ustar mrooneymrooneywxbanker-0.9.1/locale/zh_TW/LC_MESSAGES/0000755000175000017500000000000012243601243017360 5ustar mrooneymrooneywxbanker-0.9.1/locale/zh_TW/LC_MESSAGES/wxbanker.mo0000644000175000017500000002726312243601243021550 0ustar mrooneymrooney<    ,6<X v ,# 9C^fz      - 4@HQW n!|GKSX ^hx|#)M]u5   >%K q (".GLZk\ p+z,9C& jt)"3$<at  )9Vq.72aA5MQ'By PC dj &  ! +&6]e it {LMRQY     ! ! #! .!9!Y! i!v!!!! !!!!" "!"4";"N" ^"h" ~"""""" "" "" #### %#2# K#Y#u#c#####$$%$W>$$$$ $$$($ '%4% ;%F%U%d%k%r%v% %#%%%%%# & 1&>&U&t&&&6&q&R' e'&o'$'''.';(=(D(Z(y((((((( ) #)0)7)>)E)[)n))))))) *** G*Q*f* m*w*~*)* *E*'+;*+:f+9++++?+@0,q,x, ,, ,, , ,,,- -----!@-b-i-p-w-~- - - -0-=-.W!.y...........J`b'1&r%Nx!C}fh?/WBXRtPwy~jT<6 "A]vK;M. SE,|u:Y4a@2{$ DUF-(^0* H57g\ O9[=3Z+nIp )me#8G_clLsqQoidkzV> and %s&About&Currency&File&Help&Report a Bug&Settings&View'%s' is not a valid amount.A search is currently active.Account nameAccount names cannot be blank.AccountsAdd %s to calculatorAdd a new accountAll accountsAmountAn error ocurred during the csv file import.Ask a &QuestionAsk a question onlineAuto-saveAutomatically save changesBalanceCSV columns mappingCSV file settingsCSV importCSV import errorCSV profilesCancelClear search?CloseColumn delimiterConfigure the selected accountCopyrightDateDate formatDecimal separatorDeleteDescriptionDismissEncodingEnds:Enter this transactionExport to CSVExport transactions to a CSV fileFile to importFor example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.FriFridaysFromGraphHave fun!Hide CalculatorHide advanced search optionsIf this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.ImportImport from CSVImport transactions from a CSV fileInitial balanceIntegrate with Mint.comInvalid Transaction AmountIt looks like this is your first time using wxBanker!Less optionsLoadMatch: Mint.com IntegrationMint.com credentials:MonMondaysMonthsMore information about wxBankerMore optionsMove these %i transactions to accountMove this transaction to accountNeverNext accountNo account selectedNo amount entered in the 'Amount' field.No descriptionNo exchange rate for currency "%s"No matching transactions.No transactions entered.NoneNot synchronized with Mint.comNote that enabling auto-save from the File menu will eliminate the need for manual saving.Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.Overwrite profile ?Password:Please enter a number such as 12.34 or -20.Please select an account and then try again.PreviewPrevious accountProfile with the name '%s' exists already. Overwrite it ?Python simplejson library is needed for csv profile loading/saving.RecurringRecurring TransactionsRecurring transaction successfully added.Remove the selected accountRemove these %i transactionsRemove this transactionRename the selected accountRepeats on days:Repeats:Report a bug to the developer onlineRequest a CurrencyRequest a Fea&tureSatSaturdaysSaveSave changes?Save credentials in keyringSearch transactionsSelect currency to displaySelect file and click "Preview"Send %s to calculatorShow CalculatorShow advanced search optionsShow zero-balance accountsSimple personal finance.Sorry, an account by that name already exists.Starts:Subtract %s from calculatorSummarySummary:SunSundaysSync account balances with an existing Mint.com accountTarget accountThe buttons in the account control allow you to add, remove, and rename an account, respectively.This account currently has no recurring transactions.This transaction is marked as a transfer. Please select the transfer account.This will permanently remove the account '%s' and all its transactions. Continue?This will permanently remove this recurring transaction. Continue?ThuThursdaysTimeTo get started, add an account using the account control in the top left corner.To use '%s' plotting library, install following python modules: %s.TotalTotal Balance Over TimeTran&slate wxBankerTransaction detailsTransactionsTransferTransfer from %sTransfer to %sTranslate wxBanker to another languageTrendTueTuesdaysUpdateUsername:View &FAQsView Frequently Asked Questions onlineWarningWedWednesdaysWeeklyWeekly on %sWeekly on weekdaysWeekly on weekendsWelcome!When disabled, accounts with a balance of $0.00 will be hidden from the listWould you like to clear the current search and make this transaction in "%s"?YearlyYou have made changes since the last save. Would you like to save before exiting?balancedaydaysdetectedeveryfrommonthmonthsmonthlytountil %sweekweeksyearyearsProject-Id-Version: wxbanker Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-08-10 00:01-0700 PO-Revision-Date: 2010-08-10 05:27+0000 Last-Translator: Michael Rooney Language-Team: Chinese (Traditional) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2010-08-11 03:46+0000 X-Generator: Launchpad (build Unknown) 和 %s關於(&A)&貨幣檔案 (&F)說明(&H)&回報錯誤設定(&S)檢視(&V)'%s'不是一個有效的金額執行搜尋中帳戶名稱帳戶名稱不能空白帳戶增加%s至計算機增加新的帳戶所有帳戶金額匯入CSV檔時有錯誤發生詢問及問題線上詢問問題自動儲存自動儲存更變結餘CSV資料欄對應CSV檔設定值匯入CSV匯入CSV發生錯誤CSV設定檔取消清除搜尋?關閉欄位分隔符號選擇的帳戶組態版權所有日期日期格式小數點分隔符號刪除描述解除編碼結束於:輸入此筆交易資料匯出至 CSV匯出交易資料至CSV檔要匯入的檔案例如選擇此框並輸入$50至帳戶中時,會從您選擇作為來源的帳戶裡扣除$50。週五週五從圖表祝您愉快!隱藏計算機隱藏進階搜尋選項當增加一筆交易時選擇此框,會提示您使用此帳戶作為傳送來源。匯入從CSV檔匯入從CVS檔匯入交易資料開始結餘與Mint.com整合無效的交易金額似乎這是您第一次使用wxBaner!較少選項載入比對: 整合Mint.comMint.com憑證週一週一月更多關於wxBaner的訊息較多選項移動這些%i交易資料至帳戶移動交易資料至帳戶永不下一個帳戶未選取任何帳戶"金額"欄沒有輸入任何金額沒有說明無"%s"的貨幣匯率無任何符合的交易資料未輸入任何交易資料無未與Mint.com同步注意:可從檔案選單中手動取消自動儲存當您建立一個新帳戶時,您可使用右下角的控制鈕格子於其中增加交易(例如開始結餘)覆蓋設定檔?密碼:請輸入像12.34或-20此類的數字請選擇一個帳戶並再次嘗試預覽前一個帳戶設定檔名稱'%s'已經存在,覆蓋它?載入或儲存CSV設定檔需要Python simplejson函式庫定期定期性交易資料定期交易已經成功增加移除選擇的帳戶移動這些%i交易資料移除此筆交易資料變更選擇的帳戶名稱重覆日數:重複:線上回報錯誤給開發者詢問貨幣詢問功能週六週六儲存是否儲存變更?儲存憑證金鑰搜尋交易資料選擇顯示的貨幣選擇檔案並點擊"預覽"傳送%s至計算機顯示計算機顯示進階搜尋選項顯示零結存帳戶簡易個人理財抱歉,已有相同的帳戶名稱存在開始:從計算機扣除%s摘要摘要:週日週日與已存在Mint.com的帳戶同步結餘目標帳戶帳戶控制鈕允許您分別新增、移除並變更帳戶名稱。此帳戶最近無定期性交易資料此筆交易資料已標示"傳送"。請選擇傳送帳戶這會永久移除帳戶'%s'並所有交易,要繼續?這會永久移除此定期性交易資料,要繼續?週四週四時間開始時,使用左上角的帳戶控制鈕新增一個帳戶欲使用'%s'繪圖函式庫,請安裝下列python模組: %s總計一段時間的總結餘翻譯wxBaner交易資料明細交易資料傳送從%s傳送傳送到%s將wxBaner翻譯成其它語言趨勢週二週二更新使用者名稱:瀏覽常見問題線上瀏覽經常詢問的問題警告週三週三每週每週%s每週週日每週週六歡迎!停用時,零結存帳戶會從清單中隱藏您要清除此次搜尋並產生"%s"這筆交易資料嗎?每年自從上次儲存後您已有某些變更。您要在離開前儲存這些變更嗎?結餘天檢測每從月每月到直到%s週年wxbanker-0.9.1/main.py0000644000175000017500000000007412243601243014600 0ustar mrooneymrooney#!/usr/bin/env python from wxbanker.main import main main() wxbanker-0.9.1/pip_requirements.txt0000644000175000017500000000010512243601243017431 0ustar mrooneymrooneypython-dateutil simplejson BeautifulSoup pyxdg numpy pyquery keyring wxbanker-0.9.1/README.md0000644000175000017500000000066112243601243014563 0ustar mrooneymrooneywxBanker is a simple personal finance application. [![Build Status](https://travis-ci.org/mrooney/wxbanker.png?branch=master)](https://travis-ci.org/mrooney/wxbanker) For more information, see https://wiki.ubuntu.com/wxBanker and https://launchpad.net/wxbanker Requirements: * Ubuntu: sudo apt-get install python-wxgtk2.8 * OSX: brew install wxmac Installation: * pip install -r pip_requirements.txt Usage: * python main.py wxbanker-0.9.1/setup.py0000644000175000017500000000457112243601243015022 0ustar mrooneymrooney#!/usr/bin/env python # https://launchpad.net/wxbanker # setup.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from distutils.core import setup import os, glob from wxbanker import version #Create an array with all the locale filenames I18NFILES = [] for filepath in glob.glob("locale/*/LC_MESSAGES/*.mo"): targetpath = os.path.dirname(os.path.join("share/", filepath)) I18NFILES.append((targetpath, [filepath])) setup( version = version.NUMBER, name = "wxBanker", description = "Simple personal finance.", author = "Michael Rooney", author_email = "mrooney@ubuntu.com", url = "https://launchpad.net/wxbanker", download_url='https://launchpad.net/wxbanker/+download', packages = ["wxbanker", "wxbanker.art", "wxbanker.bankobjects", "wxbanker.plots", "wxbanker.tests", "wxbanker.mint", "wxbanker.cairoplot", "wxbanker.ObjectListView", "wxbanker.lib", "wxbanker.lib.mint"], license='GNU GPL', platforms='linux', scripts = ['bin/wxbanker'], data_files = [ ("share/applications", ["bin/wxbanker.desktop"]), ('share/icons/hicolor/16x16/apps', ['images/16/wxbanker.png']), ('share/icons/hicolor/24x24/apps', ['images/24/wxbanker.png']), ('share/icons/hicolor/32x32/apps', ['images/32/wxbanker.png']), ('share/icons/hicolor/48x48/apps', ['images/48/wxbanker.png']), ('share/icons/hicolor/256x256/apps', ['images/256/wxbanker.png']), ('share/pixmaps', ['images/48/wxbanker.png']), ('share/wxbanker', glob.glob("*.txt")), ('share/wxbanker', glob.glob("wxbanker/data/*.*")), ('share/wxbanker/fixtures', glob.glob("wxbanker/data/fixtures/*.*")), ] + I18NFILES ) wxbanker-0.9.1/UPGRADING.txt0000644000175000017500000000164612243601243015371 0ustar mrooneymrooney== UPGRADING == Upgrading wxBanker to a new version is very easy. The most important part is ensuring your bank.db file, which holds all of your accounts and transactions, is in the right place. If you are upgrading from version 0.4 or later, this is handled automatically for you. If not, move it manually by either: *) On Linux/OSX, move bank.db to ~/.local/share/wxbanker/bank.db, creating any folders as necessary. This is the recommended approach and will save you from needing to move it again in future releases. OR *) Copy the bank.db file from the old release into the new release folder. Then run wxbanker.py from the new release. Be sure to update any shortcuts you may have created to reflect the new location. It is safe to delete the old directory if you like. Thanks for using wxBanker. If you have any problems, questions, or comments, check out wxbanker.org or email me at mrooney@ubuntu.com! wxbanker-0.9.1/wxbanker/0000755000175000017500000000000012243601243015122 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/__init__.py0000644000175000017500000000000012243601243017221 0ustar mrooneymrooneywxbanker-0.9.1/wxbanker/accountconfigdialog.py0000644000175000017500000003213512243601243021502 0ustar mrooneymrooney# https://launchpad.net/wxbanker # accountconfigdialog.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx from wx.lib.pubsub import Publisher from wxbanker.transactionctrl import TransactionCtrl from wxbanker.currencies import CurrencyStrings, GetCurrencyInt from wxbanker.mint.api import Mint from wxbanker.mint.kring import Keyring class MintConfigPanel(wx.Panel): ID_UPDATE = wx.NewId() def __init__(self, parent, account): wx.Panel.__init__(self, parent) self.Account = account self.NoneAccount = _("None") self.headerText = wx.StaticText(self, -1, _("Mint.com credentials:")) self.usernameBox = wx.TextCtrl(self) self.passwordBox = wx.TextCtrl(self, style=wx.TE_PASSWORD) self.saveAuthCheck = wx.CheckBox(self, label=_("Save credentials in keyring")) self.accountText = wx.StaticText(self, -1, _("Corresponding Mint account for %(name)s:") % {"name": account.Name}) self.mintCombo = wx.Choice(self, choices=[self.NoneAccount]) self.mintUpdateButton = wx.Button(self, label=_("Update"), id=self.ID_UPDATE) gridSizer = wx.GridSizer(2, 2, 3, 3) gridSizer.Add(wx.StaticText(self, label=_("Username:")), flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT) gridSizer.Add(self.usernameBox, flag=wx.ALIGN_LEFT|wx.LEFT, border=6) gridSizer.Add(wx.StaticText(self, label=_("Password:")), flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT) gridSizer.Add(self.passwordBox, flag=wx.ALIGN_LEFT|wx.LEFT, border=6) mintAccountSizer = wx.BoxSizer() mintAccountSizer.Add(self.mintCombo, 0, wx.LEFT, 6) mintAccountSizer.Add(self.mintUpdateButton, wx.LEFT, 6) saveButton = wx.Button(self, label=_("Save"), id=wx.ID_SAVE) closeButton = wx.Button(self, label=_("Cancel"), id=wx.ID_CLOSE) buttonSizer = wx.BoxSizer() buttonSizer.Add(saveButton) buttonSizer.AddSpacer(12) buttonSizer.Add(closeButton) buttonSizer.AddSpacer(6) self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.AddSpacer(6) self.Sizer.Add(self.headerText, 0, wx.LEFT, 6) self.Sizer.AddSpacer(12) self.Sizer.Add(gridSizer, 0, wx.EXPAND|wx.LEFT, 6) self.Sizer.AddSpacer(12) self.Sizer.Add(self.saveAuthCheck, 0, wx.LEFT, 12) self.Sizer.AddSpacer(24) self.Sizer.Add(self.accountText, 0, wx.LEFT, 6) self.Sizer.AddSpacer(6) self.Sizer.Add(mintAccountSizer) self.Sizer.AddStretchSpacer(1) self.Sizer.Add(buttonSizer, flag=wx.ALIGN_RIGHT) self.Sizer.AddSpacer(6) # If we have a keyring, enable the checkbox, and populate any existing data. if Keyring: self.saveAuthCheck.Enable(True) keyring = Keyring() if keyring.get_credentials() is not None: self.saveAuthCheck.Value = True user, passwd = keyring.get_credentials() self.usernameBox.Value = user self.passwordBox.Value = passwd # Properly populate the list of accounts if we are already logged in. if Mint().IsLoggedIn(): self.updateMintAccounts() self.mintUpdateButton.Bind(wx.EVT_BUTTON, self.onUpdateButton) self.Bind(wx.EVT_BUTTON, self.onButton) def onUpdateButton(self, event): self.updateMintAccounts() def updateMintAccounts(self): # Reset the choices. self.mintCombo.SetItems([self.NoneAccount]) # Login (potentially using the cache) and populate accounts. self.mintLogin() accounts = Mint.GetAccounts() accountMintId = self.Account.GetMintId() # Init i in the case that there aren't accounts as we use it below. i = 0 matched = False for i, (mintId, item) in enumerate(sorted(Mint.GetAccounts().items(), cmp=lambda a,b: cmp(a[1]['name'], b[1]['name']))): option = "%s - %s" % (item['name'], self.Account.float2str(item['balance'])) self.mintCombo.Append(option, mintId) # If this is the currently configured account, select it. if mintId == accountMintId: # It is offset by one as NoneAccount is first. self.mintCombo.Selection = i+1 matched = True # If the account has an ID configured but it wasn't matched, show/select it so a save is not lossy. if not matched and accountMintId: self.mintCombo.Append(str(accountMintId), accountMintId) self.mintCombo.Selection = i+1 # If there are accounts but none is currently set, choose the first actual one. elif accounts and not self.Account.IsMintEnabled(): self.mintCombo.Selection = 1 self.Layout() def onButton(self, event): """If the save button was clicked save, and close the dialog in any case (Close/Cancel/Save).""" assert event.Id in (wx.ID_CLOSE, wx.ID_SAVE) if event.Id == wx.ID_SAVE: self.mintLogin() sel = self.mintCombo.Selection if sel != -1: mintId = self.mintCombo.GetClientData(sel) self.Account.MintId = mintId self.GrandParent.Destroy() def mintLogin(self): username, passwd = [ctrl.Value for ctrl in (self.usernameBox, self.passwordBox)] if self.saveAuthCheck.IsChecked(): Keyring().set_credentials(username, passwd) Mint.LoginFromKeyring() else: Mint.Login(username, passwd) class RecurringConfigPanel(wx.Panel): def __init__(self, parent, account): self.Account = account wx.Panel.__init__(self, parent) self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.AddSpacer(6) self.staticBox = wx.StaticBox(self, label=_("Transaction details")) self.staticBoxSizer = wx.StaticBoxSizer(self.staticBox, wx.VERTICAL) self.transactionCtrl = TransactionCtrl(self, editing=account) self.staticBoxSizer.Add(self.transactionCtrl) self.transactions = self.Account.GetRecurringTransactions() self.buttonSizer = wx.BoxSizer() self.Sizer.AddSpacer(6) # Something can be inserted here so the double spacers makes some sense. self.Sizer.AddSpacer(12) self.Sizer.Add(self.staticBoxSizer, 0, wx.EXPAND|wx.LEFT|wx.RIGHT, 6) self.Sizer.AddStretchSpacer(1) self.Sizer.Add(self.buttonSizer, flag=wx.ALIGN_RIGHT|wx.EXPAND) self.Sizer.AddSpacer(6) if not self.transactions: self.setupNoRecurringTransactions() else: self.setupRecurringTransactions() self.buttonSizer.AddSpacer(6) self.Bind(wx.EVT_BUTTON, self.onButton) def GetCurrentRecurringTransaction(self): return self.transactions[self.transactionChoice.GetSelection()] def onButton(self, event): """If the save button was clicked save, and close the dialog in any case (Close/Cancel/Save).""" assert event.Id in (wx.ID_CLOSE, wx.ID_SAVE, wx.ID_DELETE) if event.Id == wx.ID_SAVE: self.transactionCtrl.ToRecurring() originalTransaction = self.transactions[self.transactionChoice.Selection] modifiedTransaction = self.transactionCtrl.recurringObj originalTransaction.UpdateFrom(modifiedTransaction) # Let everyone know about this, someone might want to check if there are new pending transactions. Publisher.sendMessage("recurringtransaction.updated") elif event.Id == wx.ID_DELETE: recurring = self.GetCurrentRecurringTransaction() warningMsg = _("This will permanently remove this recurring transaction. Continue?") dlg = wx.MessageDialog(self, warningMsg, _("Warning"), style=wx.YES_NO|wx.ICON_EXCLAMATION) result = dlg.ShowModal() if result == wx.ID_YES: recurring.Parent.RemoveRecurringTransaction(recurring) self.GrandParent.Destroy() def setupNoRecurringTransactions(self): self.staticBox.Hide() self.transactionCtrl.Hide() self.Sizer.Insert(1, wx.StaticText(self, label=_("This account currently has no recurring transactions.")), flag=wx.ALIGN_CENTER) closeButton = wx.Button(self, label=_("Close"), id=wx.ID_CLOSE) self.buttonSizer.AddStretchSpacer(1) self.buttonSizer.Add(closeButton) def setupRecurringTransactions(self): strings = [rt.GetDescriptionString() for rt in self.transactions] self.transactionChoice = wx.Choice(self, choices=strings) self.Sizer.Insert(1, self.transactionChoice, flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=6) self.transactionCtrl.FromRecurring(self.transactions[0]) deleteButton = wx.Button(self, label=_("Delete"), id=wx.ID_DELETE) saveButton = wx.Button(self, label=_("Save"), id=wx.ID_SAVE) closeButton = wx.Button(self, label=_("Cancel"), id=wx.ID_CLOSE) self.buttonSizer.AddSpacer(6) self.buttonSizer.Add(deleteButton) self.buttonSizer.AddStretchSpacer(1) self.buttonSizer.Add(saveButton) self.buttonSizer.AddSpacer(12) self.buttonSizer.Add(closeButton) self.transactionChoice.Bind(wx.EVT_CHOICE, self.onTransactionChoice) def onTransactionChoice(self, event): transaction = self.GetCurrentRecurringTransaction() self.transactionCtrl.FromRecurring(transaction) class CurrencyConfigPanel(wx.Panel): def __init__(self, parent, account): self.Account = account wx.Panel.__init__(self, parent) self.headerText = wx.StaticText(self, -1, _("Account currency: ")) saveButton = wx.Button(self, label=_("Save"), id=wx.ID_SAVE) closeButton = wx.Button(self, label=_("Cancel"), id=wx.ID_CLOSE) buttonSizer = wx.BoxSizer() buttonSizer.Add(saveButton) buttonSizer.AddSpacer(12) buttonSizer.Add(closeButton) buttonSizer.AddSpacer(6) #base currency = global currency currencies = ["Base currency"] + CurrencyStrings self.currencyCombo = wx.Choice(self, choices=currencies) # we have to add 1 to the current indext because we added the "base currency" entry self.currencyCombo.SetSelection(GetCurrencyInt(self.Account.GetCurrency())+1) self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.AddSpacer(6) self.Sizer.Add(self.headerText, 0, wx.LEFT, 6) self.Sizer.AddSpacer(6) self.Sizer.Add(self.currencyCombo, 0, wx.LEFT, 6) self.Sizer.AddStretchSpacer(1) self.Sizer.Add(buttonSizer, flag=wx.ALIGN_RIGHT) self.Sizer.AddSpacer(6) self.Bind(wx.EVT_BUTTON, self.onButton) def onButton(self, event): """If the save button was clicked save, and close the dialog in any case (Close/Cancel/Save).""" assert event.Id in (wx.ID_CLOSE, wx.ID_SAVE) if event.Id == wx.ID_SAVE: #we have to substract 1 from combo_box selection because we added the "base currency" entry selectedCurrency = self.currencyCombo.GetSelection() - 1 Publisher.sendMessage("user.account_currency_changed", (self.Account, selectedCurrency)) self.GrandParent.Destroy() class AccountConfigDialog(wx.Dialog): def __init__(self, parent, account, tab="default"): wx.Dialog.__init__(self, parent, title=account.Name, size=(600, 400)) self.Sizer = wx.BoxSizer() self.notebook = wx.aui.AuiNotebook(self, style=wx.aui.AUI_NB_TOP) self.Sizer.Add(self.notebook, 1, wx.EXPAND) self.recurringPanel = RecurringConfigPanel(self.notebook, account) self.mintPanel = MintConfigPanel(self.notebook, account) self.currencyPanel = CurrencyConfigPanel(self.notebook, account) self.notebook.AddPage(self.currencyPanel, _("Currency")) self.notebook.AddPage(self.recurringPanel, _("Recurring Transactions")) self.notebook.AddPage(self.mintPanel, _("Mint.com Integration")) if tab == "mint": # Setting the selection synchronously gets changed back somewhere in the event queue. wx.CallLater(50, self.notebook.SetSelection, 2) wxbanker-0.9.1/wxbanker/accountlistctrl.py0000644000175000017500000005761012243601243020722 0ustar mrooneymrooney# https://launchpad.net/wxbanker # accountlistctrl.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx from wxbanker import bankcontrols, bankexceptions, accountconfigdialog, localization from wx.lib.pubsub import Publisher class AccountListCtrl(wx.Panel): """ This control manages a clickable list of accounts, displaying their totals to the right of them, as well as the grand total as the last entry. Accounts can be added, removed, and renamed. """ def __init__(self, parent, bankController, autoPopulate=True): wx.Panel.__init__(self, parent, name="AccountListCtrl") self.bankController = bankController self.Model = bankController.Model # Initialize some attributes to their default values. self.editCtrl = self.hiddenIndex = None self.currentIndex = None self.radioButtons, self.totalTexts, self.accountObjects, self.mintStatuses = [], [], [], [] # Create the staticboxsizer which is the home for everything. # This *MUST* be created first to ensure proper z-ordering (as per docs). self.staticBox = wx.StaticBox(self, label=_("Accounts")) # Create a single panel to be the "child" of the static box sizer, # to work around a wxPython regression that prevents tooltips. lp: xxxxxx self.childPanel = wx.Panel(self) self.childSizer = childSizer = wx.BoxSizer(wx.VERTICAL) ## Create and set up the buttons. # The ADD account button. BMP = self.addBMP = wx.ArtProvider.GetBitmap('wxART_add') self.addButton = addButton = bankcontrols.FlashableButton(self.childPanel, bitmap=BMP) addButton.SetToolTipString(_("Add a new account")) # The REMOVE account button. BMP = wx.ArtProvider.GetBitmap('wxART_delete') self.removeButton = removeButton = wx.BitmapButton(self.childPanel, bitmap=BMP) removeButton.SetToolTipString(_("Remove the selected account")) removeButton.Enabled = False # The EDIT account button. BMP = wx.ArtProvider.GetBitmap('wxART_textfield_rename') self.editButton = editButton = wx.BitmapButton(self.childPanel, bitmap=BMP) editButton.SetToolTipString(_("Rename the selected account")) editButton.Enabled = False # The CONFIGURE account button. BMP = wx.ArtProvider.GetBitmap('wxART_cog') self.configureButton = configureButton = wx.BitmapButton(self.childPanel, bitmap=BMP) configureButton.SetToolTipString(_("Configure the selected account")) configureButton.Enabled = False # Layout the buttons. buttonSizer = wx.BoxSizer() buttonSizer.Add(addButton) buttonSizer.AddSpacer(6) buttonSizer.Add(editButton) buttonSizer.AddSpacer(6) buttonSizer.Add(configureButton) buttonSizer.AddSpacer(6) buttonSizer.Add(removeButton) # Set up the "Total" sizer. self.totalText = wx.StaticText(self.childPanel, label=self.Model.float2str(0)) self.totalTexts.append(self.totalText) miniSizer = wx.BoxSizer() self.allAccountsRadio = wx.RadioButton(self.childPanel, label=_("All accounts")) miniSizer.Add(self.allAccountsRadio, 1, wx.ALIGN_CENTER) miniSizer.Add(self.totalText, 0, wx.ALIGN_CENTER|wx.LEFT, 10) miniSizer.AddSpacer(3) #self.staticBoxSizer = SmoothStaticBoxSizer(self.staticBox, wx.VERTICAL) self.staticBoxSizer = wx.StaticBoxSizer(self.staticBox, wx.VERTICAL) #self.staticBoxSizer.SetSmooth(False) childSizer.Add(buttonSizer, 0, wx.BOTTOM, 9) # Add just a tiny bit of padding between the accounts and the total item. childSizer.AddSpacer(3) childSizer.Add(miniSizer, 0, wx.EXPAND) self.childPanel.Sizer = childSizer self.staticBoxSizer.Add(self.childPanel, 1, wx.EXPAND) # Set up the button bindings. addButton.Bind(wx.EVT_BUTTON, self.onAddButton) removeButton.Bind(wx.EVT_BUTTON, self.onRemoveButton) editButton.Bind(wx.EVT_BUTTON, self.onRenameButton) configureButton.Bind(wx.EVT_BUTTON, self.onConfigureButton) # Set up the link binding. self.Bind(wx.EVT_RADIOBUTTON, self.onAccountClick) # Subscribe to messages we are concerned about. Publisher.subscribe(self.onAccountBalanceChanged, "ormobject.updated.Account.Balance") Publisher.subscribe(self.onAccountRenamed, "ormobject.updated.Account.Name") Publisher.subscribe(self.onTransactionDateChanged, "ormobject.updated.Transaction.Date") Publisher.subscribe(self.onAccountMintIdChanged, "ormobject.updated.Account.MintId") Publisher.subscribe(self.onAccountRemoved, "account.removed") Publisher.subscribe(self.onAccountAdded, "account.created") Publisher.subscribe(self.onCurrencyChanged, "currency_changed") Publisher.subscribe(self.onShowZeroToggled, "controller.showzero_toggled") Publisher.subscribe(self.onShowCurrencyNickToggled, "controller.show_currency_nick_toggled") Publisher.subscribe(self.onAccountChanged, "user.account changed") Publisher.subscribe(self.onSelectNextAccount, "user.next account") Publisher.subscribe(self.onSelectPreviousAccount, "user.previous account") Publisher.subscribe(self.onToggleMintIntegration, "user.mint.toggled") Publisher.subscribe(self.onMintDataUpdated, "mint.updated") # Populate ourselves initially unless explicitly told not to. if autoPopulate: for account in self.Model.Accounts: self._PutAccount(account) self.Sizer = self.staticBoxSizer # Set the minimum size to the amount it needs to display the edit box. self.Freeze() self.showEditCtrl(focus=False) minWidth = max((self.staticBoxSizer.CalcMin()[0], 250)) self.onHideEditCtrl() self.Thaw() self.staticBoxSizer.SetMinSize((minWidth, -1)) # Initially load the visibility of zero-balance accounts! # Don't refresh the selection or we'll send an account changed message which will overwrite the LastAccountId before it gets used! self.refreshVisibility(refreshSelection=False) self.staticBoxSizer.Layout() #self.staticBoxSizer.SetSmooth(True) if not self.GetCount(): self.addButton.StartFlashing() def onAccountMintIdChanged(self, message): self._UpdateMintStatuses() def onTransactionDateChanged(self, event): self._UpdateMintStatuses() def _UpdateMintStatuses(self): for account, mintCtrl in zip(self.accountObjects, self.mintStatuses): bitmapName = "transparent" tooltip = _("Not synchronized with Mint.com") if account.IsMintEnabled(): tooltip = account.GetSyncString() if account.IsInSync(): bitmapName = "accept" else: bitmapName = "exclamation" mintCtrl.SetBitmap(wx.ArtProvider.GetBitmap("wxART_%s" % bitmapName)) mintCtrl.SetToolTipString(tooltip) def refreshBalances(self): # Update all the accounts. for account, textCtrl in zip(self.accountObjects, self.totalTexts): textCtrl.Label = account.float2str(account.Balance) # Update the total text. self.updateGrandTotal() self.Parent.Layout() def onCurrencyChanged(self, message): self.refreshBalances() def onShowCurrencyNickToggled(self, message): val = message.data for account in self.Model.Accounts: account.ShowCurrencyNick = val self.refreshBalances() def onToggleMintIntegration(self, message): enabled = message.data if enabled: self.ConfigureCurrentAccount(tab="mint") # Refresh everything in the case of a cancel which won't trigger an update event. self.onMintDataUpdated() else: self.ShowMintStatus(False) def onMintDataUpdated(self, message=None): self.ShowMintStatus(True) self._UpdateMintStatuses() # A zero-balance account could be out of/ in sync, potentially toggling its visibility. self.refreshVisibility() def ShowMintStatus(self, show): for index, mintStatus in enumerate(self.mintStatuses): if self.IsVisible(index): mintStatus.Show(show) self.Layout() def MintStatusIsShown(self): return self.Model.MintEnabled def IsVisible(self, index): """Return whether or not the account at the given index is visible.""" if index is None: return False if index < 0 or index >= self.GetCount(): raise IndexError, "No element at index %i"%index # Offset by 1 because the first child is actually the button sizer. return self.childSizer.GetItem(index+1).IsShown() def SelectItem(self, index): """Given an index (zero-based), select the appropriate account.""" if index is None: account = None self.allAccountsRadio.Value = True else: account = self.accountObjects[index] # Set the value in case it wasn't a click that triggered this. self.radioButtons[index].Value = True self.currentIndex = index # Update the remove/edit buttons. self.removeButton.Enabled = index is not None self.editButton.Enabled = index is not None self.configureButton.Enabled = index is not None # Inform everyone that we've changed. This is different from the 'user.account changed' event, # as account changes are also triggered by account removals and additions. Publisher.sendMessage("view.account changed", account) return account def SelectItemById(self, theId): # If there is no recently selected account, select the first visible if one exists. if theId is None: self.SelectVisibleItem(0) else: for i, account in enumerate(self.accountObjects): if account.ID == theId: self.SelectItem(i) break else: # This seems rather unlikely, but let's handle it gracefully. self.SelectVisibleItem(0) def SelectItemByAccount(self, account): if account: return self.SelectItemById(account.ID) else: return self.SelectItem(None) def SelectVisibleItem(self, index): """ Given an index (zero-based), select the visible account at that index. """ visibleItems = -1 for i in range(self.GetCount()): if self.IsVisible(i): visibleItems += 1 if index == visibleItems: self.SelectItem(i) return else: # If we didn't break (or return). self.SelectItem(None) def SelectPreviousAccount(self): if self.currentIndex is not None: i = self.currentIndex - 1 else: i = len(self.accountObjects) - 1 while i >= 0: if self.IsVisible(i): return self.SelectItem(i) i -= 1 return self.accountObjects[0] def SelectNextAccount(self): if self.currentIndex is not None: i = self.currentIndex + 1 else: i = len(self.accountObjects) while i < len(self.accountObjects): if self.IsVisible(i): return self.SelectItem(i) i += 1 # We reached the end. If "All" isn't already selected, do it. if self.GetCurrentAccount() is not None: self.SelectItem(None) def GetCount(self): return len(self.accountObjects) def GetVisibleCount(self): return len([i for i in range(self.GetCount()) if self.IsVisible(i)]) def GetCurrentAccount(self): if self.currentIndex is not None: return self.accountObjects[self.currentIndex] else: # Not necessary, but explicit is clearer here. return None def ConfigureCurrentAccount(self, tab="default"): dlg = accountconfigdialog.AccountConfigDialog(self, self.GetCurrentAccount(), tab) dlg.ShowModal() def onAccountRemoved(self, message): """ Called when an account is removed from the model. """ account = message.data index = self.accountObjects.index(account) self._RemoveItem(index) # Start flashing the add button if there are no accounts. if not self.GetCount(): self.addButton.StartFlashing() def _PutAccount(self, account, select=False): index = 0 for currAccount in self.accountObjects: if account.Name < currAccount.Name: break index += 1 # Check if we should set account to show currency NIcks, # wouldn't it be better to have per-account show-currency-nick setting? account.ShowCurrencyNick = self.bankController.ShowCurrencyNick self._InsertItem(index, account) if select: self.SelectItem(index) return index def _InsertItem(self, index, account): """ Insert an item (by account) into the given position. This assumes the account already exists in the database. """ balance = account.Balance # Create the controls. link = wx.RadioButton(self.childPanel, label=account.Name) link.AccountIndex = index totalText = wx.StaticText(self.childPanel, label=account.float2str(balance)) mintStatus = wx.StaticBitmap(self.childPanel) mintStatus.Show(self.Model.MintEnabled) self.accountObjects.insert(index, account) self.radioButtons.insert(index, link) self.totalTexts.insert(index, totalText) self.mintStatuses.insert(index, mintStatus) # Put them in an hsizer. miniSizer = wx.BoxSizer() miniSizer.Add(link, 1, wx.ALIGN_CENTER) miniSizer.Add(totalText, 0, wx.ALIGN_CENTER|wx.LEFT, 10) miniSizer.Add(mintStatus, 0, wx.ALIGN_CENTER|wx.LEFT, 3) miniSizer.AddSpacer(3) # Insert the hsizer into the correct position in the list. self.childSizer.Insert(index+1, miniSizer, 0, wx.EXPAND|wx.BOTTOM, 3) # Renumber the links after this. for linkCtrl in self.radioButtons[index+1:]: linkCtrl.AccountIndex = linkCtrl.AccountIndex+1 if self.currentIndex >= index: self.currentIndex += 1 # Update the total text, as sometimes the account already exists. self.updateGrandTotal() self.Layout() self.Parent.Layout() def _RemoveItem(self, index, fixSel=True): linkCtrl = self.radioButtons[index] self.accountObjects.pop(index) del self.radioButtons[index] del self.totalTexts[index] del self.mintStatuses[index] # Renumber the links after this. for linkCtrl in self.radioButtons[index:]: linkCtrl.AccountIndex = linkCtrl.AccountIndex-1 # Actually remove (sort of) the account sizer. self.childSizer.Hide(index+1) self.childSizer.Detach(index+1) # Handle selection logic. if fixSel: if self.currentIndex >= self.GetCount(): # Select the first one, if there is at least one. if self.GetCount() > 0: self.currentIndex = 0 # Otherwise, select None, as there are no accounts. else: self.currentIndex = None self.SelectVisibleItem(self.currentIndex) # Update the total text (subtract what was removed). self.updateGrandTotal() self.Layout() self.Parent.Layout() def onAccountBalanceChanged(self, message): """ Update all the total strings. """ account = message.data # Figure out the position of the account in our list. index = self.accountObjects.index(account) # Raises ValueError if not found. # Update the total for the changed account. self.totalTexts[index].Label = account.float2str(account.Balance) # Update the grand total. self.updateGrandTotal() # Handle a zero-balance account going to non-zero or vice-versa. self.refreshVisibility() # Refresh sync status self._UpdateMintStatuses() def updateGrandTotal(self): shownick = self.bankController.ShowCurrencyNick self.totalText.Label = self.Model.float2str( self.Model.Balance, withNick=shownick ) def onAddButton(self, event): self.showEditCtrl() self.addButton.Enabled = False def onAddAccount(self, event): # Grab the account name and add it. accountName = self.editCtrl.Value try: self.Model.CreateAccount(accountName) except bankexceptions.AccountAlreadyExistsException: wx.TipWindow(self, _("Sorry, an account by that name already exists."))#, maxLength=200) except bankexceptions.BlankAccountNameException: wx.TipWindow(self, _("Account names cannot be blank.")) def onAccountAdded(self, message): """ Called when a new account is created in the model. """ account = message.data self.onHideEditCtrl() self._PutAccount(account, select=True) # Stop flashing the add button if it was, since there is now an account. self.addButton.StopFlashing() def onAccountChanged(self, message): account = message.data self.SelectItemByAccount(account) def onEditCtrlKey(self, event): if event.GetKeyCode() == wx.WXK_ESCAPE: self.onHideEditCtrl() else: event.Skip() def showEditCtrl(self, pos=-1, focus=True): if self.editCtrl: self.editCtrl.Value = '' self.editCtrl.Show() else: self.editCtrl = wx.TextCtrl(self.childPanel, style=wx.TE_PROCESS_ENTER) self.editCtrl.Bind(wx.EVT_KILL_FOCUS, self.onHideEditCtrl) self.editCtrl.Bind(wx.EVT_KEY_DOWN, self.onEditCtrlKey) if pos == -1: pos = 1 self.editCtrl.Value = _("Account name") self.editCtrl.Bind(wx.EVT_TEXT_ENTER, self.onAddAccount) else: self.editCtrl.Value = self.accountObjects[pos].Name pos += 1 self.childSizer.Hide(pos) self.hiddenIndex = pos self.editCtrl.Bind(wx.EVT_TEXT_ENTER, self.onRenameAccount) # Select the text inside so it can be typed over. self.editCtrl.SetSelection(-1, -1) self.childSizer.Insert(pos, self.editCtrl, 0, wx.EXPAND)#, smooth=True) self.Parent.Layout() if focus: self.editCtrl.SetFocus() def onHideEditCtrl(self, event=None, restore=True): # Hide and remove the control and re-layout. self.childSizer.Hide(self.editCtrl)#, smooth=True) self.childSizer.Detach(self.editCtrl) # If it was a rename, we have to re-show the linkctrl. if restore and self.hiddenIndex is not None: self.childSizer.Show(self.hiddenIndex) self.hiddenIndex = None self.Parent.Layout() # Re-enable the add button. self.addButton.Enabled = True def showModal(self, message, title, style): return wx.MessageDialog(self, message, title, style=style).ShowModal() def onRemoveButton(self, event): if self.currentIndex is not None: account = self.accountObjects[self.currentIndex] warningMsg = _("This will permanently remove the account '%s' and all its transactions. Continue?") result = self.showModal(warningMsg%account.Name, _("Warning"), style=wx.YES_NO|wx.ICON_EXCLAMATION) if result == wx.ID_YES: # Remove the account from the model. account.Remove() def onConfigureButton(self, event=None): self.ConfigureCurrentAccount() def onRenameButton(self, event): if self.currentIndex is not None: self.showEditCtrl(self.currentIndex) def onRenameAccount(self, event): account = self.accountObjects[self.currentIndex] oldName = account.Name newName = self.editCtrl.Value if oldName == newName: # If there was no change, don't do anything. self.onHideEditCtrl() return try: account.Name = newName except bankexceptions.AccountAlreadyExistsException: wx.TipWindow(self, _("Sorry, an account by that name already exists."))#, maxLength=200) except bankexceptions.BlankAccountNameException: wx.TipWindow(self, _("Account names cannot be blank.")) def onAccountRenamed(self, message): """Called when an account has been renamed in the model.""" account = message.data # Hide the edit control. self.onHideEditCtrl(restore=False) # Just renaming won't put it in the right alpha position, so remove it # and add it again, letting _PutAccount handle the ordering. self._RemoveItem(self.currentIndex, fixSel=False) self.currentIndex = self._PutAccount(account) self.radioButtons[self.currentIndex].Value = True def onAccountClick(self, event): """ This method is called when the current account has been changed by clicking on an account name. """ radio = event.EventObject if radio is self.allAccountsRadio: account = None else: account = self.accountObjects[radio.AccountIndex] Publisher.sendMessage("user.account changed", account) def onShowZeroToggled(self, message): self.refreshVisibility() def onSelectNextAccount(self, message): self.SelectNextAccount() def onSelectPreviousAccount(self, message): self.SelectPreviousAccount() def refreshVisibility(self, refreshSelection=True): """ This method is called when the user checks/unchecks the option to hide zero-balance accounts. """ showZero = self.bankController.ShowZeroBalanceAccounts showMint = self.MintStatusIsShown() for i, account in enumerate(self.accountObjects): # Show it, in the case of calls from updateTotals where a # zero-balance became a non-zero. otherwise it won't come up. # +1 offset is to take into account the buttons at the top. self.childSizer.Show(i+1) if not showZero: # If the account is out of sync, always show it so as not to hide discrepencies. if abs(account.Balance) < .001 and not account.IsOutOfSync(): self.childSizer.Hide(i+1) # Restore the Mint status. self.ShowMintStatus(showMint) # If we hid the current selection, select the first available. if refreshSelection and not showZero and not self.IsVisible(self.currentIndex): self.SelectVisibleItem(0) self.Parent.Layout() wxbanker-0.9.1/wxbanker/analyzers.py0000644000175000017500000000440312243601243017505 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # analyzers.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import datetime, calendar from dateutil.relativedelta import relativedelta class MonthlyAnalyzer: def __init__(self, months=12): self.Today = datetime.date.today() self.Months = months def GetDateRange(self): startMonth = self.Today - relativedelta(months=self.Months) start = datetime.date(startMonth.year, startMonth.month, 1) endMonth = self.Today - relativedelta(months=1) lastDay = calendar.monthrange(endMonth.year, endMonth.month)[1] end = datetime.date(endMonth.year, endMonth.month, lastDay) return start, end def _DateToBucket(self, date): return "%i.%s" % (date.year, str(date.month).zfill(2)) def _AddToBucket(self, buckets, date, amount): bucket = self._DateToBucket(date) buckets[bucket] += amount def GetEarnings(self, transactions): start, end = self.GetDateRange() # Initialize all buckets to zero, so we always get the desired months on the graph, even empty. (LP: #623055) buckets = dict([(self._DateToBucket(start+relativedelta(months=i)), 0) for i in range(self.Months)]) for t in sorted(transactions): date = t.Date if date >= start: if date > end: break self._AddToBucket(buckets, date, t.Amount) return [(key, buckets[key]) for key in sorted(buckets)] wxbanker-0.9.1/wxbanker/art/0000755000175000017500000000000012243601243015710 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/art/__init__.py0000644000175000017500000000000012243601243020007 0ustar mrooneymrooneywxbanker-0.9.1/wxbanker/art/embeddedimage.py0000644000175000017500000000453112243601243021021 0ustar mrooneymrooney#---------------------------------------------------------------------- # Name: wx.lib.embeddedimage # Purpose: Defines a class used for embedding PNG images in Python # code. The primary method of using this module is via # the code generator in wx.tools.img2py. # # Author: Anthony Tuininga # # Created: 26-Nov-2007 # RCS-ID: $Id: embeddedimage.py 51013 2008-01-04 22:12:40Z RD $ # Copyright: (c) 2007 by Anthony Tuininga # Licence: wxWindows license #---------------------------------------------------------------------- import base64 import cStringIO import wx class PyEmbeddedImage(object): """ PyEmbeddedImage is primarily intended to be used by code generated by img2py as a means of embedding image data in a python module so the image can be used at runtime without needing to access the image from an image file. This makes distributing icons and such that an application uses simpler since tools like py2exe will automatically bundle modules that are imported, and the application doesn't have to worry about how to locate the image files on the user's filesystem. The class can also be used for image data that may be acquired from some other source at runtime, such as over the network or from a database. In this case pass False for isBase64 (unless the data actually is base64 encoded.) Any image type that wx.ImageFromStream can handle should be okay. """ def __init__(self, data, isBase64=True): self.data = data self.isBase64 = isBase64 def GetBitmap(self): return wx.BitmapFromImage(self.GetImage()) def GetData(self): return self.data def GetIcon(self): icon = wx.EmptyIcon() icon.CopyFromBitmap(self.GetBitmap()) return icon def GetImage(self): data = self.data if self.isBase64: data = base64.b64decode(self.data) stream = cStringIO.StringIO(data) return wx.ImageFromStream(stream) # added for backwards compatibility getBitmap = GetBitmap getData = GetData getIcon = GetIcon getImage = GetImage # define properties, for convenience Bitmap = property(GetBitmap) Icon = property(GetIcon) Image = property(GetImage) wxbanker-0.9.1/wxbanker/art/silk.py0000644000175000017500000434065112243601243017241 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # silk.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . # #---------------------------------------------------------------------- # This file was generated by compileart.py # from wxbanker.art.embeddedimage import PyEmbeddedImage catalog = {} index = [] accept = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsxJ" "REFUOI2lk19ok1cYxn/nSxPsTNqaZiVNmrI2iCJzaoci1dh10uFamUJRR9HuUhl4IezWK2+c" "IqgFL0QQLQq7GAyVMfTCSdt169R2av3bRk2bNDMOE2tqzvd95xwvNjNQvPK5fHmfh5eH3wvv" "KfHmoPdqe9xIu0cp3SvtUlhrF4zOos1pY+yzP3VOTL4z4JvhRLd0ZF8D8fplHyaY760GYNbO" "88fUJe4WRme0Nrt//Tr142uPp2webO0uOvJUa6AzuLJ+PXk3T/LFBDn5N/N9flrqE9R4goFr" "0ze6Gr8K3Eufm71TvqBnYG2z7ZQG1tZ0RRbWLmModxlXK1ytsf5bqhAe1tS1M54eof/GmYzA" "k7j5bSppARintL1BxCOLapczlLtMyXWwlYOrHGzXxnUdOiJdjGQH+Di6ipbapREp9XYAC8BW" "cseK8Dqm51K4ykVpF61chNYIbdj00VbaG75k19LvmH7+kLaF65HS7CgHvJQyWuMLki4+RmnF" "huhGdi3Zg9AWm5u20Rb9AqVdzk/8QDqfZEFlHealiQJUAJSkRBuD0ZqAJ0Br+DOqfNXsXbWf" "4LwQSrscHzvEg6c38Xv9CAw4/5ZvAeCQzs/liH4Q44UscGzse4rOLMF5IbTRHL9+kDtPRhFA" "pKqRXH4GoUj/34Fj+oeSl4hUxvBqeFLMcOTPfdz/Z5wTo4e4nRtDaIGlBbGqJi7cuoiB/jIH" "dRurp1L5zJa6yppASyRBJj9J0X7OSPoKudksFgKf5aGtuZOrDwf5ZXgwg/LuKfxeeOYByJwr" "PAt1VD0efjTeFfH7fasbP6fC8iLtOXyWl3hoMZ+EVzKSvMLJC+eLosLamTo8/dtbKDcdiHbr" "kun7tHFx/YYlHSyoDIGBXDHLz2MX+ev2xIwQ1u7U0XQZ5beeKbYvFheO6hEuvUYSRoGArIHT" "RnnOTvVNTb7peS+9ApeISjS5aLgjAAAAAElFTkSuQmCC") index.append('accept') catalog['accept'] = accept #---------------------------------------------------------------------- add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAo9J" "REFUOI2lk0tIlGEUhp/5x1tl0sVSx+ziZBaVId2zkiCCECKwjVJBEERB0ICbaFdE0C6kRbXK" "pEWQmyQ0U7qHUJQVlaENWuMMkznOjDP6/993vr9V043adJYH3nMezvse+M/y/N44393kN1o3" "Ki0HxehiZQSldUQbaVHavd7c0DL41wHnuwL1IjSXzfeXVBavYVp2Po5xiE6M8HSgh+hoNKwd" "dfzKobab3zXen8Vam6vrK2rnVJfVEJkKMzjRT3jyM94sL1ULNpLUYzMjX7/Ura5b2v+q/cO7" "DMG5rhPlruZhtX+Lr6KoivvhO6RTaZSrycvLxcXFNjYrClbxpP8u74ODI2LUtrZj3R8tAMTd" "P3vWPN/iwuU8inQzqaZIq0kCa09xdGUT43aMsXiEp+F7bFq2AytHfI6S/QAWgNbmwKL5lbyP" "v2E0MUoinWA8FcvcJhQcRtkpUsmvfE4EqamsQYk+AJAFoIwqzcuezlAyiGNsTm44+4szF+tb" "AQh0NhIa/8iquetQWpX+IBBNSiVJOgmUV/3Td1cMHlyUaDIEjuhQKDa0ND83n/HJMQIPDpOK" "Jri870ZmM4DlsfAVLGQ4GkSLDmUIlJFrL4O9LJy+BFfZeEQzZ/aMXzYbcbGMh7KCJdzu60aJ" "XPtBoKTViHWkd+Ceb3P5Th4PdaCNJtDZiCsALjmWl9ry3XS8bCeenBixjd2aCdKzttexNXsq" "hsZi8bq4Hc3Z7t9FlpWN7aTJsbLxFy6nqng9HX236H37KiVaH+k7/eHJH1FuuLS73tGqWbKk" "pHbFVooKSsCFT7FhOl/0kEimwyLq+Isz/Zko//FMey/s8NuiGx2Rg2JU5plETAtq6vrzswOD" "v2v+q74Bs3Vib859UBQAAAAASUVORK5CYII=") index.append('add') catalog['add'] = add #---------------------------------------------------------------------- anchor = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAc1J" "REFUOI2lkzGLGlEUhc+sgluIM01AYY35CylSpTFdugRst5EgFltFCCxYTGGzIEw1Wm4EwToh" "KWKaYBeIsKAWm2oTzUJYFpRgnLnvvDeTxkCW7Fgkpz3fu/e+8+4D/lNWkjEejz2tdVVrDa31" "y3K53LiN20sqQLKqlHKVUq6IVJO4dJKhtYYx5gdJkEzCkguICEmekoTW+jqJ+yuD0Wj0ieR9" "knAcJ4UYuPhyYUhCKXVWq9Ue7JyA5BuSIiJYrVYPjTYg+VFEQPJ94l1u02AwiHu9XryLScwA" "ALZddzZJA8BwODwi2RARr1KpdH6bSikopW4caDabR8aYhlLK8zyvk96C/n5mH4Dl9/t9f7PZ" "lOr1+vzPCVzXvWuM+XpwcIB0Ko3JdOID6OwBQBRF+eVqCWMiiMhxFEUZ3/fzIhKHYRi7rps3" "xmS01seAhfPP5wjD8A6w3UQR+RkEwfOrq+9z27ZPwjCcBEHQLhQKVrFYtLTWbRGZlEr3Tmaz" "6Xy9Xj+7kcFyuZQwDE9TqdTbxWLRzmazT23bPnQcB3Ecw7Ksw8tvl5jNpq/iOH4RBMF1LpcL" "gITP1Gq1HpN8opR6tN3EDyRfd7vddzuf5F/0C4pDJZPalDp9AAAAAElFTkSuQmCC") index.append('anchor') catalog['anchor'] = anchor #---------------------------------------------------------------------- application = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWNJ" "REFUOI3Fk7FOlkEQRc/sLgVBbbU18Q2gpPAVbLSwtTE2dj6BiVYSEh5CGh+HEixoqRAM+829" "Frsf+YnVHwsn2ewUu+feO8nAP1a8+vj9w+HL/a9Xt+zZgIQlUollZOFMZONMUuLJTv91dnb5" "6cfRm5N2cLh/vLP7qDzd3Up47/p2OQZO2k2n3Fxdb239d6cANKf5/PbF1oB3X34yABYAd0ti" "wDIpEEYyKZGLx7G4S/P82WNSOQDYAEQJwsYlcJhQUEoQUYhIopqqQlvGey0TsJIK4AgIqAYF" "SKYaSlRaQIbJMhwrNSNoEIkA+wEoApxGAQ6gBFV1ANYIazMYMZoNkFrQJOThUvOJNB0svd87" "CMA2EYE3QJRCBdKmxHC89GVGmFkqjE8zygNHgIAagafyerfVCkDMw8bHtep9M2cwRdrl+cXp" "+2/9tTJRisxEEtk7ksYOKMcwPfZkaPr0L5X/Un8Ay9zpBmk1I4QAAAAASUVORK5CYII=") index.append('application') catalog['application'] = application #---------------------------------------------------------------------- application_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAftJ" "REFUOI2l0k9IVFEUx/Hvue8NKWpBi5qBWvRHqkVaWBImFITboE0tWgVtcgiCFgltCwyKQtBF" "mxatiqCEIBChFiZRRBmJixYWMSYttCF1xPfOOS7eTE07hy5cOIvL5/5+lwv/ueTMlUfF3pNd" "txYqtLgDZrgZaoqbY264KuaOq6JmbM4lyzMzpWtP750bjo/0dg3lmlvD9uaGLm5ZqqRDwHC8" "khBWFpYajr6aEABiV+fm+b0NAxcHv5EBbgCspYoDbo4aGI6Zo2Zo6tl2Y02dXfk21DQDcAdA" "giDueBBcHDEhBEEkIKJI5EQWiNPsvKVVoCYFwEVAIHIwATMncggSEQuoOBqyxKZWrWCZiAi4" "/wOJgKtjAi5AECKLMqBWoTZkhmRDHWSxEJsx/n6UV1PPKS8vkqQJFd2XAWmS/EkggLsjIngd" "9OLdEz6Wxjhx/Cg7trbzcvoZbz6P010s3A5e7RIBUk0h1TmIEEQYff2QQ/s70aB0FvpQSTh2" "sAfwYjCzvxWqjxlEiOr2z18/yEkrpw9cBuDqqfvs2daBIE1xafbr40t3k7OmiqmhqpgZmiSY" "GebOQnmR6blJpuYmGOh7wODYBZqiTTi+Khv5dd39hRs7d2+53tPRS3v+MF/mPzD5aYLvs+U7" "GwIyJD+ISL9Am8Nv3EfejswPrAPE1ghQyrn13gAAAABJRU5ErkJggg==") index.append('application_add') catalog['application_add'] = application_add #---------------------------------------------------------------------- application_cascade = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcxJ" "REFUOI2Nkr9rU1EUxz/v+V5+1ARr1Yigg6D+BerWQWeH4iCKCoIdrAh2sy7iEnRqqJtrHYQO" "KqKLgwj9GyyJCH2iwUFJE/Pjxbx3znF4bWybtsl3uNx7uPdz7vfLcabuv7w8eeH83VpHMwYg" "RiwRJoYgEAuCkSWkvPJ9/s3CtVdsknd28tyslxlzCxmGqhPKLLAVEPbMDWut4a+BMDJ3e80z" "MYo3To8EuP3020DNUzMA3i9/Kfzspo//bptrBqhhqojGqAomSm78AHPPl4NKufrodenqIoAH" "CsDXRvpEPj/mFFK7/yDf/Iuf8gk78hhIAM21RuIvNidca+9pod4M2ef7hBH9LLxqEHycmY8u" "jh85zIOpk4CRuLL+w41jKuV2c9k005uycDY2c4uV4MnNM7z9VMmvtvyDv1rmJFnoehaCiGAi" "qBlZp0N5pXrP+98m6fi55k/kcvs5OrGnGwDanfhZH9Cq15Niz2iPOBfdCLcP+BEE7+6UepcO" "FY5RvH5qJMD0DnPBwxcV201qZqpmqmpmZreKHwZHcyOLneRsXdBY8LZfaq5nMRwCzcafQUB1" "NViaKUVXVAQVRURQVSSKiEUwFUyMKIoBW/oHIcgOeWSBNF4AAAAASUVORK5CYII=") index.append('application_cascade') catalog['application_cascade'] = application_cascade #---------------------------------------------------------------------- application_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAfBJ" "REFUOI2lzzFIVXEUx/Hv+d+/6etZUAQqIfbArZawNsGgqaaCUKKxICqCaikIwqWwyRDEaGtM" "CCFxCYfApTFaHKLSyKcQOfTsPXv3nnMa7n2mQ5B04MDhz5/POT/4z5Lzt17cGDw18Hi9Qdkd" "MMPNUFPcHHPDVTF3XBU1Y39b+nNxceXuzJORyXhicGCirdQZukq7WlzeaGQTwGSsp4T6+sau" "T99MCQDR1Xl4qX/XwJWxZXLADYBmpjjg5qiB4Zg5aoZmnrcbTXUq3ftQ0xzAHQAJgrjjQXBx" "xIQQBJGAiCKJk1ggZvl/ywqgJQXARUAgcTABMydxCJIQBVQcDfnFplZEsFxEBNx3QCLg6piA" "CxCExJIcaEVoDbkh+bANsihEM6qzT1mdnaL+5QNtXYc51j6UA1mabl0ggLsjIvg2aHXuGbW3" "0xy/cJn2ylEa719TWpjn5Ol4M3iRJQGkuEKKOYgQRFh+OU7/0Dk6Pr5Bnl9k76cZKn0HUfx2" "NLM/EYqmFaWoZnWZju4KnL2z9RZHe0hcjsSVz0vT18bTYVPF1FBVzAxNU8wMc2e44wD1d3OU" "X13nV2ONOlD7kaAJ1Z2r/lILIz2jezrL93sPaYzhK7VvGUtriTY37cE/ATnSe6/+vXo1mPRZ" "8BXDp87M26Pf2WAIlHqbv3EAAAAASUVORK5CYII=") index.append('application_delete') catalog['application_delete'] = application_delete #---------------------------------------------------------------------- application_double = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcRJ" "REFUOI2Vkj1rlFEQhZ973xtZ8mFAC9dKFP0HapdCf4FYiKKdNhHBgIVgH0ilKGJlL6TQ/ACx" "t7TQLZMgC4Jo436+984ci3fX7ILF5sBlODBzOHPuhBuP393cuHb14a+BtzDhMiwbhkExDKFi" "mJz1E2X07ev3N3sv77xngnR548pWai3HMy0WQas3sC3gSGBYKw5/9xaaBhhmxVmeZGL73qWF" "Be7vHM7x5BIA42J8+Ng5+6Msn/v5RxXuyJ1SCi5HZrjE2vo6j15/1sml3O90uk8TOAAhwP5g" "+cLq6grt0wuZWekNy6vk3ghEoF+L/jHyGGViKqVMHARkYvvuxYUFHuwckkqdGxYjUuNmXAy5" "MIfijrljRc2TU5s4317D3EiWGwcVwCTQGEAxoCASkRAiIRihEpVHUmn6vBipe3DwafN5vl5y" "zal2+986BKgEkqgEMVSkABaExcapm8/v9OTtF0lScVdxVzZTbaaRmcY5a1hnDeqs3ihLkm4/" "25u/qpLzkYOZGoEQI1UVCTEQq2l/Ic0KTPOIzXSTzaROsTTbbzYv0N0/2N18kW+VOmNmuDt5" "PMYl5IZMzVW605yPdv/3vcfCX4l7He7IDgaIAAAAAElFTkSuQmCC") index.append('application_double') catalog['application_double'] = application_double #---------------------------------------------------------------------- application_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlNJ" "REFUOI2lkk1IlFEUhp/7zTdj5s8UlkqR/RlRIhEGEbloZVIQBJVE0SY3FkKLKGgbQrYpDCnK" "dgXWJkFahEFkZRD9KGZOSprQaGpOpjbOzPfdc1rMFBhtpLO6XHif94Fz4D/HHDxz73TlnorG" "2Dw5qoAIKoIVi4oiKqi1iCpqLVaE/KD3s78/ev7B1Zpmd0dlRVMwO9cpyl5Ucc7cvN8ENLtx" "Dycem1u0esLDAXDVKg3HShcNqL00QhqgAkDKtyigolgBQRFRrAjWV6yveN+eEH97h0BuOfWF" "T6lvLjvhogqAcQxGFXUMahQjBscxGONgjEVi7QTHXlNcfpzw+u1MD2+m/1HLZdeKBcAB1Bgw" "EFAQAyJKQMGf7CCU/EDOpt3EPvUTMiny8ovJLSgJuyppA4wB1QUgYyA10YmZfUV4w16SY62E" "lhpGuiPMxIHU1DZHMgZpRiaVMUpOduJPdRDeuI/E6C1M8DvB3DxyNMbd6C521rcNOL7n/TEw" "mbAxhvFIO/EvjwiXHiARvY4T9EjNrGPyeQ8rqxoYnV+WLlKb3kIAMJnwROQhs9EuCsv2k/ra" "QiCkJGfWMvniHcWHbrCkaAsq6ZwrmQcZwGBXK/6PXnyzirHeaywvDJGIrWH6TYSSmpsEw6sB" "kMz23Ojw5/t1V7wjYi1ihSrTwuG623xsPcvAsy6ySrbxYzzKw8RRxhteoiKkO/X+79IFc7F2" "q3fu5CkXx9L9uI2RocG5/BXhyurGvp5/XWTg74+Cpd6FkaE+/LkpSWbZ5w5Sva/xfeRfYYBf" "uUQgv6QY8HoAAAAASUVORK5CYII=") index.append('application_edit') catalog['application_edit'] = application_edit #---------------------------------------------------------------------- application_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiRJ" "REFUOI2lk01IVFEUx3/3vjc541eGhYYVCJIIFdlEtXDhrmWYUYTbdm2qTeuIwHYluMhFi6BQ" "+gKJ2rS1SNMiCDMQ07RykabNzBvnvXtOi/dGXbiRLhzuvVzO7/z/h3PhP5fpujJ0uaMze3sp" "oEoVEEFFcOJQUUQFdQ5RRZ3DiVCbCvOTkwvXn9+50O8f78j2pTLVtiGzrcJVuSDqA/r9Qogt" "LOW2Lb0YYgF8dcqtnpZtAy71zhIDVAAoRQ4FVBQnICgiihPBRRqHCiWnNDfW4MQBYFEFwFiD" "NWCtwXrgGYNvLb7no38/UJruJWUCKlM+ABIlgA0SGGMw1uBZg/UMxoLVgOLcM6rrjxD+fIm/" "w8YAFyu3KrECjFkHWWOw1uB5hsL3V1TWt1O7t5383GvIzcSAcuHygUTBZpDLLfBn+gU1u+tw" "q8PsabvIytQgKhEiiYIoDNcVmCS5vP/+8pj6ljNQnGD0wUOq6wJWZ0ZYmX1DFEaJhcSLB5hy" "H4D8rwlcfpmaXQVkbQZUcLkxmjuvMf/2HimKZQuyYaHcTHUsvr9P3YGjSOETKgHZ7lak9IN0" "+iu1+07RnhmNc7quDg417G86L84hTnDOcahijHMn0jQezOByo6iWGH86Sba7DePthMxpRgZu" "rlVI4ZjZasre3T05f7jnUZNnv6HRMqCbXi1eppXFzx+ZGr7xxN8KEK6V0uMDZwMVRZPfqaps" "3BVEQLTxH5oYG4bgspQLAAAAAElFTkSuQmCC") index.append('application_error') catalog['application_error'] = application_error #---------------------------------------------------------------------- application_form = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWRJ" "REFUOI29k7FOlEEUhb/ZLAXBWEphocFGshVC+Re+ghb6AoaGEOxs7KysdEko1CeAhjfBcunA" "gk2UBCh+wGT+ew7FjEQNbLIx8dR3zj3fyR34R6Vnr7fXmqfL708umbMBCUuEAsvIwhHIxhGE" "xN2ZfD4aHb3Z/fhyq7/SLG/OzN7pzc9OtXiuvew2ga3+RaZ3cdJOHf1npgfQd5i3z+9PbbA+" "/EYxsLCNATAYSImve3u3Pn6ytEQoigE2EcHq8PB64MvGQwCaprnRoG1b1FWDUGn40/oDSAYn" "ZE+MLwmFKoKMQqQEVsVIZjAYcHZ2yp9eCTAJ0C8EKZAC/zaCYbQ/ujXB48VFpJqgy5mIYOPz" "9+uB4er8xA6Oj3/Q5a4ihJDEh1f3yurKOEkR5VorgpAMqBIWLSw8YjweF6hkEgkb0l9F948O" "DnfebecXikAhIgJJRM6lbRsrcNR/IVGWe2dizP+mK7xR6EKdJR4LAAAAAElFTkSuQmCC") index.append('application_form') catalog['application_form'] = application_form #---------------------------------------------------------------------- application_form_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAflJ" "REFUOI2lkU1IlGEUhZ93miFFK2jhDxXFiFAMGZMhIkNEYbQqalHrIFwoYtAioXa1MChqBIVs" "EbSzFha0CqHNIBKhJNkIBWOEnz8LHWvSwW/uvS2+SRwoaeisz33OPffCf8pdvD7clTjVfG95" "nSozQBVTRVQwNdQUE0HNMBFEld0R/2c6PXdz5NGVgfCJRHN/pLI6VFtZVnBVbr3QDwyE13xC" "a8u5slfP+4QAwibG7Uv7ygZ0J78SAEwxMwwAAwOcY3Ji4q/Dx+NxRCUAYIaI0JGc3TQ86TkE" "QCKR+CMgl8uhhSJANLjw4+6D4AzMoWbbrq+qqGixghoqinNgWqzhjFgsRja7QinLAYYD9HcF" "VUFVsC0WDNIz6ZLU9OJ7ZpYmyOW/s+FvsC6HA0DB9xEReoYWN83JjtqSG7weH2bepjh9spX9" "ext5O/2S8Y+jtHTV3w+bKKrKw2s1QXSx41aNpJ5x4dxZJCQcq29n9NMLWo+2kfnyqiukqqha" "UEMDmKoSjTbgeR6eN89Sdp6Iq+b8kW4AbpwZoqGmCYerCM9lZp/fGfYvqwgqioigqojvBzAz" "lldXmPbG+OCl6G1/St+bq1Ts2Ilhebftv4pq6ay/eyC651ZbU4LGujifFyYZm0rxLbP64J8A" "AaSuD+c6Hewy+IHZ4LvBhd5fZAcZ0vVRcdoAAAAASUVORK5CYII=") index.append('application_form_add') catalog['application_form_add'] = application_form_add #---------------------------------------------------------------------- application_form_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAe9J" "REFUOI2lkb9rk2EUhZ83+aqJKf4AtS1S0lSc4lJbtwyik246tOIsVSqh6qKgSEERnGoKpah/" "QUUUAi7SQewiglFc0kUapQkRsS02JrVf7r0OXwwNaDF45vM+557zwn/Knb48eyl1bPDeco2Y" "GaCKqSIqmBpqiomgZpgIosrODv9HPl+89uz+yLQ3lBqc6oh2hrqibQXHKrX6FDDtVX1C1eVK" "26ev+4QAPBPj5pkDbQPSmU8EAFPMDAPAwADneJfL/fXxkYEBRCUAYIaIMJopNA2PxvsASKVS" "fwRUKhW03gCIBgs/SMfBGZhDzbY8X1VR0UYFNVQU58C0UcMZyWSS1dUVWlkOMBygvyuoCqqC" "bbJgkF/It8bmssibp9TLnwnv6+Zw9HgAqPs+IsL4wy9Nb2a0q2WDpewMK8XXHDo3xvZEktqH" "F8Tm5zh6wkt7JoqqMnl+fxDd6LhZi08mGTp7kcjHl/DqDjt27SYRj/N2wa54qoqqAdpoGKi/" "/yClUglwbJQKRLoTcOpqE+pN9BA21+cVFwuPb8/6wyqCiiIiqCri+8HaZgxH9lB9/5xYdoyf" "tTJVYO17GAlTclv+V0PzIz0T2zpjN3r3iueFllj7WqdQDsvGut76J0AA6b1e/Va6EFIX15AV" "FZs5Oad3fwGo7gpAHG3N2AAAAABJRU5ErkJggg==") index.append('application_form_delete') catalog['application_form_delete'] = application_form_delete #---------------------------------------------------------------------- application_form_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmNJ" "REFUOI2lkk1I1GEQxn/v7n+11c2lDA0k7cMIWkSiIKINOlUEQQV9QXRJgorFDlER3aSDXUpD" "orJjVBIUQkHUJRILAlupTbMvRdYPctcPdF13/+9MhzUh8yLNaRjmeeaZZwb+M8yBc4/Ohndu" "rk9OU6gKiKAiWLGoKKKCWouootZiRSjyZae6uuIXn9w40uRsCW9u9PkDnlL/ogYXTk67jUCT" "k8riSSUnFy09ncUD4KhVrhwsWzRBpKGPHIEKqooCoKCAMXzo6PgH5M90EhhqwxuoIlLymkhT" "6ISDKtZaTjX0zjXerV0NQDgcnqulBluZ6O7HX3Wc4JpNjP3cQNeL5muOlZzDtyMVYBTUIKp/" "TU4NPmdmLMry9dtJfu8iz2RYWrSSQHF50FFRxArGgMrsGkYJhUKMjY3ijr7Fm3pHcO1uZgYf" "kldg6It2M5ECMolqj4hFxOJai53NxRVisRhfOx7gnWojuG4v6YG7GN8ovsBS/DbB/fg2tkae" "9jhuNou1lto7w3OSG06V4v5qp3JVkmDlftLxW3h8LpmJNSTaO/HvuMRAbGj2ClYQEa7XlOTk" "A8nvLyktGKEktI/MUDPePCU9XsFI+wfKjzaTSBlUBnIEIoKIAoIB+qOtBEw/rilj8ONNlpXk" "kU6uIvn+M0t2XmVkKnfqP0Y78Z+9LXWPsofFWsQKu8xjDp2+x5eH5+l5005+eTXjw3GepY8x" "3PMNlR4kZ3YLgJn/LHU1G7MXTp5x8Fiir57S9+PrZNGKYHhPfaxzoY/0zi8UF2Qv9/2I4U4m" "ZCbftnmQPXvrP3UvBAb4DQ1SPETkn2FaAAAAAElFTkSuQmCC") index.append('application_form_edit') catalog['application_form_edit'] = application_form_edit #---------------------------------------------------------------------- application_form_magnify = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAf5J" "REFUOI2lkrFPFFEQh793u3vHgSgx8Q5CVDjtMFHAylyMrbHCQis7pTEErWyMvTYKCYX6D0Cl" "lbVGK0zQ5nKSYAIFEjEeAfZuWXZnxuLWq6S4ONUr5n3v970Z+M9yUw+W7levTT5tRPSZAaqY" "KqKCqaGmmAhqhokgqhwPkma9vvnozYvbC/7l6uR8UDyWKxe7ergvjNJ5YMFvJeRajbDr6AcJ" "OQDfxHh8c7hrwMzcBm2AKWaGAWBggHN8WVk58vLE+Dii0gZghogwPbfeaXg9OwJAtVr9JyAM" "QzTNAKLtH345cxacgTnULGs1PtY22d6LCOMChcDnRFG5MlpARTMFNVQU58A003DG2NgY77+u" "09Q+Lo6exA88tncP2dmPWf4eoplCTlVQFVIRJDtrqtRqNX5FPVTKvezEjq09IXUew6V+GpFD" "NUuQJgkiwuyrnx3Huely2zU6JJ8PSOMUNYhTo8f3SM0nTdJMQRRV5fndUjs+dOi9hYDDREgE" "Us3m5KDVbGJ/E6gqqgYoroOASuUcB1sJ+5HQX8wTi+HnHFuNBPu9ynlvFQA39XBxqXx6+JaK" "oKKICKqKJAlB3mewNMDEhTOowW4YI9t1qqd+sLv2Kd2of77jjtyWI+rtk+v3BoeGnpUqlwa+" "Lb9red0CFj+srVwdCTeS+OBGzvN6/wBpiSds75Fu/QAAAABJRU5ErkJggg==") index.append('application_form_magnify') catalog['application_form_magnify'] = application_form_magnify #---------------------------------------------------------------------- application_get = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdBJ" "REFUOI2lkL9rFFEUhb/7ZqIsUbEI0Tas/0FMI1v4LwhiimAh2IiFioiFaAIiKClcImuntUlj" "b2UZBFsjK6IJhKwWC0I2OzNv7r0WM+OPyiweeHCLe757zoP/lFy4uX69c37+yXDMtDtghpuh" "prg55oarYu64KmrGiak42travfu6u9hLz3bm16Zax8Kp1kSHp/fH5RrQSw8i4WC4P3H0LBIA" "Ulfn0dKZiQFXH29TAdwAKErFATdHDQzHzFEztPTquVGoM3f6OGpaAXAHQIIg7ngQXBwxIQRB" "JCCiSOIkFkjLat/KGtCQAuAiIJA4mICZkzgESUgFVBwNVWJTqytYRUQE3P8CiYCrYwLd9w+x" "0rmx8KACNIeboWLUrjpREEHSwOrmfcbFiFH+g+U3t2pAlSCUMf5KILW5AamVrLy9TYw57Zk2" "c7NtsjjiyoslYswrgNddEkBqs9Tzs3erfBvukWU5WVmQlTlHj7TYGWzzPaw3Fex3hT+iJyLc" "OXePlxdf0d/5RB4z8pjR/9yne/k5M3Gx+sTdL183rj2Nl0wVU0NVMTM0RswMc2d8MmNc5kSN" "DPYGLHc/Ar7RHP2nOisLnueRmEWKIvKh1z+U71D6CSItEOxrcOwtAAAAAElFTkSuQmCC") index.append('application_get') catalog['application_get'] = application_get #---------------------------------------------------------------------- application_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAg5J" "REFUOI2lkr9LlWEUxz/nea+DPzIMQSmVNBeNINAwykCKooYGlxoaXFqiRZcaChpKsCEQwf9B" "J5eGhoKICoxqaBErEJWMBgX1Xu/1fZ9zTsPrtVXpwIGHw8PnfL5w4D9Lhkdn7w8O9T3fKFPv" "DpjhZqgpbo654aqYO66KmtFYk5UWFn49nJu8PV3oH+ybqqltCC21h1pcXyzHKWC6sJMRdjaK" "h1avZASAgqszfqf70IC7E8vkADcA0qg44OaogeGYOWqGRs/bjVSdztYjqGkOwB0ACYK440Fw" "ccSEEASRgIgiiZNYoBDz/xZzQKiSAiAiSBCSIIREkABJgJokYfzldR7NXcCTLAdobh7cciIi" "+6Ag+fYkERKBEGA3prQ19zA6O0AaK1g1QvXBngEA7jyYGcI9klokjZHjTd30tA6wXSlxc7qL" "Jp/MATHL9g0EcHdEhGgpV0+PoJ4fleGsba5ypu0ixbTMl/IIfRMcLfhelgTwahR3KjFF3Vhe" "/0FmkWgZmWZs7W5ztv0SxWyH+aX36wUz+xdhrxGhEitEjbQ0dhBNUTd+b65wrKGVr6sfmP/5" "jZLRL8NjM7Mt7SdumSqmhqpiZmw136OSpqSWUokpp5p7Od91jc8rH3m3+ImT5bFXr188uSEH" "vbzep1I613G57u33N78y4craMxar1geqzseU1JO6XbTrzzhL1flfG5ckP7BkOx4AAAAASUVO" "RK5CYII=") index.append('application_go') catalog['application_go'] = application_go #---------------------------------------------------------------------- application_home = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkFJ" "REFUOI3Nk01IVFEUx3/vzXujznMMjSjTFllQDbVycKP0AUG4DKUW1SZqERFEgQV9gExJ5iIT" "DBdZG40yRNq0LIiCvsCCQEJDxdSknJxmnDf43j23xZuZcBltOqvDPef8zv+cy4F/NOPg2Uen" "m/bWdyZdHK0BEbQIShRaNKIFrRSiNVoplAgVtrc8NjZ7YaT7cK8Vb6rvscvKzfVlf9XYybh+" "D9BrZT3MbDKzKmr5yzTOJ1jxPVxX+LTtGn7IWZWT8zABLK00149sLQY89xcfBhLY1VWkMy4b" "66oIT1yh+fwAdmm0mHfixjQAptYCwIqvWM4s8fHBOUxLk0rnKK3bz4+vU6ytrmWk4yhT03NM" "fksDoEQFALQOtmkafB6+iBk2SLtC9b42duw5Rs3uM8yMjxOpiPKs+zgR2wJA/ABg/SFBLpfC" "kzCbm69Sua4GL/uTTbFGtL7M875L+J6PFTYDgAqUW1p0/kMNGk4O8vTJMBtq6+jq7GBpKYXj" "OLS3t/PwcZy2RBcEdUihccEJGAaeGIi3gm2HicViGIYBWhNyqrBCYIYKgLwC3/MAeDP/ircz" "75jIjLFzcRdRJ0okEqHELmE0+Z50wxy3X3Sydc12WuMt+J6fHyE/y+Dr+7hZl+R8int9/YTE" "YuH7Arlcjrt3+lFbcnxZfMmoO0prvAVdUFCQkjhwE18pMosZtGiUUkWZogXLsiivLCccDuff" "gt1Zs5NTQ6dueYdEKURJsVB5HiIS3IAotMrfhQgBVw/xX9hvyZowCXRnS8cAAAAASUVORK5C" "YII=") index.append('application_home') catalog['application_home'] = application_home #---------------------------------------------------------------------- application_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAi1J" "REFUOI2lkstLVVEUh7+1z/GimQoVVCSiFTSoQaKDJAeFBFE0aFJEhRMJpAaN6h+oqFFliBRN" "gkCTHqMSpMe0CCIk0yxJKwv1pqXe1zl3r9XgqjWwQNqwZnt9v2+tveE/jxw8fedk4666S1MZ" "Ss0AVUwVrx5TQ00x71EzzHu8KuVFcWpgYOzsgyuH28P6xrq2opKVbm3JsoJL5zL5NqA9TMe4" "9NTcstWzMQ4gNG+cP7p52YCWi6MUAKYARHmPAaaGV1AMVcOr4vNWKFMib9SsK8OrLwAwA0Cc" "IGaYE0wMUcE5QcQh4hHniV7fIMwMMzPdhOZXAOAWSA4QEcQJgRNcIIiDwEFREJAf7Ka0+BPr" "dzaTHX9ElfUX+kwLBogsgpwU0oNACAQyQ/cJss+o2FJParSHoHgDx2qe03Nq45FQ5w2YNwDA" "DAeYCBoK+eQrVtfux6f7KV5TSdZ/oWr3NkhPdIT5OF40EMDMEBHsD1BQWkk8PYILkohLkShP" "QjbN3LdcEJovvEIAhSYRFhYbJd8y03cdScRoPoPTH+DKsDjiTdcwQ0PfT4Sq+nuE+UKE2fcP" "mRm4y6raBizqRfwsg70RRbkcgQi3J/dxretcZzj2caS79XJ8SL1HveK9R1Vpre5ie9MeomQH" "YVhB35McnYM7GE9sxQyiRKL7nz/t8729L3LjFyz17oC9vNowe7N50/Gl7oV/A3wdmXw88/Np" "dWo6nfkwNHGm5dbwkom/AB6tGoaXd8wEAAAAAElFTkSuQmCC") index.append('application_key') catalog['application_key'] = application_key #---------------------------------------------------------------------- application_lightning = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAidJ" "REFUOI2lk81LlFEUxn/zvu+MjpMzIYUj+EE4KUTQwmjlQlcRFKSUQUKrNhGBu/6ACmoRiuI/" "ELjIIHHRppatgogISdPQPtDE749x3nHuvee0eGeKoiDprC538TvPw/Mc+M+J9Qw8vtnZ1fFg" "IySlCoigIjhxqCiigjqHqKLO4URIx83e9PTi7YmhK6PB6c6O4XjykFefPNDiVD60w8BoUDB4" "hY38gaUXDR5AoE651587MOD6/c9EABUAStahgN19Q3FpBHUWdYJYQZ3gjEGpwbTc5VhzK05c" "BEAVgJgXIyYOt/OSqpp6/PhR1FjUWFwpJNycQbN9xFNZAMRGAK9C8gC1q5TWnhNPtiB774l5" "KcRZiluz+A1XqW44T5AIIoCLlHsqWnbl2F99RqI2B/hIuIzYfba/vsDP9pJs6sEPYiR8PwJU" "LFQetjBL8dsE6aazqA3BbwBjUAmQ/Bf2pocQE6Jemur2y4hECgJrDAD5+UESmeOE6zOIFRI1" "OZCATLabcP0dzpTYWXpL3Zk7+FWHscaWUyh7qa7rxhbXwPOI+SU25ydJN3Rhi1uUCmt4mVM0" "9z4kqG3C8320oqAiJdXY/yNjsXm2P4xRWJmiuLtC3ckBMm2XfumBlNMLFhc+jd8YNH3iHOIE" "5xz9jSO0H6nj1ZzH5PItwtc+6p5GdyFCtFPH/9iwj0/azs2N5RZmHrVe/HsPf07w+0fMsFhy" "cuHEtfmpfwF8BzZLJlSQvSTcAAAAAElFTkSuQmCC") index.append('application_lightning') catalog['application_lightning'] = application_lightning #---------------------------------------------------------------------- application_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAltJ" "REFUOI2l0k9IVFEUx/Hvee/pJK8/jhgOLpSkTYgr2zkwbQRdFElQg9KqEqTNFETLVkHSogha" "K620Ra5sL5mbCIoIRTD/4Pgn/0H6dPS9e06LUcmldOHCWVw+5/eDC/95pKsw/DB7rbV/c4/Q" "DFDFVHHqMDXUFHMONcOcw6lyviKOJieLT0de33kbXM22vqmoOuvVVZ1qcbizl7wB3ga7Md7u" "5s6po5diPIDAnPG85/Kpgfsv5ikDpgAcJA4DTA2noBiqhlPFJVa+phw441LmHE5dGcAMAPEE" "McM8wcQQFTxPEPEQcYhv+OoRJOX3mhwCR5IHmAgI+AYqoGr4Bp74BAJODOeVE6vTwwpaFhEB" "sxOQCJgzVMAE8ARf/TJwVOFoKBtCqVRifHycnz9+kE6n2djY4GZXFxfSNbwbHKAmnWZra4vK" "PZ/29vYwSOL4OEESxwwPDbGzvU1PTw9RFLG4uMjH0VHOVFVx4/p1fN9neXmZ4OtX1qYqnwV2" "2MUHPk1M8Gtmhlv5PAODg0x8/kwmk6GlpYW52VlefvnCysoKbW1tZLNZ5ufnez1VPa7w/ds3" "wjAE4FGhQBzH5PN5stksnZ2ddHR0EMcxhUIBgOrq6lRQnJ173/cqvq3OsTz1h/rK3wDc7X3C" "/kFMf3//MRpFEXHi6L73mMd93RSLxZL8+7uam5uvNDU1fcjlcpmGhgYNgqBmdXWV6elpUqkU" "jY2N1NXVkSTJ5sLCgjc2NrZyAgD8XC7XEobhSH19/cVUKuWbmbe+vv5ARIq1tbUjQMX+/r5b" "Wlpai6Ko6y+SXDAZX6KQpwAAAABJRU5ErkJggg==") index.append('application_link') catalog['application_link'] = application_link #---------------------------------------------------------------------- application_osx = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXhJ" "REFUOI2lkDFrk1EUhp8v382XCiY6VKikOFVEXfQX1M3JpT9AFHHVUXDUxcVBcNHBpZtQ8Ee4" "Ck6K0Cp1cTeRJPe851yHJG1dYqIvHM6Fe5/3vPfAf6p6s/v21WZ/4267adolQOFYFpLIEjmL" "bMZkYtOejZyN0Whkh9++vk6b/Y375188q87c/sCd+hIvr+7+fWoFZ3un24+fPu+ndrtTndve" "Zu1izY3WdQAub11YaPB5/zt13cIVVTIXP27uADvcAiY58/HTPgCSYybkjsmRHPm0fzkIXEYq" "EVy7svVPC9zbe7eepABgNJ6sBJ9a6+AUkrsD0GmaPx6UUqZFIWJ69ghKmd4BhDspm1YC5wXg" "ESSTVgaP5DpOECWWB+d8KSSbGbjH0uBcsx3Y0X9OwgBVVS00oBTScDgcjMfj7s/BLyJiZnC8" "6ZNp5oEKhSa1UEjVg0dPHnZ7vXuUupvDcHOyHDfDZLiEuRFZWIgwESHMNIjQ+8URl9BvWnRd" "oCkYf0QAAAAASUVORK5CYII=") index.append('application_osx') catalog['application_osx'] = application_osx #---------------------------------------------------------------------- application_osx_terminal = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAa1J" "REFUOI2lUjGLU0EQ/mZ35il6p69JOLnjsBE5tBNSidxPSJfOKGInFiKChW2wPbCx0OaaYJHK" "Kv9B8geuPBvJWXjBl7czu7G4e+GdeYcBBz52h52Z75vZAf7T6PPhl48721tPJctkkQBLERoM" "ZoZghhAMQRVlqWdnUISgKIpCf578eM0721vPbx28p5uPv+GJv4sP9w7/zUpAfmNDBgef7rDI" "Fdp98RKyd4RXtIucN9aSfv3aVZgasUbD/pu3IKJGOOfgnFvxnXO4ff8heJESvPeYTqcXgpoS" "6n6r1UKe53BmaSlrNBphMBis/QOqBhdjhIhARNDr9dDpdNDtdiEiyLJs+VYHM0NEUGoJDmpg" "ZjAzhsMhJpMJxuMxRGRFdr0t7z20LMFqtmTr9/sgIojIMhDAygwAgJlhpmcKKln1AdYZm3zv" "PaIqWM9bqFj/LlIpIKILd+ccVBUcVOG9h4icb1kzY4WqiPce86jg2Wx2ysyb7Xa7MfiyIkSE" "MC/mfHz8/d3eg0fPsPCbISmiRgSLiKpQU0QzaFSkYAjJkNSQkkHVTovfv76uvTSX2R8MA7DL" "4SxJxgAAAABJRU5ErkJggg==") index.append('application_osx_terminal') catalog['application_osx_terminal'] = application_osx_terminal #---------------------------------------------------------------------- application_put = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdpJ" "REFUOI2lkj9rVFEQR8/c9xayRgUJcVewULQSkUi0i2jEL6CFKSwVRLTQKn6BgKKiBNLaWCn+" "+Qg2ItiIonELA2oRDRYBIdndd++bGYv3VjeCYHBgYLjce+b84MJ/lpy++vDy1InJm6s9Rt0B" "M9wMNcXNMTdcFXPHVVEztjfSeqezPPvs3sxCfmRqcr7R3BpazU0tHl3rlfPAQt5NhO7q2qbV" "+4kAkLs6c+f2bxpw4cYXKoAbALFUHHBz1MBwzBw1Q0uv2o2ozt72NtS0AuAOgARB3PEguDhi" "QgiCSEBEkczJLJCX1X0ra8CAFAAXAYHMwQTMnMwhSEYuoOJoqIxNrY5gFRERcN8AEgFXxwRc" "gCBkllWAQYTBUDGkGoZAlguzz8+TYkmMidRPPJh5glllEMqUfhkMACL1+jpa0U8c3zPN9L6T" "9LoFAGUq6wh1lgzwoSjDRkWvoCgLoiZGZITOt0W8NsgHKgBS92D77ZdzfPj6jvHmTvplJGpk" "fEeLK/cvkvJWBVj+9PnRpbvprKliaqgqZoamhPlB4u5FtowVFKlP1MjK9xXWfzTYVZ55DE+R" "v/+133Xq1rG37bH2oRgTSx+X3ry+8/7wv7zbUEevT7yauHbgxZ/nPwF8oQoFwSjRfwAAAABJ" "RU5ErkJggg==") index.append('application_put') catalog['application_put'] = application_put #---------------------------------------------------------------------- application_side_boxes = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXNJ" "REFUOI29k71qVkEQhp+dnS8S81MZktYiVxDLFN5CmliktBIbu0CCpYiVEsgdJEjS5Aq8jaSI" "oE1AUb5Cv/zgnpmx2HMOyPlShIADyyzD8LzvzjJwz0gbr45erj9deze+Zi4CcCfcMTfCAw8n" "zPAIwgxzZ3FULs/OLrZPPjzb1yfra3uj2XlZnr2T8NzkutkD9vWqIFfjyZ2t3xQEgJ2D85gW" "ux8/T6138fztpwDQCAdg9/C8p7/ZWu3v48kN1kQ94fyx4PHKAuYGgBDRNy8/WhhY1azoSNAH" "wsyM8nCkAHhTAdqRAL7//D0AZAFJGU1gKTCpjt1q1vAY2P4HkMATRAIkkT1XQCus3eW2GSQV" "1B0PECqsAqoDaUrpm1eWFgcOBEgi5CwkSUg1QFOa9gntWwC+/fg1BKQq6UBOiWiVu6ydldtn" "UAG5L7QzaH9PL758PX7xvmy6GW6OmeHuWClsvT6tO+BGWLsX7lTNOJ6q+N/jL6++8ahOGq9p" "AAAAAElFTkSuQmCC") index.append('application_side_boxes') catalog['application_side_boxes'] = application_side_boxes #---------------------------------------------------------------------- application_side_contract = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcBJ" "REFUOI29k71rVEEUxX9v9gWyJqyuFomIIItpFYllCv+FICSCIBYBBRsFUUEkigqxUgJRgpZ+" "RRLSpUpvFSMIrgoqW1iJcYvs58y912LeRoLPIghOOTOc8zvncuEfTzJ+ceHC2InRexstBswA" "VUwVUcHUUFNMBDXDRBBVSn2+Ua1+u7r8YHIuPT42OttXHHRDxR0ZD2y2wiwwlzY9rrmxuWP0" "tscBpCbG2dNdkpiIhASH4+bidc4cneLI/mOUd+0ldek2gamZGgDOTLcuRYUXr58C0Gp2kCCY" "WS6BqACQkn0wYH71IT/q36kdrlEqlAhB4kOOhoYo4HpKj1cfURDHoX0VnqzM018ogoCqYTkK" "KpE8NTVmlu6wu7/MyPAIwYQ9g2WqHz/Q6XYxU5KsoW0CmbFTFa6dvEGj0eTNp3XW3q+xuLJE" "u9NGgqCa34FqJHDBewAuT1yh/rPO5y9feXbrOevv3pJYnEpekcGHKGDyewq3z92lMlwBoNP2" "dL2PEZI/I1iPoIcCkBZSps9PA+A7fquo3AgZVTJ+6eXC0MEDEyqCiiIiqCriPaoad0AFk2wv" "VIme9mr5/qnJvzr8t/MLmGH+S8wz2I0AAAAASUVORK5CYII=") index.append('application_side_contract') catalog['application_side_contract'] = application_side_contract #---------------------------------------------------------------------- application_side_expand = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAd1J" "REFUOI3Fk71rVFEQR8/72I0xIrFxI1EEk0LRLhYWi1jkH0hhIliIYKFIQEEULMRKIgpKQrSx" "08IVIYhgIzaxsFUUg1XUENwlySpkP97uuzNj8e6qi1oEC281xb1nfnOGC/94grFzpbPFIyPX" "q036zABVTBVRwdRQU0wENcNEEFW25tL6wsLypbnbE7PxweLIdK53S1jo3VDjvlrTTQOzcSMl" "bFRrG46epIQAsYlx5ngEBJgZ9XaNz98+8nzxGTcO3f0r4NTUJwBCM/3jBZc6AG6+ukb56zrl" "1QbLKzUWy+sAiEoGwOzHI8N8Emi3UgA+VN4z9fIicU9IPh+zORcDoM4DRIWfCDBTnHPs3LSb" "E4+P0t/TD2ZceTpJLoqI82EGEPUjqBH8mt1AnNBqtSgOH2bP9iGGBodJpMH4zCj5KMoAfoS4" "U2TdLdu3Gs0kYf7tPAPbBliprmK1gCcXXqBemfoidGnaJc/MaLdTKmsVLo9e5fW7N9TXEu6d" "fkAQBoRRt+TQRH9zIE5Y+rLEvh372Vs4wP3JEgQBURgSBdnA5hPEnSjmMaaGc46k0QJg5uSd" "7v12HPjtBWPnH5YKuwbHVQQVRURQVSRNUVXvRDDx/0LVe7BHc7eOTfDfz3fV7hKOGqqMkgAA" "AABJRU5ErkJggg==") index.append('application_side_expand') catalog['application_side_expand'] = application_side_expand #---------------------------------------------------------------------- application_side_list = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAZZJ" "REFUOI3FkzFrVEEURs+dmSAhxlZbe7vYmSLYZEstVgsbRbKwsdHKRbGWVJFAtNRCENPoH1DS" "+A/EFBFMk3YJy5qEN+/eazHvrcJuEyxyYZhhGM537gwD/1ly+/HHR8srSxvDExbcATPcDDXF" "zTE3XBVzx1VRMy7N5d97e4dPP726u52uLy9tzc1fDJfnzxS8MD6pt4DtdJwJx8PxmdVPMwGA" "Z+/3fVY9//Bz5n5bD19+cYDkbgD0d6FrX6mqik6nM0kajk/R2stwo1Ln6pVF1BSAhDsAb1YA" "bk6pppgQUSQ60QKpLuetbgAtqb8Lq0efyTnT7XYngBggSCQJqDgairFpmZPbvwa3pgyigAm4" "AEGIFgugbaFd3HgLa/KOqqro9XoTgKRAMsMcAgVWAI1BnTMA3x4A3J8yCAAhEAF1J0gxrnPd" "tND0cm0T1i+8ZjQaMRgM/gKkRBoQRfAmuZ1Tq/L9CcD6jDsogDjZaO6geb10+Otgp7+Z75gq" "poaqYmZoztx78aP8AVNcm39hRsn0nam0c6k/f88L3Qw8LlwAAAAASUVORK5CYII=") index.append('application_side_list') catalog['application_side_list'] = application_side_list #---------------------------------------------------------------------- application_side_tree = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXFJ" "REFUOI3Fk7FKXEEUhr9zZq4gu0kbW59Biy0sUuwLpIlFylQhjV1AsRYrg+AbBEJsUm6zeY1Y" "GEga2602Kpl7zrGYe8WNayEW/jAMDHP+/5s5HHii5M3Ot49brzcOZ1cMIgB3wh1zIzzwcMIM" "jyDMMHdeNuXv2dnFp++ft0/y5tbGcbM61FerjwoezK/aY+AkXxb0cjZ/NPp1QQHY/XIey7T3" "9dfS817vD34EQI5wACaTCU3TMB6PF5Jm82usjbrC+WfB+toLzA2ATATA0mKAnDIihqQguZLb" "et/bzqB3AphOpwALRklBJZEFTALTSuxWdw2vjqPR6F4xQBJQBU2QsrCSUjXogtXvENyl6CVZ" "yVpJcqpG1aAS5LaUhYL/CRRAlQRYBCqVuC1t94TuLQ8RqAgqAiIkVZIIANET9CjD4XBpF/qC" "dHvQ/UHXvXzx+8/ph6Py1s1wc8wMd8dK4d3+zzoDboR1c+FOzYzTe2nPohslye8KAn8XMQAA" "AABJRU5ErkJggg==") index.append('application_side_tree') catalog['application_side_tree'] = application_side_tree #---------------------------------------------------------------------- application_split = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAaBJ" "REFUOI3Fkz9rVFEQxX9z30sRorbaCn6DpEzhV7BRwdZGbAQLwV7QyhBIZ//YXUOUFH4Oq5Qq" "ebtbCKk2u+veN3Ms7ttFsFosHBjmFDPnzB8G/tHswYvB88P7+++uFuxJQASKwMNRiFAgd0JC" "7ngEt3by9cXF+NXZ0aOT+uBw/3hn90a6vbuV8N5s0R0DJ/U8k+ZXs61bX2YSQC0Xb57c25rg" "6dsfFAIFAKvOEaAQHhCICOEReKfiClYu7t65iYcXAiQALBkmoWTIhIWRkmGWMHOsElUk6q7k" "R9cTrJkSIDMwqARhECEqQbKK2sBNeCodh5eYFKJpGtq2ZTQYMLm85HQ4ZDJu+Xw6YjpuOT8b" "MZm2fDn/yM/plKZpiF6Ylx++SpK6iI1nd2V3rdy1dNevnLVYZc1XWbNlliQ9fv1JAHWXc2Ey" "wwBJmBkCkMqtUqICXCJZ2UGXu/4K/SwVlCIzNos125wtgMoMRclfxzp6AGC980fh2qoNKCh6" "kXr87fvw2fv8MNwJD9ydiMBzJiLKD4Qj7/8igqKp4V8q/8V+A7qMJ/eyM8CuAAAAAElFTkSu" "QmCC") index.append('application_split') catalog['application_split'] = application_split #---------------------------------------------------------------------- application_tile_horizontal = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAATpJ" "REFUOI29kb1KQ0EQhU/WNN4r+AQ+gD6CgjZ2loLYBkvtrexESWMhWNtHLBVE8BUEi4iKCAZB" "g+A1cePd3fmxuDdgs9sITjXsGb45Zxb4YzVa+xebywtz7aJEPrQWQoIggummt9fd/tnS/OzK" "xzdyFmBQFAjMmDLe3nRftk/aq0eN46seZ1lmVCuiqkIUUAWGXyNk+SREAFGFKiBa9fe3d3Kw" "tTjRHAUY+zmqxV9DohBVDJyte4DrNxHAlmIAAIfnzxqrvdOnqNbavVQAMCwSPRAxRzUfAioA" "JwAU10JZAzyltlAc7irNJLck4DSOkNoSUg6oduCcjw650sXhrtIM+VTOeATh2oH38aFUhPHv" "NXsPj52NdrnGgVC89UFMEGIwC4Slt75TzrAnMDEG769QZogACu1E6f9aP+jyFS2VUeCBAAAA" "AElFTkSuQmCC") index.append('application_tile_horizontal') catalog['application_tile_horizontal'] = application_tile_horizontal #---------------------------------------------------------------------- application_tile_vertical = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYJJ" "REFUOI2Nkz1PFUEUhp/Zu0iExoRaGzsaiYlSmFhZWViS0JjYmUBs7aUwJlYk+hMo+APEP0Fh" "YwEFJiYUGGBzL9dlz5fFriwDudd7kvnYmTPP7LzvTAJ48/Hbxotny5/OaxbdIdxxd8TaVt1x" "NdSDu4z5/uN4c+fDqy8AJcDz1eXtwdxCsTQHEUEAEV0BPIII8GjnHwxlG+gBF0IxasZERJcE" "QeBONvYPNKq9oIsSwDR49/I+s8bbz0dX/RJAzSYmRwD0RygHiUYkB1TVcCIgJYBESpC6serk" "9Gq+AJApf5DBula0zy8Bjg5/7n/du/f47A+YB26GmyNqmDnqholh7szHBSa2nwGePH20Mphf" "YOlOb9V15W+6UFXNSgYYXkZR1SPcr3set78D3INxbbmNIs7W+sOZdABYe3+Qi6g6XcT+ZkYr" "omgOMPOpgJRX2OWNe3D++/T2qokQGFV9fgnw6+Bw9/VWvWaqmBgq0r6+psGttc9NCXVEGyJi" "9787zhp/AdqOGQfsRby7AAAAAElFTkSuQmCC") index.append('application_tile_vertical') catalog['application_tile_vertical'] = application_tile_vertical #---------------------------------------------------------------------- application_view_columns = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAZBJ" "REFUOI21kz1rU2EYhi9DOpSKq3/APyCnoEgpNRLsECJN/cC4ZhElilBcXAWdlEARHAqCg22F" "QluoWDHCATFgNqGjOnTtVHtOct7nfhxOWsiYiPd2L9d98X7AP+bUwsPVezNz0fODhCl3QMIl" "TIbLkQs3Q+64GSZxZiL7s7e3/3jj5a3l4vRM1JqYPF04OznS8NRhElrAcvEoo3B0cDiyeppR" "ACi6OU/vnBsZ0Hj2mxzgAqDb7SKJEALnpy/yNW6f9LkrV/m4s4W7Y2bUajVMlgNwByCKoqGF" "Uqk01KvV6lBXGACOSZ1OB0n0+30uXJol/vLppJfnK2xurCMJSdTrdWS5OUsrP3yc1J9sOkBR" "A4M4jpFEr9dj9nKZz7s7SCJNUyrXFll/95YQAmZGo9FAGhg8ePV9LIPrS+99cI05qd1uE0Ig" "TVPK8xV2P2wTQiBJEmo3bvNm5TVmRgiBZrOJHxvcb30by2Dh0WpusP/z19rdF9lNmSETZoYk" "LMvyU3fHZbgN/oVEPu5rI7++/5K/WxKajuHqbD8AAAAASUVORK5CYII=") index.append('application_view_columns') catalog['application_view_columns'] = application_view_columns #---------------------------------------------------------------------- application_view_detail = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdtJ" "REFUOI21k01LlGEUhq93HEMx2vYH+ge2KLTQgoR2ShTUtqIwKAJp0zaoVWFIlKARkvmdH6PZ" "OJOEixYtA5fVwmX24Tgzzvucc7d4Rmg7RTeczVlc9/XAc+Afk/Temujv7Gp/sF2hTQLckTvm" "hly4HJnhEjLD3DnUnO5ubm7dmXt0YSh7tLN9sLn1YOZwa0PFbaVKGASGsuWUTHm71LB6NSUD" "kJWJe5eONAy4fP8rESAH4OrbCs/OtFIsFnF3Qgh0ne6hmF/h2MkeNoo5JGFm9PX1YW4RgATA" "4+4Wqqk4fqIbXIT6vqO7Bwk6Tp3FXXhc4yECMvuk/rVdWpoTNtbXeL+eZz2/DMC71UWSBArL" "sxSWZyjkpiLAojkDI58kSbXg2ktd1Vqccs1VqblKlaBflaAf5aDvu0HbpSBJunh3QQAZrxtc" "e/OTA9mEQn6F/GqO3PwMAEvz0zQlCQvTL5mbeMHM+Gg08LrBzScfJUmpudK6xV4a2/+cUtW0" "Uw7aKUeDcwPT0UD1t1xZ/Ea2KWF1ZYnc4mtmp8YBmHo1BsDY82FejD5lZHgIAO0b3Bj8oL9J" "7+0JAWS3Pn+ZvP4wPe9muDlmhrtjaYq7xxtwQ1a/C3diuSYb/n3/Jb8B5bKGgth6hvEAAAAA" "SUVORK5CYII=") index.append('application_view_detail') catalog['application_view_detail'] = application_view_detail #---------------------------------------------------------------------- application_view_gallery = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcBJ" "REFUOI3Nkz9oU1EUxn83fc8kTdRagwVxUFysU2v7BkkRNzehCBXEyc1/oB1ax451agkWHETE" "LV0KFd11KJpFBLHoohG6lFJEY5P0vnOOw3tJdYwuftPlnnt+5/suHPhHuck71ZsT58fubzcp" "mAGqmCqigqmhppgIaoaJIKocCP3P9fWN2ZXFy0vB+MRYJcwXM0P5ngYXGs24AiwFO57Mznaj" "Z+stTwYgMDHuXhjoGXDvUZ0EYApArVbjafYo2TDHUN9JRB2xQmxw9dBDzgzU+b47yNqH05TL" "ZUQlAWDWpcb9T/jY/kTen2K4b5qcHcMrvPh2ha+tlxzJbOKcA0DjFNAhARRdkxO5gOK+93i9" "gffD2O4o7xojvNo6h7aFmf1vEoBoGkH3HIwPZgnD4xSCg4i1+CGbtOUZxnMUwzdDXP1SAuhE" "6ByiKCIiSovahdpvEa1g2GH7400Qe0+pVOp+hXUb95rNkntRcA5yoSP2cRohzXJtdQuAxxdL" "NN5OAdA/UmV+bQ6A2bNzhDO3E/riA6zj8lbltf2NJqerBhBsfP6yfH3BT6kIKoqIoKqI96hq" "sgMqmKR7oUoy3Jb5L/QLE3soyubcoOMAAAAASUVORK5CYII=") index.append('application_view_gallery') catalog['application_view_gallery'] = application_view_gallery #---------------------------------------------------------------------- application_view_icons = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAY1J" "REFUOI29k79LHFEUhb83OxZiSBVYtrGyXgtTCkmTWgKSINosxEJF8wPULl1AqyQmIgRFW0UJ" "Fnb6H1jILDPahCSFndhoVHhz77V4s4OCQZZADhy4xePc77zHg3+Ue/5mfaL/ad/86SVdZoAq" "poqoYGqoKSaCmmEiiCoPO/yfw8Pj2e+fXi7Gj/v7Fjo6H0TVzrYWd51f5gvAYnzhiS5Oz9tG" "v/JEALGJ8WG4p+2AV3O/CQGmACRJAkC9XqexfQLA6sAjvh18BmC0d4pms1meERUAIsza3g6g" "eQhgZi21u6SqpUXkls3MRt7vGEBkGgga2yclepIkJa7bnCbamgHg7Gics6PxQNCq0BpashuV" "/jaHgHB3vF7aL5FvYuZ5fsve+9JmZoPTm0UFKZLeTuLeTWFmLCdfWGl+BSBNU9I0BSDLMrIs" "C0QFQdxCcUMjAFQqFZ50PyvnarWKc444jqnVajjnQoWiUnz889fG2Ef/QkVQUWRvF1VFvEf1" "R/gDKpgU/0KVsNM27nnp/6Rr+l4xjFrsqlYAAAAASUVORK5CYII=") index.append('application_view_icons') catalog['application_view_icons'] = application_view_icons #---------------------------------------------------------------------- application_view_list = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWJJ" "REFUOI21k7tKQ0EQhj/DsRDF1hfwDbRIIcEinEJMYQQthNhIQGzsfAJBK0UQa0tFtJAgmEZS" "5Q0s1cLWyhvszvwW5xyvKAbxh4HZXea/7LLwR/TNrB6sTEyObd49MSgB7sgdc0MuXI7McAmZ" "Ye4M94eHy8vbtZPt+d1kfGJsp39gqDQy0JPw4P1T3AF2k8dA6fHuvmfrz4ESQCIT6wujPRMs" "bdyQEcgBWL6AvUnodrtIwsxw9y8FkKYp5pYRIAHZMEC5XP6gpPz8c+8xJyiYFs9hP4VOp4OZ" "EWN8dfHejSTq9TpunkfwjHU/zZgrlcq3qu/XXkQomtlTOJoW7XabGOOH+uyg0Wi83kcSQwCy" "YUlUq9UflQvEEPMIeZap4z5aM6LVahFCIIRAjJEQwpdXaDabqHBQbJ7NApSo1Wr8Bp47Sm6v" "rg+Xt8Kcm+H2duNWKEvIDVn+L9zJNHX4K6V/xwsZSiKdXNFgMQAAAABJRU5ErkJggg==") index.append('application_view_list') catalog['application_view_list'] = application_view_list #---------------------------------------------------------------------- application_view_tile = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXVJ" "REFUOI3Nk7FLW3EQxz95xMEqzSDaTSk4ZbLomKH/gAUXhXYVpbZDEEqX0kEQ2kkJCGbpHhfB" "v8HBQahDUTebgEulgdAYC7933+vwni++djG49OCG43t87nsHBw+MwkK18abyfPZz+4YRd0DC" "JUyGy5ELN0PuuBkm8XgoXJ+dXb7f317aKc5VZmtDw6PRk+GBBo90b+IasFPsBaJeuzuw9d+B" "CKDo5my+mh4YsPypSQJwAbBx2Bc/VqB6sJrV2y/q1E/6+uoMmAyACPdMmCzlp5QnywB42jP+" "qK8pTgG3JIBWJw84bZ3mAFe9OwBLnPPuyzf/OyRlaWa5jOPY3d1ffjhwgKJSB3d33prfpVBf" "BKAAaKXBr/O1TC+Vd5ESB1EcQibMPH2Ws8zYVK4uTcxlvXGIE4Df7gKcXHzNA342c3Xnx3HW" "66kD3taO/rnBfWJhvZHc4PLi+97rrbAoM2TCzJCEhYCk5AdkuKV/IZEM9z3+i/gDmpEp2naQ" "iVsAAAAASUVORK5CYII=") index.append('application_view_tile') catalog['application_view_tile'] = application_view_tile #---------------------------------------------------------------------- application_xp = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAThJ" "REFUOI2lkrFKA2EQhL/oLx4RtLISnyAWomUqX0MsLGx9Antra0kpKGgldjZiY6MGrCzSphEi" "KIjGuDMWd14SCWh0YNllYXZnloV/orJ70rqcTqw8vjJjAxKWwBAOLCMLRyAbRxASs1O9l9d3" "3SZDfW1pfuKu3eX5TSO3rM61uXlaKPIi28cbHG0ezFxd39crO4ctO4xtsLCNpHxroUahfi+E" "FEjGCpLDrC93R7kDJovow3ZZ7509kGxRq9X+dMA4PSdRTJRG+7ddhtS3WK1W0UeQQjEW8asH" "oBDJ8ljEwRtIQVKhYBxif4BILrxL+jVxSEFEriAifk0sB4RJjlxBlmU/Er7DEkkSzWaTLMtK" "G5KGFI2y1+l0kE1Cvcb+RW9L8YxigFjk/IXzt3W4fHEJrG5jbNnf8Qk6zYLxSH+owQAAAABJ" "RU5ErkJggg==") index.append('application_xp') catalog['application_xp'] = application_xp #---------------------------------------------------------------------- application_xp_terminal = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAZVJ" "REFUOI2lkz+Lk0EQxn+77+x7xYFWSSOCH8BKIc3ZCH6AVKYRYmFrYat9uvsGVwoGlLRCShsb" "NWBlce11QVCQ8/7MMxZJXt8zb+DAgWF3dmdnnpl5Fv5T0uTd8Yc94973U/YjAImQIMDDCQUK" "Ee4ognDHJW6Ui1+n5/piAQcP7/by15Mzfv5WZ5b7N0/4/OPWer3N87dPmD59vf/x07eD9OrN" "cYQHEQEhIgJJq6xrNHL9PXMhOVIQciw8eH/4mJRSp+acyTlv2Tln7jx6iUWIqqpYLpdXnLoe" "tO1er4fLyUQ0tc5mMyaTybUnoEsnu5xSCqUURqMRg8GA4XBIKYW6rpu7tpoZpRTkwkKBmWFm" "TKdTFosF8/mcUsoW7HZZVVUhOaY1grquGY/HpJQopTSOwFYPAMwMSVhIDax2A9sZu+wGgbs3" "Nf3r3EaQUrqyzznjHlj4aoyllBW3d2Tc6CZIVVVcSpgkzIx+v9/pvCtISglFYOjiqP/gxTO5" "IxfujrT+PNpQOJCc8GgoLkH42dG1SbNL/gBTPeR+G4V+UwAAAABJRU5ErkJggg==") index.append('application_xp_terminal') catalog['application_xp_terminal'] = application_xp_terminal #---------------------------------------------------------------------- arrow_branch = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdxJ" "REFUOI2Nks9LVHEUxc/TGKecUZLQN75pNkUtJHAVQZQ7/4NpEW6KqJX9hAgKgtBdbqxN23Zl" "bYKyRYlgkC3M0gmnst6bin4o2OYNNe97z/22GGRsxqee3fcL58M9516gTmcnT74YnDjxqv4/" "Tk115lk3lTnsptyDZ8YH3m4F4ADA9UI+8Xs5Pe+m3X17d+2BWovi9yJKS98WQ8OesWNj0YYT" "rCynHyltjrSgKqiEKCGUbILyeNMJVnX6yYA9uv8IFMSz1xO4m3/gxBlXtW3tg0KoJWgVItzM" "W4uwFmCUoApoGgH9N/uu5O/nmzcEVCcgRKQBYCjHlz58uRMbQQwhVqBq0bajHf0jfb/QBGNp" "PQrR3emB5IFDV6Nwenj2fCNACCrh/wxQDsvIutnOjvYOtG5vRbIlWe2GgqgSneu9ZMI3I4Vr" "/5doBKIK3y8hs7sL2VQODpqhtrpWhYJWQRJqJBEbIdfjoSuZwd+VCj76iwhKASiE1+2BVPif" "/dtzo8XL6wAEVKLFSaL8p4zJqamvJB++vDFzAQB6L1bmROxMYXRhcN0tiCE0dNAW7cSndwFo" "auZqRN4r/Fg4Fb8FEYgS1hJ+EGB6qGYGgPlb74dRp4YOnj4fB4XgFi/xH7gdIjmWX1B+AAAA" "AElFTkSuQmCC") index.append('arrow_branch') catalog['arrow_branch'] = arrow_branch #---------------------------------------------------------------------- arrow_divide = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkpJ" "REFUOI2tkE1IVHEUxY8zz1EbHb/FN6P5lUnkSkFalAXBEASF0YvIBBeVu0hJENoWkhQtbBGk" "EFghQ7tIrNxIyhApWU2RNYqGSswbxlByPv733tdCRjScVZ3tOb9zORf4n+qavNx3bfzSzVT+" "xeGWvvOPT+/w7VvwxJX+0kxPZ7aW3bz/XGX+u6EPo9uDF4Zb+j2usk5nhrO55FhR/uzz4CgA" "pBk+w16m5w/oWXp7jasWzIxvka9YjCwM/opSBwA4iAb0PE97nV4HsgiBuQCCS8FBl6ekQyt3" "5/UQc2M6HBARWLBAxCAlTZlANyllV0SNTAS2GCICTUuHUtQU+r7UnQYAV1+37dXsexab9EMQ" "EbyafYlHZ3xp2yeceuC1vI1ekMUY849hNbpRMdkz+cMGADFg8yozyCIIWTB8hiMJGz7DIUpA" "QiAhKEVANAYAsAEAogArAlsEYkZpTinwe6M3WbC+Eu7Vi9xQsulTghDb5KEBwGostpxlQ8Rc" "NwtcWbmoKK7CRizadfL+8Xohhl7k9laXV4GEEAqbWFtbj1TP1y5PYxpbO1uftpwloidVxTUO" "d6EbAgvmqglmQl5uAUgU5hbmEQh8Tiji1pm7n54BwI5HGQ+9++KMG6So7UDlQXtJYTFEGEs/" "VzA1M8VMPMRxuvX+3pdgktlRkNSJO0cPO505bxrqG8CWwP/Wj1DYPDJ9++PE31nbbgWj18cn" "QmEznmCFBCmETDO+G5yyAABYcYZYAoGAFGekymmpDFKEFyMjYMVg4lSxf9cfCwIziKgUtqMA" "AAAASUVORK5CYII=") index.append('arrow_divide') catalog['arrow_divide'] = arrow_divide #---------------------------------------------------------------------- arrow_down = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAQxJ" "REFUOI2lkzFLQ0EQhEcNSCCVIpGXRkggCIpiFUkXLAyCv0JQCzv9ISLYCP4OwcJGECvBToIW" "YiEYUibvdm73LF6nnvLOaXfvY2ZvF/inpmKF47uDEEKAeoN6xVnv8sfe6RjAzNCZ62JzoQsK" "ow4qsYJS4c3DzEDx5QGkLwDBILkkAFwBUDNInhBBHEFVWFC4FAfiBFTCgqZFkFyKCKkO3ISg" "EpriYPt8q1OtVEHzMFO4X4b4bZH6p70rHec39fk6qB40j2wxw8pRe9Leb17/CaiN3nfd2L9+" "DIfwVnwlSYjj28xodudrf/QWNk5WHxpZY11VMXh6fhxcvKxFc8S0fNi6be0t3Zd+WEafYK+k" "p4E/rQYAAAAASUVORK5CYII=") index.append('arrow_down') catalog['arrow_down'] = arrow_down #---------------------------------------------------------------------- arrow_in = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAe9J" "REFUOI3lks9L03Ecxl+frxPX/AXa/I7Z2ctsIZ0kCDOoKIK2QzWRDhPyEJ2y/yIiPRoGQUVG" "zIYhQgehy5AudRChg1j6nTMJdVNz2/fzfnezYgP/gJ7z84uHxwA8yI3Oqmi/79jYRP/UJscg" "nU1lrJXQ8+T0FTOWG513m6KXG00j30orRVvRHgIUJgamzN+iu3PDOnn1hUlnUxk3FEmICN6O" "9z4gogeqihuM4FvbtkG+UPbLNalihXQ2pV0hl+6WU+RLeaxIv/P43GTS2/dmVvdWaTHN9LbH" "UZEaAytKX9dZWgOteEWPlZ8rRdVqzAEYP/80md/3aAqcwKhBrNZtoArBQAhv1wP1e14PzW4G" "AO4vpFVF+PRjERFBpb7B4loOEUWsIGIKgKkh/ocwACOzQ/pnHEFEeXnz7T8DJZ5dUz3iKCLC" "3L0PxgFAJNKgDcQ6TxMP9yG29gdilXj0DLFo75EYwBnJ3nZ9X752BsPs/tqh6lfqG4hQthW2" "D7Y52RLm0viFDIDjV2Up0tzd1tHUQam8x5eNz0idJ4oVlteXqVR93HaXcGtX4uKjgYxjRXKH" "1UPWi+sUShsz08PvjK3bQNkrH0bWtr4Xt3a3UFFUJWQAbr26Ma++Hry5k00et/rgk0EX3y6p" "am7h4cfrvwHgVCW0ZtAt3gAAAABJRU5ErkJggg==") index.append('arrow_in') catalog['arrow_in'] = arrow_in #---------------------------------------------------------------------- arrow_inout = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcBJ" "REFUOI3lkz1rFGEUhZ93smazcUMgm3XGxI8fkLgSrG0UFLES0SKooAERRCv/h1qKYCOCELEw" "ksZCO1utUiZg1gyKxOjqzmbmnmsxRBJ2/QVeeLnNPfceHs4b7r2/5QDuXj45908+Dgyom8tX" "XHIkISt7BBBXD3K4dhSXYz0ld98t+CCx5UWCIK4lxKMxMhHtXI6rCdO1I+wbHk6lPj0y4YR0" "stZkun6IoVApHbictLvBWmeNetjP7HgLl/oWmJy5AycYq4zR/tFm9dsqZiKSO0VWJJ9/talW" "agQPyP7hwGGkMkp7q417nshEALjz9oa7nB1ALufRuad7QF5dvOSSyhkTkli89mog7P+tAsDC" "0rzvhiM5zy6/2APowpPzJWjTX9jLt9+EaGFp3pGSIR9ipnGMVnMOWX8OZE5r6jgzU7NIIsst" "OfvwtEcyUZinjZEmW93v5MX24AUSPdtm8/cmk/Um1ShKJRHJRDI6xUR1gp+9Dh83PqABSZSJ" "lfUVtvOCeDxmot7A5VRMIssz1nvrfO18IUSWWO5pvwOnW2RJ1vuUygyXI3fC/POLZcJ2wXl5" "/fXAhJ15cMp3hK7yE/4BrUQ+kumCS1oAAAAASUVORK5CYII=") index.append('arrow_inout') catalog['arrow_inout'] = arrow_inout #---------------------------------------------------------------------- arrow_join = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhdJ" "REFUOI21UktrU2EQPWmb3NQ8jCmW9jaKrSlFobgTxNIiProTRSNIWl2J1D8gBUHquq2/wUVd" "JF35ABVdFNtaF6JichsE7w02pSGRRF2Ym/vNfJ+L0FpjUnHh2c3MmWHmzAH+Jyaejr++9ii+" "uBOnpVnh+pOx91279KPdfv34lfnY22Y8V33idiLmyQe8ad3XHe3vGIBUEqn1FMyC+VFp3sHk" "paSz4wZ5v/aYBUWIGKQIJAk+jw9U5f3V0rcHf91gE+OJC+rEwElIJbG8uoxiuXDs4Y3nK/W8" "tmYDyOGqw0KTivHla7HaqLnhCQBwee7ckF/za1JJsGT4taB2anpkqBG3dXswlohFD5+NzghH" "3D3Q2dfS7m0HS4JSCusbuauRYb1XH+lM5xbypT80iN8/f5GI5nr3HvToHTokFIrlIpgJod1h" "kBT4lDWRSqUdQRx/N/NhfmtALBFrddl2YXDfkXDQHwSRgGGtIruWfUaC0NMVOdMfjULBhWKx" "gKWXS6WBjUxnMgmuaVCp9LTBHQ74AiAmZKwMrDVr9sXNxdGFWyujpmnOpg0DLAmhcAhuTQun" "9/T1/BLRBkgQBNf+buWyyP8oT26e991tT5qmBVYMkgwWDHv7FyqwIZxaMzHBqTowpowtxxlT" "huNUBUgypGQwMVCpE/H09LAiQSDBICK8uvPmN5MdmuhXTAxmCckS1r3PTU34T/gJlQcYvvxf" "XWoAAAAASUVORK5CYII=") index.append('arrow_join') catalog['arrow_join'] = arrow_join #---------------------------------------------------------------------- arrow_left = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAPpJ" "REFUOI3tkDFKQ1EQRe+L0UTSiRKFEIK9wS24BrHS2m//F+AWXINdkFQWEaxsjFYSUMHOj5Uo" "pBDJezN3nhb5kh+wSPqc5s4M3GHuAAumOH08WEn7yfU8nnKx+f5aezLGxjwL3F+R3iaDzcpW" "mySyYQYJCvEK8YLgZayjSS1eMTh7dmUASPsn9/XlertV2wYj0ag1wUioGdQUGhVqzGcEo+Ki" "051EiDSlI8QEjASN0MjcnGu+gEbwh1DhdISkd/SwXtnYrS6tInvP8DH8/PdsCQoVgkq8nr85" "V3zIYWf/Rbw0fdC9y+Oru1meWCo24ko7YRRuZjUvGPMLQu6swybSdFgAAAAASUVORK5CYII=") index.append('arrow_left') catalog['arrow_left'] = arrow_left #---------------------------------------------------------------------- arrow_merge = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYhJ" "REFUOI2Vkr1LglEUxh/DLEwliHgtIqHChiD6oqAil2psCHKJtoymqH+giKYW9/Y2CSJoCJcM" "CZqicnAI+pgiLKPUfN97zr0NJpTd1+qBO9xzz/nd59x7AButJSPJlePFM7vzsmp0wdWTyLnh" "8o/5643h5aOFi2oAx9fNRmrO9fLku/LXtwQ7fF2QSiKdSeP++f46Z3FPLByzqjrIZrwHTLKd" "mcHycxGBhGirJXH4q4Oylg7n1XggBCUl4uk4dsN72jwAcOqCJEq3S8kgi+xqf7ZQlrAIzAxS" "BMNrYGZnau2fAAFShJyZQ5OvGWTS7FQ0pIXYOiAmZAoZeN0e9HcPjrc2tUQntkbU6PqQ+rOD" "/Hset9kbOOucCHYGMRmahqh4Ez3AJAhmpFPXeH3Io1gwIUiAFYHEd4D2F4QlwJIx0NuH5Okp" "LlMXj4CjkZhdTPJvAJIEd4MbplWEp+EtkNi8K+py9QCTQIogpYQQhMS2vriKg9IcsJK/DpLN" "JBL29w/AxJAVPVfqA1um3jCc2iwUAAAAAElFTkSuQmCC") index.append('arrow_merge') catalog['arrow_merge'] = arrow_merge #---------------------------------------------------------------------- arrow_out = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAfJJ" "REFUOI3lU81rE3EQfb9NJB/Y+EGzmyq5aS/xJK2SgxcPVoUqjVhtFCIEpRT15P+hV6leRGwF" "2SIRrVj0GL1UUXrxFCIxm0JMs8aYdPf3xkNQaBr9B3wwzGXmzcybGXWrOCsAICI9o+D2sXmF" "Abj2/LKQApKg7nkDAMb3pDG2++g/kwFAe34igCAOm2MY33cE1IQhIvDpo+W1YIZGcONN3h6U" "nH960RLBZytiwe004fl+rwOh4ENjFU2viWQkCSucmJp7dWUbCYG1/UPJWDxqot5u4F35LbQm" "DIqg+7OTKH0vuZV2BdSEaIluI/BZ7HhdlL6V8LVZWVqYsRU18Wfemyt5y6Neo7B4d+LB5KAx" "Lj0+t0xKe2HGzvxNp/8RW44mZ0/bWjP68PyTk4OCz947XaBmGsZmqnD1dQ0AVL6QlfuTj1TO" "nraHw+YUSVRd59li1t6yiTPzp5bNneZEQAXwpV52Ox5HdyjlBKmJnH1BhsNxWNEE1n+sQ6jT" "/dVFs61JxGMmfF/HahuO0/U2YVATqb2HEFIh1FoOyo2yqwym+gkKsy8zTqO6VKlXoAzBgZGD" "EAoMTUIEiASjcFwHhqFHF7OF2iANXlxfyTgbDoZCuxBQBiiCILXgfXUV1ETvVcXpF/c3Ttw5" "LkLBx9InCHvv/wtoihs4h5ZXbQAAAABJRU5ErkJggg==") index.append('arrow_out') catalog['arrow_out'] = arrow_out #---------------------------------------------------------------------- arrow_redo = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhhJ" "REFUOI29Uk9I02EYfn6/TUNXpM5lzY3MgeR5pwjBINgpBg071GVEF6nALukhgwihUxLUoaPH" "FA+VhyAMkjoYSDApK7eWmf07aITb3O97n/frYK6tvNShBz4+ngeeh/f53g/4nzg1fnyob7zP" "V625fxMgG3JS14u3qzWnmvQ/Tkfdsk2RmqAwTjIkQtAQIkS4qR0qRG4ld2Pq3PRATcDZh6cP" "qeVgJBBJNje0IFAXgN/1g5agKlQJsYShYD6bQXYpOzI9+PSSHwD6H6SjqhzsDnYn2wJ7UZIi" "XMcHUYI/j1pWuDECI1IPAH4AsGAqsjOaDDXugajAE0H2ywLyn/OoVDCCcGs7SCL3LndzZnj2" "YiWAZGL3jiYUTQGk4tGL6WVSJyfSUxeq3+jItcMZGjM3M/zsfM0WaDTeUNcIBy5WVldgjPxh" "BgDjyZ22zP4z1ZofAIwYCAWO48BQQMNt1/jk8uwIMFujbU5Q5tza+hpKpoiWXUF4nkklrveO" "bpvyGxwAODF2bCDc3D4a2xcDraJQKmBxaRH55TzE/PoHFG5yEi9vvXEqFcosT779kOut99Un" "Qy1t8OChq7MLnR0xqCVUFaKEQkFV3Ju4X5nABwCv7+a+dxw9sPTp68fWDa980LEOHNeBAptm" "q1BL0FpYJRbmX2H1+bcrlQpb6LnaE4WWUyJM0EhcRIMUuhSCVGzdSkV+7H2N95/xAxFnTbiV" "dtfYAAAAAElFTkSuQmCC") index.append('arrow_redo') catalog['arrow_redo'] = arrow_redo #---------------------------------------------------------------------- arrow_refresh = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm1J" "REFUOI2Nk01IVHEUxc+bGQw/0CHLxpkUMYiICMRVBIGLkKJyoRa0EC0oSs0oSIOKIAQLgiQh" "giwzCLJcuFMrKQyDyI2Ymh/pOJmQQaHz5t2P954tzHDMwAsXLv977o/DgT+wjjr25EhdaVup" "d62dZz0AK0bHo7M/7q+1M5aHC2/Ls5gXi5m1UMTOt1k2MymEBKGNIYgoRsZGGvtu9J9fCfAB" "QOXLE3tiZNeGkkJFaX4/khKS4TEMqKtQ24a6ClLG/MJCza6qhehg0+iVv4AzneVZqly7I31n" "UUZyBqIShbvogm39A1CIqxBHQcQg1oQ4B6paHEwJFqUnpoOUYbKFkakRjE2OQUjBJNgaDEHV" "xujwaNP4w/ClOAATFSb7kxEVEybF0P2+e5otftF77cPFZdHCKXPAEe2faJmuXh2izzI5r2+o" "j5nU5ZhYytz67vrHqytFyvJsMhZpKGsrqSASKCuUCEQKH5l0WUjBLBBSEBFK20q9wUBqXeO+" "5noAmHwcqQcA6xDnsiVnhSWRY+xRkl/GaksAcO7NyUeqmn9vf+vu5bfi5oO3hbSkIK8g2/B6" "MPt9Fq97ezp9q4+reyrubtkQKLc9NsqelywyLTkLpGUiZ3sODK8BcQRTX8Mgi7viAJWvym9l" "JASqcv3b4DgOsv05UEeX2lXM0zy86sOXqUkMDn7qYNNtjwOwJcKGgITguC7EXToWRxGzTMz9" "nMPMzDcMD33uUNGbEy3hyD8ZHG09fCeQmlkjohgPj0NIwKRQ4jlhu19Euxwx2idaJiJr5QcA" "ONBY8KCgYe/AfwUras3fmJK56TSZ9HQ9gN81YnzgUNbvigAAAABJRU5ErkJggg==") index.append('arrow_refresh') catalog['arrow_refresh'] = arrow_refresh #---------------------------------------------------------------------- arrow_refresh_small = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAbVJ" "REFUOI21Uz1Im1EUPf4UFSEWSuKg0WBD0RgrUYQsavxrQKEUJEPpUqeAqEu6dZHOLoIgSJe6" "CNFFdNGoJIqaJZQqiYlRYwqliB26qe/e+32dUr7Sfo1QeqZ337nvcDiHB/xvTO6MhQPhQJkZ" "X1pMgBQ3W6oebJvxJcYhdBj06aJPC0svs4BJUFddD2ZG9uvp5tKrVb+pQOgw6BPWZtw17Z22" "ylqILtB0gWgC0QWJXAKZz5nztfGI0yhQXjiw0l42W1o6rRU2fLr6iItv5yBFqLfYwcxI50+3" "1iciQ6YOJrZeXzJLI5NAKdpbHF3uAYAXC/4jpfh71/W2b8PirYiH4jfFcoMx9eHZ/pW/tWCK" "5/NDK/fZKzcOgXCgypV03SWs+9HbW3pYuPe+9eyS4m5SDFacT81nHQXulxoBYGSuP9JodQwS" "EVJnaZBiNNkd6PJ4kMpkENs7WDh7nwv+0cHwbN+V/VGDrc3ZCtEE7ieun3VmcxeIxfYTJLRk" "fPObg5533g1HXcMzZkEyfQJWDCYBMcdEeDr/4Uu0aDAdb9qiT6dajoouwuQvPM4fDyji9H0E" "/hk/ALOAzz2zT/9eAAAAAElFTkSuQmCC") index.append('arrow_refresh_small') catalog['arrow_refresh_small'] = arrow_refresh_small #---------------------------------------------------------------------- arrow_right = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAPZJ" "REFUOI3tUbFKA1EQnEgIeqWpzh/QJloqEtu0VvkHLQV7aytLrfIjIsFKhRSJIXgcCUQLC4OV" "F3xvZ/e0MHdJYZGrdWDZZZaZXXaBfxTC4VXjunnWrCxyK0UMxLH+vvY6WORKAHB6d/QFAKYG" "pYKiEE+II8QJvBOIE4TrIUSIKI4fO+e9HQAoZ0771QNYatBU86AZaARTgpZxiiSZbifH04fo" "crhbzibTOBebgqnOxLNs856QUK/MN1Aq2s83v67tP3/qYDVAGG5g8jZB/DTqjlrjen6DZVA7" "2dpTZ216vgxb483CX+hfRPf0elv5CGrLav4KvgFJZLLiNphTcwAAAABJRU5ErkJggg==") index.append('arrow_right') catalog['arrow_right'] = arrow_right #---------------------------------------------------------------------- arrow_rotate_anticlockwise = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAf5J" "REFUOI3Fkj1oU1EYht97Y9QmUoMa09xISoM2ggEFs1QRrIqDIgWdBBclQyEGcRZdirQgLpa6" "ObhIwcW4iLYWBLcU/Au0AfMzSEGIQyP56T3vd46LCQ1Ng5vvdDjwPLzfdw7wv2P1usx8SKW1" "qzJam7hQIJQCKbPPr72c6ytIf7zleFyTDfsiScfvYMDrg2iNWquGcrWC8s/ysrVhJuZTr9fa" "jL1ZYLsmG90zkjwcOALL8oBCiBbYto3R0ChiwViyJRvZzYynU3vpZnpowEmN7I1BjAZJlH6V" "UK1V4d/ph2VZGPQPot5qOPvHAtXi20quq4FQMkO+MJqqgaZqYbGwoFfWClOrP1am3n1e0LXW" "b1CISPAQ6DLT5na0D6SO7/LshjaCUrUIuvrh/I1XDwDgytOL9fe5xRkqAUmQEt8iEEWIIURr" "CAmSnTmpOPPmzlLPF+uMoJQU1hvrqLt1hAJhKFfduzx3/sVfAcanT5m+ArqcrVQr8FgeWBZw" "9sS47exzrl94dMaEDzgIH3Qwdv/kFklXravPLuWGg8PJaCiKumrAa3uhtUCMgTaCL/mvKBXL" "+PQ43+G6/gEb7kShUljOf8+j2WyBQigtoFagEKSASrZv0M656dNpRU5q6gRJOOEIRATlYhnf" "nqz2ZPrm+N1jJpE52nOJ/5TE7fi28B8NSQuVAOr6rgAAAABJRU5ErkJggg==") index.append('arrow_rotate_anticlockwise') catalog['arrow_rotate_anticlockwise'] = arrow_rotate_anticlockwise #---------------------------------------------------------------------- arrow_rotate_clockwise = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgFJ" "REFUOI3Fkr9rU3EUxc9L2pAm0gZq7ctrERPaZHWIig7aqWgrdoji4KRkC/kDFOqSqUOlUEQR" "/AUiBae4aUUQ1MUMFWzSKL4kIAEhLiEJL+977/26GElIKt080+VyzofD5QL/W8awZeZdKi2u" "yojoOBODiUtEvPk0+eLuPwHp9zcsr6tz4cBMwgpaGBsNgEXQcBoo1yso/yznjY5e2Uq9rHUz" "nl6Ax9W5o4ciibnQPAzDC2ICC8Pj8SA2HUN0KppwuJPrzXj/1n57PW2OWanIRBSsBUQE+5eN" "eqOOoC8IwzAwHhxHy2lbk6dD9e+vKp/6GjBxxgyEwcJodlp4U9qWYq2U3ftRzL7e2ZaW20bT" "bWFmahbkUqabG+kORBL/WP0AJgYphhDf2rqWWwOAS/cWUa7Zq8esCPx+PxRRfADwYOlZ30Gv" "PLmoAawBgOsSFBGUKIhokEsYAPTq8uNlrf6YLmwsPFeKrlpHwmi6TXTaLsil0r6A5KNlbU6Y" "IGKc31jQ5qSFWDQO0YwRGUWhXAQRb3b9fbWTD5f0dCiM+dk5kAhEM0QYLdWGz+tD6dtX7BYK" "+Z313RNDGyhFICIQE0gLRBisBU7bQaGyB9u284ZDK72ZgVdeXD+nzcMmiAXVagVEBKXoCxPf" "/3ynMPDKQ3U2e0qfuZ3QBzLvp5M3jx8I8Bv5aBASyYcdHAAAAABJRU5ErkJggg==") index.append('arrow_rotate_clockwise') catalog['arrow_rotate_clockwise'] = arrow_rotate_clockwise #---------------------------------------------------------------------- arrow_switch = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjhJ" "REFUOI29kUtIlGEYhR+nmTHIFt7y8odamX9m3iAvRVQggZshIaYgXLRq3yqSaNGu1tEqKNpV" "a0MoUkEcqhFHM4icMTRLzZGRCXX+/3u/72tRgVKUbXrgXbyHczbnwP/kwsPIQPRxNLxZC2w3" "fP5+pNPz5FQuvfpms553uf+i/fkYbTDaoEXHROgL7KBHKd2tlbi7wgU4RQ7p1TTTs6nEi6sj" "rQBBgN6mS1gs1lqMtUx/eX/s7fzUoBjBrT7EznA+og3aakoKS9jYyLUcv3F0ZPRm/ETAWovB" "Yqz5cZp9Jftpq2kjs5ohFAyhRFBGobRCaUEpQfl+CCBoxPDg1T20aAJmBwdL62hwjlC4u5ig" "DZGan2FxZYHPiwtUljloEZIzqcn4rckOgLzNhUTvRAt06Ou1+sqGvna3g0RynOHxYW2sPTt0" "PdbffqVF65D5MHZ7svb3K+wBA0xMJ1j31nGr6vHXFF7GB8Bf9/HS3pZIXu+jc1aUIEqwYikv" "qiCbyVJX6XKgqpaZjynGpyZIJpM0uIcRMYy9jk+mnsw1AwSVrzhZfxptNdoIYjTp/BUm3k1Q" "vbeGynKHinIH02XQRmMweDmvKbemXn56utARUP7WhkUL2fUsi8tLDI0Os5JZQawgRhCrEaMR" "0YhoBZAXuXvGihKUL4j/fSJRKiY52+etej1aqW7xjVtaWkpjcyPzs/PEY2OJpefp1l9W+BNO" "xOk0ogaN2LmlZ8vudnNbKOsqHiBK+O/Of+AbuTJWoUb0ThIAAAAASUVORK5CYII=") index.append('arrow_switch') catalog['arrow_switch'] = arrow_switch #---------------------------------------------------------------------- arrow_turn_left = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAalJ" "REFUOI2tkUFI03EUx7//beo0TCuhv1tKqYOwu4dAwcvwEh1Coq6ZdHOdCjoFgQgdvHYM8qAw" "0QmKFEF5KKTBwA5NlNpk1qjGQMz//L3v+3moSdqIMXyn97689+H75QEnXcMzw/7YyujDavd9" "x4Ww2/pMhberBTh/D2Nv70yGguExVUWmmAGpoOF3MUySsixW49O35rcqAmJvRp64jaFHXc3d" "cByAVqGq8MRD8VcR34p5bGxvzquRibl7y+/+iUCyniQUClGCJMQKfI4PwfoGRNwIrnT0XjfG" "PIg+7e8o3/nLzerz1MueG51tnvH68jt5JDMfsP51HXveHpobTwOOg1PBJnil0uUfhZ/Zz6+2" "3h8BAEByam3p0rULFws7Bf+Lm7Pux/inx+cH21o3cxvh9nPtLR49AA4yuSyyr3NTFb+wSzti" "jEyX57m7S/elJPH0lzQCvjqcaTkL7nOo4hf+V4PjV210IAqqIrGYwOp4ygGAQLUAsy8wFKhV" "iOGhXjVAjECUsJYQI7UACOofB1KjA1qCqmBtEfg7gipYiwMKkZhZAKlQ6qF+AJ447IzZe1WN" "AAAAAElFTkSuQmCC") index.append('arrow_turn_left') catalog['arrow_turn_left'] = arrow_turn_left #---------------------------------------------------------------------- arrow_turn_right = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYFJ" "REFUOI29kT9LWwEUxY/PNKIpRoUopmavc6eOnRSXDOLQTtG6lLZQ/6AOXf0AQpd+hLa6lCoY" "FMzbu1RBBJ+NVCn5ALbk3XPu6yAGec0gKfSOh3t+/LgX+F/z/PPTtZmPM93pPLgrwGI+yzrf" "p/OudLBYq5SalkzLfELyR5IKMmG0/wGcQtSINrZmd960Bbw8mHuMWKvF+2PlgZ5B5O7lkAky" "8MRBF+jEUf0Q0eXZ+var/bcAkLkpv6hVSt7U6sPB8fJwbhi/7ReCIACdkAueJJALRsJiZW96" "LUDQTKZH+4rlQl8BdMEkHP88wXmjDppQHCqCFL5fRO+qi+HKX4CYnOjPDuDKrkAJ4XHtB8mt" "T5UvCwAwtfHkG6mv1aXwddsvuGky35tHd1cGUeMUt8sAEJs+5Esj8+mjtwxoAkUocdQbdWzO" "bi/cXtxbDtfT5RSAYEJIDsZst9t2WgAzwigIglkHAMa6NnB1ZkAjTIQnHRpYTNAJ/xeDarh7" "/Q3eHfAHD2/t30Aj8WEAAAAASUVORK5CYII=") index.append('arrow_turn_right') catalog['arrow_turn_right'] = arrow_turn_right #---------------------------------------------------------------------- arrow_undo = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgxJ" "REFUOI3Fkk9I03EYxp/9HJEYFWzkNtOGw1tdCoKiYhZFUelB1GtEFEHSn0uHTgURRqBRIISH" "IggKdlgENSIoKDvULp1if7AciRLyS0PY9r7P++0gLpdidOo5vZfnA+/zPMD/VmDxuPT2tDMz" "GA2kgUqQBlU1is2oMmvCjBOkHp9Ml5YBLrw55ZKx/XAOMEeYc6AjaERZyvDnfUz508h/y6VZ" "5eCzgVfvAcBbBJC2YDIFnUFNQSPoCM9rQOPaRnS0dGDrlm3dVdXLh27tbQWAYA2gRKbwHCSh" "QlAJVYJCxDa2IN4cB4IBNIciaNvU1p0fz78GMFx7YTV1jRwc0qr27NuebGVA8cOfxbsPYy/G" "rn084v3dDjw9+/KiCFOlqRIC8LCuqQmq3FGXAQD0Pult6H/YdWUliIhCSagpxAitCpYBApXK" "qFTZ/6c5eX33kFS0JxwKY17mMePPQIRZYEmIfQ+O3Ymuj55QJY7ePeBUCBVdCDESQ7w1juCa" "IDzzMDmZgykzNUDf/eM3Ixui5xLRBAwO7S3ttQppBjriZ2UOHj18nSghn8unK2apGkBUq6oK" "MYE5gI4wI9QIc0S5XMasP4fcdAGFz4W00QaL94olYMkSD9/uHI6FoueVhi8T41D5vQNR/W5i" "WVXNSMCliiPFElZS541do3uu7vy0eqn1qmshnNh8hspH/wL4BVfpShtMzyvVAAAAAElFTkSu" "QmCC") index.append('arrow_undo') catalog['arrow_undo'] = arrow_undo #---------------------------------------------------------------------- arrow_up = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAQlJ" "REFUOI21kL1KA1EQhU/8C4ogFlksJIjY2gqa59BG22xKER/AB4oQFUVbIYJbiaAoYpN6QwJG" "yL3zd61sgruBXTzlzJmPjwH+M6cPcXJ83+zmdWayFifd+Lk2v7YTVaNG6/boKatXmRycvewv" "jIarr7VqtLWxvAkzw3v/Db209zEOle32QZtyDb6GKzfCsi6iEBNIECzOLsF7rtvo+2qqwW+a" "14dhr96AmiH5TNAfpLud+O5xsjeXBSDPYFVYUKSDFBd/HE8BEFgZFhTkKKuWA3AEMYEGhS8C" "8GMGK0PLGLAJzBTecQEDR2CV8j+woGBfwIAcQZRhMDBJAYBndM4vISxQ0UxA6fwAMoqrUD2w" "uKAAAAAASUVORK5CYII=") index.append('arrow_up') catalog['arrow_up'] = arrow_up #---------------------------------------------------------------------- asterisk_orange = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqxJ" "REFUOI2lkj9sW2UUxX+f33t2nh03eYlS0iaN0CttoHSBN1QMHRCPBQm2ZEKwOVIZkLo0CFVd" "WmEYWCpVatlbiUzM9YJQEUPcin9FDLWUFJHGIX1xbcfPz993P4bIxbRsnOle3XOu7j068D+h" "Rhv7FZFYqtYSY1h2z7EG0L1KBVHXjVATa1cmz9MYanIj4or4h9fV/FtxLnwPg6o83SyqMrb4" "DoUjr8dicuu7XzhLw5E7LLTQyKkxKM6i3DGsdyjufdkKNYSqdCTKuT7O+DQiYMU8f4G3Qs20" "NldN8ydAcKZfQSt1QaxaciaOgRXS7QZWWJ35hPp/egCwf1Xddmdfi92Zl+ncvZUUFs4E+ck5" "en/+TvfhrzdmPrUro3w3u0YEkD93sDVz7LJ5eO+BO/VSMP7qu4FSoLsJ7c379dSxq0PhxkUv" "YgCqf03dxj8cm04Ta0iMpW6FoLQYR47nggg6Tdn95bu6CIloFYoldIuH2N9r11wr4M29Qb48" "h3QeBZL1YsTi+D4MuiAa1/eZOv1mJIMUp+Dj5gv0Hu/Q2rmLawzo+99gBcSquhGbWAPlk2dj" "zx8DLINuh+0fv6+LJjFWhaJVOBjAIFO4pY/t2yNRYu8zgkxyD9zSFKb/BMdzsZIhGhBZDqsk" "oybmeAaZqK+L86cD3e/xaP3bRmfnL/KlccrHTkR97VSf5TujTfOKqhZmFz8oL5yivfEb6ZPH" "q93m9pZTKEYTR18gS230/vFOen1d7jx3QfOys5SffvFCeeEUptel/UcjYSBrYlnb29oGK0wv" "HCVfnKj+8KEXPc3BsDAG9rc2E8cPAt1P0WI/P/jX1H7+aLc+Od+LWlu7tHbaidEqhIPc/CuJ" "G5cI0U5VxAaZ9VYWq/0GwL1KfqmvbcVkqiaS3Th78x8j/wauAUd4RhFPcwAAAABJRU5ErkJg" "gg==") index.append('asterisk_orange') catalog['asterisk_orange'] = asterisk_orange #---------------------------------------------------------------------- asterisk_yellow = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAo1J" "REFUOI2tk89LlGEQxz/v7ru75ma6qIc02HwjpKAw3nOBskYEHToYQdRxAy8ds6BDFLH+CQlC" "QYHoKZAo1CTC6uCWFCVELphm/kjf9cf+et/3mafDIm5Kt+Y0M8/Md+b5zgz8T9FvsNVrRvxx" "tD9G17Y/95Jk7jl6Y5iR7DBWZU6gIjkpYWvSaL6eCLTcQimS22+iSFa13ibSdDEhLpOrQzvg" "5rbi+2SMfVGMfYcxzGp0uDFRGF6xfLAC0WN2wAwTjLYgAlqT2dNBqJ1RyX7uUStjoCFQ34Fv" "cFOELrP2BGihuPQeLfQ0XiL9Tx7yLxlxpy5o+dmrN56xVpq6rPXsXZ17d1YvDfBwd7zhvsIG" "CHeUUbPDxIIwEz15L4a/iqEN/GKOtU996aLQGb+CAzD7CBsPTC2kqLIS+RcZtOAoIS2KjBTm" "7WBAgfggGhEwhcG5R1iisMyqJvKFhVFTKwg1XyZccxzZmomJt5VAK4LhCLiLoH3Mqlrq227Y" "4uUJRuowI3XkV7+xPvEYUynwvz5ABKRc3dEKalqvJkIRE7TGy62z+OFJWgmOKCzxsTwX3BKY" "0fN0VpKSfUqsZDIT3H8YVVggGNqPpoASCLhcaukuc7BnjNvimgxWHzoXU26Oxcn+zNbvFcLR" "Rg7E2+2CT2p3fLDSWB4gFTl45lpNvIONzDhFZ64ntzz9KxBpsOuajuKWsK+0/Sz2jTGxp4Pl" "AbpC9fbNmngCVdxg88dbhxJD4jG0Pj8NWmiwThGJHky9uVMe/V8ASkF+Ie1sLXxkcz6NUvTG" "u3GOdDO6Nvc9venkWfr2heziL0cVdw7KqPzCbD+WQEorYp7P9dbu8s5P3qfLL5H0PEaBvtOp" "HSL/ANikQvL/Oa4mAAAAAElFTkSuQmCC") index.append('asterisk_yellow') catalog['asterisk_yellow'] = asterisk_yellow #---------------------------------------------------------------------- attach = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAfZJ" "REFUOI3Nkb9rU2EUhk9qwaEERKRFHDRY4yY4qEhRcBNd/Qs6xc0aELOEQHAQmjWxSYaQoYIu" "/lgSI00uESopRAUXBwkFoSDSem/uOe93vpt741SxJaWCi+96zvMcOC/RPyb2N0u1Wu3UaDTq" "A9hU1fsiwtls9gMR0ZHD4Hq9nrDWbojINoDjIpKMx+PLyWRy3Ov1nKnDLgNYE5H3ImJF5F4u" "l7s9GAyuishDIqLpg+CVlZUTALoAPotIpKrZfD7/kojIdd2htdY9UFCpVOZU9Ysx5h2AH6r6" "GsDbVCrliEgXwEUANFFQrVZPG2P6ADoAvgPYMMZ0mPkNgC4zH1PV+TAMLxDta6FUKp0LgqAN" "oAXAAFi31j73PO+Tqr4QkTkAN6IoutJsNrf2CMrlckJE2gAaAIaq2rHWrrmu+1FEVo0xZwHc" "tNZearfbm7vcFBFRsVg87/t+3/f99Uwmc5eZE57nLe/s7Hxl5qcAEsaYW7FYbP5P+LdARM6I" "yDAIgiUiGhcKhTvM/IqZHzDzSWPMQhRFyUaj4e3/2TQR0XA43FLVo8wc7g5836+qajYIgsvj" "8Xih1WptT2osRkSUTqdnrLXPAIyZeUlVZ0XkyWg0mgmC4LrjON8mwXueuLi4GAdwDcAjY8xs" "GIaPrbV1x3F+HgT/H/kFyEt+J0am0ZgAAAAASUVORK5CYII=") index.append('attach') catalog['attach'] = attach #---------------------------------------------------------------------- award_star_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAudJ" "REFUOI19k01s03UYxz+/f99oLc5VBWUTE1YzxpDNyMGYRcyUGKNZ5CDECzgMamY8cZDEGOM0" "Bk2IF53JLiQzLIaLRHYQ8WW4UScg6upAzAjazLFu3UrXrqz/38vjYaxZduCbPHm+l+f7vCtu" "4Zn3z0hnR5Kf/53DGcFah7UOZx3GONoa7qbn2EV+/fxFxQoEl4mzFucEo28FmiVvzZIZI1hj" "WQ1vmVSzaYvxLU2hEfbe+SHat2htlwRvJ+CMZaGs2bA2gvYt7bETbE9c5T75iwdqopTKFay9" "bQWm+3w6yz2RIM2182wKj+Il2nk6/j3r7gjzy28TWGO6VwsElknmbP9gKNnhLVbMjufrvmPj" "hiRebRuxzKccHXuS9N/Z7iv9+99dLaAkVR/1XaBRiQS0hndS+157veXUgY3bDoAXxs98Sd+Q" "d3LP1vR76KUgXxdn6nbnMwCqMrh+QmJb6kRARBAneLVPQOxBROcRXUDPjmLL0wgKpzV+8R/8" "udzeTV18ETSz2S53PXss0NwVD9a9hPhTOD+P0zmwZVCO0L2thINrcUZTuNDP3Pnc114NXwEo" "gBt9JJ1lILx5V2Og/gXEzyJmAXFlxN4EFeCHy1P8dN1S1Jr5hUIxX5r9+NRH6Q+qV5U9TtzT" "9MVa39qlIgmcySO2DG6R09c06Qo82rSd+sRD/Dh2gpE/h7g2njtSXeP63ZQC0fhpXRhHFCAO" "hQKxDFyeoHVzC9aztNy/E6s0jz38OCBveKyAU+HnQrWtKBVEjMGfm0SFEkzP5wipOB1NbwJw" "8KleGtZtQ6HWVH8hc7w+6ly5PXDXFgrnjjB7NjUuHsPxxuTLxVKFsckUf0wOc2jnUQ5/28ma" "QARBFqsVRJjfoeIN0ZmBg0wPpnpdiUeaD9OZvzL+bBs3iiOjKcIEOZnuIayCDP9+BlCfVYf4" "Xy+v3Jzh7cUcXVs/4ZuVrV14lZpeVzN0KRRt1p7yBIqI9JzrmTr0P5VGgdHTVfjEAAAAAElF" "TkSuQmCC") index.append('award_star_add') catalog['award_star_add'] = award_star_add #---------------------------------------------------------------------- award_star_bronze_1 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnZJ" "REFUOI2Fk0tI1FEUh7/7f/if0bHs/fCRhTFJhEUWVousnRg9Fq2CoEVEReuW1kBtaxcFUS0C" "cROYpT2oRbVwEUYRiomVpEZTvsZm/D/uPS3MYSSG7uZw4X4fh/O7R1FwogvnJaypJejqQkTA" "GMQYRAQxBu/QIXj5isSLp2qBcQoFEkX5xwtgXrIgCsJCBGuRIIzmAa0RrXGrNWXNfv4uxvxH" "EIRIEGBt3oxojdcA7vZK7HIfK5mEuTkkCIoLTBCk1OgYdm0tTsMm3LUas34fsYYynA0bMP2f" "ED9MFRXE29vbZGw8xZcRvC02pu4YeuUuvDXTyMAgMjicWtbf11bIOADS0RQnsJIoy4Zfnbnn" "mXVuqTkdLj2Ozuaw6/fifX37MHZseadwYCcAfpBWZ96MKAC50/iNFfWVggIREINevQffqcLM" "/sSOpvCyn1BzE/NN6xBmx7Fmpk7OC65WHyYy903z2YSuO46ZSRPN/MRk0pjsFBL4IAZVUopN" "hPOhi9jwUCeePpH/ENJWVUeou0zT0aRfcwQ9+R2dncRkp5HfM4gSvGiCRN9zTSZsU/d+XFk0" "RHX52xBu1Gj19zxwpj4iJkDmfiN+FhPlcFyHRP/LCULTsgD/k4K6nJ6lovyZlfmCRCFEIRgN" "4d9a4syqm+PPisY4n0u8VVdsAcB2I2L2NFa8Am089PJVNZJKbisqkI6mOIaDOlFLbLib8ie3" "h0pfd98tT/fi2RmiJRshVK3FO5jQ+3WiOu4+vkRJb+8tbL1D3Rg95Y6NtJS9ezQquRyEskiw" "aBvJTFbaQ+OfSfvn1L10T3421772yMVNW2MD76+j2V2I/AETYVbTF3nsbgAAAABJRU5ErkJg" "gg==") index.append('award_star_bronze_1') catalog['award_star_bronze_1'] = award_star_bronze_1 #---------------------------------------------------------------------- award_star_bronze_2 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAolJ" "REFUOI19k01IlEEYgJ/vZ/12bQ0pM8mMFMmiOhRlRoXRzYTqEh2KqEOUdevS0TTqFNQtCsIM" "IuiQUZZKQgUVWNCvZZGZ/Sqt7K67uvZ989dhzVbCBl5ehpnnYWbedyxyxpHufWbrsjqexR+j" "jEZpNRkaqSVrizbScuMyXUcfWH8YN1cghUSb7GalFVLryfw3gkDmItjTBIHEGBBKESjJktEE" "uz5/JFACqSbXfDGzQAQSj3w8O4xQkk0jI6yWUUpSo3hOhIiJIoL/CAJfNL8d7KPMq2S+dKgY" "T6MXbGDDcILycBXPXr4g8GVzLuPkTnqvv78fXufYc9x5tVuCFAuK16OKqinpbaNLlNLx5E7z" "89O9jbmMBWCu1UQI7Cos2wE4kbQPHioMH5i9ogElXLyvbVx9//TWnpKipinSD2LWwUdfsoKW" "Nd+Yu6zUYIExYDSqeD2+uxA9NoIjk3iZD1i/4tlbKwFjQ9ip5N6s4FTZNqS+ojc3RFXlTnQq" "hkyNoNMxdCaJCXwwGisvHweJ+7qd8ED/TTy1e6ohTOPCSoRq1zU7qvxF21GJYVQmgc6MYsZT" "GMvgyTjR592KtGi0Wn+enFYFq+lbPyG5xu7rbHOTbzA6wPwax/gZtJzADblE++7FEbruD/xP" "Ga2m2BiFBXft9CBGCpACtAIxmfPcMev80N0Z+wAAN1KvCpdmaxyShJ1R7EghSnuoOfMWmeaq" "lTMKzLWaCJotKrqY8EAHBV0X+/MfdlwqiPXgOWnk7HIQVv3MJ4irWhUti4TuHCevp+cCjlpl" "nfu+P/TjS92sF7e/m4kJEGaaYNpvJJ0odfqHPhHzD1utsc6ptznzudMcq1gefvfqLIrqXOQ3" "lcVVzBd+rh8AAAAASUVORK5CYII=") index.append('award_star_bronze_2') catalog['award_star_bronze_2'] = award_star_bronze_2 #---------------------------------------------------------------------- award_star_bronze_3 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAopJ" "REFUOI19k0tI1EEYwH+z+1/Xzd2SMg/5oGzJojr0IIyCokMhgtWhU9CTkLp0q6Np1LVORUFU" "hB66BD0NiwqS2KKnhD3EarPMNlZz19XdmW+mw5ashA4MH9/h95tv5vtGUbC2HH/k9jZGefIl" "iTUOEYuIxYrFGMv6hXM40/aC52d3qH+MVyiwIljrMPovaPJRTH4b4xAjhQi+wmTiNC2YnLBU" "v2Z/7jw6J2gteeF0AmuE0YxmXiSIzgmb3X3qSgaoGO+jalaIdCaLyLQVmNZn3YOUBT2WRUZZ" "5D5i562jQT2hvKSI2Mt+xJjWQsZfmMS72h8Goo2+8azZsH3WUyqrFiFlayh/d5Ez8ZV0fxhs" "fd++r7mQUQDual2InK8W5fMDHOlpaDpcEztQtmo3oj2CX69x5bnc2BONt0yQ2VxCNXXF84KL" "q/uZs6TCocA5cBYpX0vWq8Smf+E3wwQzH1HjyfytRUN6AN/I8K684GRVI8a22Y0HwxLdgR1J" "YEZ+YVMJbGYYl8uCs6iiGfgxeN03Ke7rvU5Qdk4MhGuujKLlpq3bVput3ooM/UAyQ9jMb9zo" "CE45giZJ+OU9IaWb1eWfJyZ1QbX09xIwq309Hde84bc4m8ONj+KyGawZwwt4hHseJNG2/h/8" "XxtVSyJNaaTTl/qMMxqMBiug/8YiL63ODXROOQcAeKEGKV2c73HAUOz/jS9UitggMntutWut" "XT6lwF2tC2HZJOH5FPfdIXL3Qu+Mx3cuRRIxgv4UZuYC0Kph6gqSskHCVaHA7WMUxWLn8csK" "dfbb3sD3eH3Jq1vf3NgYaDdJMOk3khqq8PcOfCKRPaQuJzom3ubUlw53tGZp8bs3pxHWFCJ/" "ADXQXvT5EBZuAAAAAElFTkSuQmCC") index.append('award_star_bronze_3') catalog['award_star_bronze_3'] = award_star_bronze_3 #---------------------------------------------------------------------- award_star_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuhJ" "REFUOI19kk1slFUUhp/7fdOZzjBYplZBWqHAaJUSrIlLImZioqghsrCGDYoGNbNDFy6MUWtC" "2Bg3piRsjDU0hg0GMVFskyLSgtS/NpjWFKNjCx06nWlnytfpd3+Oi9JJ0wVvcnLfxTnPueee" "q7ijZz6+IIf3pxn6t4gzgrUOax3OOoxx7NlxL92nfuWXEy8pVimyYpy1OCcYfafQLJ/WLIcx" "gjWWtfJWTK2btpjQ8mjdZQ7dcwwdWrS2y8C7AZyx3A40m9fH0KElk/iaJxqvs0nGeLAhzkKw" "hLV3vYHpujqapykWoT1VZnt0BK8xw9PJfu5fF+XKb5NYY7rWAvwVk7vUO1CX3u9Vl8zeF5r7" "2LI5jZfaQyL3GZ9fe4rRv/Jd472vfbAWoGSwJR46v02J+FrD+4OvvPnWY98f2bL7CHhRwtxX" "9Fz0vnl51+hH6OWiUFdmmjtLOQC1NLBxUhI7m0VARBAneKknIbEV0SVEz6NnR7DBLQSF05qw" "8g9hsXBoe5YvI2Y2n3U386f89mwy0nwQCadxYQmnC2ADUI66+zqIRtbjjGZ+uJfi1cJZr4Ez" "AApgroe0s5yLPnKgzW95EQnziLmNuACxi6B8pvuGmb7wB9W5qjhPJgXpfrbPHa/9qvxpkp6m" "J9Hx7gEVa8SZEmIDcFVmhqaojBd4ONNJbFs7iyPn+fPieTs3Nna0tsaNnSz48eQPen4CUYA4" "FArE8l//EA9lOqm/PoD64iCJv8/QurXJt8jRyKqN4FT0+ViqA6UiOGPQczeINrWiC2XqN22D" "596u5UY+fABfVGsNkDvdEncuyPgbdjL/8yfMXhqcEI+fkm3pV/0NCYLfv2Xd2SxLi9MEQKXs" "Y31u1EaIUd6rkjviM+fe4dbA4Em3wOPtxzlcGp/YV98olWuXf+RmNU7Zr6NUVExMKisi3bVH" "nDrJ64szvFctkN31Kd+tHm34DRoWyqn+arG82zcq4jyZcsiJfX3u2P8E+4ovXUezIAAAAABJ" "RU5ErkJggg==") index.append('award_star_delete') catalog['award_star_delete'] = award_star_delete #---------------------------------------------------------------------- award_star_gold_1 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnZJ" "REFUOI2FkstLlGEUh5/3+0ZlakTHFhZjjlAykXQPgoqKVoUSCVFEEEXUomgR/QHCQNCmNu0i" "CIIiigrMCIpMqFxYEJXdJxHJ0TJnGse5+L7f954WNcN0kc7uvTwPh/M7ioryjh8T09yC7ulB" "RMBaxFpEBLGWmo4OePiIUO89VWIClQLxvPLnEliWlETaVCI4vwmM9xPwfcT3cWI5qnaNls9i" "7X8E2iBa47S2Ir5PYEMGZ10Y5mVxYjEoFhGtZxdYreNqNInb0oK7OopamMNp2IqzQRGIRrFv" "PyIzJj6rIHj1apckx+IMj+CuKeBE9uDUr0eiSeTdB+TDUDz89nlXJRMAkP6moLZuTIm4xjzv" "lhuRBYQnD6vanYgtUNW6Eb1o4LYcdrsnTPMaAG2yE5Hd6REFMNPX+FnmLI2I8CsFwQlvgjlR" "xKQRk8FMvsTPf0VQWGPQ2WF06tt+BZC7wQ6ruey2HQ0FInsRPY7VaaxJgZ8H8UAFUIFarGfI" "PLvC5NPBbqeOfeWF+H6Jxdanp3pJZ8xt2onoL4iXQ2we8QugXLxUkrG7132TpWvFOU79NsT6" "/STMXNYWhm7dslNvQASRGcTOgGgULl96r6e8IttL8F8pNO5m2g2G7ptMAlGAWBQK5OcS4TC9" "/Cz3Z40RwKrq9qrwSpQKIJ6HTiVRVQ041XVUN85vfhFn2V8xlmrkWlPQ2vxWt34pmYEzTD7p" "T4jD41Bs8YHaJVuoWdBG6tN4O/Dqnx3UMLVZhRYFJ3pO8rWv/7ydZlXbaQ6m3ye2f7p5YVQX" "NMUc7X92Xa7R8xxKnGJo8ATb/nx7doS6B/u4eKeT15X3PwARjVieA+d/JQAAAABJRU5ErkJg" "gg==") index.append('award_star_gold_1') catalog['award_star_gold_1'] = award_star_gold_1 #---------------------------------------------------------------------- award_star_gold_2 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApBJ" "REFUOI19kutrzXEcx1/f3+84Z2eOdnGZdWaS1bDcQhIhD2RWwgMlpUk84BH+ALVSEp54JqWE" "B+TS3HJtipVLc5tJnY1krts5ZtvZzvf28cDGcX3Xp2/f7+f7evep90eRp+036mXl1Fpa0s04" "8TjvhspjvWXemEUcPX+Mqztvq2Emkm9gjcXL98/OO6z3Q+fP0trmIwS/GGiLCBjn0M5Spd+z" "tv8e2hmsG+rlzL8NjLbEKCQWFGCcZUGunRlhwNjBLmJhnLgkMPo/BjpnGtpev2BCrIpxIlSa" "LoLSZczre8ukgmpanjxG52xDPhPmX1rPvmwqmB8GpZGxSxbHOkmOnk9QsohEx3Ga0lO5cv9y" "w6P9rbvzmQiANFfEtQ+rlUhozIvGfa8y5ckJ2S2qfDniByiqWMjEluMXri2NNrKwcg6ANr2f" "k+sybxRArqnsrRROS4qAiCBeCEoWQ+FExGQQ04PpforLfkJQeGPQva/R6a6NCqD/DKu85kRY" "sy0RSa5H9Ae8zuBNGlwWxIKKoCKj8NbQ8/Ak3Q9aG4MiNvxYiC/HqPKOi9Epa6rDitWI/ojY" "fsRnETcAKsSm3/H+ymlnetk98xB7fkmheCMpM5K5Ax3nzvmvbSCCSA7xORCNIuTjrdNpO0jt" "MPxHjGXr6AvjieumJ4UoQDwKBeIQ7yGgb8ZBrv9zDwC8itaNKJmFUhHEWnT6HWpEKUG0iGjZ" "+MonDUz/I8ZhvTlVEfc+uywsnkbP/QN0321OScCdRHVV/agpS4mV15Bu/1AHPPvrBDG+LlGJ" "yfHPF3fxqan5sO9jds1eNmVepmrbzx7p1AOawX7qfp/6hzoPszm1h47WHaz4vfdwK0U3N3D0" "0hqe579/AwYKV3nB8EbFAAAAAElFTkSuQmCC") index.append('award_star_gold_2') catalog['award_star_gold_2'] = award_star_gold_2 #---------------------------------------------------------------------- award_star_gold_3 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApBJ" "REFUOI19k2tozWEcxz/P/3921pkzs5FhM8WpYa7lpdBSaFq8QFJj5JJ38loykTe8IUpKKUvk" "kkuSSxPmTgyZzsTJbdiZ3c52/s/l58VYf9dfPT39nuf5fH/f+v0eRSjmbb8utdUJbr9N44xg" "rcNah7MOYxwzxw1l/9FHPDywRP1kImEBZy3OCUb/AE3/bk3/MkawxoYRvHAyUE1bTGCZkHOH" "msE70YFFa9sv+D8BZyw9Gc2o/Fx0YKnMO8OMohZGyEtGF8TozmSx9r8OTN39plaG5UaoKOxk" "bPQpXlElc+NXGT4oyt3H77DG1IUZP5ykbtU35CSqvb6smb2w5AploxJ4hTPJS+3j8PM5NL1q" "rWuuX701zCgAaSyNBc4vVyK+1rClceX6DVMvrS2bsha8KEHqGEdueOeWTWrahu4HA931pWRp" "e0oBZBuK30nexBIREBHECV7hLMgbg+h2RHeg255iM58RFE5rgq43BOmvNQqg5yTVLuCoX7Ex" "HilZjgSfcEE7TqfBZkAMqAgqko8zmo4H9bTdf3bWK2DFwEB8O0LCWc5Hxy8u90sXIUErYnoQ" "l0FsLygfk/7Ax4snrO5i69S97PilC0NqSOpBzOh9ffq063wBIohkEZcFCVD4tF47kTZ9LPgJ" "/9HG4qV0+7H4Zd2RRBQgDoUCsYhz4NE9ZQ+X/zkHAE5Fq3IKp6FUBDGGIP0BlVOEFy0gWjyi" "7Ekdk8Pvf/kLqeOlMecylf6QiXTc203brcakeNyMlydW5Y+fQ+7ICtItn6qApr86yKVztoqP" "i305v5nPDY0HXTfTK3ZR296cXNBy6tD7oDegr4eq310PxPuDrEnu4PWzTcz//e7BOgquruDw" "hcU8D59/BxVmWbwXErXTAAAAAElFTkSuQmCC") index.append('award_star_gold_3') catalog['award_star_gold_3'] = award_star_gold_3 #---------------------------------------------------------------------- award_star_silver_1 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAotJ" "REFUOI2Fkz1IW1EUx//vI+SFWMgTP5CXxICVUEqHklIchGKniM6CS6FDHSwd3FxEiXRT6NSh" "Uwdb3IRU8NFAixQCcWinYmw1LUFt60fEKC/vvXM/OmhCQgm927nc34/D+Z+roOmwZ08lxRPw" "19chpQSEgBQCUkpIIRAcHwc+fkLHh/dKndGbBZKxxuM62JDURT41I1BbBMSuAM4hOcflrVvY" "n5xs1FKI/wh8gvR9qIODkJzjeHgYtaEhOD09UJNJwHUhfb+9QPh+Rjk4hJZIgKdSqMZiME0T" "xyMj0Pv7Iba/Q3qUaSsIra7Oy8NfGfwso5JKoaevD5FIBL/jcYjiLuS3Usbc/jLfzOgAkM/n" "Q5qmJaWU2meibPztat+fjhtPooaBi4sLRGIxfI1a77bH09mXRCkiQq1WO56dnS0rAFAoFPYD" "gYDFOQdjDIwxmKYJVVXheR50XcfR0RFOTk5ARGCMoVqtolKpPNIBgIima7XaG8uyOiKRCM7P" "z+E4DhzHgZQSnHP09vZiYGAAwWAQW1tbKJVKWUVR1hoLYdv2TcbYumVZSeO6dc75VfZSwjAM" "CCGwsbHBGWPzmUzmecsQ0+n0ruM493Z2dtaICJqmQQgBcb1AgUAAtm1XiGi0Dv+TwsTExKXv" "+7nT01NomgZVVaFpGhRFgZQSruteLi4u5trGCACe5411dXXBMAyEw2G4rgvTNBEOh9HZ2Rmf" "mZm501awvLwcIqKH0WgU5XIZ2Wx2d3Nz83U+n8fZ2RkSiQSIaKytIBgMPuju7g7Zto1CofCK" "iO4uLCw8LhaLoysrKwdCCDDGWgQtv9HzPGtvb+8HEU3Pzc3Z9fulpSV7amrqdi6Xe8E5v9/M" "/AXk4nc7HI/26wAAAABJRU5ErkJggg==") index.append('award_star_silver_1') catalog['award_star_silver_1'] = award_star_silver_1 #---------------------------------------------------------------------- award_star_silver_2 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAp1J" "REFUOI19k0toE1EUhv+ZSZyJKTSTB11M1WqroWrRgo+NUhSE1u67FF1Yoa7qqpvSmuKuBddu" "FGkXdmElKh2JC7uJJIuqUDSBJkpQKDVN6YNJZs59uLDVBIkXDpdzzv2+zTlXQd25+/amvN49" "gOVKGlwKcMH3QoAJhvPRS3j84ine3FtS9hlfvYARg5C/H3PBwYTYu/+G57F6BGqDwGOQEiDO" "4XGGGLfQ612GxwmM7/Vcai4gj0HHQeiqAeIMR71udPq6EaRW6FoAAdkC8v4j8FxKfP72BYf0" "LoQQRasXgWmaOELHcdSIY/nTR3guS9QzWn2y8jz/zrioqWFfrO/EgZM4Fu5CJBJBuVjB6noB" "i9nXiQ/TKxP1jAIA6XQ6oGlaXEqpERHmc3N3rljXbp+JnwUArK2tYf79s5enW3vuExGICNVq" "9efY2FhJAYBMJvPd7/dbnHMwxsAYg2maUFUVruvC5/NhfX0d5XIZRATGGLa3t1GpVG74AICI" "RqrV6pxlWS2hUAhbW1twHAeO40BKCc452tra0NnZCV3Xkc1mUSwWk4qiLPxZCNu2uxhjryzL" "ihuGgZ2dHXDOIaWElBKGYUAIgcXFRc4Ym0gkEg8aptDf37/qOM65fD6/QETQNA1CCAghIKWE" "3++HbdsVIhrYh/8Z49DQ0K7neamNjQ1omgZVVaFpGhRFgZQStVptd2pqKtV0DwDAdd3BaDQK" "wzAQDAZRq9VgmiaCwSDC4fDh0dHRnqaCmZmZABFdbW9vR6lUQjKZXF1aWnqSTqexubmJjo4O" "ENFgU4Gu632xWCxg2zYymcwjIuqdnJy8lcvlBmZnZ38IIcAYaxA0/EbXda1CofCViEbGx8ft" "/fr09LQ9PDx8KpVKPeScX6hnfgEckW7QD0VN5AAAAABJRU5ErkJggg==") index.append('award_star_silver_2') catalog['award_star_silver_2'] = award_star_silver_2 #---------------------------------------------------------------------- award_star_silver_3 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAptJ" "REFUOI19k09IFHEUx78zs+uMbH8cR1tyLAQXQqIg+nMqoi4Zgbc8BgZ58ObNiyQr3RQ6FQRB" "B+sabIFDe2kPbaxREV201GgzKNMVXZvdmffe79fBlJWwHzx+vB98Pu8H7z0DDefKeEEP9GXw" "+msFijVEFEQUlCgwK5zv9nDv8Tu8vX/d2GYSjQIlAqU0mP6CvHULbwWzhrA0IjAbk51qJOBY" "4NuCC14MigVEsiX8n0Cx4HdI6Nhvg2JBz74YPV4CBwzCkYPN2AwjiPz3B5x98/En2uwEMq1N" "8JIxXNfFSU/hUKoJpfdLEOZsI2M1JuVXT14mM31mPeKLZztMZDpceJ6H5W+LePFhEx8//cjO" "Pbl5u5FJAECxWGy2LOuY1toiotzDQuWwFdZuOY6HarUKP+0hbX5+duWS5Oj8vdNEhFqt9mtk" "ZKRsAECpVFpKJpO+iICZwcxwXRemaSKKIiQSCSwvL2NlZQVEBGbGxsYGKpXKjQQAENFQrVZ7" "7Pv+vpaWFqyvryMMQ4RhCK01RATpdBrd3d2wbRszMzNYXFzMGYbxdGcggiDIMPNz3/ePOY6D" "arUKEYHWGlprOI4DpRSmp6eFmW9ns9k7u7rQ29s7H4bhmbm5uadEBMuyoJSCUgpaaySTSQRB" "UCGiq9vwP23s7+/fjOM4v7q6CsuyYJomLMuCYRjQWqNer2+Oj4/n95wDAIii6FpbWxscx0Eq" "lUK9XofrukilUmhtbT06PDx8Yk/B5ORkMxFd7uzsRLlcRi6Xmy8UCo+KxSLW1tbQ1dUFIrq2" "p8C27Yvt7e3NQRCgVCo9IKJTY2NjA7Ozs1enpqa+K6XAzLsEu7YxiiJ/YWHhCxENjY6OBtvv" "ExMTweDg4PF8Pn9XRM41Mn8API15DFtZvAAAAAAASUVORK5CYII=") index.append('award_star_silver_3') catalog['award_star_silver_3'] = award_star_silver_3 #---------------------------------------------------------------------- basket = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnhJ" "REFUOI3Nkj9MU1EUxs996evrKw9ayKupooRCJKCBkIiJgzHGoFQSYcAaB3VwMDEaRgd3FzcT" "TYxRU2Fl1MbA4KBp1LQKoTBQrQ8jqAHbpveV++e83rooiQbR0S850/nObzjfB/BfK5fL+dPp" "tLmdh/xpcXXizQVLubcP7vZpCzQE31w+fuv8gYe/+7Stjq9MZMcChnpUC/gbCxtWQ03XGnR/" "/cG5m0/G/goYT2b7NCWnQi0mrBU+QgxW5spf1yHUYoJGcOrU+J2+bQGjHfx61CfAWXSgtcHL" "nh452R/y1l85iw7YZAOOdsClX34wPz9/1/O8I4gInuf5pZQdvb29ZCr1TPR37TEcx4FoNAov" "ZpfYyLFD5szMzAYiLnPOARHXNET0IpFIDyGkR0p5zTAMkk6nX3buDBuFQuGsaZqQz+fPtNtB" "c3p6+r5lWUHG2I3u7u4eznkHyWQynUqpd+VyuVXX9SKldB/nfNXzvB2U0mVCSKxarTqe5+1y" "XfcLAEQRsWQYxmqxWExpAwMD713Xrei6vlKpVIYDgUBWSnk8GAzO1ev1uGVZb6WUQ01NTQsA" "EA+HwwtCiMFYLAZCiOcEACCVSj2VUl4slUpFwzC6GGOfhRBtAFCglMaUUh+q1WobY+xzrVaL" "AECRc+4g4qgGAMA5v0cIWdE0bVjX9TnG2GAoFMpQSuPNzc1Z13Xjtm3PKqVO2LadY4wNIeIq" "ALzebGIymcR6vd5IKW0nhKxRSruEEHkhxF4AWOKcx6SUn6SUUaXUfkS8PDk5edj3EyCl9Akh" "GCKCEAKklPAjWkDEzanVakAIAaXU461a/E9KJBL+RCLhBwD4Dp0zYJyL/xlBAAAAAElFTkSu" "QmCC") index.append('basket') catalog['basket'] = basket #---------------------------------------------------------------------- basket_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAr1J" "REFUOI21k01IFGEcxp932nF215FJUVvToFYMN/Aj2iKkIir7ogw0pEMFdejQh4eCiLoWRNAh" "KAnp07NElzyshw7J9uVWpiuUNe4muoq6s86Mu++87+xMhwoq+rr0XP/P/3d4Hh7gf2p4eLgg" "Go36/uQhvzuc7H51WHbM62urPELcUDBn0o5rh9bc+dkn/Or5RHeszSs59/PegiI1KxfmRaFQ" "LHBvH7zyqO2vgI57sXrBYT1KiQ8z6ieswMRgZnoWSokPAuE9eztu1P8RsC9Izwc8FhIjCVQW" "2rH9LbsaFXv2eWIkgVKSxeYgjv2QwdDQ0E3btjdxzmHbdgFjLFhXV0d6eh9bjSuXSYlEAoFA" "AP1v3udatqz39fX1ZTnnSUopOOczAufcLisrCxFCQoyxs5IkkWg0+qy6YrGkquoBn8+H0dHR" "9uWlfl8kErkly7I/l8tdqq2tDVFKg2RgYKDacZwPmUymUhTFtGEYqyilk7ZtlxuGkSSErFhY" "WEjYtr3UNM0pAAHOuSZJ0mQ6ne4VwuHwR9M0dVEUJ3Rd3+31emOMsWa/3z/ouu5OWZZfM8Z2" "MFmLa6XvJlLKm/iY/6maLZqGZVlPPABAKX3KGDuqaVpakqQGy7JSuq6HAajj4+NrkuLL9iWl" "Rdge2uitKqnB4/hD77PhJ0gRKyx8BXQRQiYEQdgtiuJgLpfbpijKgGEYO4uLi2M6nT/dWNuA" "vJBHQ0Uz8oRjfV0TKNH3CADQ2tr6QNM023Gc3lQqFXJdN5JMJpuy2WyfqqpNmYVZUSQyWkKn" "AABntnahurwehBDJ861PxpjHsqwc5xyWZYExhq/VQjPnEJ+MYnCyH+ea7+Jy5Ai8iyS4cOlv" "t/C91h2vuLgsqFxoqt+AmsBqjE69RvRtP8bH5q/+E+ALJHAZhBwnQJELGHDdzhedU+c+AyTt" "X40NpbslAAAAAElFTkSuQmCC") index.append('basket_add') catalog['basket_add'] = basket_add #---------------------------------------------------------------------- basket_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAr5J" "REFUOI21k0tIVGEUx893nTvX61wdHbVGzXylaOGDrKhNhLbIICvsYVAuWiQ9cBllEG5qUW2C" "oggLdSVhBJEuVCywpgdjaD4WWcO10WnyMY73G+d+jzt3WmRSkdam//Kc//ktzv8cgP+pkZER" "q8vlklfzoJUa59re1Slm6NbWdRZhFNthLkQabp4of/C7T/jT8Nm2gZpYyWyNxFrjPWHFFhEF" "m2iN3j9+rbPmr4CGloESwWQddocMM57PkANTQ8Gvs2B3yCAg3rGv4XbJqoD9uaTRaaGgjqmQ" "YTMGDlVXldmN2TfqmAopKAy7cuHULzsYHh6+axjGTs45GIZhZYzlFhcXo46uZ7SsIFNSVRWc" "Tie8GPygV1dsl3t6esKc8wlCCHDOZwTOuZGamlqEECpijJ2XJAm5XK7XeWmJksfjqZVlGcbH" "x49kp8TJ3d3dzYqixOm6fqWwsLCIEJKL3G53nmmaH4PBYIYoigGM8UZCiM8wjDUY4wmEUM7i" "4qJqGEZ6KBTyA4CTcz4vSZIvEAh0IQCAvr6+BYRQgqZpNbIsP5qenq5TFKXN7/fXJiQktHu9" "3toNC2PtiSNP56IhLZmKQoCUHnD0aEkXLQAAhJBXjLGT8/PzAUmSSimlXzRN2wIAHq/XW75t" "sLnakZ7MC+obk6WcTaC/73aM9vfCjsngemEJcA8hNCUIwl5RFId0Xd9tt9vdGOM9SUlJA+GA" "93R+xWEx9tNzQK3HIM7zGHKyHLCW+PYuX2JLSwuPRqPxGONshNAMxriAUjpOKc2vfHvjZeX1" "hwhtPrgcX7ApDdz9s1HLjwJjzEIp1TnnQCkFxhgsRQvhWBuEBzvB9uQMUN0PYQDAWgxEYsC3" "4i/8rP6jaU1WxXYpMyVisQiTgGcMUP0xEUbMy/8E+A7JvBCe89ULJsoyheiUCdE7Vb3m1W8K" "n15nYex2mQAAAABJRU5ErkJggg==") index.append('basket_delete') catalog['basket_delete'] = basket_delete #---------------------------------------------------------------------- basket_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvJJ" "REFUOI21k11MFGcUht+ZnW9mB1h2XfnZVtAuqxggCBZoQ1yaJpQYrXpDiUZtmxpDYjTYpE3T" "3vSmmBpvWlIN1lZKIWm4gBiT1bQXrUHiuCo04mLEpozrzyKw7v/Cznzf7KxXcNEoXvXcnud9" "kpNzDvB/1tTUlKgoirwaw72scWzg748KzPTppjKBv5uyI5LWuno+bOj7L8e/KHx0YKLdKpm/" "Zq2iTV0qyM8SPp+IufMHT11qf6Wgq39iC2/SYbtTRlh9BDdCk/H5Z7A7ZfAcG97ddWbLqiP8" "efXakP8R26tGFuFCYuLE8f2NX/94wR/SxLfflG6h1TYNS0EtFp+NAlroYy4QCJw1DOMdxhgM" "wxAppRW1tbXc8OUren1luRQMBuFyuTA7M0LffUMW5aIW2N1bEX9wHXf+6KM8Y8woLi6u4jiu" "ilL6hSRJnKIofs9rDklV1X2yLEOY7/mu7a01onPTNmSi95AJ3oCt0IVCZxnhxsfHPaZp/huP" "x9cRQqKpVKpa07RZwzBKUqnUw4aiiwfclVt/cHh28PrTIWQiHBbuL2FxKQvfjHWUb2xsnEmn" "00lCSCiZTO60Wq0TlNK2vLy8SU/+lS8rKuvOODbu4rXZn8CRGEiBDUJaTaikHnNJ/C4AgKZp" "1ymlh2KxWFSSpDpd15/mPen9qqbV+6194x5ooV7wxABNurEwqiwGo/y+v0LTFxljt5cF5ywW" "S4jn+XZCyIgl9Nv3m+ubPy2peR907mdYxBy0xAYsjPrppURz/vSTiMsw2CyAmytr7O/vZ7lc" "zkYDpz/zvre92+BKsNZ5DWtKRGiJcoTHbkSno/JO3+PXddM0axhjRwYHB73CsoBSKui6nikt" "daDa24n7Q5/jnzEF0vo6pOceYCy22Tm/JPizWQMcx8E0TR8ArAg6Ozs5APjmcDWjd32Cu64F" "iXAED28F0oVFdm93zy+Ty2xHR4f40kv8wOvINHhKhaaqCuSIrujh8Ce7TgbUF/0MADwH+apT" "PJHnRKsAAAAASUVORK5CYII=") index.append('basket_edit') catalog['basket_edit'] = basket_edit #---------------------------------------------------------------------- basket_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAstJ" "REFUOI21k0tIVGEUx//3m7neeTr2mNQmM6eysRgttNr1oCINKnoHPSCoIAo3QYs20aJFbSIo" "iqAyoSCQFkVD9DAouj5iQlPLiqYpGnGcUXO8zL33++58X4teGGarDpzF4fzPb3HO/wD/M7q7" "u/NUVXVOpJH+1jjS+HKvh2vnF8+wk55RHwY1o/7cnuqrf+rIeMOHG6NbHAq/nnPkeWNZjzsn" "E7ecJ67sPnNvyz8B9Q3RSsJpk2+yE6nYZ5Qh0fk1mYZvshNEYk3r6y9UTgjYGDSOF9lNxF/H" "EXBb0a0b6hb6rHRb/HUcU6UsVgRxcMwOurq6LlmWtYwxBsuy8iilwXA4LDVFnpgLy0uUeDyO" "YKEOaK3cWbKPPHj8PMsY+2QYBhhjKcIYs/x+f4UkSRWU0mOKokiqqrbOLi5QYrHYTrfTDq/x" "KBGct4oMvrnW5fF4XLqunwqFQhWGYQQJ5/xsX18fhoeHA0KISCqVqtZ1fdPAwEBVJpO5X8Lv" "XpxSWhvIL14Ev9I/c7qtZQeltLm3txeMsVekpqbmg6ZpGVmWE5lMZp3D4YhSSte4XK7OaY7E" "fhvXD3mnFiCXuYOiygM+F8ndylFjbVlZGUzTfEYAwDCMlpGRkcDQ0FAknU5XmaZ5P5lMLJmj" "dCwpWrANMF6ivfEGPAU6CnhC1Jb22FVVpYyxjp+Ay5IkJQgh62RZ7tR1fXWxJ9vu8Ye3eydl" "wc2PgODIaS8QXHlUsuWyJyVu9ANo/+XEhoYGJoTwjo6OzlKs/pFF+S+a5y4/GHLIbeD0y4+b" "ybC5q5F8TxCJ3P186PTD0l8+oJTaNU3TGWNv3BjqKyyvC7m8aQhrEJBsiN5+B4CDG+/gLy/F" "XGeq8OmJ+fPH/YW2c0u/hHfdDNhIHMIaBiDGeM/mnIdkTwfe3jnZZB8PwEzqiF7erAsuIDj/" "nkLgdy0AzgEuir4BPw9oQ6kd3mwAAAAASUVORK5CYII=") index.append('basket_error') catalog['basket_error'] = basket_error #---------------------------------------------------------------------- basket_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArdJ" "REFUOI21k09IVFEYxc99M2/ePLWmrKkR03CMcCrLyEjoDxIUFWTgRESUQYvZVC5bRLtyU6ui" "oILE3AXWRnKRZIE1Zv5B0QycnMZiHEOdsXnz575777uvlUFRtuosv+98v8V3OMD/1Pj4uCsc" "DuvLecjfFpfah5uKZObu7g1O5YPhwUKGNt8+t6v1d5/yp+OL7UNBtyYfW27XimiuqNBSlULV" "ZT86e/N58J+A5rah7YpkHZ5iHXPRL6hAfHTx2zw8xToUwjuON9/bvizghJ9e9TlNxCZiKC0U" "QycbjtZ4xHx/bCKGtSSHej9Cv/xgbGzsvhDiAOccQggXY8xfXV1NOrpemTWby7RYLAafz4c3" "I5P5hoN1end3d45zPk0pBed8TuGcC6/XGyCEBBhjVzRNI+Fw+F1lySotGo2e1nUdkUjk1Gxx" "m35nsAkFRe6CfD7fUlVVFaCU+sng4GCllPLT4uJiqaqqScMwtlBKZ4QQ6wzDmCaEVGSz2di4" "pz1R7g24J+LD8M7t83tlWTSZTHY5a2trp3p6etKqqsbT6XRQ1/Wn6XS6aYA8aJc6s5ltEaZw" "u3T1ZhLw7YFBsxjNdU7tXHMDiUSi1wkAlNI+xtiFVCqV1DRth2maCeFiOLTtPLFsCUtaRMLG" "zPevqN6wFxmWJ/e/XMYmx7HIEuChw+GIK4oSVFX1aTKZPEMVBsuWmF6IgEsBITm4xZE2DdSU" "7UeG59BPnz1RAKCxsfFZKpUSUsquRCIRsG37BRUUwhJYv7IcvpUbUeLxQ3Xo8K4oxfDXt3gX" "ec+zHLXOpTwZY07TNPOcc5imiZyToq3vFphkoIKhcu1W1PkPY2D6DXo/9iIwWx/ubH0x8hMQ" "CoX+2gsASF3vyxJFL3g9+TLuMAuPuA3PJLBMmX5XxTVkLdtRYMLyf2vB56X5D4rcYx1f/WHO" "AAAAAElFTkSuQmCC") index.append('basket_go') catalog['basket_go'] = basket_go #---------------------------------------------------------------------- basket_put = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqVJ" "REFUOI2Nkk9IVGEUxc/39PlsGh2NN2EF5RiZGhaRi6CIiEop+kMw0SaiwKBFLiNa1CoIinZB" "VAtB2rmswRT6j4QYGRaFlimmRtEbne+9+f7c977XpoKikQ7czeXwg3vPYSih8727YhUp5MUC" "fCqa3s6Jsn/5rFIAgML2lk4c3ngWMtIlXSUBzDblYBZiBkSgkr7yvxdXB/bP+7qIuqXNACwY" "w5BZ1oLN1xZ4oajUx4uxuyigzNaplpptqEttwVc+jQXhYXv9EYAlkg/eP5ZAsPgJk5NXNr0P" "HmHCe4JlS1fCrVqDka9PMV2owrbKu+6BrhsbFwUcapAXyj9fxlBwH+++9+Gd9xhD02OF5f5x" "uKyInQ04/cevRkdHb4ZhuIOIEIZhhda6obW1lfXmHqq+9EnH8taja9V1PB8ZEwd3bV0yMDBQ" "JKIpKSWI6JtFRGE6nW5mjDVrrc85jsMGBwdfrF1R6xzN3z52InkJ4+PjR+vdxJL+/v47yWQy" "IYS43NTU1CylbGDDw8NrjTEf5ufnV9m27XHOW6SUs2EYLuecTzHGMkEQTIZhuNL3/S8A6ogo" "7zjOrOd5Oautre2j7/sF27ZnCoXCvsrKypda6z2JROJ1HMcdyWTylda6vbq6+i2AjpqamrdK" "qd2ZTAZKqWcMAHK5XJ/W+lQ+n/ccx2kUQswppVYDmOCcZ4wxn4IgWC2EmIuiKA3Ak1JOEtEh" "CwCklLcYYzOWZe2zbfu1EGJ3KpUa5px31NbWvvR9v8N13RFjzF7Xdd8IIdqJaBbAEPsVR3d3" "N8VxXMU5r2eMfeOcNyqlxpVS6wCMSSkzWuvPWus6Y8wGIjrT09Oz/XcTtdblSilBRFBKQWuN" "n9GCiH5PFEVgjMEYc+/vDv23stlsRTabrQCAH5pLe5ziQpK+AAAAAElFTkSuQmCC") index.append('basket_put') catalog['basket_put'] = basket_put #---------------------------------------------------------------------- basket_remove = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArFJ" "REFUOI2Nkk1IVGEUht/v6p2rt2kc5RpiZM70gxZTLSTsTyqsJCopmGhdEAXRMqpdRW2CWgUR" "LQSJFm1alIQSBYVETJSYLfrTfjTJuKN+d/x+zr3fbVMhgtULZ3POw7M5LzBfYrD9D5LxlluL" "CvMyAMrmOxxrWx61LtjDlrrZer91eNv4fdX134JzjzfFq91tbHnNdqQS9Uggbpxa9znzvU/f" "/afgyuMdcXbBZiyp3oAfwSiKpXEsSTWDsXDdj9zwkclH5upsvnyuIKLE1NDEM9sv+W7G2wgL" "FXj44Taef32FMrD0XN6au/gyer6t+P2C+3lqAICBZcUY9t+gM/cUGyvvLNx78tqavwo6s/Js" "XbkCQhuIDVgMlCOBkTcj8NgMtmZxdDbPBgcHr4dh2EZECMMwobXO5nI5dvlRHipSKIopzJDA" "2pnTYt/21sq+vr4ZIvokpQQRTVhEFNbW1jYzxpq11qccx2H9/f3P2tNnsd6cOHSg5hJ2sjMH" "Gz23sre392YymXSFEBebmpqapZRZVigUlhlj3k9OTi62bdvnnK+SUo6FYbiIc/6JMZYplUoj" "YRjWB0EwDqCOiIqO44z5vt9jtbS0fAiCYNq27dHp6endFRUVL7TWO1zXHYjjuCOZTL7UWu9K" "pVJDADrS6fSQUqo9k8lAKfWEAUBPT88DrfXhYrHoO46zUgjxTSnVAOAj5zxjjBkulUoNQohv" "URTVAvCllCNE1GkBgJTyBmNs1LKs3bZtDwgh2quqqgqc847q6uoXQRB0eJ73yhiz0/O810KI" "XUQ0BuA5+/2Orq4uiuN4Iee8kTE2wTlfqZR6p5RaAeCtlDKjtf6qta4zxqwmouPd3d2b/zRR" "a12ulBJEBKUUtNb49VoQ0Z+JogiMMRhj7s3t0H8nn88n8vl8AgB+AuFodtqolwGRAAAAAElF" "TkSuQmCC") index.append('basket_remove') catalog['basket_remove'] = basket_remove #---------------------------------------------------------------------- bell = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAq1J" "REFUOI2V0ktoU2kYxvH/uaUmTZNa29pqK+20VaszDHXlKIgLRcUbWmUU1zOLARdDVyLCKOh+" "QJRxdi4ERRActY07EakoqHht7cWkrU2iadP2NDk55zvn+1y1U2+I7+pdPM9v877wnfP6+sob" "L662it6zzdcAzG8WbrXW4FFjKTHu6lZXSI/uXByuIpUf3PVNYKh75T++z45AEvdUKBorq9RH" "+3JKU55WLKmerwKDt9vbpAieRuu2LYov34umApzRHrz0E+IRoQ2PT/114HTq5BeBoZ7WTsOq" "vFresI949Y84YxcICjlELovSolQ3LSGVzR8GPgaS3avrfSUvhpes21JRsw/LcHFSZ5Gug/Rc" "9PAilO+AWcXSCrNlrmcO/tfehuHfcYWsq2o+pFU27sabSGCP30U6Dn7JxZkuUhZShEyFChS2" "I+U8IDxxvrqtoz5Wu53AHUBkzqGLaZTwmJmwEQUPURKYlRoYJjKQTM/K7P+ArdrLyqtxC2/p" "671BKCSxVJQyIBa3GEnbGEphKA29fAWlmSKux4M5QC/a6mbm1TN83yMSaWHsVYxMNkJy5D3F" "2RItq6OYusRzBEGgmHyXx/eDf+eB9UeHf8/0v+1NPbrFip/XIopFftmzi46tv9I/LBl4Pklj" "iwVoBBIy6WL+yN9jiXkAYFPXmw3vhidfv7zbTf2qdjJDacKxCD+s+Yn7T/I8ejhFbY1F4Lrk" "bZleeHZ9btl2PLkq+yZ/rTDVx+DjeyQuXCY3msWUiocPbAaSDsJ1cEsy+kUAYO/J5P58bnq7" "PZFmaZNFY0eY/X9sZHNnE7WtUewpD88js7Dz2SceOJNMANqlLk6l+idP1C6roKGunEJWMToy" "i+/JxMK89imwcK4cxJhZ3HDMFxx1BYbyeayU8dufl1PJucwHhoBNh9ZYUGYAAAAASUVORK5C" "YII=") index.append('bell') catalog['bell'] = bell #---------------------------------------------------------------------- bell_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAt9J" "REFUOI2V00toHHUAx/HvzOzO7nZfeWwe23Rt0yZpVmxrjIquImIsiVQtrQYUCqVXpadcFBGs" "IPTirUQMnjwIaqFgq0mrF61tQ5G2RFJiuptnu8mGfWaTnZ35z8zfUyqCofi7/z7wO/zgf2b2" "h55L0+e7xI1znRcAPI8s/NTVgkWLV4qsqXpHdDV0pDHQxGIp/fojgcx4z5e2zWuOS9SSeiji" "a1CXZ/JSkZZSq8uJbYH0lWS3K5ypUPugP9pxFEU6GMsTWCt3iO4Qyly2/Mnbny2e+U8gM9H1" "luZtOB/cdYxo7AmM+2M4m3lEPodUQsT2NLOYK70L/BtYGO+N29L9OtD81KvhlmN4NRNj8Ryu" "aeBaJmrAj7QN8DTRFvbs2+p50heT3Wj2r6Zw25s631EaEm9gFS5TzV7FNQzsuolRqeHTJbpH" "Ih1J1XDdh4CwxBex7r54pHUIx7yHWB1FFRWksFgvVBGbFqIu8DQooHlwHZfKhpv7B6jKpC8Y" "w9x8wMyNS+i6i1eG8AGRqJellSqalGhSQQ0+Rn29hmlxcwvQTg409jq20e9vTFAvC5ambUwn" "QLmYJRzUiHf42CjWueXE+b7Qxi8FnT81f+fOZyNK5trab9pX46WLw/3aoLFxP9HZnyI9Oc3L" "J4aJdexl6o+/qOXLzDUnmIn0kHr6eQaeGcLyFb352tIrwS4trAK8NDKfWpsrzt69Ok58f5LV" "zAqByA72Pn6AyTslfnzg48neQziqw6H4YRxF8NyBFCDfV7e2DH60sD83X7qwWZ4hffsal8e+" "Jb+cw+NK8htFvEqIN5OnARgZGGNf60EUFP9DAODomYXjpXxlqFpYoW2Pl0RfgOPvvUClusZ0" "9jpnfz4FwNkrp8isTSGRdWW7H3wzsvtTxZUft+4MMykEt3SV1MEX6W7v497qba5P/c7yfOXz" "bQGA74bR1ht3fWgLTk9qTnhWR3cUNAlVpBy9Obr6wd9Hj0nzjFSH7gAAAABJRU5ErkJggg==") index.append('bell_add') catalog['bell_add'] = bell_add #---------------------------------------------------------------------- bell_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtRJ" "REFUOI2V0ktoXGUAxfH/vd+dl/PKTCZNJtMxSU1qAl3YZqUrRSHWV4k24iPg1o0odqWiVkEX" "btwUi6IIIi4kKNpqYn0QqVARFzYYTHWmZNK8hiaZydzM3Ln3u/f7XCXioxTP/vw258D/zO+f" "Hzw7PzUoL5wa+BTAum7hy8EuPLpCWq66ZuhE2Ezcm4llqdRK910XKE8ffNv3ORoo0p4OJ1KR" "DvPKwoY2tGe02nrmmkDp3MiQksFcomcsmi4cw9ABzpUZvLVfSN8gjcur9ZPHX6u88p9AeWbw" "IRHqmIrvHyedO4Sz/A5BcwO5UUUbCXL9nVSqtUeBvwOL08N5X6sPYp1H7kp2jRMSLk7lFMp1" "UJ6LGYuifQesLN1J66bdnlU6MzKE8L93perJDjxidBTvx9v8Cnv1PMpx8NsuznaLSFgTtjQ6" "0NiOUnuA9OTp3NDhfGrf3QTuH8j1tzDlNlp6NDZtZNNDtiVWhwHCQgWK7R1V/Quw9UgknsNt" "rrBw4SzhsCKkE0SAVDrE0pqN0BqhDcz4jbQbLVyPn3YB8cSdmeHAd0ajmSLtumRp3scNYtS3" "VknGBflChJ2tNk4lYO27JaqzJcJX7a7JA4gPL+sfxLvTtTMTo2LM2VkuDozeRunHeW6fnCBX" "OMDcz5dobdRJeQK53c2hY08y9Pgz9BZy8WazccfDqa2aAHj/XP29B49EHrNry53JzmG0Msn0" "JBGYzH47h3WpxuGJp4mVZzHOv0nIWSSc7TVXypXhvRnHXli8+bOX+SSRXhgvbVW4+LVNd183" "ltKYLUW0ZwDueXbvL9bJPEIb/cY/jzT1fP+YofVMvi9D8ZYCVuDz6xuz3PrAJPGlL3CddVqA" "3RD8VmblX8BuPjrR96qh9Iv7epNkGj5yXVHM+ljmMvZVn8V1EXht9dI1AYCPJxCNzP7nfMlT" "2TaJ+GbVCPs6qky9otCnj36jXv8THRZLAGMr4t0AAAAASUVORK5CYII=") index.append('bell_delete') catalog['bell_delete'] = bell_delete #---------------------------------------------------------------------- bell_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAs9J" "REFUOI2V001MXGUUxvH/vXdmmBnmzkxhRkFqKULBwRJsF36wMC40amzFfiRt07jUjemKRZdK" "jAuXJkRjF5o06opogrWgMSa1JsRqSVODbQlQxlJmph0+h5k79733vscVpCaYxrM9eX55FufA" "/5yZse4L06Nd3uRIx7cAoYcGLnZlUWTD4i25ZngoYiZe3xVrIr86e+ihwNx492e+z2uBJqUk" "kkg2pM07N8tiiDJqdZn4T2D2x9w+7QXXEy2vRFNtgxgS4NyZQBWukYp7xvzS2vvHP8wP7wjM" "TXQds8Lp0cbdR0hl9uMsniOolvHKJcRIkNnbTL60egr4N7Aw/mSrL/p8rPngS3b2CGHLxcmP" "oF0HrVzMWBTxHQg18agd6tzKhWa/y+3D8i+5nm5p6jhppB8/jFr+gcrSZbTj4Ndd6m4Es7Gd" "WDAHgVBxtN4CTE95n6Z2P92695mzRmNS4RU/waxNIZ5iY7nCetlBRzIknziFa2bQgWZ9U5e2" "G3gVyTU0ZnCrd7k5eYFIRBOWBA1AMhXmnpsg23mMZOsB7k/baHcNV3Flu0GtIt8Xb/yJ7yvi" "8U4WbyQpluIs/H2falUTsZuwM2mCjTEe6XubShUCrC+2gefOzL9TvHV3Mj91kT39T+HVajz/" "xiEOvHyC5XWb5txbUJ/iyvmvSKQdgsCip3tPdBsAeGHo9sC9+ZWZvy6P09qTozhXQLQi0z6A" "vauGdm+DaILN3+l4cYhAqQ9+/WjABrC2pC9/Xhs53B/tN9jMrRQK1Eol2g4OYukpxF/hsd4M" "omtE4g0Q7stuLP5R//ynwiXzwSMaHF44ulpef1XUJi373yRulxF/GQyLq9/MABpdnyHb3U6g" "1Lu/vNfba+x0yr99/Oxi3+mv2yxzAfFXAXlga2LFeihNX+PW2PDojr/guSp69dxRR7SgtQ5J" "ICERDYGIiFYiImgNWlr+AY5+V3NRobmaAAAAAElFTkSuQmCC") index.append('bell_error') catalog['bell_error'] = bell_error #---------------------------------------------------------------------- bell_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtdJ" "REFUOI2V0lloXFUcx/HvvTN3lmaWTDqTfdomzdLYCtYNLViEqqlokKKCfbHPPvgUFNxAxeJT" "3oJLH1V80EBRQ5OUirRJEwpdRKgkNmk6SZtMMEOWyeTee8495/g0iksp/p7/vw/84A//M799" "3zV8fahDTg22nQYI37NwpiOHIOcYueTbTn/ETjyXiddRWJt9/p7A3EjX50HAs0qTFiaSSEVr" "7cXpVWMZYW17ZvSuwOzZnk4t1S+Jxt5YuuUFLKNwF0cRyz+T3iGtm0vr7790svDBfwJzox0v" "hpzaoZrWY6SzB3Bvn0JVVpGrKxgrQXbPTgora8eBvwO3RvY1BUZ/Ed/54FPJ3DGckI9bGET7" "Llr42PEYJnAhXEdDMry32gvP/tDTSSg470vdWNf2ilWb70OUxigvjaNdl8DzcTe2iUYMkbDB" "KEPZ1fpPQAr5abbzYFOq/ijKv4EsfoItNzBSsFkqIysC6UkGE7VUAsm7jmJjS6/8BZRNT7Qm" "i1+5w/TUMJGIxjEJokAq7bCwXCZkDF5M0Jq9jzcXr9KnzJUqEDpxJLNPBe5DsUweb12ycD3A" "V3G+jNlcqGguRyNMOWEaMl0caD7Eligzpgvd+b4dA4Uz28ICuDDQNplszjy+99Gj/HhqmN7X" "XuWN8W95ev8JlNEordAYihu3ydTUM3XzHFcWzmtt+XVhgMP984fGTpoZ3x/pauruoTi3jBcI" "lNEUSjeQOiDQEqkkm36ZB/JPsCW37UvzEyW7uqX3nVvdK/Nrpyvr08xeu4gXeAQqoCG1i8bU" "bprS7TihOLlkC1cXLzIxN/F7RfKw9c9HGnp7T69lzOhXu2x8IRBa4AWC9ux+Hmt/hssLk5yb" "OVsUiiPFj/n1X0A1X/fv/tDS5r365iStjXGOF65xf/5JJqd/KldC+pGlj5gBuCsA8M3LhDYz" "rW8FktcHWu7kfGNbB0vxw999tjVevfkD2wddzWNPGR8AAAAASUVORK5CYII=") index.append('bell_go') catalog['bell_go'] = bell_go #---------------------------------------------------------------------- bell_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAulJ" "REFUOI2V0k9om3UAxvHv+7558zZLmrxJU5tm/bPGtmuoRXQXkUIGTtswhxQ3qcgQPXnozaMX" "PexQLyIMRfHkdaUFN03nrXjoFJRuUJj9M5J0ebNoapcm6Zv3789T1YIyfO7Ph+fwwP/M1jfj" "tzaXRp316yMrAIEnFr4b7cWmVxWOYcnq+0E5cjEeSlA62Hn1icBuYfwL1yXv+cRsEYxENV3e" "u18XkrClo45Y/U9g5/vsmO949yKpma7Y6deQhIe5t4pd3SB2ypEeGI8/vHyt9NG/Aruro68r" "qr4UHpgjlnwG8+GXeO06Tr2GkCIkz/RQqh28CZwEioWJflf4X4d6nr/Q3TuHqliYpev4lolv" "W8ihLoRrQiBBX3fg6eNeYOdmdgzFXbMcP5UYmZf0wUvY+7dpGj/gmyZux8JsHKEFBcGAQHiC" "pun7fwGO7XyeHHuuP/rULJ61jfPoM2SngXBsDvebOG0bp+MQ0CVQAvieT6Pl1/4GmiKrhZNY" "7Qr3128RDPqoIoIGRGMq5WoTRQgUISGHh+gcHmHZ/HQMKG+/FJ/wXPNcV3yQzmOH3Xsum/sD" "bDRepMIFNusJ4pKBgsvS9nlqwVfY88aGzk5kXV3X7ypfFQ5uXjmnzJith4MDz77AjW8NQiN5" "3rr6Dul0mmi8n7t7LuVmiotX3iOTGaWnJxm0bfvlYrGoSsdTbl8782vJio8/6JznjavvUrjx" "KXd+qZLqTzM1NUW1WqVer1M1KkS6o4WFhYX88vJyQz4GZj4onl3fsLcjkSgA4507dMwW8/Pz" "TE9Pk8/nmZ2dxTxqiVardRlA13XtxJF+LiqfBFPGx0Bk/WAQIXVYXFwkHA4D0G63EZKMqqor" "AJVKpSP9E5icnMxmMpnlXC6XGjqd0gLaqVCtVmNrawtN0xgeHqavrw/Xdf8ol8vy2traoxMA" "oORyualwOLySTqd7NU1TJISaOPyxHfAsftOnwz6ya9u2axjG7+12e+5Pj1lKlW6LVG0AAAAA" "SUVORK5CYII=") index.append('bell_link') catalog['bell_link'] = bell_link #---------------------------------------------------------------------- bin = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAshJ" "REFUOI2Nk09LK3cUhp/fzGTCJJPBfyVSxCqJFhsTxFGQy4XWhYV0Uah22X6A3pUK3dXl3V1K" "QerWRbhwiRS6yxfIMgupghJMFgo3KzXEJPPvNzNd3JpW8EJfOKvDeXhfzjmC/6F6vf5zMpnM" "d7vdytbWVv2/PfGxof39/ZfAN/l8/vvt7e0FwzBot9tupVL53XXdP4+OjuoA6nPDe3t7PwC/" "lcvlb1dWVianpqZIp9NomqZZlvXi4uLiy7W1tbtGo/GX8hxA07RXOzs7uYWFBSYnJ+n3+3ie" "h67rFItFNjc3c6qqvgJ4AojjWMRxLJaXl5cLhQLj4+MEQUAikcB1XQzDoN/vY9s2MzMzKwAa" "QLVaVRVF+ezk5ORTQLcsy7y6uiKfz2MYBlEUIYRgOBwyMTFBrVZDCGGMALqufy6l/CWKoq+k" "lKbjOOLu7o7Ly0scx0EIgZSSZDKJ67rMzc3Rbrc/xK1Wq6bv+2+KxWI5m82SSCTodrucnZ1x" "fX1NLpdDCEEYhkgpkVLS7XbxfR8ARQjxdTabLU9PT+M4Dq7rYlkWGxsbZDIZWq0W6XQaIQSp" "VIpOp0McxwRB8AHg+/5P8/Pz3N7e8vDwQK/Xo9/vI4TAtm1arRZxHKMoCqqq4vv+U0AQBJ9o" "msbNzQ2u6+K6LoPBgOFwiGma9Ho97u/vR5vyfZ8wDP8FeJ53PRgMWFpaotPpcH5+Tq/XYzAY" "AOB5Hp7nEUURURQRBAFRFCGlHEV412w2MU2TUqnE6uoqlmUBEAQBYRgyNjZGFEXEcYyqqqRS" "qZEDtVarnZVKpaLjOF8sLi6iKAqKoqDrOo1GA4D19XUymQyapjE7O0uz2aTdbr8/PT39VTxe" "4MHBwR+FQuE727ZHVg8PD2PTNMWj5X8qCMPwvZTSrlQqt0++cXd390cp5WspZUdK+RCG4dvj" "4+Pj5/7lUX8DgHJnGQDeZkMAAAAASUVORK5CYII=") index.append('bin') catalog['bin'] = bin #---------------------------------------------------------------------- bin_closed = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcJJ" "REFUOI2l07+qGkEUx/Hv7s7s6qogV8E/VRKQSHLVC2kFA5JXsUidx8ibGEiTwtbK0kaIWGS9" "3GIV1yvqapBZd1IpKVZuIL9mmMOZD4cDA/8ZI6k4HA5fr1arL1rrT47jvBJCSMMwME1Tb7db" "T2s9KJfLXzudjieSgCAIflQqlXeu6zKZTACQUpJKpYxarfbmeDx+9n3/I/A+EQDqpVIJy7IA" "aLfbAEynU/L5PLlcDt/36wCJwH6/N+7u7tBa0+12UUoB0Gq1cBwHwzA4HA7mTWC5XBqDwYB6" "vU61WqVYLF5gHh8fmU6nPD09cROQUpLNZhmNRqzXa06nE1pr0uk0rutSKpXQWt8GlFI0m00a" "jcb1LqXE933m8zn5fJ7ZbAaAmQQIIXAcB4DFYoGUkjAMcV2XIAjQWl/3kghEUZRUxrIslFIv" "A+fzmTiOExGlFOfz+eUJLg1/J45joii6njeB7Xb72/O82LZtyuXyFdNaY5omm81GB0FwBLCS" "gPv7+wfTNO10Ol0oFArYtk0qlUIIgRACz/PUbrf7Nh6Pvyd+JoBer/cTeJvNZo3LyFEU8fz8" "HGUymV9hGH7o9/vhrff/nD9039Y0wLxRwgAAAABJRU5ErkJggg==") index.append('bin_closed') catalog['bin_closed'] = bin_closed #---------------------------------------------------------------------- bin_empty = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqhJ" "REFUOI2lkz1IJHcYxn/z4YSMs7MaOHeJsNFm40bcqIMg2FyTwNlICtMlfRqxOSwSsTjShRSu" "vRA5kJWr7awVFAxaLewWJ9xWZsf9cGf+X5PmXHJwV+WFt3p5fzwvz/PC/yzrU4OdnZ281vrz" "crkcbmxsGM/zVKvVEsfHx70kSUStVks/Cdjb2/M6nc6PMzMzP9u2/a3W+gvbtvE87580Tf9u" "tVp/HRwcvAYy92OAh4eHnVKp9HJtbS03NTWFEAKtNY7jTPX7/e/6/f7q1tbW7P7+/iv7v4tZ" "lllZlln5fP7l5uZmrlKpkM/n8TwPYwy+7zM9Pc36+nrO9/1fAVyAer3u2Lb91cnJyZeAt7i4" "GFxdXRFFEWEYYowhyzKklDiOw8XFBZOTk5+NAJ7nfa2U+s0Y81wpFQyHQ6tYLHJ+fo6UEtd1" "EULgOA5SSpaWljg7OwPArdfrgRDij4WFhReFQoGxsTHiOObm5gaAubk5LMtCa41SijiOieMY" "IQQAtmVZ3xcKhRfFYpHhcEiSJIRhyOrqKrlcjmazyfj4OJZl4fs+7XZ7dA6ALYT4ZXZ2lvv7" "e3q9Ht1ul36/j2VZRFFEs9kkyzJs28ZxHIQQHwKklM9c1+Xu7o4kSUiShMFgwOPjI0EQ0O12" "6XQ6I6eeLB0B0jR9OxgMqFQqtNttbm9v6Xa7DAYDANI0JU1TjDEYY5BSYoxBKTU64bjRaBAE" "AdVqleXlZcIwBEBKidaaiYmJkZWO4+D7/kiBc3p6elOtVheGw+E35XIZ27Z5H1suLy8BWFlZ" "IZfL4boupVKJRqNBq9V6d319/af1lMDd3d038/PzP0RRNJJaq9WyIAisJ8nvW2qt3ymloqOj" "o/sPnml7e/snpdTvSqm2UqqntX59eHh4+LF/eap/AVVicNff8FRBAAAAAElFTkSuQmCC") index.append('bin_empty') catalog['bin_empty'] = bin_empty #---------------------------------------------------------------------- bomb = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtpJ" "REFUOI1lk7tvW3UUxz/32rVv7OA0bRxbRYDUZkKkC+UZ0UQoW+jaETExIP4JJG8slRhQJQSd" "K5gIapCryCyhoiVSMdgJcmqckNgQObl2r+/j92SyFZSznKPz+Oiro3PgjFl7P2X37s78L7fF" "JQD1kI/sBpdslRl7n6lx3RkHyd6d6w78CM6OY00D7Hfpa4Matc/eNZpPreJFa/hFa173brFy" "DiD37nyOw1vW2rfD2PpS2dyM28jXHnfD5SsPpi5cXHGM30VFOz9bzT0M1anbtN0xwFga2tg3" "661Yf72hi0/28nnhvMTNqzu5C5ffdxwxTSou4YbFd4wkM3WbNsAEcG9Dv3A6ENnXrnnecbfF" "D5u/s/mojRl1McNDCCJ4HmETyVE/+0nwDWWAFEClUrnxz/HpF/XWsHB9Ic/TZ5bqwxqXX36P" "rc6rvHHxATJ+hpXPeeyX+PCr0vGXP81u9vv9oxTA0tLSx+Vy+dbWo23+7Ob4a/+IVqtFqVRi" "YfaQp4dXSITl2+YCOSfhMHmluP93tzsYDGppACHECkCxWKRarRKGIaurqxQKBX7ruQRBgf1/" "Lc1ejq32LNlsdjKTBoiiaNEYQ7lcZm1tDWMMUkpGoxGj0Yg4jvnjJE+SJCilyGazSCkXJ4Aw" "DPF9nyAIMMagtUZKSZIkRFFEHMfEcYwQAqUUURShlOKsgrrv+8tJkhDHMUoptNYIIYjjmCRJ" "EEIghMB1XYbDIVLK+gQQBEEtk8ksO47DaDRCSolSCiklQoiJ11rjeR79fh9jTG1yB77vr+/u" "7jYAjDFEUUQYhufkp1IpANrtdkNKuT65g06nczQ3N6cPDg5uzs/PZ8fyx0sDyGQyuK7L9vb2" "UEpZUUp9PwEA9Hq9X6enp087nc7VTCZT9DwPz/NIp9MopTg5OaHZbDaUUhWl1N1zzzS2crl8" "Q0r5gZRyRWu9aIzBGFM3xtSstetKqSdn+/8Die3TStGnNdYAAAAASUVORK5CYII=") index.append('bomb') catalog['bomb'] = bomb #---------------------------------------------------------------------- book = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeZJ" "REFUOI11k71qVkEQhp89Od+XEBsVRSxMUCKIMelUUBC8ABGvwEIQSy/AiwlopVaKKFgYrCxS" "i4UQtIxFfsDknN2ZeS32RPLzZWAZWGaf+Xs3ATx4vrIo8zdCm5DuCCEBEtXp/wkvlH57/evL" "F1cAWoBwe0ri2tL1+bTxZxtp/xFUWKCAre2/7PUi1F5msBYAcW9pcS7dX77E3MUlVAmEomaN" "mv386VlmZ1ruPnzGYQA6s7Q4z8e1n2xu7qIIAGK/CgmF2NrZpeszB622ECm145arN+ZZuHAW" "d5CCCOEuPAILsdcVXr9dPQ4Qwj34tbHDuBnRdR2lz1jUe2OKdjTm3KlpQjoOqIMMzAt93/Po" "1kItvy4CSax8+UGZGXHk/VCBRPHAi2He8Gr1O30xzIVbYCRG4zHZ6lAnAsyCXAo5QM00aTSC" "RkQKIoLsiewnAqCYY53RF8c8KB6Dr3ASmLcoJgKG4L7QF6/tuMgDxFw0CSz75CFG1CwlV4CF" "yBa4ByVEKc4UDWVWk1sIiWyO9UZfghKBmyjhlDJoQU6xOGkL1KDstYUIzAIzYVa10CjhpqqZ" "iN+HdSBB03Dz9jJKCXdhLmLwGtSYsyFB7rrVoxV8/vTh25P68w7oH8GRn4l4t772/vE+4B9O" "lcycZa1hZQAAAABJRU5ErkJggg==") index.append('book') catalog['book'] = book #---------------------------------------------------------------------- book_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAl5J" "REFUOI11k82LjlEUwH/38b7vTFgw+WiEycfkY7xDydeQkix9/QcmJSWlbCzsWLBnFrJQrLBQ" "Fr4SwyRJEWayIFkQo7zzDmae+9x7zrG4zwjDqdO53e75na97HMDOIxe6LMoVwxrgegzDDDAj" "GfulKoHgm+8eXDy+GKACoBIP4FheX9nhhr80MZtwggRTTGGk+YNxb6hVFlFKBQBja71rodvW" "vYCF7XUsEVDTFFVT9NkzpjK1tcLm3Qf5E4DNrHd1cOPpGxqNMUwVAJ3IwgxTY2R0jNwX/C6p" "BHWuUqvQuaqDpXPbEAEzRdUQMUSVqMZ4Hrh89f5kgGGIKO+HR6llVfI8J/iCqOk+MoVKtcas" "aS2o2WRAaqQSJeC9Z+/6pSn9NAjMjAv3XhNaq/zlX2ZgRhBFQiRKxqX7Q/gQiWJIVCKOaq1G" "EVNT/wmIUSlCoFCwrAVXrUJmqFNUlUIchfwXACEKMY/4IERRgmhpE9zFJ3xoPmXRsiZt7aMs" "2FQ/fuv0y5MloHzsAz5IKkeMooTI+ADz5g6xdsUG5rd1cm/wGo9fPTyx/lD7jCyNMUUJRQIU" "URkPQhEEH5Wxb3dZs3w1kgmr23cgLrCx3gPYoWziwxRRiD7ig5IHIQTFR8F7ofH9M1U3nV0r" "DgNwdPs5lszpxuFas4keiBhSCD4kzUPEe6UolK+jDQY/PuLUnV4ATt3u5e3wCwzLy10wyDLW" "bejGnEPEiGJoaZ3fw+MXN+np3sL1l33UXIWB5/2AO+sAtu47c95gf9q83/4/BuWZ1n5oeQau" "wOAbZn1P+j4d+wm6UcsrZWpjSAAAAABJRU5ErkJggg==") index.append('book_add') catalog['book_add'] = book_add #---------------------------------------------------------------------- book_addresses = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqdJ" "REFUOI1Nk79vU1cUxz/3vWu/2IlJjHGbIFxqA6naMtAoiKEKXSoxMGZBHcpQiYGd/4CpY9WF" "tUOlMFWoQyPUoa2IRIUoAleC/kidhICAEIId2+/5vXtOh/tCuHe451zpfu9X53yOWVxc/FhE" "bgAzjUajNBgMKE/eAQUAUVD1iQikKXS35b/rSw9aAFZVLxljWq1Wi36/T6FQoFbN3yuoA8EA" "0Nv1l2EhaJIvC5xtNBrMzc2xsLBAtVoB9n9V9I2bMCwyfnUTxoEro0fUm59ZEalOTEywvLzM" "36tfI45cYP+UPO714cvsIEsnfiDYfj47LLqKBUwQBNTrdeY/OANGUFH8zmP1qs6N+PHeFgDF" "gmHoqNk9u8YYQuvtO+1z5OgZQhthbcTqo5skSc8LqaIvnsFY8KYGqCppmrLz6iFjpWMc//As" "66u/Eg9eUoxKvH/8PO0/lghD4VDX8NO3kySJ++t72LbemsM5b/Od6SaD/haHj8xTrbUYjWIe" "r/3C0dZpNjq3UFEqjBGU4tnLQzRQVUSEJEkAmKo22Fy/TWgj7qx8w6D/lGebdylP1HEuQ/L2" "BUWDgVrgARHSNM3ByZAsRiQjTWJUMjIX47IRqgICPY33MMDuOciyDIDd7hMOHjpGebzGR59c" "IIoqNE98zquX/yAIVvvMm6vo62QnYtrX4G2Bzr8/c/LUF9z7/RoHJt9DJSWwJTYf/0ahWEUU" "KsG79MpbU9HAqVVVnHNexHlrTzZu05w9hzpHmg358/51CMHuUQZQKALhPgeqiktjxCVsrK2w" "1llBjSfRFHIqjaBAd7gOQ4BpzwHAzMwMxagLRvIJ8JOkRn3xAHGO1+WYT0/e+q7dbl9UZcqK" "yM1Op/MVwG7yFAHUa+Rd2XdtfH6j3W5fBDCGnf8BrRR3dVQ2UWYAAAAASUVORK5CYII=") index.append('book_addresses') catalog['book_addresses'] = book_addresses #---------------------------------------------------------------------- book_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmRJ" "REFUOI11k8uLzmEUxz+/3/t733mNhXsIM4aRYcy4FEIpskBJ7CQrJVlhZWFhIfkL2JJZueRS" "E5kpExsLC0mSXEYkRhozk3nf3+85F4vnHXennk49Pedzvuec5yQAu45e6HTRK44PQ7LRcdwB" "d6LzH8c0EPKRN/cvnVwEkAGYyiESOrqWtyZDn0dwnwiCCDPc4OvIN2q5Y5610bAMAGdzV2dL" "sqV7AS1zu/BIwNxiVovZZ01tprmasWn3YX4H4NO6Olu5/eglw8PjuBkANqHCHTfn6+g49bzg" "V4slWJJklYwlK1ppnz0dVXA3zBxVR80Qc2r1wOWrA38DHEfVeDs0SiUtU6/XCXmBWLwXSmTl" "CjMnN2HufwNiIw3RQJ7n7FnXHuXHQeDuXLj3nFAt80d8Q4E7QQ0NgmhKz8Az8iCIOiqGkFCu" "VCgkNvWfABGjCIHCwNMmknIZUscSw8woNKHQ/wIgiCJ1IQ+KqBHUGj7Clw3eYPGLa6wZGuRL" "pcqUbemJ7f12tgFoPM4DedBYjjpFA9Lx+iYb8gd0HDhMU1sntSd3efbg7uk+f/4tjWOMWUIR" "AYUYtaAUQcnFmPe0h6Vb9lJ9NUBycR/Nr6+zsHVmSfFj2cSHKUSRXMiDEcxQcYIpIThTxj5R" "ndMGO4//rP3UXEqeLPzRA1VHC40lmCFiiDgizmjzDMYf9zL51hHy2kfGgbHRElriQ2MXHNKU" "teu78SRB1RF1rOFHVu3n6cNeWqZPIiuVGfssDH5M1N3OTSjou9P78GDcvF/+Pw4O/T6frbaa" "le/6mFGApel7w87v6Lcz3wEe9dEnQ0cEnwAAAABJRU5ErkJggg==") index.append('book_delete') catalog['book_delete'] = book_delete #---------------------------------------------------------------------- book_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsJJ" "REFUOI1tk09oVFcUxn/vZf6kk2kmWmwU25n8K2rGiSioEFuhpdRCaUTqwoWgIIgrNeJSsHTZ" "RTcV7CKCYKHS2k1pKSWkhCjdqDUiqVWTDonESKKZzNCY99699xwXzxmU9sDlwoXzO9/h+64H" "8OnJi0W17gdFK+D1K4oqoEp8aeOIM5iwWh67dKYLIAEgzh7FY2Opt+DNL1RRrTdBDBNUYKm6" "zEqoiCY6eVEJAJTdpWLee7/vbfLrSmhMQFTiqRJPX9OWIdOcYNfeY7wKQFeVigV+vTFJpfIM" "FQFA6ipUUVGWas8IwoiXK15BPC+RSvDO5gI97atxDlQFEcU5xYlgRVkJDN9fGf0vQFGcE6bn" "a6T8JEEQYMIIK/G7pYlEMkVv+jZf9f9O00d9LB+qKMHsoUSdJE6wzhCGIft29MTyYyNQVa5e" "G2JH+jGvlQ6S69zKUnkDd38b+jJWoIpxgjMW63y+Hf2L0FisU5wVOtLX2be5SmtuF4tTd0l5" "Ea+3riX7Rj7XAFgrRMYQCaifxksmwVfeSv3JZ5sWaevaQzh3mVTGY3r8b6KV8GkQ/tv/AgDG" "OmxgCY3DOsE4YR03OVAsk+seIJj9Bj9lSWYLBIsTIE0f7hwcvu/HAImbQkNoHIFxrKqOsb97" "ilzPAMHsefykIap1MDNyg7MjrWwdHB4H8GMb4xVMFAPaatf4OP+IN4ufED0eoimlhLUCc2M3" "+XziAyaX0g0b/XpgIuuwoaXl0TAD+XmE9czd+RohYHlxPeXRO/zYfIInUfZ/cqDEgYkcvTpC" "77sXuHf5NPev/kE6v4Xqwhy/JI+SyaxGmcSJzLyiAFXwfbbv7OPe1ALRxM90bnmPlpYNPLz1" "gPH242Tbu7FWUIUoCBpx9AB2Hz43pHBEUdb+8wXbOtewfWMH01ELV8p9VEy28TNRfrr+3am9" "dcBz7R6pNArIEXcAAAAASUVORK5CYII=") index.append('book_edit') catalog['book_edit'] = book_edit #---------------------------------------------------------------------- book_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnhJ" "REFUOI1tk8tLVVEUh79zvJrXVLQ0E8xL+eSalkoGBlGDhlIW1KRRQQRNiiYNgmjYH9CkUfQY" "9KBBEBU1iHJgz0FE1KWwKCJ6cL1Ses7Ze63V4Gh1swWbBRvWt36/tfcKAMYOn+0zL1cMK0Iw" "ahhmgBlpst9HxeHi0tT988fXAGQAVPwBAnr787ngy9cSZgtFkMIUU5gu/WQuNtQyq5mPDADG" "5v6+9mDrwCraW/uxlICapl017d7cUENNdYZN2w9SDsAa+/ty3HzyhmJxFlMFQBdUmGFqTM/M" "EsUJf0dqQYMgU5Wha22OzpZliICZomqIGKKKV2Mucly+em8xwDBElPdfZqgKK4miCBcneE3v" "PRVkKqtoWroENVsMSAepeHHEccz4SGcqP30IrPSUr28v8Vz28E/9vAIznCjiPF5CLtx7Sew8" "XoxQIsaartLRtZViYQKzbBkgXAB4ryTOkShYuISgMguVWfK1L8itHqW+dZDW5BGr6qf/BwDn" "BR95YidEXoickJXP9DBJXVMDMnOdtoG9bGt7RUW4CKB4UVzsUoATnBPy9oC2vp0QPePRuYvU" "NszRXfuBoba4HKCaWnBJCki8slwKrGsJqGucReMpMEV+PGbNlqOM54tMnBqt+wMwI/GCjz2x" "UxKXMCS3aWhfj84+x3SO4V09aPKJ6uoCg5t2AdGRshmIGJIIsRM63SQ9XYPU1H3D/HcIKnh6" "rQAoGhVo7s4hSXLo/ol8fn4XDMKQDRsHsCBg+ONdmvOnIXxHWN8MGCP7dvx2XZHtoGPbsRWv" "r588Of8PuHPrxuT+dPOM4d4SD8/sxtQw1bIcqJfAJEEV1Fb+AoPDoIDwy2OgAAAAAElFTkSu" "QmCC") index.append('book_error') catalog['book_error'] = book_error #---------------------------------------------------------------------- book_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn9J" "REFUOI1lk8trVEkUh7970x2NisQQMaIm+AI1dhDEB+rIuNCdiPgHuBBkFsMwuHLhXkGX/gEB" "Xam4UVHwlZiIDuosBKP4QGLAiEGTTtrOvVXn4eJ2S9QDRRUF5zu/80oADv7b3+uilx2fhGSX" "47gD7hSX/zimkZhX3z+4cGoNQAnAVI6TsKGyqSf5PFHFvekEBcxwg6nqN2Zzx7y0moaVAHD2" "Vnq7k319q+heXsELAuZWRLUi+tL2BSyYX2L3ob/4GYAvqfT2cPPpWyYn67gZANZU4Y6bMzVd" "J8sDc61IwZKk1Fpi/eYe1i3rQBXcDTNH1VEzxJzZLHLpysDvAMdRNUY/T9OalsmyjJgHxIp/" "oYVSuZXOhfMw998BRSEN0Uie5xzevq6QXzQCd6f//ivi/DK/+DcUuBPV0CiIplwcGCGPgqij" "YggJ9fQkH8drkBz7CZA2ASJGiJFg4Ok8knIblNuwchvW0komgZWdG2nvO0/SYr8qgCiKZEIe" "FVFjKvyDWSSYEERY0bGejV07mMm+8fXgEJ1Hli4a/Hui1gAYokbMI3lUohpigf29R1E31BTD" "+Vgdo7JyN7Uwy7MPg9WtZ+hotLFIIYYCIOZkGlA3Rr+8IZogFokamc5n2LLqD2qxnv73fvhL" "qTkwQRTJhTwa0YzMMkSFZYu7EVPUjfHqBzoWdfH/2EOG3w1PBOXAjxqoOhq0SMGMuuf0PzpH" "sEAmgbWdm9i55gBPRoe592JQs4Q/P51mpLELDmnKth19eJKg6ohexdQRdVyd62N7SNI2hl4+" "w55sv/bp7tDI3C7cvnXj8bFi8+bMPw6Nd221cv/1AO3jJ+48v3v2cLON3wFZNdgPkh5AUgAA" "AABJRU5ErkJggg==") index.append('book_go') catalog['book_go'] = book_go #---------------------------------------------------------------------- book_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqNJ" "REFUOI1lk8tr1FcUxz/3N79MJDaNTRMfRRNtoymJExWrrQ8qLgKCL7pvcVEJLlyULsW/wa1b" "RReiyUbR+KBG0ooKASHgo6kSI4qYDpnJmMz87u/ee46L3yREPHA5cLn3c873PAzA4T/O9aoP" "VxQtgdmtKKqAKpnTxSPB4ezs5OiF098CxAAS/ACG7ws9nWb6/1lUFz5BBhNUoDw7T80qovEG" "6hYDoPxc6O0w+/vW0bGmgGYERCWLKln09hVNNC2L2XP0BJ8C0K8KvZ0Mj72gVKqiIgDIQhaq" "qCjlSpXEpiy1TIIYE+djNm7upGtVKyGAqiCihKAEEbwotcRxefDe5wBFCUGYmq6QjxpIkgRn" "U7xk954ccUOetuWNiOrngKyQgg8Oay2/7OzK0s8agapyfuQZ62uDnPphgsFqiaejSzNQxQUh" "OI8PERfvPcU6jw9K8ILH0OdH2La5QkvPn6z++gzHNn13YPuplzcXAd4LqXOkAho1YhoaIFLE" "CJuSEfq7Jmjp7md+apjWld1EFTs0fFKP1wHgfMAnHusCPgguSN0rHdF/rCgcJFSfsKxtLUl4" "wzf7tjb5uZmzdUD9sXVYFzI5QUnrkPe+FVd6RZQrYqJ58l8WIaky987m6m3MJLg0A3hRUi+0" "+UkOfHGL5mZF/FsiKUPUjLqU55f+TZ5NzA7ECwOT+oC3HusEJ0K3f8SO+B+27O1H09uY8IHx" "GzXSUhkjjtdT5V9/u/R6aLEGISghDZkEEX5qeczWfYdJi2eJ4xbG76bc+XCI0amY4ov7bx7/" "/WBoyS4oRBE7fuxDjSEEJU8ek3tLrrGd8dtz/DV/hJn2XdiXY5Rr7u6nk6jcuXn94e/Z5tXn" "f7XDFu9TmbFceN7DhDMoD0C5Ojl27dgC4CM+n9Eb/WEBrAAAAABJRU5ErkJggg==") index.append('book_key') catalog['book_key'] = book_key #---------------------------------------------------------------------- book_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAq9J" "REFUOI11k1+IVHUUxz+/8c69m+OfnVSGXdLBUijX0TcDS6kIISJEQdoKRBAkpIcgfBB87GXF" "IkJ86kHIp/Kht17SpHrYoBWEsNxVdJbde5sda2Z17sz98/ud08OdlUo78OMHB87nfM/3/H4G" "4K0PL06odV8r2gGzV1FUAVWKSx8dcTl5unz3hy/PPAvgAYizJzA839hRN0vtZVRXiqCACSrQ" "XY4ZpIqot5VheAAo+xsTW8yruzazZayBFgREpegqRfdNo6tZPeLx0sH3+TcArTYm6nz7y206" "nT4qAoCsqFBFRek+6JOkGf+MYgQxxvM9tu+ss632NM6BqiCiOKc4EawogyTnq8vXHgcoinNC" "c+kBfqlMkiTkaYaVIm9ZhVf22VgJENXHAYWRgnU5aZpyaM+2Qn6xCFSVi9//Tj5S5j/1QwWq" "5E5wucW6Epeu3STNLdYpzgoWQ9n3yWxh6hMB1gpZnpMJaCnAlMtQUsQIIkLmDJn7XwDk1mET" "S78/IF64yfqsxdbaRu7MR8QbdkNQ4eHdad55sUZzbIL2zpOn5ubmLgwBgnVCNkiYv36F3eNP" "8fZ7R4njmOcWFrjy488kuop3jxzGL3tEUcTMzMzZZrO5abjGYoTO/C22Vx6y77U3OfXxZ/x1" "71fGx8ZoNBpEUcSnn5wjDCPw13D6ow9oNpsnvJUHk1lHvDTPul2bARjZ8Qb932aYnJykWq3S" "6/Vot9t8fv4C93sVAEZHR4NHHjinGK9CGLUA6F7/BlCmpqaoVIqCOI4pGXhmbZ4AI4uLi8nw" "LyiUSux55XVu/3SZq99d5fCBlwm8fbRaLWZnZwmCgHq9Tq1WI+4PzPT0dDcMwz8MwP5j579Q" "OK4qkHVZ07vBeG0DQeBjgFuddVj1eaH6JwaRPEsHYRi24zg+9Ddv2qO4G3uCcwAAAABJRU5E" "rkJggg==") index.append('book_link') catalog['book_link'] = book_link #---------------------------------------------------------------------- book_next = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAldJ" "REFUOI21ks1LVGEUxn/KHcNB5yNpVDAi04UimWmLalrowqIghP6AIAqqRS1aBoWraBFBi2pR" "tggkEBdCCUYh4ibLr9TK1KExLMGxFuOM3vue83pbWEOiu+jAsznwPOcH54F/nLyz9wcbRYTO" "qy0jAG23njeKCDmtCiKrDD24PLJtwPXOd75nhP7B4YvrwOGDNQ/xLaqKiqCqTCUWCQQLm1YW" "FyY/drWbTQGu6/p9o/M8ejW9aNVwobWu/OShyk1XGs/fo6ioiHTG21N9tPdxwWL4VFd7lwFw" "RkdHaa6rY+9Op7y4OMTu0ijj4+NYa8lkMsTjcYzxEFMArotxJb5S+P0DUA2Qt7S05KdSKZLJ" "JLW1tcRiMW5OXAPAqkVFEaMYTzCuUGB2YIwwPTMzMXz7fb0zOztLOBwmnU7jeV4O+0jJMey6" "Rdc1J7GWH6s/EatkMtn9mUvZofyqqioAfN/Pma1axArGmg2pwVODpy6eehj1MCKop+LMzc0R" "CoVyZt/3UVH651/nsI1r8FyDcQ27ImWkllLMfEqMJzqScaeyspLl5WV8389RtB+4g6qSTqep" "qKigpPkK4XCIwrKhtmTh8DPx5GuiI9kA4ESjUYLBIJFIhEgkguM4BAKBTYGqiqrybbJmrKJ+" "YaBgJXj6D7HTcO4uYoS2eA2+7/O09w3yu0D2t9HajW+4rDHX8eXE3x1xmhrqAOgeeIuKcry1" "edvO9/S8gLWte2d4bAoxQllpDGstfS/7tyVYtxbI3xKQB7DvTPuTbDbTYlUJhaOfE903WrfF" "+B/zC625eTTAVzayAAAAAElFTkSuQmCC") index.append('book_next') catalog['book_next'] = book_next #---------------------------------------------------------------------- book_open = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhBJ" "REFUOI2lk89LVFEUxz8Td8yGnBmTsnSKfviIRGph7QZCIYNoIfQvuGoTtGoVtGrfxkULF0E7" "F0IFtol2FhqSbVQEbRYFI4SvUXz3nPNui+c8FKaVZ3nO/X7P55x7LxwzCgBTrxdG84yAIIgI" "b5+MLwFMvnw3KpLlRATZE0T2+DL9eKmQiQuLl/pKpKlhlpKakXhh6/efm957BvtOfycYqoqK" "oKr82PhFsXTqtgtpukjhBM8eXs8h0jRl/tsWqz+b86bKvVs1Hty5egR9dOoVXcXiogMwMwBW" "VlYwyzqNjYxw5Yy70NNT5mJ/L8vLy5gZrVaLer2O9wniu3AAqgpAFEWYGSJCo9GgsbnJ8PAw" "SVIiiiJEhDiOAfBJgj/ZhQsBVASAtbU10jRFRKhUKsRxTJIkeU1VabVaDAwM4L1HvMelpsiB" "QRRF2aJUaTabhBDymYeGhlBVdnZ2ssvyHhHBqSriPSEE1tfX8x2Uy+Vc3K61CWq1WmbgDxkc" "JvDes729TQghp2gTtHcgIqh4nEomAOju7s47lkolqtUq1WoV5xzFYvGIYXtUJ+LxScLdpzOI" "F0R8jjdZv0EIgTcfFrKOqtiB0MxQUZyIcHnwbMd3Pvv5KyrK/YmxjvW5ufe4/f19NuO/B52P" "EpzvP4eZMf/xU0eC1Cz7TJ3i2qMXM7u7rXFTpVzpXd2YfT7xv7PHin/ZG4/t2teD9QAAAABJ" "RU5ErkJggg==") index.append('book_open') catalog['book_open'] = book_open #---------------------------------------------------------------------- book_previous = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlRJ" "REFUOI2lk09IlEEYxn+r36op2mq0q+SaqRCKVihBgUEKGUSFIHapY6WX6OClQyWdOnYtPHQI" "tBIhoj/YRSJICytTO6gEbocg2vyz7ur3zbwzXwdzxT8E0XOZmWd4nnneeWfgPxHYTLQ/nszq" "P1erLvaMNKRJDRqN1preq80fAFpvP2vQWm81uHxvtNJmSAgCo2W7crHWYIzFGoOnNENvRjst" "cLS++i6+wVkTdk+2ZyWXip4vTsgN39phAhlcO70/bWytZfBjjKlve7uNKE4cLOXU4Yp1g9RS" "0RcjtnRtbYwBYGJiAmMMIkJTbS37ipyS/PwCopFCxsbGVkvoetvxuTi75ICIEJuPoTxNciGF" "5yqW5pN4riK5kKL3Uj+zs7PU1NQQDocREZyu4c53kWDkQHleBWKF0rwyxArLykVbzYp20Ubo" "63uI7/skEgk8zwNgenoax4rREhCUUYgVxAjaCp7x0EbjibfKKQHA9/30vVRVVeHcOdbT2PHy" "wqfU8vKhnMwdxH7E+Dkf3xBdeRrRskHs+z4zMzPrbTz/qG1KuapMEnVXstXxnsWFRZ5cP4vr" "uogISini8Tjj4+PU19cTjUZRSq13QQUy6rwV72nmYuOkOKsCgJycnPSJubm5hEIhQqEQjuMQ" "DAa3PqQz3QNHMpzM4blfc2it0Er/GVfnrY3V+L7PgxcjaK3XE6RrI/hda4/yPbs3bwEw8Po9" "ooWTLU0AWw1c18X6HrOJpW0TFEfCGGMYfDXEtn/hb6hsu3U/lUo2GxEKdhZOfR242fIv+m3x" "GyNqZPqcnASUAAAAAElFTkSuQmCC") index.append('book_previous') catalog['book_previous'] = book_previous #---------------------------------------------------------------------- box = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcJJ" "REFUOI3Fk71qlkEQhZ83voVIiCQmxC8JSIxYiBAbvQYbIYWNjY1g4Q0Iol0KL0BBsBdsbaws" "LETESmwUgpDCXzAE1Hw/O3OOxb5fohgrCxeG3Vn2zDnMzoH/vRqAO9dOTU70d+7R6AJqJgzI" "IIwNdt1Vk++J715/8GEdoLl/ZWkm1G5M945Nz/aWoWmgA8n8EiYFJQpf379j68vm+o2HH2+1" "oQMvjiwuT88urPDp7XPK8AdKSEPKhCBsJChhpuaPMzW/Qoib6xd9uhWeWz17jpdPHtH/tlXB" "HShkMiFkSkKk2N54zcxgxImTq2x93lxrbZhbPMra5atoOMAKFIkzyUgcBUWgMj4nKsHE4R6v" "npnWBofob79Box0UQkW1SEmiCJXsQqjUYpOHlpChrc0RLkkOsjJEolGSITTqwN2dQmTUO7tT" "oJJoGOQwUAlyly27XLiMgZ26yKrAGEWSg0IZlH3lZhFOoVGgNM6qZFeBRyKGQfbLX+SqMkYt" "5HSNcQ9UkuwHORjtLzeFUjiEx5PVTWlrQxZxcPFM/YE01t5jq2OUwf7NB8Y0ty8tPMbNeWlv" "3qsX/vSBDa5IjLF4+s9u/Al21vbDVSQAhgAAAABJRU5ErkJggg==") index.append('box') catalog['box'] = box #---------------------------------------------------------------------- brick = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAntJ" "REFUOI2lkz9ILHcQxz/779TD271FOPGp6VQk2Fnb+eCRUlI8CCkf+ITYhtcnkCa9NgELc4de" "ldrGziouKiIXZaOnIHjuLXp67t5vJpXHe8ZU+VTDzBfmO8OMxSvs7u7+3G63v0+S5A1AGIZX" "5XJ5Y2Fh4dNr+i+o1+uVWq2W6QtqtVq2ubn55qXeeu6Ypun7JEm+AuwgCJiammJmZgZV5fj4" "mLOzM9I0BZAwDM+DIPi976harXY/7xbHsW5vb2sURRpFkW5tbWkcx184qlarXQCnXq//5rru" "vKoyMjKCqnJyckKv1yOOY66vr/F9H2MMY2NjiAhHR0ekaeouLi7OuCLy3dzcHJ1OhyiKcByH" "y8tLlpaWXu6GYrFInud0Oh3K5TKtVutbG+iMj48zMTFBEASUSiUqlQqNRgMRQURoNBqMjo5S" "KBRIkoQsywjDEFXtuKoKwODgIJ7ncXd3h+d5pGnK4eEhAHmec3t7S7fbxfM8AFQVVcUVkX5C" "RBgaGmJycpKHhwdEhJubGx4fHymVSriui2VZGGMwxiAiuMaYIdu2UVXyPMcYQ57nWJaFiNDr" "9RgYGOjvIsuyfk1EBm1gd29vjzRNKRaLOI6DiPA82nOsqjw9PeH7PrZtc3p6iojs2Z7nfXNx" "cfFhZ2fnr/39fSzLwvd9XNcFwBhDlmUUi0WGh4eJ45iDg4O/W63WD4VC4Z31bG1jY6OS5/mq" "qn6cnZ0tT09PY4yh2WxiWRZXV1ecn5/fq+q64zi/Li8vX/ZP+XPW19e/Bj6p6vv5+Xmr3W7T" "bDa5v7+v93q9n1ZXV//81y+8xtra2lsR+VFECsAvKysrf/yX9n/xD16Kioq/LFKkAAAAAElF" "TkSuQmCC") index.append('brick') catalog['brick'] = brick #---------------------------------------------------------------------- bricks = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtdJ" "REFUOI2lk01oXGUUhp/z3b+ZuTNtE0ubdDpQaR2bCaONllSQ4koEN4rgyoWgUhEVofsw1J2g" "YDeCQheFrrKsG4tpwErBiFbiD9ZixpAEa/Mznczcn7lz73c/FzEUIq58l4fDc855eQ/8T8ne" "wnetVinKw6kkTI6d3A6umKC70+jv4/Zo5VXPKSyVXP+H0xcuRAD2XoAa9Ocbg+yMSRJyk+M9" "/ChkGUlng1Oxviw6ZVn3FoCnANReQHl1Zdqt7KM8OQWuQ3/5Dv21NrgO5ZOP4foVysu/T395" "/u06gN36tFUKk3Aqy5Jj3hG54s62UfU64bffIKnm4NPPAtD75Xv6P91CpzElUZIruwRgp040" "P1ItnElSxTBLEKVw9o8ijUminxcJ27dBDFkQoRyFEgvkweJqW+5Pl9wSJw4fx1YOYu34alAU" "J5rYR2tknQ7KUciu5yZ/ABiSyONHn2Qr6JAZzVDZ9K5dBQST56A1xpidyUAa9Qj10MwVH3mo" "1bpasi2x8AtlGkeaVPd3mX/pABM3lqnd+AL/wCGKk00s22U4iBnE26yMHOar+suSjVTnNtdX" "F2wRRZalDLMEz/Eo12p8fnaTwuJpnv/zJtWb19G54a9ikbn6c6yMTTJx/BDZ/ZB2YE/bSotZ" "798TbTRaZyQ6JTc5izLOE2++z7VfV1nrJDTq4/gAS+v81t5gkKRYblFsp1t85vrC/CwVM9as" "NfE9H9tyUUooFzwaJ6rUwoQ/NgJ64ZAoSbFFULaFUv9E2Rgj711897XYCS86FeUbk3Nv6UXO" "vXCKrX6MAqJhxtc/rkFuEEsQUXS78U6URcQAl4BL5z88d3CrnwW2pNHdTiAGIdeaQZqjtcFx" "LIzJCfoD0jgy/3qmXb0x88nZSJdmc290bKoxTrnocuvOOnEypN+NKOTdzYqJXvlPwO5pb818" "9non8z6mMOpnuYZ4O66oYObyB+98BPA3aMRFSJfpxxsAAAAASUVORK5CYII=") index.append('bricks') catalog['bricks'] = bricks #---------------------------------------------------------------------- brick_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuJJ" "REFUOI11kk9oHGUYxn/f7Eyy+TO7O4lskibxoIQosq3CWkor8RBWBEUPi4GCGPTgodCTl9CL" "t9KL10IiWPCQ7pIsUgiCQhCCCBb/ZCQhTXZJt8aUTUgyO91uMs7s932eGuxaf8eXh+d53pdX" "8AxWVlau1+v1jzzPOwPgOM7DVCr19cTExLVn6Z+iVCqli8ViqNsoFovh/Pz8mXa9eJLo+/5l" "z/OeB4xkMsnY2Bjj4+NordnY2GB7exvf9wGU4zh/JpPJ26eNCoVC8O+0arWqFxcXteu62nVd" "vbCwoKvV6lONCoVCABArlUq3TNPMaq3p7+9Ha83m5iatVotqtcre3h6JRAIpJUNDQyilWF9f" "x/d9M5fLjZtKqQ8zmQzNZhPXdYnFYuzu7pLP59tvQ3d3N1EU0Ww2SaVSHB4efmAAzeHhYUZG" "Rkgmk9i2TTqdplwuo5RCKUW5XGZgYICOjg48zyMMQxzHQWvdNLXWAMTjcSzLotFoYFkWvu+z" "trYGQBRFHB0dEQQBlmUBoLVGa42plDodKKXo6upidHSU4+NjlFIcHBxwcnKCbduYpokQAikl" "UkqUUphSyi7DMNBaE0URUkqiKEIIgVKKVqtFZ2cn9/Z/5d7+bzwOHhH8fUJm+ALdaiAey+fz" "b/q+/0JPTw+9vb1IKQnD8HT/RqPBWu1n9sU6l7LnmXz9bQJrn7sPvuOv2sOaYVnWOzs7O58u" "Ly9XVldXEUKQSCQwTRMAKSW/PPiBV186hzQk54ZySBFxIXORiu8+Z0xNTYXT09NfGoZxqVKp" "XF9aWqpvbW1h2zZ9fX04jsPBoz0s0ct7L18F4LPJOV5Mn0Ug4qL9t+fm5l4BrmmtL2ezWVGv" "1/n8zie8/+4kLRQzuVvc+P5j4rFObn9zJ/iPwRNmZ2ffUkrNKKU6vr3/1W58sDl18ewbjA2+" "Rrn2Oz/98SM79/0v/tegnfNXBm8gxBUBtoYGWt+8e7M28w+rNJghLvXdJQAAAABJRU5ErkJg" "gg==") index.append('brick_add') catalog['brick_add'] = brick_add #---------------------------------------------------------------------- brick_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAs9J" "REFUOI11kU1oY3UUxX8vea9NI/l4RlI6bUZF0lKGbqQL3RQRK4igaB2GirhUmI1Lh1mIq1m4" "dCPtRu2ik9BGFzIIMgXpDEJRJJHWWuKUR5uMU6Zt8gz5fPnf6yrFqeNvebmcc+49Fo9hc3Pz" "Rr1ef79Wq10AcF33fjKZXJmbm7v+uP1HKBQK6Xw+39Nz5PP53urq6oXz+9bA0ff9xVqtdhEI" "JRIJstksU1NTqCq7u7vs7+/j+z6AuK57kEgkbp4lyuVynX+7eZ6n6+vrWiqVtFQq6dramnqe" "90iiXC7XAQgXCoUvbdueVVVSqRSqyt7eHv1+H8/zODo6Ih6PY4xhbGwMEWFnZwff9+35+fkp" "W0Tem5mZodlsUiqVCIfDVKtVFhYWzv+GaDRKEAQ0m02SySQnJyeXQ0BzfHyciYkJEokEsViM" "dDpNuVxGRBARyuUyo6OjDA0NUavV6PV6uK6LqjZtVQUgEongOA6NRgPHcfB9n+3tbQCCIOD0" "9JROp4PjOACoKqqKLSJnAxFhZGSETCZDq9VCRDg+PqbdbhOLxbBtG8uyMMZgjEFEsI0xI6FQ" "CFUlCAKMMQRBgGVZiAj9fp/h4WGsX7/D/PwN/b8OEDeF9cI7SHQ6YgObW1tbr2SzWeLxOK1W" "i263y+A0ESFUvEW8+hOT715l+NlLtH/7gd/v3sZVrxJyHOf1w8PDDzY2Nv4sFotYlkU8Hse2" "bQCMMbTv3iT70ttE7v2I9fUi0f1veebik6T++D5sDWpaWVlJB0HwkapenZ6eTk5OTmKMoVKp" "UP/4RV7+LI/1/FtntdY/HeOXO8d6JjBgeXn5EnBdVRdnZ2eter1O9/MrzL3xJk8c3KLbfkAL" "aPwdZvce1f8IDFhaWnpVRK6JyNBzxa8OXKldzjxlbDtUofGwj/cgbHod+eR/Bc5z50rmWuvk" "/ochsZ6WkFYF/eK123LjHwq8nZtkNfZpAAAAAElFTkSuQmCC") index.append('brick_delete') catalog['brick_delete'] = brick_delete #---------------------------------------------------------------------- brick_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAulJ" "REFUOI1tk11oW2UYx3/nK0tCltM0GsxKV9taIow4BC8EWRG0MCl40ykMppdCb4yIIOxKbwRv" "vPBGQUWoUBPb3ImIo4rxY3To2mCzGLqkpy3pGmeWnqY5JuecvK9XG13o7/Lh/zz/h+dD4QQK" "hcIHBwcHr7darTMAsVhsb2hoaGF6evrqSfqHyOfziVwu58oBcrmcu7i4eGZQr9x3tG37cqvV" "OguopmkyNTVFKpVCSkm5XKZWq2HbNoCIxWI7pml+/aCjbDbbPe5mWZZcXl6WxWJRFotFubS0" "JC3LeqijbDbbBdDy+fyXuq4/I6UkHo8jpaRSqeD7PpZl0Wg0iEaj9Pt9kskkQghKpRK2besz" "MzMpXQhxJZ1O0+l0KBaLaJpGvV5nbm5ucDZE5S20rWuEImkmWj+j+Ode1YHOyMiI6TgOR0dH" "KIpCIpFgc3OTyclJAKrVKhPxGsPdJqH0FczxpznYSnH4w1eqLqUEIBgMYhgG7XYbwzCwbZuN" "jQ0A1HaBsUc7RMznuFctE1BcTkcfw4wnFV0IAYCUEiEEoVCI0dFRHMdBCEFn/yfGH2lgTlyk" "dydLIKywvf43rq+y9t+TbbXf74dUVUVVVTzPw3VdPM9DURRo32A8voM5OUt37zMUo4UROY3R" "26c3NktHBgMqUFhdXcW2bcLhMJqmIYSgvfMjJiXMJ16mW/8E1fBwDx+nUVijkbzM7X0HIcSq" "ahjG7O7u7hsrKyu319fXURSF/r83CPpVEudmcfc/RwtIeodjNH75k1vmJW7WWtvNZvPNQCDw" "knJ/TQsLCwnP8zLc/eOtZ5+KhX0lQXz4N2KJAF17lH+u/8V1/4LjKJFPNU37aH5+vv7glI/z" "zYcvyFfmv6CSfYc963dOnT1Pr+lQjzx/7R7D72YymbXjen2wQGXzju+WvtXHz1/Avttk62a5" "709cfPu1zPsfn/R82mAgHvaubtdK+EdN0TvV/1WT/ouX3vvu+5OSAf4Hy0CHMaBdAToAAAAA" "SUVORK5CYII=") index.append('brick_edit') catalog['brick_edit'] = brick_edit #---------------------------------------------------------------------- brick_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAs9J" "REFUOI1tkk1oIwUUx38zk2k+NJmM1dim7YJgN1s0guyCCEtZD1XEm8WD+HH04EUQRNCD6MG7" "1yK4RKwJbUB6EqGCFcRs2SWRllpiu4NtxayE6ZjGZmcy73nQrru1f3iH996f//s0OANra2sf" "Hx4evu77fhHAdd3f8vl8ZXZ29r2z+PegXq8XarVaqKdQq9XCxcXF4mm+cVIxCIKXfd8/B5iO" "4zA9PU2pVEJV2draYnd3lyAIAMR13V8dx/nyTkfVanVwdzXP83R5eVlbrZa2Wi1dWlpSz/Pu" "6aharQ4ArHq9/lkikbikqoyOjqKqbG9vMxwO8TyPTqdDLpcjjmPGx8cRETY3NwmCIDE3N1dK" "iMir5XKZfr9Pq9XCsiwODg6Yn58/vRsymQxRFNHv98nn83S73ZdMoD8xMcHk5CSO45DNZikU" "CrTbbUQEEWHnpxUef+AHkokI3/cJwxDXdVHVfkJVAUilUti2Ta/Xw7ZtgiBgY2MDQ0NS3W94" "6NwVvJ2vsVOXAVBVVBVTRO4ERIR0Os3U1BSO45BMJom73+MWnyY3/iTpwQZJ+QOAOI4REcw4" "jtOmaWKaJlEUEYYhURRhGAYy+J2R3jrZB/PEf64wVn4N2/8OiYcn46VMYK3RaBAEAZlMBsuy" "EBFUBb31LQ/PzMPgBtcqX3B//hgr+JnkcZudnR1EpGHatv3C3t7eG6urq780m00MwyCXy2Ec" "tclYMVn3L+T2TVAhPlrnkStvM7z5VdTr7r8zMjLyvHFypkqlUoii6C1VfXPmwvl8vvM5xSee" "JWU3kHD/37+1se67SKdtsvfj1Q8uv3vjI4NTWFhYeKxI82r5wqOXxs6niY+uoRpyvb7FxfkZ" "DMuB9HOsf/r+LWMoz/xPAKDxyVP75VcWJyzTQ4c+oHdlTax0ic5mk+2VD5cTZwlEt8PU9YUX" "j1UUFfnHVPnPVxAB0bG/AR7MoFxpLCo9AAAAAElFTkSuQmCC") index.append('brick_error') catalog['brick_error'] = brick_error #---------------------------------------------------------------------- brick_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtVJ" "REFUOI2Nk01oXGUUhp/5y8/QzJ1pyqRJJsVUh2EsQRdKBDELa4IguAkFFWkXCoIobsSf0o2g" "FruvkNkIWcQZklkrRUGzKAQVGUgax5F0OkPSBok31+lNZ+53v3NcpdjYhc/y8HLel/NyIjyE" "1dXVz/f398+7rjsGkMlkdtLp9OLMzMzFh+kfoFqtZiuVSqBHqFQqwdLS0thRfeTQ0fO8V13X" "PQVEHcchn89TKBRQVTY3N9na2sLzPADJZDItx3G+vp+oXC53/+3WbDZ1ZWVFa7Wa1mo1XV5e" "1maz+UCicrncBYhVq9Wv4vH4U6rK8PAwqkq9XicMQ5rNJru7u6RSKay1jI6OIiJsbGzgeV58" "dna2EBeR16empvB9n1qtRiwWY3t7m/n5+aO3IZlMYozB933S6TR7e3vnooA/Pj5OLpfDcRyG" "hobIZrM0Gg1EBBGh0WgwMjJCX18frusSBAGZTAZV9eOqCsDAwACJRIJOp0MikcDzPNbX1wEw" "xrB862Pu/eHzyiNXiEUSqCqqSlREAFBVRITBwUEmJiZwHIf+/n46nQ6u69ILDbkTRUr1dwkl" "wFqLiBC31g5Go1FUFWMM1lqMMVz96Q1UDIGEBGHI2PE8xZPTdLo+V2rnuTRdRkQG4sDq2tra" "C/l8nlQqxcHBAb1ej1ACZs9cwKpgxSIoO16bqdyz3A3u8f6PL3Lu2Ce/xBOJxEvtdvtCq9X6" "YHJy8rFCoUAqlaIbBlgVbu01MBISisFYw9+9Dk9OPMddc0Dp5ofTkcOaFhcXs8aY91T17WKx" "mP7yxpu8/MRbhGIJxWJVuO21OH7sJL+2r3Ptt2//DCxzEY5QKpXOABe/sZdf6wWGngR0w4BH" "TzzOM6fn+Ll1ne/q1+4ElrN3LnPjPwsOWVhYmBORj0SkD/ji6l/vlJ8+9Xzyh9+/3zYRzu58" "Sv3+M/0fJi/hW40le9jTu59x83D+DyVusCmsaHTtAAAAAElFTkSuQmCC") index.append('brick_go') catalog['brick_go'] = brick_go #---------------------------------------------------------------------- brick_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAv1J" "REFUOI1tkk1La2cUhZ+cnGNiQjwJiSYxpoI0SAlx1FnFTBrQYUkrCo2Oiv+gg87upOAP6KiD" "wh3YRJPaXyDoRAVFIoofAQnBJE2NxlM5+T7v29G9XOU+w81ir8Ve28ZnODg4+PX5+Xmt1WpN" "Avh8vprX632/sLDwy+f0rygUChO5XK4v35DL5fpbW1uTb/W2D46GYay2Wq0vAEXXdWKxGLOz" "s0gpubq64u7uDsMwAITP56vouv7nx0TZbLb7qVu5XJb5fF4Wi0VZLBblzs6OLJfLrxJls9ku" "gL1QKPyhqurXUkr8fj9SSm5ubhgOh5TLZRqNBmNjY1iWRTgcRgjB5eUlhmGoqVRqVhVC/JhI" "JDBNk2KxiN1up1qtkk6n394Gl8vFYDDANE28Xi+Pj48/KIAZiUSYmppC13U8Hg8TExOUSiWE" "EAghKJVKBINBRkZGaLVa9Pt9fD4fUkpTlVIC4HQ60TSNl5cXNE3DMAwuLi4AGAwGPD090e12" "0TQNACklUkpUIcTHgRCC0dFRotEo7XYbIQTNZpNOp4PH40FVVWw2G5ZlYVkWQghUy7JGFUVB" "SslgMKDdbnNyckKlUsHv91Or1YjH47jdbg4PDwmHwzw8PBAIBOj1ek4VODg+Pv42FovhcrnI" "5/MIIchkMpimyf39PUdHR9jtdtLpNJqmUa/XOT095fr6+sG2vb090ul01qWUP5um+WW1WuX7" "1VX+3tnh7OyMUChEIpGgXq/TbDap1+tEIpFOJpMZ3d3d/U9ZXl7ur6+v/64oyjd7e3tHTqdT" "AmxsbNDv91lZWWF+fp6lpSUWFxcxTXMQCoXmAHRdH1E/9Ly2tvbv3Nzc+/Hx8TjgeffuHZZl" "sbm5idvtBsA0TQDOz89/S6VSVKvVru3TZ4nH41/NzMz8lUwmQ9Fo1K5pmqfRaHB7e4vD4WB6" "eppgMMhwOHyqVCrK/v7+P68WAPZkMplwu927k5OT4w6Hwy6lVJrN5k82m60aCAR2Aa3X61m1" "Wu3BNM3v/geOhaRMyvpy6AAAAABJRU5ErkJggg==") index.append('brick_link') catalog['brick_link'] = brick_link #---------------------------------------------------------------------- briefcase = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAr5J" "REFUOI1tk0tonFUUx38z80mTOE35JpkUkolK25gS2wYiUbso8QGVLtSiuy4U7M6WNrhwo0IF" "s3AliuBzWzcBheomKmIDWqs0xjRoWvqg1YkJCW2ax3e/xz3nuJiZOi3+4XD/i3se9/+/J/fR" "4QeMu2AGalYLrXM1RA01kAZXIwB44eVjd9eoQRVTw8Qwr6hXTKTOhc8+/5gAqC4vzveUOkLi" "hd/riYZJPSETNBW0caaeQmsHm7b2o4IEOey1K3PnT3aOPM2f01cRMyZnrzHcVyETSL2QeOPy" "/AJbS2XSTDnw5DCzM7+i2CeFr3+7dX7fffJMsX1Ld6l3J4uXpqmuJIStRpzExElCnCasxxl5" "M3of2kubd0xOTS65OHk+DyDI6MU/ZiiFJfLFMgAuM1yqRKkRpTWdPQE7O7u4cHUOUR1995vV" "G7mGXu+92Hty9+Bjh1rby8RSIE6FTA1R8FJTfXMQ4Jev8dPs2dPvfLX0OFBz4YNXBop5t942" "Pf2zqLecN8s3W3WHnWbWdk8w1Wic+/RwpSQWXOrs3haWe/rudNFAmnwXhTTz/HP9AsvVy2+f" "+HLxzUCscLZc6Qu7Kg+yePEXJHWoGWLg6+NntwM2l+8n7O4n8/rG68+yKzAo9+8ZYu7MdyQb" "K8z8vfr/n6qOm7c2KDlPZfvDLM1fORgAtHeEDD+xH0kcj3qPSYZmgmQpmvl6pEgmmM9QEe4N" "i0yZEZjVHpuuXsfHG5zZeIR1KwIw4H6kJb7Jt36Y9SgmiiLeerU24dIPtZ0J1Az1SmvXHsQr" "LX+18NT+54iiiHPnSlSrVfYODjIyMsKxo0dY+L6HQv62++Tef6l3xSy3pbFxdOxi4MBxhoaG" "CMMQgLW1NSYmJjj9xYeEyRzWtL//lWrC2NjYcefcUefcjiiKiON4wTl3SkRGx8fHXfPdfwGR" "XM2Mzjm2VgAAAABJRU5ErkJggg==") index.append('briefcase') catalog['briefcase'] = briefcase #---------------------------------------------------------------------- bug = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArVJ" "REFUOI19kl1IU3EYxp9zdtT5lWauEkPbnGarDMTVNnUiFBoGgUHS10WSF1IRkgVFXRVUNxFS" "FxEkIgWClBdGF2GS6LKaCn6h4cw5pDA/Np1nnnP+H125lpnP3cP7Pj9e3vcFNlHJOwd3tjtK" "AcD5+nBlYas1tL5HjDSlHY6sSM81Bq6SutpHFSaisW1MZdqmAK5ioqTdXr/mqcoURngh9at3" "DR6pQZCRUFVX+PC/AKqxACXsHgAUt9oCnPAYpvGUoazFMweL7PoHZbcFY7r5xvGL+dfXMkIk" "wNl6qJRxfBCoGNgiJSZV555GvC4ao3NeNLqbkZ+7BxVby3G/5yk44WCEQ3C22QKEifmuSpcH" "ABwvC1gUooTavVWY+DWIkCJDgx69M2NYXArAmp4Hb+vAREfbt2wAkBjlsQIlE45X1maJieU7" "9WnCicxijP3ox/JqALPyMkhMEi4VVGMuGMSz7udI0LPh8A66T36OpirrZRo7r6rEcMp0BOM/" "B7AU8mM2uARVl4CSHQX44umAxFfBNQGLRuGopT77SniJvefcdq5BMcZnYmp+HEtyALPLQYSE" "eJSkWTEy7YZ/xQ9AB6oQcJXHUcIaci6b+J8rrDKaJCUjSozDvBxCCLGwpezHsO8rVhQZplQL" "Rqe9oCqDyFZTxx97BKKyO7q1fGbZrkTv/HSRMTkbM0E/7IYDmFwYgawoyDLsw9u+HgxODQEE" "NWMN3h4AWOzzd4UncF113xRUsaupswXHTGWQyTIoBczbLZBlCXMLc2AqA1HIk93VGeFn++sP" "ACDvluUjOJyluU5Igg7vBzohh0IQGWooYR5K2BswJFENZl+Lz/MPAAAs13KaqErOUsJ1nHIw" "wl3fX3gLN+rdEBAp04WMT5zCRhRu9rX4POvr4kahSE02TtupSjVw1r9R/Te+gFQ/Nm7MlQAA" "AABJRU5ErkJggg==") index.append('bug') catalog['bug'] = bug #---------------------------------------------------------------------- bug_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvZJ" "REFUOI2Fkm9I3HUAxj/fu/M8z3POLTflQvGcqWPTEq/dnaeHraFjUbGgVdSLjd6MNWK0oqJ3" "BW0vChokVC8qRkEh4YtBNHCRmbNlWdtsrtOViuTU0/vd7/a7u9+f77dXigmt590Dz/N58fDA" "XZT4Oqa6LsS6Abq+2ne4oz+c25xxbTTdg7H6jV5ZEmXap46/eyhkW3K7NKV1V4AymUpciJ5e" "844pC9JWHU7afLNy2nNOGASOnOo4+58Ax5KaY8u3ADr7I5qyVbG01LZr9avPtMajvjM9b4i6" "4K5XHnm+7eW1jtgI6Op/sFsqLgnHpW3xlJUfa3qaUreX35dn+HjsPG1NjRyq6OXtH95H2Qpp" "K0TXQESzpatt5PDINEDss3ZZRJE43nyEqaWr5AoGFj5G5ydZzWiEgy3M9I9PDQ780QDgkY4q" "EY49Ffs8fN4jXb1VvmrxWG0nk3//gp7XWDR07OJyTrQfYzmb5YPhjwj45PX1DYaf+NHrmHJU" "WvI507Qrnww9zM2FcTK5NIvZDKY7QGJnO1emB/GoPMoSrNaJA7tPN5xcH3H02bGosijUldby" "V+omGUNjUc+SE6UkqsNMzI6RvpMG3DgFG2Uqv2PLc/e9EFKe9QXz0imv2EqRy0/KyJGjhOi2" "PVyf+4m8WaCquIaJG78S39mMbmh3VvTU2aSh417r1/bcWzaTmo3XbW1gPpsmWrmXWysTGIUC" "lZ4gJX5JZ3uE/eFeLG/Ku2zMPmRq+vj6D0ZeHHtNmK6hT7/9goOhHgxbx3Fg147dLNye5/6m" "VhyXQ2v1ARxhEdkbA9SJfx3p59d/S5R6/UPvfdNHKmMT8NTw5XcXWdGXKBIBHm0+CcBL+z+k" "fkcLAuFzs0m3v1/6ZPu+ilByLrnnxmzSZRYshKXLe4LFYujWAPH6xzlz8Sh6LsW1ycm82AzY" "rNDRmst+jxNpbCwj1hKnoeoBkgvjjFwdZu5P7Z3/BQDUPBU0t5RI6fdjCihToKNU35W+hVf/" "AXXnVV1P4Xg4AAAAAElFTkSuQmCC") index.append('bug_add') catalog['bug_add'] = bug_add #---------------------------------------------------------------------- bug_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAu9J" "REFUOI2Fkm1o1HUAxz//h83bg05dq9Zi105nc5XB2Gx30xtXyRwTWkYzM18k9cIeqJEFRURQ" "lBFFSRHRixhSUIwyMARrmmZr5dGotNR2w62mY7dz97S7+///v4de7VhP9n33he/38+LLFy6j" "zkMhHT4YigCEP7lla8dgW/7vGXOxiQyFVi322lNoV/Tvfr0nIDxVrVzlXRagXcY6Dwb3LHjp" "KkcJ3SGT7gs1MXufkaNyW3/HK/8JkJ5KSaFeBNg42J7SQi9Rnl7586q5e2/eEPTt7XrWaKhb" "/dSWB1qeXOgYiwHhwfURpTliSDO1zF5atatpOxVWKb/MTvB+dD8tTdfTs2IzL3/zNlpolNAY" "4QPtKaHMluGtwzGA0AetqoQSY/fabYzFfyLv5PDwMTJ1hrl0ira6dUwMjo4NHTjXCGArqcsM" "KcZCH7btt5W5+WpfrXGHfyNnLv5AppBiJpdBLKni4dZdzGazvHviPSp96lRxgxN3fVcqXTWi" "PLXTdUVNX+B2zk6Pks4nmcmmca1KOq9q5fvYELYuoD2DuQZjU/OexkeLI47cFw1qD6ehws/5" "xFnSuRQzmSx5o4LO2jZOT0ZJzicBC+kItKvLpVD71jwS0HZxwYKSVSuWU2KWk8jlyVNGcOWN" "nPr9JAXXIRK3qD78Bm/G40hLX0Drtx4K1NvWQt/fde3SicTkhobljUxlkwRrbmL80mlyjkMk" "bnND4hLrex+kccfjXFNXs2x+Ph3Z9Nv4Z8UfDD8WfdpwzeMDRz+iO9BFTmSQElZf2UzVyRHW" "3no3vthXGAPbKR//lOv8V1gS3f+XHwCse6b5GJpwpCmMbVh8MXqU1348x22vfozRcmcxl3y+" "lujXs/ofAIDmJ9YMSFfskEJbWmr2Tlxwu/t2llZMfo6TnyYHZNIWv8aY+lfAYgXur/+211Ht" "feVlsr5aWLb5B5m44Py0Jd2Ceu5/AQD199S5vRrVk5i+aCrDr0w9pdDvdH+pXvoTXLBZATco" "2hQAAAAASUVORK5CYII=") index.append('bug_delete') catalog['bug_delete'] = bug_delete #---------------------------------------------------------------------- bug_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuhJ" "REFUOI11kmtIUwEUx//3Mbfp1F2WbatpMw2fZa2ipetpmApGIQkVPUgqikiSKHpBVF8KgiAo" "iiKKCilJ+pBRCZWtVvaw8pGPpk7zsdlyc6+7e693fVrkZufTOfD//zj/wwGmqIIGY3Np3Yqt" "AJDbkOcw3TUxU+kAgAw3q54VXFj1pCAHACiX6Bb9wdv7ThYXjvQPJ6kfunP/B6DDjTghVJM8" "XQEgmWeDK5ysAImaaLhqPAWbu6NxSO5TW+70OCIBxL+D8XZOCDyNbRnlSKLkqLOZ0e7+hqOG" "AzhVfxm0UoKWqvZJHmL5o6UhkQ+ZRBf5jUBwvCKtCCTnwqehz5Ap9PCyIkZHbECz68jTe13n" "oyKIgriT9olmn+jGrszN8PsHYOlvgodWwqjQQKtKxM3BHozP4PdY6xZYeX9GLaWYC9+vVwA7" "uJ3qvz/4RV3CaNLj5iyaJZfC3PcWfqiwTLcE3f1NmMZo0Ge3w6DyMKtT1lUwqWWYYSiBLFaN" "4Q5rPg0AlI/8RMhC8IaAMU4KozYDnQMWxMUlod3mQB490n24cMssRcLimN/W74ghOMQnaKBQ" "pST+Pci8M7NtqQnpKeWGYnzuew41kwynW4Letge4umkXmLQSBIdrEHAScHT6wQWCTjbozafC" "APuLsYvI4fZzghCrVabiTWsLYsaahy9t3BqvTC8DO3QNZIwfwHTwP77aA362aFFVfRsReVVN" "peo+BJoxyMU1Nyp3YnruerCDV0BKBHCeVIy+tHh4zrM6q/rDx6g/CNfjs5pyvWFTTebKDTRn" "vwWC4sC6dXA0NgUmOG921sH3fWEtFWm+sVdXmbtyxx2BmElOeGohiwsh4NJhtPGdA5xnYWb1" "h95JfxAJiNdnXM827UZnzSF0vX4LaUoeeEfnkJLC2vnHP/ZE6qM2mKeXnzDqEklGm4zfP39h" "oO27l5JQhabTX1umihsFUMXyx2w9bRC8TjEonTCTEItLz7V2TGUGgD+y2S8zxR3MyQAAAABJ" "RU5ErkJggg==") index.append('bug_edit') catalog['bug_edit'] = bug_edit #---------------------------------------------------------------------- bug_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvpJ" "REFUOI19km9o1HUcx1+/u9/d7u82583cLlt3a9MttrHR0t10azJRURIXNNSCiJ4IRUgWBEVF" "UvkkamEPfGIlCsIhIkI9mYGssek2xVLc2rkpht1ynXc37rf7/fl8e+SaUn6eveDzeT14f97w" "mOn+MaG6ziV6ALpOr+/rTLYbj+64lkPPYKJ2OStLUKZ9YP+XO+K2JSvFFOuxAmUy3X2u4+AD" "dkwpiq06nfvmp5UpfUArEOo/0Hn4fwWOJVnHlkMAm5IbsspWJWKpil9rM3tbNnb4vtj6gRaL" "PvPezjfa3n1woy0XdCWf7xHFec1xZUv1cNnr6/YQdHu5fu8Wx8aO07ZuLTtWbOPzX46gbIXY" "Cq3rzIasLa624b7hFEDixHPiwaPtb+hn+q+rGMUCFj5G/rhBJpelPdrMreTl6cEzU3UAujjK" "rzn2dOJk+3FdXNtW+6q0XTWbuHF3gvxilrlCnobSlRxpaGVExfhm6Bghn/y2lMHQS6Nex5QR" "seRV07QrX473MvnnZXLGfeYWcmh6mJ2BINXRzcSt2yhLIxPTtjQerHtrKcSRV8Y6lEUxFqxh" "dn6SXCHLXH4BQwuyN/IUVU/2UlrVyqpCmpjuQZkq4NgyUP9mXP37hUVxyvRyPK4A8wUDAz9b" "Kup5In+HcKQcJ3eWaNNr7I6UUef1VU1+ldJsUz5cErgd98DFmUtkDTDETyLSTGX+d9Y8uw8W" "J7j4wwlC5QYtJR718dORjQA3j84eWhIMvz32vma6Lnz/8ym2x7cSKqZpXdVMeEUBKc6AEpyF" "S8R73tEyhvHt0OFEGMC9vAd3B9PfrXmhevN4aqymP6QTb9qOWyZQ9t9UN0ZQUsAbKKHE2xJM" "zYwGTp1P//RQEwGufna9+8Wwb7SutpdA+B7KngfNzfjpKUCQxSkq62uoUM6eCx81NmqPCgBG" "v15/p2nfyajbNYuyM4B6qP1u/1rS164wefaTpP5fAqto+saP9hlKFEoEU8SvRKErZSgRlCgQ" "AVGr/wFnX1XBtbD8rgAAAABJRU5ErkJggg==") index.append('bug_error') catalog['bug_error'] = bug_error #---------------------------------------------------------------------- bug_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuJJ" "REFUOI19km9o1HUcx1+/3925m26ubQazy41uy01Frbnrzls7mSO1jASfWD0olCCkByVZZPQs" "w4LogdGDKAixgmDEIKEolxl1DlsTZ5w6b8y7uWltN/3tdve7+/6+f3q0MTN9P3vz+Xxe8Hnz" "hntoy/dxkzgR7wZIfBvd3dkbcf+7Yy823f3x5sXeeBoj5IH9H+0MS0/Xa6G9ewKMIL3lxOaD" "814JXdbSdKpb4t37R/1HrSJVew50fnBXgPK0o6Q+DNDVG3OMNBXaM3UXmm8+v/HxzcH3t79j" "PRRqefPpl9rfmL+xFgMSvY91a8PPlrKd5f7qmn1tz7HMt4TUdIYvBo/T3tbKztodHPn9E4w0" "aGmwEn0xR2q7Pbk7OQoQ/6pDBwhY+9fsIT01jFsu4hFkYOISN2cdIqENZHrPpfv7Rh4G8Gtl" "Ki0l0/GvI8f92t7REFxp7Wrq4tL1IfIlh3+KeWRFDa907GN6bo5Pf/uMqqD+67YXYl92nEGZ" "GAoOPrqX4YkB5kqzTBXyiEA13aEoF7LfIWSZs1fLCOEVLI9DqQ+vfLyQQfTzTaVwdVPFpvoQ" "12auMl0oUPItZeuqKBevDVGUGRpXtJGaGGI4LY2WxjLS4F9IsKRVTe19BOyl5Iou9Us8tJ7m" "fLYPISWhutWsaYiSLxXIuQPGC+jl48PLXlsA+JTv6NmxP956IPgUrq5E6jxPrHsRZTRKKzSG" "SWec9Q92Midc+8/saac2PFW30IPkq4OHLGH/euzUNzwZ3k5JCpTRZHJXGMuNMDqV4pabIzMz" "yiOrumhdGbFnXXK39QBgw9trT2NIrA8bntn4MlIrpFYoo7nuZKmrauDceJKfLv4wU9b03AEA" "WPv66mOtLd4LJSEQWlCSguYV64iFtzGYTXLy8o83hKLnxhFS/wtYrPDexjNGEatsGXcjTVsr" "fxnpn/AseiYPc/mOKt9Njc+GhK9l0q+MbZVR4b/fY2x+9i+NjWPU+6fG2gAAAABJRU5ErkJg" "gg==") index.append('bug_go') catalog['bug_go'] = bug_go #---------------------------------------------------------------------- bug_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxlJ" "REFUOI19kV1oU2cYx/8n57QnetrlazU2amPTD1tLVEKrNq05K8wpOBAdrN1wKGFjuI8LoRUv" "vFPUIggqCiLohehViV6IY0g3wpzWUib4MdqYdkvYybFNtDlpPs95z/vuqqUdzOfuD8//B8/v" "Ad4z8k9BFrof7AOAUGTHwZ6RrtJ/dyzLQ99osGl5ZgYF08mxoxf2+YhBXVSnxnsBTEdcvt89" "uJhNnVYoYT1mVj9VNy1c4oqo6T/WM/y/ANOgmknoaQDYNbJTY4SJ1GDOF03zX27t7bae23OS" "a1zXfPzTrwNDix1uOSA0sr2PMvzCmRbtA6HWFm77AhJfjT8zCdycuIVA2ybsc+zF2d+vgBEG" "Shi40L2dGqGWwOODj6cBIHi7k1ahijva3o94+jlKlSIMWDGmTGI+p6Fr3RYkRp7FR+/FWgBA" "oCZbxZkkHrzTdUuglr1rrfXcfu8uTKp/YKGsYa64ACLa8H1nGJl8HtceXUeNlb5ccvDos6fV" "pk7HqEG/0nVS97nvY0y9eYZcKYu5fA46XwPZ3Ynx6VEIrAxmcJhv5HZvHmz5cUni2KGJbmag" "0ih58ffbKeSKGuYW8ihxEuT6LrxKTiBbyALgYVYImM5Wm4Reav3Bx4Qlg2Vq2hx2cMSKhWkr" "WtGJ9e4NiEenUHJSbKzfjMRvGgY3nYCqqpqiKGceln+u5Rf73j3raxPpZG/1axv89h04fOgw" "PB4P1rjcmJ8pYTaZQ3ggjOamZrhcLquu67uzz7XxFW8MfLvtZW9NqOPIkW9w9cZ5qK/fwlPv" "gd/vh6qqyGQySKUUCLaqyaHvhtoikYgmLAewce6B84CzHYBltX8Vii+KGBgYgMPhQD6fRzqd" "xsXLF9k/9kQbANjtdnEFwDTNv1RFzQGwTz6cYYwybnh4GJIkAQAKhQJ4jidbi4FfAXyiKEp5" "xQkdHR3tPp8vIsvy2oaGBioIgnN2dhaxWAyiKMLr9cLtdoMQ8i6ZTFqi0eibFQAAvCzLfkmS" "7no8njpRFHnGmOXpuye8zvRK6MOPTABVlUrFTKVS6UKhcOBfUXFlqaSUjDYAAAAASUVORK5C" "YII=") index.append('bug_link') catalog['bug_link'] = bug_link #---------------------------------------------------------------------- building = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAbxJ" "REFUOI2Nk01rU0EUhp97M4mCKPZjYQNSTXaCIIkuCuIiCGo3IW5cdyUSuvYPdCPoyo39AfkF" "giEUlCLBCuJGjBQRRAoubjWJ2vZ+zJzjIpo2epvmhWGYA+fhmWEOTJivCwuaVvcnBTxdWkqt" "ewcPnU5HnXNYa/m7W2sJgoB2u00+n6dYLFKtVod95iAgSRIKhQIAqvvGqkqlUkFVabVaIwYj" "AGstAC82BzdzCk5AVHAObl6wRFF0OCCOY1SV0pkuqvrfgtOTATa2phAVrAwMrAMRpXbJEobh" "eADAlbntVAPVqfEGURShqqx/nsapYgXEDd5CRblzORlv0Hc9VJWrZ4NDDKb5pT/TAfdf3T33" "Pn7DLV1ERGg0Gvi+j+d5+L5PrVajH/X4MvdpBDD8ibHT8342w4f+O1QVYwylUolyuYwxBhGh" "u9cldyLH4pMbt0cAyxvLpzzxns9kZ1nbaiIiGGMwxgwt9uwuD16uMD87j0T24fVH1y7uG4Q7" "96Io1o/BJjvfdmm9fYZkhUwmM4Q0XzcxYY7vP7ZJrM2L81bgzyzU6/XUSfs36im9k11ycY5j" "8XFWH696R3cdkd98jBSIX07rOAAAAABJRU5ErkJggg==") index.append('building') catalog['building'] = building #---------------------------------------------------------------------- building_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAg9J" "REFUOI2Nk01IlEEYgJ/5vm/RrCQtQpcCdREy8KddixQPYQidkk519RS5eDLIU5c6bIFXD106" "eesQBMUWJJLaUococ0MsDDJXWFt/i/12Z+btsLgpbosvDMO88D7zzDszcMBIdXVJqbxzUMCz" "gYGSebV7kUwmxRiD1pqdWWtNOp1menqaYDBIKBSiv7+/WOftBuTzeZqamgAQ+WcsIvT29iIi" "xOPxPQZ7AFprACbmCyczAsaCFYsxcOWsxvf9/wNyuRwiQrhuDRHZN+DYwQCJpRqsWLQtGGgD" "1grXOjTZbLY8AOB8/WpJA5Ga8ga+7yMiTH6vxYigLVhT6IVY4XpnvrzBhllHROg5nd63+/tv" "k8SeTLFZtc6Ne5c217Z/PYw/mL1fvM87b282uLlDi7db75LJZBgfH8dxHJRSbFWkqGr4Q6Sl" "k1O1zUzMPSXx+Q2LX1dHiy8xZ6TRCbh82ZhFRPA8j3A4TCQSIaUX6DjTjnEM7fV9GJXnYms3" "IFEHYCgxVK2sen08cIJXSy+w1uJ5Hp7n4TgOme00AXWEqy1DAAxffkToZBsKVVnoQfb3LT8v" "srA9rw7nqokvPccGLK7ropRifTPD3PIMH5enGOl7TOzlAJVuBYJkFUA0Gi3503biJ0ncxhTd" "bT00151jYeUDM5+m+LG4MarKFe6OC4N1MZQaVHBUYAuRsXdjKyN/AQVXK5HJZJ4VAAAAAElF" "TkSuQmCC") index.append('building_add') catalog['building_add'] = building_add #---------------------------------------------------------------------- building_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAg1J" "REFUOI2Nk81LlEEYwH/zvrNkSaLpwQRbP+hSEbVbkNAhpIN2EQ8hHT2ElHjoVNE1wr+gzh3E" "boFRsSplieShQx+0KqWFbFqslWb78e47M0+HRVPcFh8Yhnng+T2/Z5iBXcZyW5uUynu7BTzq" "7S2ZV1sPyWRSrLUYY9jYjTGk02mmpqZoaGigtbWVrq6uzTq9FRCGIS0tLQCI/DMWEdrb2xER" "EonENoNtAGMMAM/nipNZAevAicNa6DhiCILg/4BCoYCIEKv/hYjsWFC9O8B0qgYnDuOKBsaC" "c0L3CUM+ny8PADh9cKWkgUhNeYMgCBARXnw5gBXBOHC2eBfihJ5TYXmDNbuKiHC2Mb2je+bl" "MHMPhjmz+InEeX9RkLsd425wE3D9VV/Th8JrOuUCzjmGhobwPA+lFNGVtxyPLBO7eJk9zUfJ" "vRttTE6O3h6T2czmSyxYafYiPjNr7xERtNbEYjHi8TjV8xMcPtdNxfwE6v4l9i08pCla51vk" "mgcwMD1QpZx6VhupYyz1FOccWmu01niex97MKhX1zTAwAoM/4eYCOjOLL6qpOEI+cyUIRT7+" "mVOVhSoSqSe4iMP3fZRS5Cr3k33zmMqRqwS5b2SB9d8+1mdJAfT395f8aRtxLDvDST/FodoQ" "7aVYTxs+f9eEOXtLlSvcGpM9jTeyP5b6PKeizpOvDrnXOe7u/AWkxTVXwbKW4gAAAABJRU5E" "rkJggg==") index.append('building_delete') catalog['building_delete'] = building_delete #---------------------------------------------------------------------- building_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnFJ" "REFUOI2Nk0tIlFEUx3/z9pVjio+mfE6QGhEWGpZRCZGQ6KZlEG6KFi5ctQ4KJGhdhNsgqI1Y" "0iQogmNKhqb4JstUfHw+Jx/zfXO/77QYNCcNPHC5nMO9v/P/c++BI8Z8ebkcVrcfFdBSV3do" "3bY/GRkZEdM0UUqxuyul0DSNYDCIz+fD7/dTW1u7d8+5HxCJRCgoKABA5K9iEaGyshIRIRAI" "xCiIASilAOgYjzozBUwLLLEwTagqVui6/n+AYRiICBey1hCRA8vQBilztDLZ/FS2ljshPHfv" "UEDP7HEssVBWVIEyIVN9oMTeT9a5u3jzS1j/cYbRQNOzAwCA0hPLMZ1toU68rmkSk6+w+n0U" "t83gWHIWSWk53hiAruuICJ0/UzFFUBakqW6u+abw5t9Cn3+DO8HG9MAYxo6+EtY3L8cANsx1" "RISKbC3aPdRLqnMIr7+G8NxL7G6FKymXuK3BxfCOu+pSQ9vE3kd69PlB3nBKHyKCZVm0vn5M" "ovqG93QN4bkX2F0RjFAeMx29hLe3q0sa2gZiXsEwJT/R5WB0Y4iEX5PcKE0n4+xtjIUmHG4h" "vJHLUtdXXnnTmNx05gB9AA6A+p76ZIeyxrI8Pqa/NFPosWPafJi/3xGXKOysn0LrGea500b6" "ySJmF2bK8m5mt099ml6KWghvPdR1Qya1cXIXVymuuI9npouJ5iADgVX6W4J8tAoJGfGshpaJ" "KOWzTNuTPQvW2/hGiA7GuLGIMfye/PNX2dBWmOobZTDhOqGFbVJtGazMrJFt5Hk8RlxNO52x" "wwRwpyJl56I/01laVIC49G5d0+qqG4em/j23G38AqFhONwNA+C8AAAAASUVORK5CYII=") index.append('building_edit') catalog['building_edit'] = building_edit #---------------------------------------------------------------------- building_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAi9J" "REFUOI2Nk01IVFEUgL83PzaNzjCWZv7M+DOkw4DQZAZKRglBqyRaBO0kIlq4alE7t9WqXUS7" "0GUtEopBUApFKxVS0lSyFlbQGykrx/fmvXtPC9Fx0MQDh8s5cL/7XTgH9hnf29pkt75nv4CB" "7u5d+8b2YnZ2VpRSuK7L5um6LqZpMjo6SlVVFfF4nK6urq17vu0Ax3FoaGgAQCRvLCJ0dnYi" "IqTT6QKDAoDrugAMz2/8TAkoDVo0SsGFpItt2/8H5HI5RIQTR38iIjsSIvsDjC+XokXj6g2D" "UjVFjRok3Hwdy7L2BgC0VmbyLysLWX5KJNZB9mt6bwPbthERXn05hBLB1VDrDJCKnSJcmcIc" "7uWgESsAFMzBqvqFiHA6anImanKuYoao/YJQWQT1+zlHkleJh5eYeNTi3wG4PXaj7kNkAhFB" "a01/Xx+LY48pb7oE1hRvn/RTElmnwpvBIHRxByCnpN7j9zK3OoOIUBn6Q6K+mlBpFm1/BtGo" "v++oP3uLrOM8GLnXHtoC9Iz3hA1tDB32lzG4/BKtHBpLPhGJHUdnpxG9TsvlJnTuG4HAArHm" "KzUZw76bN7DWbtp2ThbNedZWsky/eUhdooNgKIO4K2B4mXy2AGi0tUB5Yy1By7n2ujeZ9AK0" "FreP8NFvGItFOEvCyQPvaTx/B4/Pi+GP4gkkqE514AkkMIri+IqPEQzHfT/mhioKlmkzRu6n" "MuLqoGhBtN5IEfK1gNagZfIfJLsyWUToj5kAAAAASUVORK5CYII=") index.append('building_error') catalog['building_error'] = building_error #---------------------------------------------------------------------- building_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAitJ" "REFUOI2Nk01IlFEUhp8ZdTFKY03+Tlo5gwuTQLIoqYiEotxIi6CduYogVy0iaBu4qEXRqk3t" "XQbFEJSSo1+UKUSGaZg5FDGZTc7P993v3ntaDFqDP3jgcjgvnOe8914ObDO+d3XJRnpwu4An" "/f0b6oH/i+npaTHGoLVmNWutSafTJJNJotEo8Xic3t7etb7y/wG+7xOLxQAQ+edYROju7kZE" "SCQSJQ5KAFprAF7OFG9mBIwFKxZj4NwBjed5mwOUUogIhxqWEZF1B3ZuD+CkdmHFom3RgTZg" "rXChQ+O67tYAgCONP9dNv+9cxlnI0qoubQ7wPA8RYeRLBCOCtmBN8S3yvqappo0J7xEX7zaF" "hq6nCusAGfMbEeFEc5p7432I9VFWo7QmGmmlreEoK26OqYKTPfWgtnrkWjq7BrgxfmX/B/WW" "89KDtRZtFWfa+zBiMdZgEb5lFjnYdJysKgQnvo5kOgeJrAGUkZaqijI+Zt5TJ1FcrTBiWVia" "xbcabX184/PHW6Gj+SRZPx98PT+6FAQYcAbCARt4sbuihuepZ1hrcbWLNpr68F4awvtorI5R" "URaidsce3i0mGfucXM75HC46cHNXPV9kNjsTqFJhEqmn5LXL4/E7KKtwtUe8pp1jsbO8WRhl" "eG5Y6io7ppybk1PlAHYoNAjFxchjmGGOKD0l3/Wq8JBAMMTYpzE6vZ5A5Ff9aYfJ0mXaKlpu" "kTNSVulhYj9uM7+q/wXdtU5LSeIa4AAAAABJRU5ErkJggg==") index.append('building_go') catalog['building_go'] = building_go #---------------------------------------------------------------------- building_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAltJ" "REFUOI2Nk1tIVGEQx3/n7G7mJW+kbYuRrVRkFySxG1EiFF0o33uTpJDqKajovYigegqLiJ6E" "KIIoaLOHQkgsqGDJXV0vZaSY7LKrodues9/3TQ+SubSBA8Mww8xv/vMwsESb3L1b8tXtpQKe" "t7XlrVuLk2g0KlprlFL8iUop4vE4vb29BAIB6urqaG1tXZjzLgZks1mCwSAAIn8ViwgtLS2I" "CN3d3TkKcgBKKQDexOYv0wLagBGD1nCoXuE4zv8BrusiImz3pxCRfxzKlwZ4N16BEYMy8wqU" "BmM0B+077Cj+xNDtzSc3nInczwsAaFqd+Ge7/vKUwuJJ6o+dJ9F38/rHq5mJxsujL3MAjuMg" "IvSMVaJFUAaMBv/MM3ZVhSnbeIC5byF8KzZWlq1xnoTOSnsOYEZPIyLsXRPP2W4Nvqd861F0" "OsLylTVk9DiB/Q1FajbZuQC42He6NuJ+4LAcwRhDV1cXtm1jWRbbSpL468ewPQkse45lpQnI" "pJmddDwLAFfLumKfh4GZz1RLAK/Xy85NK6mRt1g+jVERbDMN9gok6zL4MJYZGJo55QE49+5c" "qUeZQX9BgGiyny1FDfz6+or1vjBr97RQWjmMR5KEQ0mmwj+Z6k/qnh/pSx0PRu/NK8jMdThZ" "keHZmFXsltI9/oJ9/jjB5lbcRCdebxn9rzM8ShbCplpi30dUpnZVMwze8gKYx4XXYP4x0mhi" "jLCrKYvlmcBTUEU4lOLFQBWObzXT4RTVbrCgwF1+/DU9uc+02N7faLxSUlHRPpdK/xoZmrpw" "4u7oo3x9vwFTJUkc60AhpwAAAABJRU5ErkJggg==") index.append('building_key') catalog['building_key'] = building_key #---------------------------------------------------------------------- building_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjpJ" "REFUOI2Nk89LFHEUwD/rj0ZdzV3dsB0ha7wFCyIVLB4EIQg8iJeS7eQhI0Tq1smbEIJXo5t/" "godOQhS7JHnqEkjtXsatnXGcpWzZZWdmZ76vg2hKJj748uU9vu/D533hwSXDzmblvHrbZQFv" "5+fPrcdOJ7u7uxJFEWEYcnyHYYjrumxvb6PrOqOjo8zMzJz0dZwGtFotDMMAQOSvsYgwNTWF" "iLC1tXXG4AwgDEMAPnw7miwSiBQoUUQRPLgd4vv+/wFBECAijF//hYj8cyBxOcDOjyRKFKE6" "MggjUEqYHQvxPO9iAMDddPVcA5HkxQa+7yMi5M0BIhFCBSo6+gtRwqM7rYsNfkeHNJtNtP0C" "5XKZwcFBqo7DxMQEfX19bGy8Q9d1VlZWflqW9apUKr1uP25++enpzYO2gxf2R5darUYul0PX" "dfr7+8nn8ziOw/T0NIZhkEqluoMguG+aZueJQRDJrXrxEL6XeZh7zPLyMrZtk06nyWQy2LbN" "2toalm3RO9DzeWnh+fje3t5CB8DSztLVWBC898yAnt4eAAzDwDRN5ubmSCaT1Ot1XNdl/c06" "0Zg3AJBIJLQjA6/xzG+J1K/UYtZ+BYBiqYhSitXVVeLxOACNRgMUdH7pvsE9qFQqXgxgcXFR" "jh/UajWy2SzDw8N0dXXhOA7FYhFN0xgZGWFoaIim18SqWBQKha9nlglon5yczMTj8U1d169p" "mtYuIm3VavVJLBarpFKpTaDT9/3Isiy30WjM/gHTwkanGZeuSAAAAABJRU5ErkJggg==") index.append('building_link') catalog['building_link'] = building_link #---------------------------------------------------------------------- bullet_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAPhJ" "REFUOI1jYBgFFANGbIL5UyJq/v1nKPv5+zvvp68fP7//8rZrZ+flFmxqmdEF0vsDG8SkeBtt" "TS3ZnU09GH6zv2V/8+2RE7cKM+/T0192oatnQhf4+uNzuYGGPsNfpr8M+pKuDH8ZfzNY6Fox" "MDD8z8bmAgwDPnx5y8HKyMPgp5nLwMDAwFDsPItBWUyPgZGBkYMoA958fPnj6rNjDB27ExkY" "GBgYOnYlMtx9dYnhP8P/H0QZ8O/f/94Tl44xsDGwMGy+PI2BjZGF4ciFgwwMDIxTsRmANRbM" "siQ6GBgZsxgZGHj/MzB8Zvj/f9qpaS8qsKkdBQwMANrSULAqVbXwAAAAAElFTkSuQmCC") index.append('bullet_add') catalog['bullet_add'] = bullet_add #---------------------------------------------------------------------- bullet_arrow_bottom = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAANBJ" "REFUOI3tkDFKxFAURa8fCcEJpMoKtHAnNqmmsbe1yx6yiKTLArICu+xCEISPhSFdeO/d/+cX" "Y2eRGbTQck55eFzuu8CFP3O1FdM0HVNKCCEghAAzg5lBVdk0zc323m1FSskAoCgKlGWJqqqQ" "5zlE5PVcg+utIHkbY3xzzu2yLMOyLPDeM8a4Pxdw0qCu6891Xe/meQ4k4b2nqt63bfv+6wbj" "OD6r6hNJqOqHiDyQfDEzI4m+7x9/DACArusOIuJUFSRhZt+DDsNw8vKFf+ALuo52TWcpn9EA" "AAAASUVORK5CYII=") index.append('bullet_arrow_bottom') catalog['bullet_arrow_bottom'] = bullet_arrow_bottom #---------------------------------------------------------------------- bullet_arrow_down = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAKVJ" "REFUOI3tj7EKgzAYhK9YYmJ8APcu3fsmPor4JMHJp/EdOhUKJZkcBfH/kyC0e+rgUOjiNx53" "xx1w8H9OqTAMwzvGiBACvPdgZhARiIibpilS/zkVmJmyLCvKsoQQAlJKxBgxTdNja8FXwTzP" "F2Z+5nmulVIYxxHWWg4h1LsuAEDXddWyLC+ttXTOsff+aoxxuwsAoG3bal3XOxHd+r7fDB/8" "iA+4sExmNtsnpAAAAABJRU5ErkJggg==") index.append('bullet_arrow_down') catalog['bullet_arrow_down'] = bullet_arrow_down #---------------------------------------------------------------------- bullet_arrow_top = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAALpJ" "REFUOI3tkDEKwkAQRb+bLbIKgXS2VnoTD2O6nCDXSeEFrHIGGwmKIF4gxczObLawEYsYIaCl" "rxz+/wwP+PM1s+GhaZoQYzQiAhEBEYGZQUQoy9IO83ZQ3sUYjyIC7/3de79l5gMRMTNP+wAA" "6rpequo1z/O0bVvfdd2mqqrbWNZ8KJ+TJElVFc45F0I4FUWxmjSgqhdjzMJaCxGBcw5Zlrm+" "7/djA29SmHlORC95zIyn0PXYwJ8f8ACbJ2z81oX2kgAAAABJRU5ErkJggg==") index.append('bullet_arrow_top') catalog['bullet_arrow_top'] = bullet_arrow_top #---------------------------------------------------------------------- bullet_arrow_up = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAJ1J" "REFUOI3tjzEKwjAYhZ8hJEY7OnQSnHoAD5RD5BI5Swan3sSlgyK4dO4fyJ9mcpcGCg4u/cb3" "Hh88YOP/7GpF3/ctM99TSldr7bu2E0thCKEloheAExEN3vvzakEIoWXmhxBir5SCUsoQ0eCc" "u6wSxBifUsqj1ho5Zxhj0DSNIaLbkkB+B9M0HcZxREoJzIycM+Z5Rimlq93Y+JEPnl1AYPsv" "KhAAAAAASUVORK5CYII=") index.append('bullet_arrow_up') catalog['bullet_arrow_up'] = bullet_arrow_up #---------------------------------------------------------------------- bullet_black = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAKdJ" "REFUOI3tjLsNg0AQBcfWEdACEmhDWqEAWqANU4cLIKEeCwgudUbOZ+/kxBFaS7acMtJLnkYD" "J39zsc48zzPnXBNjrFUVVe1V9T7P8/PoOivgnGuqqrqJCKqK9/7WdR1Ae3SvVkBVaxHBe88w" "DBRFwbZtteV+ChBjZN931nUlhEAIwVLtwLIs/TiOiAhlWTJNE0BvFizSNM2SJGmBx3stkH0d" "OPmNF/PgR/8yPS+rAAAAAElFTkSuQmCC") index.append('bullet_black') catalog['bullet_black'] = bullet_black #---------------------------------------------------------------------- bullet_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAALVJ" "REFUOI3tkDsOAWEURg8hkUhQqBTYgJ6FzBZ01jASVjEL0MwaVEKlswUmEiGZGf7M438odJPb" "TeuUN+c7xYU/tWmI150b4VhitIctoMxCsnfAahJV1ZYYcCzXM+svBpDpNudH6W9OCmBdVZti" "QBfevG853gz7a8mw04Yi9SRVDhhFXBiS0pBbx0dbyGNRlQO5Ci9PxbQH464jeceQRqGkyj/Q" "SbA93EErjzz5jbNXILp/6vMFxAhOiaMXpSQAAAAASUVORK5CYII=") index.append('bullet_blue') catalog['bullet_blue'] = bullet_blue #---------------------------------------------------------------------- bullet_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAO5J" "REFUOI1jYBgFFANGbIKHw2Ur/nz7kPnn63fZf0z/n/xn+D/NY8+/DmxqmTE1y5XzSks3GYRl" "C6lGFzBKSYvyf/36yTGM7937xff/nUJXz4Qu8PXt0zQ151A2jrsHGBgXRjJw3VvPoCAvwvyX" "4X8hNhewYDjpH6Mih4QiA4NXEUJRgyQD839GBaIM+Mf0/+m3C1tluDdlMfz8/oLhGwMDw+dP" "zAx/mRmeYTMAwwtcwmJzrx47+Of5D06GT8ysDO/fMTLcecL49////9OwGYAzFr69fZbO9I9R" "/h/T/6f/GP5P99zzrw2b2lHAwAAAE1dXvSc/zwIAAAAASUVORK5CYII=") index.append('bullet_delete') catalog['bullet_delete'] = bullet_delete #---------------------------------------------------------------------- bullet_disk = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWhJ" "REFUOI3Vkr9LHGEQhp/5dvc8N6ecIEaQhFRpBSERbG1TpbSyEbHxr0gjKNjZBawkXSBdLKxE" "DMYipLAy4QTBE3+wh3u3u9/OpBDkVnL2vt07MM8MLy88e0m/Wd36bSNDkOaesUaN83YXcdCI" "A9SEm6TL3vH57J+djz/+S1vaOLKvPztmZvbt4Mwea3uvbYtrh9a/4/pNmhVcdzwAu0cXD/Oe" "hySDy9scEa0cDSs0JwQGRalsrMygahgQYMQhZFlGcpcPBtQjRy8r+PTlL07Al4qWigFmBgZx" "9MQHXo2s9AQuAgyhREQwNcwU7wvy3A8GdNKCSEJWPozgNb+PyMBEqYc11ndaXCV3gwGlGgER" "SpfPx8uMx68RHJfpGUvvNnHUSbMnMgjDgDeT8LLRYX76Pc3aFDi47U0x8cIT1yCUSnWqRZpZ" "/r7/9tXwXHOoST0cxWuBqCJWopJy0jqlnRT82l6oUp63/gFEqbA25HMz+wAAAABJRU5ErkJg" "gg==") index.append('bullet_disk') catalog['bullet_disk'] = bullet_disk #---------------------------------------------------------------------- bullet_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWpJ" "REFUOI3V0L8vQ1EUB/Dva5H68eopVZY2UTR9g5IGic2AoU01pIlELX5MBqSJ6CBNw+JPYBQW" "CZEOZhGTqsGPwRswiQgGkb73bt+91yB+JFq19iQ3Oefek889OUDJh1Do4eZwIsINFuNUCLUO" "bT0W6jPlu1QOxq1MN5KSK9zLqL741wR5AYDM1zoDXmtzF6hmTF3sBrv/DSj7EZnquTmxQQJ9" "TcHhm5a4TpdP1/3lRQGeSJgIUeN2OWqDdoaTzW3USCoMlQQFiKGiwJUnPVhd74uKdVkw/Rbg" "DPQtjZb+mEAJWTle6xMLApc7kYqcqq9Kzk6w7Dk4U+Ef9YCRe1gsChwdY15AWygIaC8PM7a2" "gL9KfAI3ngHBjMyeAoCBaQrs7S5QQmaPErL8Eyj7TKhO4nZ5GDDdwWS1A+DomQx//WOudMM9" "sNR4nUomAUR+ATmdWDIbIypnHJyxj8M5vmsOMAYw3pRvmSUc76ugl/hfTcHnAAAAAElFTkSu" "QmCC") index.append('bullet_error') catalog['bullet_error'] = bullet_error #---------------------------------------------------------------------- bullet_feed = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAALRJ" "REFUOI3tjjsOAVEYRs+lEIXIJGxAa3qNZdiHiGIkIqJQqxUSIgqFLYhCI1qjV6g8M08j5v42" "MMUkWqf88uXkwJ+fUUmjjMoHUFViXGLZ8Wagepdt0jeTaG1dTDKfIpFuE0ieUM/FMuqpBTIs" "Hbhnn3hiEcRTfDnj0E9f0L2ahHGDUG/wVAdXZni6lr6gaazJGStc9vi6QqSWhBRSC3CxOd12" "avIYE+ijWtwdXmInfv/8zhdJKkjQ/UXXDgAAAABJRU5ErkJggg==") index.append('bullet_feed') catalog['bullet_feed'] = bullet_feed #---------------------------------------------------------------------- bullet_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAUdJ" "REFUOI3tkU8rRGEUh3/3IrlETcTimppRiomURDEbk9lbsPUBKNlZ2CE2tr6ArHwDIVNDQ0ZW" "akjDDGM0jeYyf+6c+77n2k7T3Gtr4dmdzu88nc4B/lHcmssHkyUSpBXaW7WjxVilUUZ1E1RE" "FXr3ENTPQnlhT2/7dYPVw6AtmZhYgISA7hlUR/UZXD+f4e41xlYLd0VWcsXamebaQjBhLrCk" "SpshWYJhI2OkMaJPo0gVNZ6KGOO78MTXYTQUmIIgbcZL/hEWCwi2YEkLX9VvjPUHUbTK6lUy" "mq+dqxOYEFKgt9MLwRLSZrwbKXg6+nCbvkD0KZojibDjDeb3fWwSgZhgCsJAT0CZ8odxk7rE" "SeI4SxKh7A7uHQX1DG8qpQnvrHb+cPpmKQhltpCoz7gKfBsoSbtJq0L6P7aRdMs6oq+h4f//" "Dj9rJporgp1X/QAAAABJRU5ErkJggg==") index.append('bullet_go') catalog['bullet_go'] = bullet_go #---------------------------------------------------------------------- bullet_green = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAMZJ" "REFUOI3tkD0KwkAQhZ8iIihoFUWwFNEjWHuFNCKWuYaeI4WC7d7AA1hJRLQQQbCyMvib6O7O" "7trLdLZ+5fDx3mOAPz+T4Y69ebeunQtg4YMcrDLCSAoX/dXp281xAdq5YNAYjlqlDqSR2Me7" "0Ww9BYDxt5tldxH8ZrGNzXWLKI5QLlSAF/mcygY4ZZHoJ1KVgKyGpDcosWwXG2DeJI6XA2qF" "Kry8h8f9DjorwbnsD1xiw9lyAvMyvk0JOtZC3VTITvjzOx82Y1p7oPss/AAAAABJRU5ErkJg" "gg==") index.append('bullet_green') catalog['bullet_green'] = bullet_green #---------------------------------------------------------------------- bullet_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWVJ" "REFUOI1jYBjygBGf5P96BqZbkgbt7EJiTr9eP52hln11Lkmm35ioUfDmZP7/359P/n++K/zt" "2TZlD3Q1zLg035ymmyaoazRJUMeO8evjUwyMDMKcDH8Zgjylf91feur9FZg6JlwGsHDxegro" "+TL9/XabgUNEioGFi4FByt6AS1FbZjqyOpwG/P3x8/rv9w8Y/v16w/D/100GNr6HDAw/rjJ8" "ef4TxdUs6BqvT9Yx4RSXnMbCyy3y789VBqZ/HxgYmHgZ/v/+xXBjxc0f1299TMNpwK0Z+jHM" "bNxFYhYhhv9/7WJg/PuC4erWj1+ZPz37wszIyHDj/ofs2BWP1uI0gF1YoljcOsrg15vpDCws" "/AzX9379du70qzzxz59Wi4gwMEQvfPsZI6xQAoSJ8Rcj81MGZnZRhqs73ny5eO5VVvrS+4tx" "hROGAc8evN7z6eM+ha/vv32/c+tVWcrCu6vwaR4mAACieoqNpo5gggAAAABJRU5ErkJggg==") index.append('bullet_key') catalog['bullet_key'] = bullet_key #---------------------------------------------------------------------- bullet_orange = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAALFJ" "REFUOI3tkD0OglAQBgdjpdYmit5BC4/CFeg9gT+JJ7DjCvQ2FrZaeQcSNZIQJeKDBw+0N2tF" "y5SbyeTLQkNtLOn42Y6HVJVLaRw+BvLMJ3t71orrr9sWs1XlMpsvsKdQagiOi2y/Blj+qi05" "UDjYEwhPEByg1ydROJIqB7SG9AkqBqNBJ7xS0fwTKJTP5QzdEXQG8Lxxj/AlVfyBMoWX7zao" "AidREMb40QNP3tBQmy8/00Vr8wx1WQAAAABJRU5ErkJggg==") index.append('bullet_orange') catalog['bullet_orange'] = bullet_orange #---------------------------------------------------------------------- bullet_picture = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWxJ" "REFUOI3Vkj9LW2EUh5/zNpqam9wLSiutoC6Ki3S17ehU6OQixQ4laydBB0fBUUGLu7i1bm79" "AG4utji4phahUoyJydt775u8x0GiudV8AM90zuF3nvOHA4/epDtY+fJ9IwwKCxeWp0YEMUTa" "pnYrFk8c253NpXeLnVyuG1AqFj6W3089C4JSNzjqOI3Esb139Al4GFC3kg+Ckpyc1TmoLBOF" "f7Gp49f5EG9erjEzNYIxJjN1BiCiYQtoeU+xeM5A3yCeBN9f4U/V4tUjaNgToCp1VaIrm1KN" "Y9rapOESLmxMlQRUUKj3BNxA4Cr2VM4m8PljGs5yWR1jcjj/vxQAk4lEQ+/h8l+bV8MrlGvP" "mT0yzI6vk8vlUECQ3iugiqD8/P0Z5xyHaUr6oo/0eB7nHB/eHqKanSADMPhTbaejq3P73Og0" "U+CcQ/XuL+4BrE2+bX398dpjps0TECRStIbvdFAaTbv74DEer10DDxeZ9HOv2bkAAAAASUVO" "RK5CYII=") index.append('bullet_picture') catalog['bullet_picture'] = bullet_picture #---------------------------------------------------------------------- bullet_pink = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAALFJ" "REFUOI3tkCEOwkAQRV9p0Sgg4Qg9B1eownMNOEc9mF6BM+AQGCSCQMF0u+luZ/DNuNo+OXn/" "52dgYjSJddStbkhlH0WKSMATqqhdubwsn0M3M2tT2csuOSS5koWU7C6H+uQAjkN1ZuWj9IXm" "EbkF+mtkvkhpaAvLNQscHdIo4hQN0HuloTXHmgWetvKPDtYzdKU0zvHiXVmu+QOvrqzPPxy+" "cLS8+FRf/ZbmhInx/AFZp1UZr8NLSAAAAABJRU5ErkJggg==") index.append('bullet_pink') catalog['bullet_pink'] = bullet_pink #---------------------------------------------------------------------- bullet_purple = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAALZJ" "REFUOI3tkL0NglAYRY9EOmJlJYk6hg7CCqwBiTbGDViBzsLO0s7OBTQmhEYMoI/fB/byrGg5" "5c3JvV8+GOjNSBXuaGca2JLaqimpyH3B29uzCH7dsapAA3vtNo65hjrXuV0q57gRAK7C7SIp" "LXPVEJ4l91PFZKqTkVp/xroUCLJYIhJJVbQUnwZBrFLVBSXCf1wFxhKMecsriXkS+CpX+YOS" "xDtsQzKElZEQEfgpkac8YaA/X1CSTEruNs+UAAAAAElFTkSuQmCC") index.append('bullet_purple') catalog['bullet_purple'] = bullet_purple #---------------------------------------------------------------------- bullet_red = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAALBJ" "REFUOI3tjj0KwkAYBWcNEe0FIYh4DMFz5ApewSqwXsMrpLKwEBQrGytBxNomXSQ/uqhh83mB" "FQSxc8rHMDz48xukTSA+uvI43jyOqUKfIfg84KPtVEu1WspzMZcsiuSE0i634RqfNWE9GmJ3" "W6rNGr/boaQRfhwwAjbLsXmB3B/U1xu5W30biM3+AL0B0uuTZyUJzdjlKtd4gsCgxgYvLFAk" "NOMLrdmENHHe+PMdL9ziRhhMwH34AAAAAElFTkSuQmCC") index.append('bullet_red') catalog['bullet_red'] = bullet_red #---------------------------------------------------------------------- bullet_star = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAPhJ" "REFUOI3tkDFKA1EQQN/8qElg07kgpEgl3iCCZSCFpY0HsFBIZ58+uYKWtnapPICVCAo22xoW" "MWITsvGvm/93LNKEVTYeIA+mmsdjGNhQin0+6djHbqfM2SpbKm4AGcDhvwM6vqzb5LMtLunK" "dtjGBMzv9wc+W9w1au5BjmK76ksxkEZnV0LtXE0ds7OHeks+fcLPX9Hk47pxHF+s+qYYqB7M" "enn2Plq2l6OmgqaTUTCLe0X/V0Dk1jv1ff2K0NyCs+TTCDLpyyl+7Q8AxNkmpsri7SZRlyGV" "3cArTeBl7QUAxn+HuR0PnbEtn/qWJpOh4MK/3A3wAw+AZWhdGog5AAAAAElFTkSuQmCC") index.append('bullet_star') catalog['bullet_star'] = bullet_star #---------------------------------------------------------------------- bullet_toggle_minus = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAJxJ" "REFUOI3tkTEKwzAMRX9xDZ686ULpCZrdV0xO0C5ecgTfwXMiI2XolJAmhrZ0zV8Ej89DQsCZ" "yx7EGB/zPDeqChHBMkXkGUK47fvXPRCRxloLYwyccytPKTW1DQ4CZoa1FjnnlRERpmmqnnAQ" "lFLgvUfbttuzwMzfCZZi13VvG5RSfhMQUZV/FIzj2A/DcN9+QFWhqn3VcOb/vAA/RlME/Jy7" "fQAAAABJRU5ErkJggg==") index.append('bullet_toggle_minus') catalog['bullet_toggle_minus'] = bullet_toggle_minus #---------------------------------------------------------------------- bullet_toggle_plus = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAJ9J" "REFUOI3tkbENgzAQRV/iILGAx6EhE4SeFWGCpHHjEbyDawO6o0hFFAyKkNLymy99nZ7+3cGp" "Sx44557zPNeqioiwuIi82ra95/O3PBCRuigKjDGUZfnJQwj1XoNrHozjCECMkaqqiDECMAzD" "7gobwDRNADRNs/IFfLhB13UrX8CHAdZanHNYa3822BwxpdR77x/fH1BVVLXfJZz6X289NVj8" "b29D8QAAAABJRU5ErkJggg==") index.append('bullet_toggle_plus') catalog['bullet_toggle_plus'] = bullet_toggle_plus #---------------------------------------------------------------------- bullet_white = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAJVJ" "REFUOI3tkDEOgzAQBDeR7Uek4VX+Qt7BO/iCX+WCtAga62TYTUUqRwLRMs2dVqs56YCbyzxa" "Yc755Zx7S4qSACCRHLqu+xyyjuPYL8uiUopKKZrnWTnnvtV9tkJJ0XuPWivMDN57kIxnBAAA" "kr99n4cEAJKZIYSAEALMDNu2pVbRtUKSwzRN2J9IMq3rOvw5dnOVLyHCW4OVPLtjAAAAAElF" "TkSuQmCC") index.append('bullet_white') catalog['bullet_white'] = bullet_white #---------------------------------------------------------------------- bullet_wrench = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWtJ" "REFUOI3dkbFLAnEUx99PPevEoKY4HVqKIKLAIK5d+h9aW1wqGhICI1EqajhxqKFFXGosoeYC" "x4qajSjwyogDu87L09/93v2ahMq83IK+6/t+PvDeA/jrkN8KuVxunnO+hYgDnPP9WCy29Hnu" "cYPz+XwYEdPRaHRQlmU/IkrfO64CSulMKBQKC4IAxWJRt23bl8lkDhVFyXYl4JwTRARd1wER" "NcbYbCQSmWOMLbY6vk5wMpn0UEqXJUkCxhjIsjwiiiKYpgm2bWuuguyxmkJGV/t9z/5AIACV" "SgU0TQNKKaiq+sQ5X291276gHJXjTYo7Y0NBcnVrgOR7AKN8WeCcFxzHqRNCiolE4uVHQfrg" "Pt6wycb0aJ9f8BKomgzOrzXMrYx3XPXLEQ3LSU8NB/0eAmBaCCX1Hd4sku0Et92gZjmNV9Pu" "FXu8cHNXg9JjffMkNbHWtcCo0YXTi+pekzJvk5Hds+1JV/if5ANWtq4z52SN3wAAAABJRU5E" "rkJggg==") index.append('bullet_wrench') catalog['bullet_wrench'] = bullet_wrench #---------------------------------------------------------------------- bullet_yellow = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAALVJ" "REFUOI3tkL0JwmAURY9isBG1FsERrM0CTpDGAbKGmSMrZAY7EcHSDSziT6Hk15B8eZ99eFa2" "nvJx7uXy4M/P9LSj3TPD4huDV9dQVUR5QbjYEHfdgVpr8WUebBmvcMTQ3E/b8hQABF21r+Xr" "Gk8mLm1xpHntcKZLshxPc9WC8g3SCmLe2KZAjJBk6tavBVEeH7FDFxmteVzOxFcizVV/kCaE" "t0NAWeKlOcQ3oueLUN/w52c+nYtPejxtNc8AAAAASUVORK5CYII=") index.append('bullet_yellow') catalog['bullet_yellow'] = bullet_yellow #---------------------------------------------------------------------- cake = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAp5J" "REFUOI2NkktwS3EUxn/3n+RG2pu0FUGqj5HEwmNhDGO8ShdmLCwMMzXGDHaGHWsdM2xszFix" "sbC1sLFkqlS1GBae45EKlUq0vc2jaZL7yP9vEU1rMHzb75zvnPN9BxZh5C77Xo0wyl/wL573" "ryjPFjaq0buc+19eLC5Qyh/weLfSuly/8KeJ83xLpM4DeBcLvJm8wlTxPhP5fmtoaPeHcOve" "Ne3daxm+t35aek8Oj6ZekjYf8C57NgOXANAABgcHE0KI00l7w5mlQUFmxuLEnhDjyTa64if4" "MnaDSPsE1wYsIiEfL8YK033r09t6e3uTAkAXxf5YLHbGlRLHUSjpIRAI8OTLZUaezvAkdZ5w" "OEzVBttRBHTPMl0U+xsnSC14NBqNEvxUJJtzWdvhByBdOUjF10em5ADQaXj4NGWzK2GgtCWH" "geNeAE2VhZSSIz1tv7hu2QrHVVg1CcDJAyuQUmKaJvnUQ29jgy5jQH1OxbVAk0FHRwcAtVqN" "dkPwedJme6IJgFwux9RklhY9Rau8tZCCUb2uIsvCTFQPYZomjuPgOlX2b/b+jK/M9LRkrlRg" "ZeAROt+pyPSCQOVOt5Crv7Jy520qlW00qXF0xkH+zB8/dnUVEU8aza4wN5zGSnULeF0X8G/J" "Svmx6ilcfYqe+IDqClGLNiNa6mbKQg4yacrjRexkHl+ngX9LVjY2EG2W23ww7rHHZrGTecqP" "v+Fm5pAFq/6uLX680WZ8XSGM/TH0eJBK2nIbAppSN93S82N6fBN64tckfoNycEvP0ZS6uSAg" "xEUnP2C6+XunvKHtSzQ9ivCF0TzBek9tFumYKDuDWxypKtQ1IcTVxivPY+aR0QP0aGiblVLr" "NFhVN5EJTdPeKtQzYGjpjtLQfM8PJss5Ma4x1VcAAAAASUVORK5CYII=") index.append('cake') catalog['cake'] = cake #---------------------------------------------------------------------- calculator = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcxJ" "REFUOI2lkz2LU0EUhp+ZuXvh3sKPUtjKwiKkSzL3X1hrtf4Ci/gTYiVYWYT8Am0CycKSFGmy" "2y4bsgsbcbsUCirYBLPJnLljkW+yKuLbzMuB885zzjDwn1IrU61W3xSLxedpmh4aY1BKoZQi" "hEAIAe89IsJ0Ov0+Ho/f12q1lztJ9Xp9GEL4Ef6uWaPR+Lzqi1YmTdMCYJ6++vBH5OO3z+KD" "g4NHewHGmAggSRLuPXiI1hqlNVqptf/6ZXGx1pq9gBDCumiWDWqrWa+3BWGzuk0AgPee10cF" "vPc45xCR5enw3uML95eb31ymt5uNMVxdXdHpdIjjmNFoRL/fJ0kSnhy3OWy8Q0TI83yfwPtF" "0VpLuVzGOYe1FhFBRPh29II8z4miiHwDsCEQLwBcXFzQarWI45jLy0u63S5JknB9fU2v10NE" "8CL7BOIcAFmWYa0lz3OstVQqlbUvlUpEUYSIu4NAPADn5+c0m0201gwGA9rtNsYYhsMhJycn" "i5G83yeYu/maIMuyHYLVbqy1RFGEc3eM4OZz6Z+eGnFOAVsPtatPNzdhNru93QuYTCYfz07P" "HhtjUqWA5WdaJAUCEPKAE5nfTn8Of5P/7/oF8ekAsn4NhRgAAAAASUVORK5CYII=") index.append('calculator') catalog['calculator'] = calculator #---------------------------------------------------------------------- calculator_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAl9J" "REFUOI2Nk0FIVEEch7957+3mWzStkwt2EYwSy4LlGRZ0CA9dQlCwThbdVuigF6HjejDBU6hs" "EB2r22YHLTZi1cRCN3RTow7tGphmJasr1r6ZNx3WTFkov8v8+cPvmx8MIwA6Ozv76urqrgUC" "gSrTNBFCIIRAa43WGqUUUkq2t7e/LS0tPYxEIrfYy9DQ0KzWel3/n1/RaHR5b9YCCAQCtYB5" "pesR/2K4/6rf5/MFiwSmaVoAtm1zuOIIhmEgDANDiN3565fCxYZhUCTQWu8uzJ2A2BM2xN+A" "RhQLAJRS9LTXopTCdV2klDuni1IKVVsOgEDvExh/wqZpkkqlGBkZwe/3s7i4SCKRwLZtjg8/" "oSp6FyklnucVN1CqsHQch1AohOu6OI6DlBIpJWvt1/E8D8uy8PYXKDSQSgKQTCaJxWL4/X7m" "5uYYHR3Ftm0WFhaIx+NIKVFS7hMIgIGBAR0Oh1ldXUVrjed5eJ63O2utmfrwgmT6FdmtH2xs" "ZTfXc9/7nt1J9VgAUioApqenSafTtLS0MDMzQyaTobm5mcfx+2yVZrh4PkTV0RpezsfKpt6N" "R5yOYIUBkHfzADQ0NNDW1oZhGDiOQ2trK5ZlMb/2mjMn6lGGoj7YhBIu5041ArrDAnDzeZkY" "GzOl64rCW+9nLbuCT5Ry+eRNALou3eNpahDBcIkFkMvl3o+PjVebphkQAtj5TAWTZn3jO/PL" "k8wuT9Dd9IDe5zcoMQ+h0T8FB8AJB3uOVZffbjx9gZrKs3xcecvk3ASfP2X7DyQoSCp7ESIs" "oEzDJloPvhlc6f4Nn4k4dMH1GdUAAAAASUVORK5CYII=") index.append('calculator_add') catalog['calculator_add'] = calculator_add #---------------------------------------------------------------------- calculator_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlRJ" "REFUOI2Nk81LVGEUxn/vfa8377XSICJBUVsUmIsWeudfqBYhzKKihUGLQCLINkEQghIVtAqT" "WRfY0gRRbKBmbKlDjTEKEYxmptkH+DU59/1oMeYHA+WzeQ8Hnt/7cA5HAHR1dT1qaWm5HARB" "nZQSIQRCCKy1WGvRWqOUolAofJ+bmxvo6em5yW719/e/t9b+sv/XZiKRWNjtdQGCIGgG5IXb" "L/iXhh5f8ioqKmrLAFJKF8D3fQ7XHMFxHITj4AixXX/7WvrYcRzKANba7YbcMohdZkfsGCyi" "HACgtaa3oxmtNVEUoZTaeiO01ujmagAEdg/A+WuWUjI1NcXIyAie5zE9PU0qlcL3fU4OvaQu" "8QSlFMaY8gRal5phGNLa2koURYRhiFIKpRTLHVcxxuC6LmZvgFICpRUAmUyGwcFBPM8jm80y" "OjqK7/vkcjmSySRKKbRSewACoK+vz3Z2drK0tIS1FmMMxpjt2lrLyuvnbLwdYD3/Ee2Yzxb7" "9GzSPHABlNIATExMkM/nicfjTE5OMjs7S3t7O7lnDzn2M8OZ+DUONJ2mkB2rz42P9b6yM+su" "QDEqAhCLxYjFYhhjCMOQtrY2ALwPw5y6coPKT28g3UtQXUNjQ4OcnLG3XICoWFSpdFqqKBKl" "Xe+VWJyn8ngTnO/amX53LdKKRhdgbW1tZjw9fkJKGQgBbB1TiWRpCQ6x8W6YqqFONguLbACr" "KxItWRDsQ+MXa7u9g1V3649q13XmWV1W5BelLv429/YFKEHq72z8WLjuGNFgHPvFYPvPJc39" "P1NkPM+TydDCAAAAAElFTkSuQmCC") index.append('calculator_delete') catalog['calculator_delete'] = calculator_delete #---------------------------------------------------------------------- calculator_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqlJ" "REFUOI2Fkk9MlEcYh5+Z2V3kK+xqVFTSYlVs44oxKvlIjT2VA6ENDYdKTUw42F56aCJtPHhF" "D5p48oBEPGq5kLRejPFfgFJN2GzBlUA1Wnbjgn8QrV12v/2+mZ0eRARp9HeZyZt5nvdN5hUA" "HR0dJ+vq6g44jvOhUgohBEIIrLVYazHGoLWmUCjMZDKZXzo7O39kcbq6ukattc/t+1Ps7u6e" "WsyGABzHiQOq5ade3pWLp76NhMPhDcsESqkQQHl5OdGVq5BSIqRECrFwfzL9qrGUkmUCa+1C" "Qc0DYhEsxRvAIpYLAIwxHGuPY4whCAK01vNngDEGE48xN3WNz8KXuPfbcTs30w9etj30GlZK" "kUqlSKfTNDc3k0qlyGazNDY2Un3hPPlIkn+ty/odB4lt2sWLvz9l/HLPyXlBCQDXdamvrycI" "AlzXRWuN1poX32xlbUUlFdHdzN4fJyJ8KqPrqVhdEwsBaKMBSCaTTE5O0trayvDwMJlMhq+/" "2EDsg4es3NREcbqXiCNIj0zgF4rPvGJu7ytBEADQ0NCA67qUSiVc12XPJyWiJIltacHLnkFG" "NOGKjayYu/3YK0SaGg5fuSsBtDYAJBIJ+vr6kFIyeuMsZV6CWG0LXrYLGQ7wX37M1I0EXj7/" "1a7DV0YAJIAf+AsTtLW18U/6OpvXeVRt/xL/UQ8qYim+3MjToT+57n3Oto7hxJJvDHxf9w8M" "KB0EIjc5wNZqjRbVTKdOs6oqgjf7EU9uppjZ8r19nhj3lu1BLpebGBwY3KyUcmrVEPH95/ir" "92fuDv5BWc1O8k8zTKh9zN6643uF/OhiwdK1Ajq/iwdHDv0QQhpGrv5K+sG9XHRNbF/TibHR" "t98CqLcLq53gaPrBGDr3rFQsM79LSk3NJ+5M/B8M8B881k6NOlvoKwAAAABJRU5ErkJggg==") index.append('calculator_edit') catalog['calculator_edit'] = calculator_edit #---------------------------------------------------------------------- calculator_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmtJ" "REFUOI2Fks1LlFEUxn/3Xmdy3ho/YgQdKygX4qiQKO9AQdg6EHShSYugP6CFbtuEbQpatBIr" "goI+iAwRSqk2Ay0yx7GUEsEoTGaaEAVLR+d9770tNHVQ6oHDuffA8zvP4giAnp6eGw0NDd2O" "4xxRSiGEQAiBtRZrLVprfN8nl8stzs/PP+7r67vMbvX393+01i7b/2tjYGAgvdtbBOA4TgxQ" "bb1P+JeGb54PBgKBqj0ApVQRQCgUoqSsHCklQkqkENvvn5nNxVJK9gCstdsDtWUQu8xS7Bgs" "Yi8AQGvNtYsxtNZ4nofv+1vdQ2uNjpUCILAFAPnXrJRienqakZERgsEgMzMzJBIJQqEQNeNP" "OfbjDhtrSxhj9ibQenPoui4tLS14nofruvi+j/ZWWWsSHD7azq/5F5jCAJsJfO0DkEqlGBoa" "IhgMMjU1xejoKMW5FGVVcUqqmlj68gqHxX0AngdAPB6ns7MTpRSu69Jx7jR+NkE4UoZeGaai" "rpto0WeSA82BQoCvAUgmkwwODiKlZHIyxdy7u0Rq22E9xfsHDzlUlqNUf0cQbisA5L38doKu" "ri6klJyscThRXUG4fA2z8RWsQf8e53hrLzqf73t7/VQYQAGcbW29YqwVmXRaZLNZstkMeu4+" "0fpWlElh/SWisQjWrBF0DkCgsWJlIbl+700mobY2d6bTmXAmkwmk02nU0hixugbKox5mfQ6w" "TDyfJRqLgFnlYGUzC+Ov6y+dibwsPKstjd2KLzReeFSt5DesvwwFxyNRoVqynz4wO3z1WdF+" "AG8jXzxxuyNnjcUas1nWsvO3YAwYW/kHUSo+NdPjEm8AAAAASUVORK5CYII=") index.append('calculator_error') catalog['calculator_error'] = calculator_error #---------------------------------------------------------------------- calculator_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqVJ" "REFUOI2Fkk9LXFcYh59zz50Z7lxNnI5BK0FBJFD/7GSyigPZZVModGEFSTftQiQL8xEMBCNd" "lanMJ0jSRbXZ6OKCXONGcIQqaFEQZtA7HUeaRObijPecOVlMmjoI7W9zDi88z/lxeAXA3Nzc" "i9HR0e+SyeRdKSVCCIQQGGMwxqC1RinF5eXlealUejk/P/+E61laWvrDGPPO/H8a+Xw+uM7a" "AMlkchiQXz99xX/lzU+T8Vgs9uUNgZTSBnAch1tdKSzLQlgWlhCf72fl1sOWZXFDYIz5PJCf" "AHENtsS/gEHcFABorXn2eBitNVEUoZT6dEZordHDtwEQmDaB9Q8spWRvb4/V1VXi8TgHBwf4" "vo/jONx78zt38z+jlKLZbN5soHVrmMlkGB8fJ4oiMpkMSimUUlQff0+z2cS2bZrtBVoNlFYA" "7OzssLKyQjweZ3d3l7W1NRzHYX9/H8/zUEqhlWoTCIBcLmdmZmaoVCrU63UKhQLHx8ek02nO" "zs6YmJjAdV08zyOVShEEwbsgCJ4fHR39YgMopQHY2trC8zyGhoaYnp4mDENOTk7wfZ9Go8HU" "1BRSSsrlcqpQKLwoFot3bICr6KpVRwg6Ozt58PAh+Xye7e1tent7GRsb4+LigsXFRcrlMh0d" "Hauzs7OPisXijzZAdHWl/I0Nub6+LtLpdOtD799nc3OTyclJUqkUtVqNarVKLpcD+BYIu7q6" "EjZArVb78+3G28H37z8k6/U6AL++fo3WmoWFBVzXBSAMQwATi8WWAU5PT+ttazUyMvLV4ODg" "b9lstre/v79p2/YXlUqFw8NDEokEAwMD9PT0oJT6u1QqWb7v/9W+lyCz2eyY67rLfX19dxKJ" "hDTGWOfn5z8IIU67u7uXgVij0dBBEFTDMPzmIy7QU0RWlhc1AAAAAElFTkSuQmCC") index.append('calculator_link') catalog['calculator_link'] = calculator_link #---------------------------------------------------------------------- calendar = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjBJ" "REFUOI2lk81LlFEUh5/3w1EbczTmA5qoyEgCiyQQW1U7aRNU61q1CdpWtIhZRJsWbfoPAsFI" "MwrbhJBlfiFRRBBWOoSfM0gjxjBz7z2nxauOgRvpwOHcw4Xfec4598J/mgfwZGT1nqh3XVQO" "iAhOwIrgnOBEsU62ucNZxTmZenD1WFcI4FRvXunam9xN5VzfzEmAEEBEkwDx/hugCs6CODAm" "OlcrYKpQMWAMf+4MY4zUbwk40Q1dhf0pEBu52g2RCpgK2Cp8XQTAWEdNwEltJAsFUIlIRCIS" "txmBTAaA6oYAAI9fL+p62Wjvu2VVVe17v6Sqqk8/RPmzsSgfHI9ioVTWa4+mdIvAOEFUCQPo" "H1shCHwGxlcIA3gxucLo8n1GBgUVoW46x/HsHqomIvA3W1AgDDwun0kT+nCpO02dDxe70vhe" "QHvbUXw/4MLpTLRaK/xDoAKhD6+mC0wWHzIxpKgq4cfb+L7H7FyewA94PrFMNuGjbBewgqpS" "F0BPZ4qxIThy6DA/83P0dKYIvLt0t7ciTpmZL7GvuZ54fVhrwUqkFvgebz4VAZjN5/HwGP5c" "xAiIKN8XSrQ0xUg2N2xtLgSw1kYz8OH8iSRhcItzHUnefilytiPJwHiBH/NrJOIxUokGRJTA" "p0ZgXNRCx8EmFlfLtGUamV1aJ9sa49uvEtkEJJpipFsaI9LAw0mEHT0kK6O53plTRiRurMNY" "h7OCcYJ1dse/8Hut/HLHi93aX804TpCtCEjKAAAAAElFTkSuQmCC") index.append('calendar') catalog['calendar'] = calendar #---------------------------------------------------------------------- calendar_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmVJ" "REFUOI2lk0tIVVEUhr99zrHsRQU+sqSX0QPSNOFWEjQqIoSiGjQqGkSgNC4KwkGEUOCkHDUr" "BEOjLAp6WNlDM8K8lmAhIYGaimQpdu/ee60Gx7RmRQsW/16Tf39r7bXhP8MAXG0ZPStqjolK" "vojgBZwI3gteFOflt/R4p3gvr88fXpuIALzqiYOJBVn/cnNV/ccigAhARLMA5jVWgCp4B+LB" "2vicToFNQ8qCtUycasZamT1t4EWnfBWWZoO4ONVNmaTApsCloXsAAOs8MwZeZkbSPwwqMYlI" "TOJ/KZCbC0B6ygCAS/cGdHzSat2zL6qqWv98UFVVr7+M64bWuL7ZFuvw2KQeqXmt0wTWC6JK" "FEJj6xBhGHCjbYgohFvtQ7z4co6Wm4KKkPGmig3L5pK2MUHwqwUFotBwYFsOUQD7t+aQEcDe" "RA6BCVlXsIYgCNlTmhs/rRP+IFCBKIA7b4ZpH7nAq7uKqhJ1nCQIDL2d3ei3CY7X7COVTpNO" "bZ4hsE5QVTJCKC/NBmD1ipUYY9hdkk2+K2RhpmfXju1UHKqkuHQVmYuaSFTmXQwg3jqAMDA8" "7BwB4FNfHwZDc3KEjg8NFK/fhA88m/J24o1la2EZoJUAnL7Wo6PfU9qcHFZV1cddsT6Z0vIz" "JXr33RX9PZqSl3VLZZ4G0zNQZePy+QyMTlKQO4dPg+MsWzyLns9jjI1/5X3/S6ofHAWg+v5R" "eoeSKPojXiQnL6rqPhZbkXnWeazzeCdYLzjvmJ25h7bkI8qKtnO7q5ZZJuL526eAuWz+9vMk" "KpZUY0yFgQUK31Gtba8dPPUTIAaHVsRZEPYAAAAASUVORK5CYII=") index.append('calendar_add') catalog['calendar_add'] = calendar_add #---------------------------------------------------------------------- calendar_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnRJ" "REFUOI2lk11ozXEYxz//l8MYaZztjOGYeUnmLTVcITcjRSgpcSWlXJBwpXOh3bhws6zcSSnv" "LzF5mbeZDS0mKclmyd7O2Yqx0zm/3+95XPxn44786un5PTef3/f5Ps8P/vN4AGefDBwT9faI" "ynQRwQlYEZwTnCjWyW/hcFZxTl7W7JpXFQI41f3bqibG/+Xl1PkPiwFCABGNAxRe3geq4CyI" "A2Oiez4HJg85A8bw4+gDjJGxIwAnOsxVmFYMYqNQOwzJgcmBzcO7bgCMdYwCnIxa0pUGlUiJ" "SKTE/cpAIgFAfhgAQO3tbv2eNXqusVdVVc8/7VFV1QvPovpSc1Rfa4ly+mtWd598qSMKjBNE" "lTCAy819BIHPlZY+wgCuv+ijqfc4T64JKkKsNcWCsvHkTaTA/9WCAmHgsXVVCaEPW1aWEPNh" "U1UJvhcwv2IOvh+wYXkiGq0V/lCgAqEPN1vTvMic4Hm9oqqEr47g+x6x+ntUt72mofY0OqWU" "JUUbuTgCsIKqEgugelkxzfUwOzmL9s5PVC8rpuB5GVMGWpm78xBjyxeSfXOXSY0NrFgX7vch" "2jqAwPe435YBoKOzEw+PB28y5B7WMWf1Zgo+PsI7s4Px7VcpTxbh0AMhgLU28sCHtYvihMFh" "1lTGefw2w+rKOA39nykoLYcNB0cmF6amEqg3a9QDVSpnTqB7IEtFYhwdPd8pKxrD+89f0ckJ" "hl7fovDGPnLZHoaAwW8BLqArWiQrTalzH5YakUJjHcY6nBWME6yzrCrdwoSWOyQnjyMMYgym" "Le29vqq6U97ffp7G7TOODvV37fXFS4qvXwStW39fan4CNrlrNXVrUrgAAAAASUVORK5CYII=") index.append('calendar_delete') catalog['calendar_delete'] = calendar_delete #---------------------------------------------------------------------- calendar_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApdJ" "REFUOI2lk0tsTGEUx39z7+31aKtFZ0g7fahHUEEiusFCIiIhFdItiYUuiDUWREREWFggLKxI" "BPFIoyEeqaBaBqXEI5pKlJppb40qfczc+51jcWVqYyFOcvKdb/P/fud/vgP/GRGAs/fTe0Uj" "W0UlLiIYgUAEYwQjSmDkjzSYQDFGnhzcPKfWATCqO+prC0v+5eV9FzoXAjgAIloCkH95G6iC" "CUAM+H5YZzPgZyHjg+8ztKsZ35dxOQEj+ltXoTQKEoSpwW+RDPgZCLLwJgmAHxjGBIyMWfLF" "A5WQRCQkMeE55A7xeW459q3DNLj3aDhRsxmA4zeS+nPE13MPelVV9UJLSlVVL7aG90ttKR36" "0qjJ5p068LJJ9UePfnt5SVuPrEk5AL4RRBXHhsttfdi2xZVHfTg2NCb68LztDBfWMGX2MtJd" "b3EjWQonTadgakVRrgUFHDvChtoojQmP9bUxmp72sarqHcP58yiuXk0meR53YoSPL94xOGxB" "1luUI1ABx4KmZx6J/iM8vq7EJcXI+HKKZ9Ux2nMKyw3IK6jEDbo5k97Eid31763QUUFVybNh" "3ZIoADXOMBunl1E0q47RnpNYeT7ZwSp673egS/fw040DYEH46wBsK8Kdjn5KBrpZrBOI1awl" "mzqN7SqZwUp6H7TDyqNEqxbmJucABEEQemBB2Y87lE6eSaAxkq+OMTnmMpoupz/xFmvlUaKl" "lYgotsUYgW/CFhZUFNDRcpr5yxsY96mF940PeXEzzevbz4ks208sXh2S2hGMhNjhFAJ5uO9c" "52JfJL+0yyP7uokZi1bw3ftKV3snd+MH+Hr1O/A4twsDgyPXctv4Z9QvLx5ZMnOas3ReNZqX" "ac143pZ1h159+NtS/QL+22ySEHdAsQAAAABJRU5ErkJggg==") index.append('calendar_edit') catalog['calendar_edit'] = calendar_edit #---------------------------------------------------------------------- calendar_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAq1J" "REFUOI2lk01oHVUUx38z85KRTmtSeM0jL9ogiUqFSECMrQQTUEviprQKiQjVTVosdeMquGgD" "aiQE24VV3LgShFb74UqwUCFNmtIkurDRNkbkxbyvvEdNxLGdd+ee42LyId2JFw7nnM3v/s89" "/wv/8zgAn0/cOSHqDInKQyKCFYhFsFawosRW/hUWGyvWyszo4ce6UgBW9a1Xunak/8vNI2d/" "eRIgBSCiaYDg/DFQBRuDWDAmqWsRmBpEBowhHL6CMeJvAqzoOlchuwskTkLjdUgEJoK4Bj8V" "ATCxZQtgZetJChVQSZSIJErsRgYyGQBq6wAAznxT1L/uGv3iallVVc9OllRV9dy1pP9qOukv" "XU9yZe2uvn56RjcVGCuIKikPzk+v4HkuF66vkPLg6xsrTJXfY+KSoCLUzY2wp2UbNZMocDdG" "UCDlOby8r4mUC4f2NlHnwoGuJlzH4/G2dlzX46WnMslqY9nywQcXcvrm/mYmfl4lNhFTcx+y" "M0yTbcqSL1VY3V0AHx64FdDW0k61eoebfzRQnD23PRkhFlQVV2NWb11mtzzCwBsDhGHI8vIy" "0ze+p2FHwPMDvXieR7FYxJ+b49v6+pMpSFwHsDg/S3FhkYHXXuWd8WFWbldobs7S0dHBUu43" "xsdnKJVKPLN3H709z5HL5Y64AHEco8DS4jwND24H4JP3PyWqxQwODtLd3U1/fz99fX3Uaoah" "o8cBaGxs9De3oKo88ejD/PjDbGLVd0dRsYyNjREEAQBhGCKifPzRKfa/+AL5fP6eA/D2Z/OT" "xkjnWvX34M+bX/Ls051kW1rYVu9SLpdZWFjA931aW1vJZDL8HQn55SUzOfHdr859f8Tr6enp" "CILgYjab3eX7vqeqbrVaHXIcJ59Opy8CdVEU2UKhUAnD8OA/hzl9PuYroUEAAAAASUVORK5C" "YII=") index.append('calendar_link') catalog['calendar_link'] = calendar_link #---------------------------------------------------------------------- calendar_view_day = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAc9J" "REFUOI2lk79rVEEQxz/v7pkUp4UQDYgYFVQQE6yCEAmCELBKwGtsrLSIILZWkkLs7PwPRCUQ" "UbATFBJOLBQbIQgHppGoRESUnLydnRmLfe9+4CEEB5ZddpfPfL8zu/CfkQHcX/t+yzy7am4H" "zQw1iGaoGmpOVOsbikZH1d7cuXx8OgdQ9+vN6T1jO8m8tNyeAsgBzHwMoPH4GriDRjAFkbQO" "BUiAQkCE7ZsvEbHRLkDNS67DgX1gMQ2PJaQAKSAGWP8MgESlB1DrlWRzC9ySErOkRKsZGB8H" "IPQDYgl4NHGbS2f3/9P7yutNzoU4qEDUMHfyerr09P0KrY1VrpxZ5MPXdV60n3P+2BwLk00K" "cX51hCAJUKssOJDXMwAWJpt0QgeAb9tb3J2/R2tjFYAiKkGMGK0HEDXcIK/9LbkTOozUR7rA" "Qqwsdz8gGu7OrtJC62PK9u7TWw7tneDGk0XmTlygugvQGM37imhps15LFmaOzDJzdLbsS8b8" "qYtkWTYAqDqXADHipZwHa19S19wRBVElqBEkeR+pV8kY7IK7M3V4Nye1evve/QvDQi3JTg8p" "2qulh+3TYtaQqEhUNBqiRtQ4FPDj5+9nQw92Gn8AGpcuIyGyvtMAAAAASUVORK5CYII=") index.append('calendar_view_day') catalog['calendar_view_day'] = calendar_view_day #---------------------------------------------------------------------- calendar_view_month = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeRJ" "REFUOI2lkrtrVFEQh7899240bAgI2V1QsAlYrU0CRhujrQiiqcXev8BSG1sb/wIbiW9B1kYW" "FTFRyYIShKBgEXAfdwmuJix7zzkzFufuIyZNcGCYMxz45jcP+E/LAdx7u1VT5ayoRiKCF3Ai" "eC94UZyXMfd4p3iRndtXT0zFACq6uLQwbQ5S+eby9wJADOBVDUDh8XVQBe9APFgb3mkfbAp9" "C9ayc6OGtZ4RQDTjKhwtgrjg6jJIH2wfXApfGwBYNw7wMhrJzwRUghKRoMQPIlAuA5BmAADu" "vmzods/qwJbfNVVV9cH7lqqqPloJ+bPVEJNuT6/d+aRDBdYLosrDlTYGiCLDk9U2cQTPP7aZ" "nDBU6wn5vKG61mK2dJg0m4EZtKBAHOVYOlMiNnDldIm8gUunSgBcmCuGOB9acE5GAOsFFYgN" "vFhLyMdQrScYk6NaTwCG8emHVjbucYATVJV8BBfni7srzhXJm1F+eSEoKByKRwAngRaZHK8+" "d3ZVrH3pYIU9Sgabi0M/LszAwPmTM7xe73CuMsOb9Q6LlRn+tY3NLlF2t8MtqCqV41M0tnrM" "lif50dzm2JEJNja7ewAAkh1fOCQnv2/d/zadesE6j3Ue7wTrBefdvoBff3rNfT8Oan8BS8wz" "nTw4DIgAAAAASUVORK5CYII=") index.append('calendar_view_month') catalog['calendar_view_month'] = calendar_view_month #---------------------------------------------------------------------- calendar_view_week = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXRJ" "REFUOI2lkz1rVFEQhp/sLqZYBIuEgFinDNrkP9inTqo0AXsrSSFpY2GXygSEEK0CphEVwTTp" "bYKNoCsEQowfy70z806Ks5u7RViu+MIwpzjzzDvnA/5TMwB7H8+fKGfWlboniRC4RIQIJR6a" "iCA8idDJ1uricg8gMh+tLN+e+5fOm/unSwA9ACnnAPqvNyATwkEBZmVdV2A1VAZm/Hn8DjPN" "XgNCOeIm3J0HeYn0EaQCq8Br+DwAwDxoAKHmSL6fQao4kYqTGGdgYQGAegQA4PnRIH8PLTMz" "X7wfTM0Hx9/y7Ocw17ZPEqADYCGUSRtVlvz6a9RWHHTGI7Qrh8qD2oS7GoCFSE2tm3BQNiaT" "ABfZcgQbde7P9hqAq2X7CcD45noA7k4Cux9+0O2UrEx23g6wCJ69+UptwdNXX7jVLYXdDg3A" "oozw8MEdPMZvP6//wk0KFdvlIbk+bb48vW9S3zwwD8KFhfDwGwEXl8PD1nNP0xWHIy2+xFk6" "cAAAAABJRU5ErkJggg==") index.append('calendar_view_week') catalog['calendar_view_week'] = calendar_view_week #---------------------------------------------------------------------- camera = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkRJ" "REFUOI3Fkz1PU2EYhq9zOC3HkJRQPk5QgdTUiAnEIAOTmrAwObgy6E/QkT9gXJx0IAz+AkZd" "jNFowmpIag0pJDpgQotge6ic8370fR8HpcbEWe/pXp4r1zPc8L8TAKyvrz9USi1ba8855wKt" "dUEpVdRaF5xzQRzHplwuv1hbW3sAsLq6umit/by5ufkt2NjYGBaRzsLCAiKC9x7vPTvbr7h7" "+zLm0zOevJmllFyl0di91+l0ngIlQERkaaBSqdTn5ubKSZKwv79Ps9nk6OiI89OzvH3/lUb3" "OtcWbxAEAQcHB3fCMByM45goioI0TW9GIlItlUrU63UmJiaYn5/HWotzjvHxcXZ2dtja2mJ0" "dJTl5WVarRadTgdrLY1G40rknOPw8JCxsTHs0DSPX+ec9gI8MBgUuHXxEuVul93dXZIkwVrL" "3t4ek5OTeO8Jvfecnp4yNTXF8w8GLSFxISQuhriwwLsvQyRJwvHxMdZajDHked63jLz3aK3R" "WvPdFYmLA0QhiEAggpEiSimUUhhj0FqjlEJr/dPAOdenAoj4n8chhCEMhAFZlmGM+cOgDzgz" "ODk5oSiGng/wXnBOEIEiOWmaYoyh1+thrUVrjbX2NyDPc2q1GgvDTQZ6Gdp7el4IXcYF/ZHt" "7e3+32eQM0CktSZNU1qtFqPtNkuVCs45rLV0u11qtRrNZpNqtYq1FqUUMzMzZFmG955gZWXl" "frvdfiQigyMjI4H3PnDO4b3HOYdSSrTWIiKISH8Dv/rLfzy9v+QHngiXRpqnCBAAAAAASUVO" "RK5CYII=") index.append('camera') catalog['camera'] = camera #---------------------------------------------------------------------- camera_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAshJ" "REFUOI2l001oXFUYh/Hn3LkzuWnGkUw+bhNN6FSlKWRS01hTglZIKdSFBXGXhSLuiouCm1m6" "kXbhRoWECOLSRRZF05VaPzBuAiJOo2Em0AgpJpOP5t6ZzMw59+Sc00Uw4KoF//v34bd54X9O" "AMzNzX0kpZzWWncaY4RSKi2lzCil0sYYEQRBks/n75RKpRsAMzMzE1rr9YWFhYdifn7+aedc" "ND4+jnMOay3WWlZ//46333iB5P4XfPrDCLnwLJVK9Z0oij4DcoBzzk2mCoXCyujoaD4MQzY2" "Ntja2mJ3d5fB4RF++m2HSuM85yZeRQjB5ubmm57ndQRBgO/7Io7jS75z7vlcLsfKygr9/f0U" "i0W01hhj6OvrY3V1laWlJXp6epienqZWqxFFEVprKpXKGd8Yw/b2Nr29veiuYT6+26Z5KLBA" "h0jz2rOnyTcaVKtVwjBEa83a2hoDAwNYa/GstTSbTYaGhli8l6CcR5D2CDIexkvz84MuwjBk" "b28PrTVJktBut4+VvrUWpRRKKQ5MhiCTwvfAORDOkbgMUkqklCRJglIKKSVKqSOBMea4CuCc" "PTr2wPMg5QlarRZJkvxH8G/gWFCv18m4Tg5tgIcDd6TI0CaOY7LDgnLrLq3OA05M1NnZv4+1" "ltTY2NiH2WyWKIoY7uui1s6gRQoA37Z5JvmTtX9+5PRUjlcuTHL5wlV0sMdGUmY/OsBXShHH" "MbVajZ79fSYLBYwxaK1pNBqUy2X84kNeHJnCeIZzA1f4/q8FLhan+Lu6iB9F0Y319fWbzrmO" "7u5usby8LIwxWGsxxiCldCefMyItsrx+9j0APrj8OYv3ZsH75ugXHreL7w+237p2NTjEUrry" "Jbe+fZcg1cFXt7+WqScJDL6U7WwkO5dOhafYbT0gbm7z6x+/UI/UJ08kAHj5+slbCHFdwFMO" "Gjg3uzy7VXoErq+Qw8a/E8MAAAAASUVORK5CYII=") index.append('camera_add') catalog['camera_add'] = camera_add #---------------------------------------------------------------------- camera_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAr9J" "REFUOI2l081rXFUYx/HvOffOzK2BiZm83KY2CVcsTTFRYpCCrxDdqLjoSgzSdtelxVWWRVoF" "caWLkIV/QZZV8KVKtQEhWApjyjAJTaBjXibNtPdmnLn33JNzjovQgCsL/vbPl8/mgf85ATA/" "P38ty7IZrfUxY4xQShWyLCsqpQrGGBEEQV6pVL6dm5u7DDA7Ozuttd5YXFx8KBYWFnqdc/HU" "1BTOOay1WGup3fmJ8++fIl//hq9+GaccnqFeX70Qx/HXQBlwzrmzXhRFKxMTE5UwDGk0Guzs" "7LC3t8eJ0XFu3n5Avf0SL06/jhCC7e3tc1LKUhAE+L4vkiR5w3fOPVcul1lZWWFoaIjJyUm0" "1hhjGBwcpFarsbS0RH9/PzMzMzSbTeI4RmtNvV4/7Rtj2N3dZWBgAN0zypc/p3QOBBYoiQJv" "nnyWSrvN6uoqYRiitWZtbY3h4WGstUhrLZ1Oh5GREa7/maOcJChIgqLEyAK//tVDGIa0Wi20" "1uR5TpqmR0rfWotSCqUUf5siQdHDl+AcCOfIXZEsy8iyjDzPUUqRZRlKqUOBMeaoCuCcPTyW" "ICV4UtDtdsnz/F+Cx4Ejwf7+PkV3jAMbIHHgDhVFUpIkYVpsMvr9FUb3tjjtlWjsvsDvjwNp" "mlKtVpk6McmdZAjlB3hCULApz+R34fZ13os8zrz1MaXoedLqj9y9dYP1+wm+UookSWg2m/Q/" "esTZKMIYg9aadrtNtVrl3IM/GP/oU4J7N+G3qzzV+zTR2Biv1Nbw4zi+vLGx8blzrtTX1yeW" "l5eFMQZrLcYYsixzlbISwfEI3v3k6Af8K8MMoA9/4b/2w9te49UPL57suf8dKt2hC7T3PWr3" "2PSeJHDp5eO9D5tbr8miJ7XXIWk51rekMQfuiycSANz6YGSu29q6JK0Ys9JtWtz8OzfsZ/8A" "AF2VUGgadc4AAAAASUVORK5CYII=") index.append('camera_delete') catalog['camera_delete'] = camera_delete #---------------------------------------------------------------------- camera_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwVJ" "REFUOI2lk09om2UAxn/vly9fsq3L3zap0nbNrLabjbObZYL/oEMjigMPuxR1HkTxNA8iRT0N" "RAYeRA+l6O5jZQfRiww3J1UPqzrblDSFdRvZ2iSLTdI2f97vy/u+HnqrevI5Pjw88MDzg/8p" "ATA9Pf1Ju92e8Dxvj1JKSCn97XbbkVL6lVIiGAy6sVjsu6mpqfcAJicnj3med2t2dnZDzMzM" "hI0xtbGxMYwxaK3RWpP74zJvvPIw7up5vrgyQih5iHx+5XStVvsSCAHGGHPcl0qlsqOjo7Fk" "MkmhUKBYLFKpVHhwYIQff7tPfusoR449gxCC9fX1Vy3LCgSDQWzbFvV6/VnbGDMUCoXIZrMk" "EgnS6TSe56GUoqenh1wux9zcHPF4nImJCUqlErVaDc/zyOfzw7ZSinK5THd3N96+AT77oUWj" "I9BAQPh5ru8gsa0tVlZWGO6t8lRwAd9QmkblGpWBFpbWmkajQX9/P98uukhjEfRbBB0LZfm5" "dncfyWSSvq4ch8J1etOvMTTxJgfG3+aF4Qi21hopJVJKtpVD0PFhW2AMCGNwjUOXmuf1U+OE" "o+Ns3MzhCJf9oV66kwPYSilc16XVagEOxmiMsRAWWAZGAr/zxGEfkYMZ5PoFnL2COzeW2W54" "nL10c2eClJLNzU0c49LRAq0NShlS9jzvjC0Reehl2mtfIfxV/F37caurfLNsU6y5OwWtVouF" "hQXGwkV8nSZSa3qbVzl9eJHw0Ena96ax/B7u5iD3rlzn86uG4raF1hpbSkm9XqdUKhGvVjme" "ShFoZjn6iJ/Eoydxi1/jcwzt+gGKP13nYmEYIg2azSZaa0QmkzlTrVY/NcYEotGoGOyqijNv" "PU9HJIjHfiaacGjX+1m9/CsfXNrQ5S0NOzcE+F7shuPiuRPm1LvnyV94n7XbvxAYOIJXvr8W" "8ZF5/KP57O68b7fx2OCej5/sC1vRB/rZuFuhsJTb9vl9J54+++fiv9H4j4L4Xu/DO6tLdLb/" "0jKg5iz0iy+dyy7/F85/A3CTd8eugI0LAAAAAElFTkSuQmCC") index.append('camera_edit') catalog['camera_edit'] = camera_edit #---------------------------------------------------------------------- camera_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAudJ" "REFUOI2l071vW1UYx/HvPffauSbEaR2/1G0SYVSaNE1UuRFKlzaQBTFUKGULEv0DWJBYIjEx" "sCAWXqQQBAsSMASWwsCLQCAyQEoKpG4tx6KtlIJjN4pf4uTe4+NzDkNEwpCNR/oNjx7po9/y" "wP8cB2BhYeH1MAxnlFIxrbUjpYyEYRiVUka01o7v+51EIvHl/Pz8ywBzc3OTSql7S0tL287i" "4mK/tbaRz+ex1mKMwRhD8bdvefHKE3Tufsjb348Sz5ylVFq/1mg03gHigLXWTrm5XK4wPj6e" "yGQybGxssLm5ydbWFieHR/lh9SGlnQucn7yE4zhUKpVZIUSP7/t4nuc0m83LnrX2dDwep1Ao" "kE6nmZiYQCmF1ppUKkWxWGR5eZmBgQFmZmaoVqs0Gg2UUpRKpRFPa02tViOZTKJ6h3nzu4Dd" "roMBepwI04OPk9jZYX19nUwmg1KKcrlMNpvFGIMwxrC7u8vQ0BBf3OogrcCPCPyoQIsIPz7o" "ZXRIM3vxIVa36XQ6BEFw0FIYY5BSIqWkrQWe5+J5gojYj+ta0t4a5y48R0oUkVIShiFSyv0G" "WusDFcBag7XgCBACLsZ/JvPYNPFsnuPOn/SKOkEQHAL/Nmi1WkRth65xMMaitSUhauSjP9GX" "PIZuXefU+Wucjt+nqyRKqUMgCALW1tbI92/idveQxqCN4cnINwyduwrhTVY++phHjwWk3Cpn" "0uoA8KSUNJtNqtUqA/U6U7kcWmv6+Jt81tJ3fA/dugfWoNs3yD31Cs9uv8Gnf7QxxuAODg42" "yuXydKVScev1OoVCwblz+xaXhzcYmbqCa25iu9ucHEtizR7RR3qI+WMUV762d/5SXzlHPciv" "7116KTU2++6JMzF0ewVrO6x+XmTy+bM4bj/EnuHGB6/WnK55+kjgl7emHky88MkpV9zHduuA" "/c9V4MZGqN7+ndL11z7zjgKU7Pir718NrLFYY/ZjLYe7BWPA2BP/AIfDpm7zMdXZAAAAAElF" "TkSuQmCC") index.append('camera_error') catalog['camera_error'] = camera_error #---------------------------------------------------------------------- camera_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAslJ" "REFUOI2lk09oHFUcxz9vdjaZtmElmz/TxCSy0WJis2gsEkGisMXePPSagz157zEHb1rqwZOC" "IQdB8JijnrSVCkmq0bQYQ8Nu0MWuNrsxsTPZ7M689+a956E0glAQ/MDv8jt8+Fy+8D8RAEtL" "S9fSNK1orU8ZY4SUMp+maY+UMm+MEUEQqGKx+OXi4uJVgIWFhQta6/rKyspfYnl5+SnnXDQ7" "O4tzDmst1lp27n7N22+dQ/36KR99M0UhnKZarV2JouhjoAA459xcrlQqbc/MzBTDMKTRaNBs" "Njk4OGB0Yopbm39Sbb/MixfmEUKwt7d32fO83iAI8H1fxHH8uu+ce65QKLC9vc3w8DDlchmt" "NcYYhoaG2NnZYXV1lYGBASqVCq1WiyiK0FpTrVaf940x7O/vMzg4iD4zwYc3EzqZwAK9Is8b" "Y5MU221qtRphGKK1Znd3l5GREay1eNZaOp0O4+PjfPGzQjqPIO8R9HgYL8+3v58hDEMODw/R" "WqOUIkmSk0rPWouUEiklx8bD93P4vkfee3SZ6CFNU/oqNW50PyBRXdI0RUr5qMAYc2IFcM7i" "HAgPPA9ynqDb7ZJmirHBae70fUaiOicC/3HB0dERPe4UmQ3wcAS975DLabAZ61nG08VzTJ+d" "o512+Gn+O+QvI/8IkiRha2uL2dEyd+NhpB/gW8Wb569gnMVYg8XxIG5QHnuNY5WwKT/Hbk7h" "SymJ45hWq8XAw4fMlUoYY/ghUxhn+e1wF20zMqvRRnMk27w0Ps+x7vL9pTX8KIqu1uv16865" "3v7+frGxsSGMMYwupGQmIyxMkFmDcZa9+D7FvrPcaayxfu82udvPrIknjeTyJyWbKoWyijRT" "PDt0Xrw6eYkf769zo/pVUxkuNq9z74mCf/PCe6LzykTl9K3azT+04OKD96merPG/UHqXjnG5" "0xIz2bpG/fH/b7KqnWZ0sUNzAAAAAElFTkSuQmCC") index.append('camera_go') catalog['camera_go'] = camera_go #---------------------------------------------------------------------- camera_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwZJ" "REFUOI2l081PY1UYx/Hvvb19ISXYlpY7rUMJIHEm0BqGhauxkQR3LmZLDIaFC3bDjuWwUENi" "SNAFYeFfQOIsdIPGFxJcGhPFNC0GQuv0Bcp4CxTuuYdzjgsicdY++983n80D//MsgM3NzY99" "35+VUvYppSwhRNj3/YgQIqyUsmKxWJBKpb5ZWVl5CjA/Pz8jpTza3t5+aW1tbb1mjPGmp6cx" "xqC1RmtN+dfvWHh/guDwSz7/4QED7kMqleqHnud9AQwAxhjzdmh0dHR/amoq5bou9XqdVqtF" "p9Mhl3/AT7+cUrl4xFszj7Esi2az+cS27WgsFsNxHKvb7b7jGGPeGBgYYH9/n6GhIQqFAlJK" "lFJkMhnK5TJ7e3sMDg4yOztLu93G8zyklFQqlTcdpRQnJyek02lkPM9n31/Tu7HQQNQKU7o/" "Rurigmq1iuu6SCk5ODggm82itcbWWtPr9RgeHubr3wOEsYmFbWIRG2WH2f0rjuu6nJ2dIaUk" "CAKur6/vlI7WGiEEQgguVYRYJIRjgzFgGUNgIvi+j+/7BEGAEALf9xFC3AqUUndVAGP07dgG" "24aQbXF1dUUQBK8I/g3cCc7Pz4mYPoLAIvT3H+TsF7zuDvJno8VJ2KCUolarkc/nmZmZodVq" "obUmVCwWn/X39+N5HvdTMQ5/+5lH9wIWPpgnl8sxNJigUqnQ19fH4uIi4+PjZDIZpJQcHh7i" "CCHodru0221UpUI+meTx7AKrq6vU63Wy2SyFQgGlFOvr6zQaDRKJBEtLS7cBz/OeHh0dfWqM" "iUYiEXtubg6AcrmMMYbl5WWSySSXl5ecnp6ysbHB8fGxBuxkMqmdnZ2dDWADoFgsLjWbzU+A" "RDKZ/NbzvHfX1tbC8XgcgF6vRygUkhMTEz8C7zWbzXPrv581OTn5cGxs7KtSqXQvn89rx3FS" "7XabarVKNBplZGQE13W5ubl5WavV7N3d3dYrASBUKpUK8Xj8eS6Xy0Sj0ZAxxu50Oh9ZlvUi" "nU4/B8JCCNVoNE57vd6TfwDo7qWLgnCM1AAAAABJRU5ErkJggg==") index.append('camera_link') catalog['camera_link'] = camera_link #---------------------------------------------------------------------- camera_small = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYJJ" "REFUOI3tkjGLGlEUhb/RZQfRGUgaUzix2kJYRNIEha1Tib8hxeKy2G5lmrQp7NL5LxJIENKk" "WlJpExGVdZlooXFgHX2+8T32pRphmSJ1IBcunOZ8cO858H+sWLTb7Q/AjTEGAGPMcZVSdDod" "q9VqGSkl3W736EvFQmt9U6/XKZVKeJ5Hv9/n/dU57978YDgc0mw2jeM45HI5Go3GOPadxCKb" "zTIYDKhUKriuS61W49vPObe3F1xeVtjtdvi+j23bbLfblwmA4ziUy2U+3T/n6ywFnHLxosCr" "szN6vR7VapXRaEShUEBrfZo4wbZtMpkMX6YpHh5tHrD5/jtLOp1ms9kgpWS/3xNFEVprEgAh" "BGEYYswjxgLSFiZlsVwuEUL8HbBer5lOp7x+FuBYe3KW4PzknvF4TBRFR7NSijipJz9YrVYE" "QYDn/eKt6xKGIbPhjLv5nHw+TxAEFItFhBAopZKAxWLxUUp5PZlMrDj7w+GAUgrf95/0whjz" "OVmpf3b+AIds0zTApzG1AAAAAElFTkSuQmCC") index.append('camera_small') catalog['camera_small'] = camera_small #---------------------------------------------------------------------- cancel = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAelJ" "REFUOI2tks9qU1EQxn/3pklRiS1NBFESJcU/VMVitS4KClUohJaSnSB07QP0BQpduHBhwRco" "7QP0JSq0C7uTFIlYQWnJTW0barwn95zPxU1imrjswHA4zPfNzDczcN4mCARqu+3yCIJevNdD" "rnLvdpZnkyAhCZzruPv4Cbf7tZ6Cy23OQB/5+VOo/ES1Y3AOOQfWoqFLMPkAnE03vuxVL8AV" "AL+PfNyEt+8gn0fWQhShfB7//Qf0K8R7NIY/msueQrW7denNa7mZF9LOjlSvS7WaotlZRcWi" "FATSyYnc9rbMwzGZ0rTqoE4HQKw3OMItLYExkEqRWF0lsbYGqRQyhmhxEbdfQ9biWjwfiD/W" "xi1XKtiFhThJMhm7MTRLJVy5jKIoxvUOEedivdZCF6AlMS7Qins26sT+SWgByOdJrK93KssY" "vGSS5MYGFAox5r8SnEVDF/GXl2PNYYiZn8fMzaEwhMFBUisreCPpeLXd9gcCc+uGmq+Kas5M" "y25tKZyaUiOT0e/hYTUmJmQ3N9V4Mq7Gy8c6uZ5VDfbPXGIDAn80l/HG76DP33AHh7Gs9kxG" "0vh3c5jyHtGP4CADV/tO+RQCbl7LDNwvINs+YYucQA6z+/0MuS8BwBEEHmQ6y+l6BYfZrti5" "2F/4VDM6iJjjswAAAABJRU5ErkJggg==") index.append('cancel') catalog['cancel'] = cancel #---------------------------------------------------------------------- car = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAf1J" "REFUOI3tkrtrk2EUxp/v4tcvUlraJrVQwWhQEqR4AWsx8QIWrRYREQcHxcmhuPkHONWh4Co4" "dFLQSUHrBSFqpCEaM9SQkgRMrJdqU0JJ035+Sd7zntchtLR2cXLymR544Dmcc37Af2krZmj0" "rc80zbtSyj5mZTERpJAgIptICiaalkKOfrh9/sXaAnPVGGYiEvQG9vo7oEODZAZxc0KDJIqz" "i5F7zz4+BWBsKLhw43WrMBCwF6ZxP5bF0TNXkE7GIKTC7JdP6B+6hGLiEeYzef3PFczTY+97" "lqWYGPB3YCYdR1u3H1WX4NQIc9+KIFZYdAgsgd7uNujHrquWrl15KeTZmccjee3UzcmHR4K+" "c4eCPhRKNVQcgQYxGqRQF4y6aPr2zQYCWzwgCbybKuBlLJ38+uTaQZNZDh/Y6UX+h4uqS6gT" "oyEYDWLUhWqWCUb1l8DnOResgMhuP94ksv1bT9zqNJnYUgpwvk/h+YM7sFps7D88jD0DJ0Gs" "QJIhGShkkpicGIdpefDTcxXWJgOOZbRq+wYvKloqgZbm4fN2Qtd1lMoVaO07oNwylFLNf9cX" "4PN2gZlRrjiQdi+Wewa3rXIQCoWK4XB4u23biEajmWw227f22it5rVZDKpV6lcvljq/jQNO0" "y/F4fEwp5SqlxjcQtz4f+TtO/4V+A0tYDFegLInCAAAAAElFTkSuQmCC") index.append('car') catalog['car'] = car #---------------------------------------------------------------------- cart = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk1J" "REFUOI2lUz1rIlEUPWZli8SJ5mMNSAYMUXYgU0gKJ5VV/sKW2y1uxEa3SYpdAhFShWwSQipR" "gl1IkSqVW4nFgxQ2GxMYYWNmRUWxiAFn3p1528Sg7AeEvXC5r3n3HM45F/jPcr30Q6FQEJxz" "EBE45+9d5XJZAIDjOLBte6yJaKw551heXkY0GkWr1cL5+fl3txACa2trsG37n8iWZeHs7Kyh" "qmqgVqvh8vLyB+f8xO04DnRdx9TUFAzDQCAQwN3dHWRZhq7rCAaDuL29RSgUgtfrDdzf36Na" "rYJz/mFzc/ObOxaLuYrFopicnES329Usy2LdblczTZO1221tMBiwZrOpDQYD1mg0NNM02ePj" "I4joJwBMAAARwePxQJIkJssyPB4PCwaDmJ6eZqFQCDMzM0xRFMzOzrKVlRX0ej1YlmWMuXBx" "cSHW19dRLpfR6XQ0SZJYq9XSfD4fq9fr2sLCAjMMQ5ufn2f1eh07OzuuZwZPIn25vr7G0tIS" "JEli4XAYXq+XKYoCv9/PVFXF3Nwci0QisCxL/DEHp6enYmjXiNfPb8dxsLq6ilKpJPb29iZe" "HKTt7e3X/X7f5Jx3jo6O3gCAGwCy2exbIcQnIooPEUcZDOfDwwP29/ddiUSiP1zqfkrhu3g8" "/vHw8LDKOU8R0cHW1tbBKHo6nU4RUSqZTKY456/GNDg+Pv5MRJnFxUXIsoxarYabm5tndCKC" "oihQVRWVSgVXV1d6Pp8P/6bB7u7u8FDSmUxmjMHGxkbKtu2vtm0jl8u9+Aj/Wr8AALRoeunc" "DbQAAAAASUVORK5CYII=") index.append('cart') catalog['cart'] = cart #---------------------------------------------------------------------- cart_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqVJ" "REFUOI2lU09Ik2Ecfj6bZLrP6ZSpYx/MttHEZYti35CwQ/MqdejYIcgEo4N1cNCkdCJ2kDqI" "hxBCPEQmNC9CsehQs94uQeU/2rD9aWxrS8INt/d9t6+LEwcRRj94Lj/48Tw8z/MD/nOEfz2Y" "n59XGGPgnIMxdkUIBAIKAJRKJRSLxQpwzivAGIPJZILD4UAymcTi4uKqSlEUOJ1OFIvFvzJT" "SrGwsBC32Wz6UCiE5eXlb4yxGVWpVEIwGERdXR1isRj0ej3C4TAkSUIwGITRaMTm5ibMZjM0" "Go0+Go1ifX0djLFrw8PDr1Q9PT2C3+9XamtrkclkZEopyWQycqFQIKlUSs7n8ySRSMj5fJ7E" "43G5UCiQXC4Hzvl3AKgCAM451Go1RFEkkiRBrVYTo9GI+vp6Yjab0djYSKxWK7RaLens7MT2" "9jYopbGKFHw+n+JyuRAIBJBOp2VRFEkymZQbGhpIJBKRW1paSCwWk5ubm0kkEsHY2Jiwr2DP" "pJG1tTW0t7dDFEVisVig0WiI1WqFTqcjNpsNTU1NxG63g1Kq/LEHc3NzSjmuA1mDMYad6iR2" "j6Wxy3LI5rLIZFMjL+5/Hj9UkQYeXLqnNzTcPdNxFgatBa9XfXj/5Q22gukpFQDMzs6eUBTl" "Fuf8epnxoIKt/DvYredRrCriVFsv/GvP4DzZja3g0o2qvRZe7u/vH6CUDlFKw4yxIbfbLXg8" "HmF0dFT4mf2BakGNvo6bAIDbFx7BpOuCAKFGAIDp6WkP59xrMBggSRJCoRA2Njb2VazsPsXF" "Phc4SnD3Psbky6uoOXIUT54v5Ss8mJiYKD/KkNfrfVjeOwbbxqXjmjvdXedgaT2Nr4mPWPn0" "FtGtX1OH/kbHYOskBGFQAEQF2IGizHyYSbh/A+09dM4cnOxlAAAAAElFTkSuQmCC") index.append('cart_add') catalog['cart_add'] = cart_add #---------------------------------------------------------------------- cart_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApNJ" "REFUOI2lk09ImnEYx7+vvayWvmkluZzvUjIS9BA79HYYHVaDbdctOu02DHZaXXRjjTCQHQtk" "g9ElukWHLgvWHAychx+syyA18GVlKuoUR2Hp+/u977tLSsIYjT3wHB+eD98/wH8O968HGxsb" "OqUUjDFQSp9w8XhcBwBN06CqatsyxtqWUorh4WGMj4+jWCxia2trn9d1HRMTE1BV9a+fFUXB" "5uZm3ufz2WVZxs7OziGl9C2vaRrS6TSMRiOy2SzsdjuOjo4giiLS6TScTicODg7gdrthNpvt" "x8fHSCaToJQ+DQQCn/nJyUkuGo3q3d3dqFQqkqIopFKpSI1Gg5RKJaler5NCoSDV63WSz+el" "RqNBarUaGGM5ADAAAGMMJpMJgiAQURRhMpmI0+lET08Pcbvd6O3tJR6PB319fcTr9aJarUJR" "lGybC9vb2/r09DTi8TjK5bIkCAIpFouSxWIhmUxGstlsJJvNSlarlWQyGYRCIa5FcCHSYiKR" "gMvlgiAIZGRkBGazmXg8HgwMDBCfz4f+/n4yNjYGRVH0P+ZgfX1db9p1yWtQSuEo7sGWI+Cr" "JdS6jOhUTl7cj2pvrhSk2OytgHDTHhqdmrnW6fLi/PsuErFd9VcqNc8BwNra2qiu6wuMMX/z" "42WC298iuPfsJa7LX4DcV8BsQZkfwt7H2A/+IoUzfr9/bnV1NUkpfc4YWwkGgytNgk93ea3r" "hovDw4UWFb80iA6dc3IAEIlEXjHGlh0OB0RRhCzLSKVSLYo7++8x9egxjJkPaJwXcAbg9KQD" "SRm5Ng3C4XCzKPPLy8stgtjs4BJvEhaHrNTAG7I4/clwWOhQlbr2+sptjM2KwbNKfs6gcUOa" "Qc9p0N89iGrh36p1dPtNq+4KAAAAAElFTkSuQmCC") index.append('cart_delete') catalog['cart_delete'] = cart_delete #---------------------------------------------------------------------- cart_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAs5J" "REFUOI2lUl1IU2EYfqbT2pxn/qWxMd3cxH4mIZmz1IugwCgk6OciqOjH6taojKKrakg3CkZ1" "MQQRRMQL6cKIjJKwOOrFwOnJPE7H/NlPs6TJzjnf+c7XTUKDDKIXnrv3ed6X53mA/xzdvxJ6" "e3sZIQSqqoIQcl43NjbGAEDTNFBK06CqahoIIXA6naitrUU0GsXg4OC0njGGuro6UEr/ellR" "FAwMDKy43W7L/Pw8hoeHFwkhz/SapkEUReTk5GBpaQkWiwWhUAg2mw2iKMJut2N2dhYulwtm" "s9kSDochCAIIIVfb2tre6gBgZGSEGY1GJBIJD8dxfCKR8OTm5vKxWMzDcRwfiUQ8+fn5vJX0" "3s3XDO2ZpipsfB0FpOWLegBQVRUmkwmKovA2mw2yLPN2ux2SJPEulwuyLPNVpVFwyV3thqJG" "mB3V+L5QCeG170kGADQ1NemCwSBqamowNzeHeDzuEQQBkUjEEwgEUKo9v1dojKGgoh6pNQGp" "RR653E6YCkvN+t9MejAzM/PQ4XBAlmW+oqICkiTxVfYUdhgOevPKj0Je7Ue2UYeQ/zOUlJyQ" "5OShtB709PSwzbgIISjImsexegPMrmZIyy+Qka2CJMsQfj8BRUZ1desb/5axvXpccnZ1oo3R" "1Ce2IV5gqdA5th64z4SuI8x7+8q3zT09APh8vkrG2E1VVa8RQrBdmoatyoTivcehRHzIzGaQ" "1suwOjoOqD8c4WR2YFMg41cLz7S0tFxXFKUV8fFEvbsQFDasTnVBg4SNNStW3o0n+4Jly0/F" "mpOU0sy0DxRFQWdnJ7NardCkl9jT8Aiz/bfw5cNHbCvdh2RkAbHiZlPTqUaT3+/vmJycFDcF" "0kz0er2MLvThzuUbQAaFf2QIoeBckisyNwytNx6mlHZQStHd3a37owAAnG7IS+13lugP7C4H" "y5I/yvH4pRPtU8GtzP4JSA98ZcNVci4AAAAASUVORK5CYII=") index.append('cart_edit') catalog['cart_edit'] = cart_edit #---------------------------------------------------------------------- cart_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsRJ" "REFUOI2lU01IVGEUPfNmEp2Z58t+1BmZHHNGyTHyL59EWtTGaFe0yrBF1qKVFUiLEDdCVuSq" "lQQmbmSKfsBFGEFo8GwmJNBBZzRFG2bUacgcffN93/u+FqkpSBBdOIsL554L554L/GeZ/nWg" "r69PUErBGAOl9IppZGREAADnHIZh7ABjbAcopSguLkZtbS3i8Tj8fv+4RQiBuro6GIbx182E" "EAwMDETLy8ud09PTGBwcnKWUPrFwzhGJRGCz2bCwsACn04m5uTm4XC5EIhG43W5MTk7C4/FA" "URTn/Pw8QqEQKKXX2tra3lkaGhpMQ0NDwmq1IpFIqIQQLZFIqOl0WltcXFR1XddisZiq67oW" "jUbVdDqtpVIpMMa+AYAEAIwx2O12yLKsuVwu2O12ze12Izs7W/N4PDict65V5I4i74Bd8/l8" "SCaTIIQsbAk0NjaaZmZmUFNTg3A4jKWlJTUUCiEWi6mh8TG4MrTZHMdxeLPe9wcCAaRSKXR0" "dKxuCWyYdG9iYgJFRUWQZVnzer1QFEU74viOnMJz7mxHJfaI9OWqslwQQsSuOejt7RWb56KU" "IlNagZo3hpJTzQCdwtp6KcKBN3gesImuB48kALBsF2hubt4SFO3t0rgv2Jt/9GoT9M8Y7X+F" "upa7yEiF4cgqWN3kWQCgp6enVAhxizF2fXP7U3McZ/Yfg5yzBmPlKyA4jNVPKDp9G8svu2zD" "90/IJ9s+/pQ2UnippaXlBiGklRAyx5l+p0oOBvceqgBf+wLB11F9sRScRJGZOYWS6gsSoLdu" "mUgIQXd3tygoKHhcX19f6Mtfe7jPe77aKi9DsARgMiP4YgoAB9encLCkEAYhNz+0l5XtMLGz" "s1NQSnFWefujqumZYpZmIVgSgNjGkmDOKkV8fAyTrzv8u37jcFflsmDcKriA4Pw3hMCfXgCc" "A1wEfwEUNoRVmS3KqgAAAABJRU5ErkJggg==") index.append('cart_error') catalog['cart_error'] = cart_error #---------------------------------------------------------------------- cart_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqNJ" "REFUOI2lU89Lk2Ec/0xnodu7X9iqzbemm7TaCCHw3aE8Wf9Bx+iSdfCSXexQhAqehISgk4dk" "dREPQuChVhA45DELCtyStnLvlmy2YaaT932e532eLi6SSog+8Ll8v3z5fvl8Pl/gP2H714Fk" "MikZY+CcgzF2xZZOpyUACCFgWdY+cs73kTGGcDiM3t5eVCoVzM7OrtillEgkErAs68DNlFLM" "zMysx+PxQD6fx/z8/Bpj7KFdCIFcLgeHw4FSqYRAIIBCoQBVVZHL5RAKhbC6uopIJAK32x0o" "FovIZrNgjF0bHh5+Ye/r67OlUinZ1taGWq2mUUpJrVbTTNMkGxsbmmEYpFwua4ZhkPX1dc00" "TVKv18E5/wIATQDAOYfT6YSiKERVVTidThIKheByuUgkEoHX6yXRaBQ+n4/EYjFsbm6CUlra" "58Lc3Jzs7+9HOp1GtVrVFEUhlUpF83g8RNd1Tfc/Jbt8C5o1CF3XMTo6avt5wZ5IdzOZDDo7" "O6EoCunu7obb7SbRaBR+v59YsNDRfhrP+QQopfKPOZienpYNu7LKE0jBQAUH5RwBXzfOdpzH" "0tpLvC8RPLtZboIN8q9BGkxq8mLsKiwpYAkLAhLlrRK8Dj8WP6WwrL/iy7fNQ3YAmJqaOiWl" "vMU5v84YA2MMGf4YlhQo1D6CCQ4uGJjF8N3cRo96ATts1/7t3oLRtJfCywMDAzcopUOU0gJj" "bMjgBrjFcdR1AsdcJ3Hc3YWW5lYcUYJ4W0wjnVv4YGzDY2+kbHJyUgaDQaiqinw+f59smXi0" "OAEqKAxOEW4/g0TXJbwuLGBxZYk219Hz+QHMfRqMj483HmVobGxs8tdefKRl51yoz/Fm5R1E" "a/VwZgT0NxcOQugOvgrZ3K7brRaMgDfqPwC7boRe1eW4RAAAAABJRU5ErkJggg==") index.append('cart_go') catalog['cart_go'] = cart_go #---------------------------------------------------------------------- cart_put = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAq9J" "REFUOI2FU09Ik3EYfqYSxfblmjbLtoOD4Sf7KhHykyIPYnUIukmn6DYVD20d0kMhbLCTmJp0" "Ek3ETh7sYpeC0KZ8OEoJVKittX0Ko8Es/+B+f7u0D8Wk9/L7wfvneXif57XhhHg0fVMyQbB9" "8Bt77EDMdn8v/1dd2UkDOC+yW4GHuHe1EweEnFSGipMSVPIKLgWY4KCCWEBTU1OSUgrGGCil" "Dyri8bgEACEEOOd4sxlBkRG4zl4EFQxFTnHJ6ce1WFHuEwmfz4fm5mbkcjnMzMz0VUgp0dLS" "As45AGD6dQGe6gY0XNCx9SuLPbKPFt9t2MrOIJFa5ZqmlSeTSczNzaUppS9t8/Pz0u12w263" "wzRN1NbW4snbO/BW1eOy5wb26QGWf3zEaXEObfYOqKqK9fV1pFKp9t7e3vdlra2tNtM0kc1m" "kc/n9XQ6jfvumP5lcxlLqXf4nF3E0tfFxTZ7B7a2tvTV1VUUCgUwxjYtFRhjcDgcUBTF8Hq9" "cDgcxou7H/ApM4+f29uIXnl1XVVVuFwuIxAIoFAogBBiAoCttN3Z2VnZ3t6OeDyOfD6vK4pi" "5HI53el0GplMRq+pqTFM09Srq6uNTCaDSCRiO+IDQsiztbU11NXVQVEUw+/3o7Ky0lBVFW63" "29A0DVVVVUZjYyMIIbLUZzEAgMnJSflXXxzS2voLIdDU1ISFhQU5MDBQdmzA/6K/v//U7u5u" "kVKaHxkZOW85cWxsrF5K+ZgxFiwhHmZQend2djA4OGjr7u7ePWJlIURHMBjsHB4eXqeUhhhj" "Q319fUOH0cPhcIgxFurp6QlRSq3DsgHA6OjoU8ZY1OPxwOv1IplMYmNjw0JnjEFVVWiahpWV" "FSQSiW8TExP+YzuIxWKlQwlHo9EjDLq6ukKc8+ecc4yPj1t9fwA0g4QKzeXDeQAAAABJRU5E" "rkJggg==") index.append('cart_put') catalog['cart_put'] = cart_put #---------------------------------------------------------------------- cart_remove = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArtJ" "REFUOI11U01IG1EQ/nb9qRiDgaSxtMYSqXTBPYilJvQnUMixh/bQY6GHYiNeYg/VQovUUE/B" "qoQeWtGKlF6keGk0B6GgsSyEYug28ZCgJltpZEmwSdHse7uvFxOUmrnMY2befMN83wC1jIG7" "v9LCbn+0x2rWAKirlfB5ruhu013ucnPnxbx7+87vL+UPZ9VxZwVffb3JOpquo8NyC8VyERvZ" "MMKJ5Xn5WenRwsICI4SAUgpCyEMuGo0yADAMA7qu4zte45LJhQut17BfzOLgMI/mRivWd1fw" "LRVDyPMZfX19yOVyWFxc/FnPGIPb7Yau6wCA+IYF6UIc+b95OG03wKMJq+lPkPd/gBiHhiiK" "fDqdRjgc3iGEvK03DAOpVAomkwmKouBeZxC7u7tYLjyH0+YGzzNs5xN4512HLMt8NptFMpkE" "IeTx8PDwKu/xeDhFUZDNZqGqqmtnZweqqro42gAwAxwD6tBgyLKMvb09VzweR6FQAKX0FwDU" "AwClFC0tLdA0TXI4HCiXy5Lxh0ck8R6FwwM0153jBUHA0dGR1N3djUgkAk3TlFMsLC0tMa/X" "i2g0ClVVXWazWcrlci6LxSJlMhlXW1ubpCiKy2azSZlMBmNjYxwA8JUGmqa9TCQScDqdMJvN" "UldXF1pbWyVBEGC32yVRFGG1WqWenh5omsbO1MH8/Dw75hcnuK6+DcNAb28v1tbWWDAY5GsK" "qZaNjo42lkqlMiFEnZ6ePl9d4szMzFXG2FNKaX8F8eQEFV8sFjExMcENDAyUKk3rj1X4oL+/" "/8nU1FSSEOKnlE6OjIxMnkQfGhryU0r9g4ODfkJI9YY4AAiFQi8opYH29nY4HA6k02lsbW1V" "0SmlEAQBoihic3MTsVgsNTc31/XfDsbHxyuHMhQIBE5N4PP5/Lquv9F1HbOzs9V//wBRD4px" "0TpV1AAAAABJRU5ErkJggg==") index.append('cart_remove') catalog['cart_remove'] = cart_remove #---------------------------------------------------------------------- car_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlJJ" "REFUOI3tks9L03Ecxp/vj9wMUzSn6xeMxPB7iDJLJcw69MPSkpCCDkWBdLB16iJ06GSI4KFD" "QpAEFdjJyspCiGE6TbvocsQgh5ma277G5prbd58f7w7SWHXpD+g5PafX834/PMB/Kb9MQ8c7" "h67rj4QQu6WkHMk5BBPgnNs5F0xy7hdMdHzoaXmTDdAzRtPH6yqKy/a6CqFCgZASXK4npLlA" "cDFW93hw+hUA7S/AuVuePKahzP7dj77hTzh8+jJ8k8NggrD45TOqGy4iOP4U4ZmA+ucL+qmu" "CecPwV7Wugox5/Miv8SF1SRHIsWx/DUILgmxBIcUwLaSfKhHbpBt866AYKJ5bqAtoJy8Pdpf" "X+E4e7DCgdlQCtEEQ5pLpDnBYhIWW/cFGzWUleaCC+D91CyGhn2T8y/cNbqUovFAeTECS0ms" "JjksLpFmEmkuYTFahzEJa82DqDkGKx1DillwOndUy+PdRbrkMocISCxM4fWTe8ix2bHvUCP2" "1J4AlwQuJOa/DYI2TKDKqMH2onJ4/M/A7COQmqdTqTx6gXg8BB4Pw1FcBFVVETKjUAp2gpIm" "iAhVLTacb24CNBVnjOvofnsVGlT09T+3Mm0ahhFsbW0lt9tNhmF8zG666WYlDc7cp2wN+O5S" "zbUtlNmBoiiXvF5vFxEliag3G2DGQin/0ph9emkU7cceoHPoCuyaDQRKZUYRiUTmTdPsNU3z" "4crKym8XbN2flxtPR+pdpS6YawuIJcLwTo9gNWrdUfCPqm5zdkJR2hRgEwFxEPVM9iy3/wRr" "DEGVumjnCQAAAABJRU5ErkJggg==") index.append('car_add') catalog['car_add'] = car_add #---------------------------------------------------------------------- car_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkxJ" "REFUOI3tkstLlGEUxp/vwviZ4qjNeCHFmYaGkZAukEnZhYjyQlRERIvCXSGuqkUQmAS6ENoW" "LVpZ2MrAsosoZTpYBmaDFhPNMKUjjmmo0/g58533vC0GTWrjH9Cz+q1+h/OcA/yPsgo1rW+c" "uq53CCEqmKWNiSAsASIyiITFRBPCEq3v75x5sV6gr4GmD1f7HJ6drjyoUCCYQZyekCKBcHSx" "+sGzjz0AtH8EZ2++yrY0eIyfE+gc+IxDJxoQGBmAJSSi376isuYCwsOPMTseVP9eQa9rf1f0" "S1hPq1x5iAT8yClwYckkJFYIM5NhEEssJggsgC0FOVAPX5UZm71BYYmTke7GoFLbNtR10Oc8" "vc/nRCi2goWEhRQxUiSRtBhJK832TRo8hZkgAbwdC6F3IDDy/UnTXp1Z1O/Z5kBw2sSSSUgS" "I2UxUsRIWjItsxjuLw/hCHXCmI+gOLcQNllZ2X3sdr7OxDYpgcTUGJ4/ugdbhoHdB+qxo+o4" "iCVIMOyjHXBRP3wNl5Hh3g4z0AvHYB/2B4ealF1Hz0uKx0DxWTgd+VBVFbG5BSj2rZDmHKSU" "aM4dxalrt5AZeg1EhwB7Lub0Moy89E/qH/o6FQAoLy8Pe71et2EYiPX3j3/yd1WsNu08orNR" "5FZQd+VP+y3FsElZsvYHiqJc9Pv97VJKU0p5f/2pWJXR5bGekqzuRiTNGSwDiC9pEBqmFWwg" "g+eKW2zZWTdKHULX1SnEfxAiM5pIrXDzhgRpSen15fnpSyorZazKKEPere3jtt/0aiXFs73c" "MgAAAABJRU5ErkJggg==") index.append('car_delete') catalog['car_delete'] = car_delete #---------------------------------------------------------------------- cd = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtBJ" "REFUOI19k81rXGUUh5/zvndyJzOZZNJpmoSJ0AlOEDVW8YMkra24GakwFGwjLa5U6J8wRddC" "Z+O+0LoogpiAlAjF2QhaTItG6aaRMoVBm2KbkOZjOh/33rnvcWFbpUif1eHw42x+5xGeYP6z" "2kERPQnMAc8g6gmyrvC9Ovly4dPST//Ny6OhXL2UScV+VeHjD0vPJ/IjWdKpJH2+QcOA3/+4" "z/nvbkQC59s2qCxVjjUfHyhXL2X64+RiebZQev9wkbsPhJ9vNtEk5PM+B/b00QeoU77+sc7S" "1UatY7snlirHmgYgFfvV8myh9O7BKawRhgag1XE0H/Totx4+0HTQQjj11hTl2UIpFftVADN/" "9vKMipw+9FKBb3/dpL4JAwZyAz6djiPtGQKgG4IxEALHjxRRkdPzZy/P2Om3P/jko3deeONe" "y7LVimnca+MnUoxmPQaTjlxKAQ8FrIXQgVNhX8aX6/WNyAPmRnODXL8dAIoTaKzv0m1t8M2V" "W3cBjh8ujpVmJtltQyuETidmNDcEMOepMOHZBN0oAAErMDpk+Lx26y/notcBFq/Uf5l+Nj9+" "cz0kCB0Az431ocKE96hGp6Cx4lDkcbn/EkaOIFKCWAGHPtwbUdaiXojicCgj2X6yg2lOvFkc" "tyaxYk1i5b1DxfGd0OAnLENpn72ZJHEUIcqaByyv328eeHn/COl0kuEMRD145cVJpqfyY1EP" "moFlbTskiByeUfLDCTa2NgGWjTN68UJt1b2232csC+0AtltwZwf+3PVobAl3diJiJ4gIIrAv" "Y7hQW3XO6EWzcOboNVE9t/hDHaMQ9KAdQjdUOqES9Byxg9jFWKMU9vqs3GggqucWzhy95gG0" "bVBZutqYBEpHXi3iekI3dBA7UCVhHXtSlolhj99WGw9fOag8VaaRXJakn8Sp0u102dze4Yva" "6v/L9FSd/+E2sKwqXz2p89+DnkwBt84AyQAAAABJRU5ErkJggg==") index.append('cd') catalog['cd'] = cd #---------------------------------------------------------------------- cd_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxZJ" "REFUOI1lk19MW3UYhp/fOYee0haoq1BIMSmbJUxlYOIMsD8aF+3UpFkMw2i8mZrsyisvWPTa" "hN6YeDOjzhuzCx1mQcym3YzGkQ2CaLZFtmCHjRs6VgRGS/+c057f54VuGvdcvfny5r158in+" "x8g7mV1KyUvAEPAASiyFygt8K1odP/F28vx/++pOSKUnmgKenRZ4/dXkQw2x1jDBgB+fbSCu" "w9Xf1jj29XxNwbGy6YxOjh4o3h1IpSeaGj3/eGqwK/ni3gTLm4rZhSLih1jMpm+LDx8gWvjs" "XJbJ6VymYlYPTo4eKBoAAc9Opwa7ks/v6sY0FC0hKFU0xc06jaaFDRQ1lFC8/GQ3qcGuZMCz" "0wDGyNjpAVHq8O4dXXz54yrZVQgZEAnZVCqaoGXgAFUXDANcYPiJBKLU4ZGx0wNm71OvvPXa" "/ocfv1UyWS955G6VsRsCRMMWzX5NJCCAhQCmCa4GLYq2JltdzK7ULGAoGmnm4g0HELSCXL5A" "tbTCyalrywDDexPtyYGtFMpQcqFS8YhGWgCGLFF0WmYD1ZoDCkwF0RaDdzPXbmpd2wkwPpX9" "offBWMdC3sVxNQA97T5E0Wnd0agFxBM0gror91/cmsapCY4ngEb+uVtKWKrV3Yig0UBruJFw" "c5CDexIdn5/LzgG8sDvRPnP1FFcWT1GqrFN1XfKJZ1GSWLKAC/m1Yl9/vJVg0M99TVCrw6OP" "bKW3O9Zeq8PUpZPkN8+yb89OOrck+G5+gpmfP2JlLY6hDfnk48wV/Vjcpj0MZQdul+D3Dbhe" "sMitK2YuH6e/pw/P8OjreBpP1RjoHaJUnttunDjy3IwS+WD8+yyGgFOHsgtVV6i4glPXrBZu" "0qBCpLa/AcCb+z5kW9sOUPgMgLLpjE5O5zJnpn8hYgshHyg0eBpE2NjcYP6PC4ydPQTA2JlD" "LOYvI0jVBFj45lN32zPDX+SuF8OZ2cX+7qjPvD9k0tZsEQkqKtVNfvr1K+LROH+Wl9go5Tl/" "aYrCbee9e4Td885/cyO/+r6Uq3M9oAMCRUSOzh5dPvIXFxJc9mA3JwoAAAAASUVORK5CYII=") index.append('cd_add') catalog['cd_add'] = cd_add #---------------------------------------------------------------------- cd_burn = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwxJ" "REFUOI1lk01oXGUYhZ/v/sydvyTTzCQz46QwCZlY1DQWrCRpjVIXIwhDIE2KPysVunOhiwEF" "Nyp0Nm4U3LSItS40ImUKxbEiaLED2kI2jbYpDrapNlOa1Nzc3Ln3zv0+N2mVelaHl8NZnIdX" "8IAW3m8cEEK9AEwDuxHKEIi2gu+VFKe+fLv803/z4p6p1E73xEOrpuC1V8qPmIWBFIl4lIil" "oXyPX/9Y5/g3lwMBx7d1r1qvztr3Cyq10z2xMLpYmRouH5kpcWtL8PMVGxWFQsFioj9CBFBS" "8cWPK9SbrYard+br1VlbA4iHVq0yNVx+/sAYuiboS4LjSuytLjHdwAJsCQ6CF58ZozI1XI6H" "Vg1AWzh2dlIJcfTg3mHOXLrDyh1IapBOWriuJGFoeEDHB00DHzj8dAklxNGFY2cn9fFDL7/1" "6nOPPrnm6Gw4Ia21bSwzTjZl0BuVpOMKMFCAroMvQSrBYI8lllZuBwYwnU33snTDAxRSQKu9" "Sce5zdfnr90CODxTypUnR9jcBscH1w3JpvsApg0lGDJ0k07ggQBdQLZP44PGtb+kDPYDLJ5f" "+WV8tJC/0vbxfAnAnlwEJRgy7mGUClSokCjEfbj/yg8kXqDwQgVI1M5dE4rVoOujkEgUA6kY" "qd4E80+V8rpmXtQ18+LcwVLePPE6/TcvUXSWmVl6lzAIEIpVA7jQXrcnHi8OkEhE2dUDQRf2" "PTbC+FghF3TB9nRiTp295z4jvW8X3WQ/v228AXBBk5o6eaKxLJ8oWuRSsO3BXQdu/g3XNw1a" "GwLjVJVEcZ3MRBFxKIU5ZOMuvqOkpk7ql7/7fHX82Zdy3VDtHx1Kc7cDWx3o+IpOIBlZnuOh" "4FN6swMYXgz2AH0mD6euivnSVxkNYFv3qvVmq/Ft8yppS5GMgEBCKJE/xNB2A+bOsjYQETBo" "woe4GkC9Omu7emf+TPP3j9/8qBG0/7xO2nQYzUAyM4g6B26+jVIS1nbmb3Zhk/b/gD34zlbX" "E+99MtdvJLoCXw/zmbQihsGW8hFW6h8XVkGNQ1n2pQAAAABJRU5ErkJggg==") index.append('cd_burn') catalog['cd_burn'] = cd_burn #---------------------------------------------------------------------- cd_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxlJ" "REFUOI1lk11sU2Uch5/3nNOert1HRx3tLJp12mLACUZdtoFAMLEqSYNmTDFeAQmJidfz41qz" "eqGXapwXEi+UmYlVp0XiB6gYwGSaCC7d1rjBHIMN17N+nK/39UJBI8/VL//88rt58hf8j6GX" "i9uEUPuBAeA2hDIEYknBV0qK946+lP3+v31xPeTyx1rCvplXcOhAdlMg2RElEg4RNDWUY3Ph" "9xVGv/jVFTBa0+3hwvBe68ZALn+spckPjeX6U9knd6RZXBOcmbJQIUgmTbasCxIElFR8cLJE" "4XS5WNcb+wrDey0NIOyb+Vx/KrtnWwZdE7Q1Q7UusdY8mnQDE7AkVBE8vStDrj+VDftmHkAb" "GpnoU0Ic3n5Pik9+Wqa0DM0axJpN6nVJxNCwgYYDmgYOMLgzjRLi8NDIRJ/es/uZFw8+srn3" "clXnWtWnfLmGGQgTjxq0hiSxsAIMFKDr4EiQSrC+xRSTpSuuAQzEY61MztuAQgooL1VoVK8w" "fmp6EWBwRzqR7eumUoOqA/W6TzzWBjBgKMEGQw/QcG0QoAuIt2m8Vpz+Q0r3AYCxU6WzPXcm" "O6eWHGxHAnBXIogSbDCua5QKlK+QKMQNuf/iuBLbVdi+AiTqn7shFBddz4kpJBLoiDYRbY2w" "78F054cnS+cAntieTqx++Taxr99ELkzjr7sVa/cBhOq9aAA/LK1YW7Z2dRCJhGhvAdeDe+/u" "pieTTLgeVI6PEr4wxsanDmGmNlP/5Tjnvxund+1nS5OaOvJO8by8v8skEYWaDX9W4dIqzFUM" "ytcEq5+/TmbX44RmvkG8u5/w7Ed03d7OxoWJbu3o84/9KJR6a+zbEpoC24OaAw1HUXcUticJ" "XJ0jlEjBcwUYWYEXZjGqvxH0vE4DoKbbw4XT5W4gu/O+NNITNBwJvgSl8NoT1CY/I1J4Fru+" "SA2wKjq+zoIOMHXifeeOhwc/Ls9Z0eKZma2ZeFC/pVlnfatBLCIQvsvVs5+iBQSuXmV1WTG7" "oPm+p169SdhN7/w38w/NH2kkZ8a7gp6XkJq6JFFvPHpCvvIXKgJbOHqC5QoAAAAASUVORK5C" "YII=") index.append('cd_delete') catalog['cd_delete'] = cd_delete #---------------------------------------------------------------------- cd_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA0BJ" "REFUOI1dk0tMXGUAhb//3jsPBpgXQajTUqYyVGiQamjtFKVYE6cpCcEEMJqu1FhdmpjQ2HWT" "slBrjDGtsGlIREgM0tiI8RHFThuiDQkveTRTFMpAnaFyGWbuPP7fjW1qv9VZnJzNOUfwCN3n" "xpqFUK8CR4E9CGUIxIaCH5UUA0NnI9ce9ov7or13pNRVcPQqePP1SL0tUO6l2OXE7tBQWYu5" "5SR9387kBPTt6FbPaE+H+SCgvXektKjgHG4PByOvtISIbwsm5k2UEwIBB41+O3ZAScWXvywy" "ej02ltYzXaM9HaYG4Co4etvDwUhbcy26JvCUQCotMbfzFOkGDsCUkELwWmst7eFgxFVw9AJo" "3eevHlFCnH7uqSBXfk+wmIASDcpKHKTTkmJDwwIyWdA0yAKdx0IoIU53n796RG84fur9N04c" "OLye0tlMFYit7+CwuajwGridkjKXAgwUUNj4gTtXzmLeXuBZMShEztxnAEcrytxM/mUBCikg" "trFFJnWXr8aX4gCdLaHKF6qnyS5EqWw4hSf4NPdi+0l+N9BiKMFuQ7eRyVkgQBdQ4dH4cGxp" "TcrcIYBbUwNTx334/KFmkrfmsIsspe5KfL5K3bhfo1SgCgqJQjwoF96tu9C6vzbs8wRPYK0N" "YncJlif/IFewcenusX80oVjJ5bMoJBJFubcIr7uYrudDu+rdc1NP1h4e8Na0kbnzOcK2ia2k" "FCOfoHDwbTald9kAohtJs/FgdTnFxU58pZDLQ41zmuZwwuep6SCz+hmaLU92K0j810mSTecw" "pR9Yi2pSU5f7x2ZlU7WDSi/sWLA+/Q32xDUeO9BGNt6HbldYW3uJj99ktuFj/FX19I/NSqmp" "y9rQmZM3hFIXh39eRFOwMjGI516UnHyctalPkGRIJQOsRueYabhAYHcVv83EEEpdHDpz8oYB" "sKNbPaPXY/uAiG2yjxff6Wd+8D0WxqM4qhrJbiWg9QPq9ga5ORv7b8pWD4AOMP/9YPaJlzq/" "jv1pekVs5FA44Ma3aw/Jlb9ZXVqm7OVP2dF9fDQ8kVtY2byU1q23/nemh+lq8VvPVFcYTXVB" "sWH48z9ZkW1TK78NRJUSXzx6538B+wde34wM1FkAAAAASUVORK5CYII=") index.append('cd_edit') catalog['cd_edit'] = cd_edit #---------------------------------------------------------------------- cd_eject = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwpJ" "REFUOI11k99rW2UYxz/vOSdNmvRHNNauNIIpJBGj3WyDtJkuw4tlIoZedPUHXulg6D9QmNdK" "C96IoA4qXrT+LOrooHNFFDZnURSGIKN0LEyzrm2yxTY5ycl5z3lfL7TDTfzCw/NcPHxvPt+v" "4C5NvXHuoBD6BSAHPIDQlkBsa/hWK7Hw+euFi//+F3tHcfZ0d9gPzmo4/nLh4cBgX5RIOERH" "0EC7bS5fu8Xc179JAXNNsz29ND1Rv21QnD3d3emHFovjicJzh5JsNgQ/rdXRIRgcDLL/3g46" "AK00n51fZ2m1dK5lOseWpifqBkDYD84WxxOFZw6mMA1BbxfYLUW94dFpWgSBugIbwYuHUxTH" "E4WwH5wFMKZmlse0ECeeGE5w5pebrN+ELgNiXUFaLUXEMmgDjguGAS4wmU+ihTgxNbM8Zj76" "1EsnXzmaeXzLNqnZPqWtJsFAmP6oRU9IEQtrwEIDpgmuAqUF93cHxaX1irSAXH+sh0t/tAGN" "ElDa3sWxK3x54comwOSh5L7C2BALp97n8ORxXFfQH+sFyBlaELfMAI7UKA2mgP5egy++v3LD" "VzLrK5ldvLB+45MP50in05z9+BRr13cwzABaEDf2MCoNvqdxpULchvu3jg5sDqRTKUZHRxnO" "PMTaNx/g+z4AhtCUpeeiUSg0fdFOoj0Rjj2ZHDCNwM8Tid1yOpViZGSEcrn8j0maxbm3QKvr" "FvDD9q36/gMP9hGJhLinG6QHjz0yhPv7j/uSyRSZTIZqtYplWVQqFfL5PI1Gg63vvhoWUzPL" "Y0IbF+enjxg1Kag1wXbAdqF0/iNcp4Xrukgp75ha7U+q1WpLADz/5tl3nx0fevXIeIqNOuw2" "oeVqHOnjSg/f13i+j2lohu4LsX61xJnVq+99evLp1/4T5fxokootqDZ8fl16G9u2kVLiOA7N" "ZhOlFI1Gg3q97iilQv9bpr5YlOWFd8hms+RyOTY2NrBtG8MwiMfjzM/Ps7Kywl3A7qxzsrV6" "wJNtIaXE8zz2tu/71Go1b2dnp/0XuB93gv+aeAQAAAAASUVORK5CYII=") index.append('cd_eject') catalog['cd_eject'] = cd_eject #---------------------------------------------------------------------- cd_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwdJ" "REFUOI11k91rW3UYxz+/c0568tK8aIxJbTtNRoZx1BVE7YtuItjIhDhhVhRhqIMy/4HIvPJi" "2Fw4r4V5ofNm65RRYdgLlbmXltXJQN2QVEJt0a2lq2uanJNzzu/382J2vsA+Vw8PXx4e+PIR" "/I/xIzOjQuhXgRGgH6EtgVjR8I1W4rOT75Yv/DsvtoZK7XQ8Ku2ahoNvlh8J9WZSxKJhumwD" "7XW4tniTY1/97As41jY71enqvuadA5Xa6XhEhqcqw/nyK7uLXN8UXPqliQ5Db6/Nrnu76AK0" "0pz4rs70bGPGMd2Xp6v7mgZAVNq1ynC+/MLoDkxDkOyGlqNobgZETAsbaCpoIXjtmR1UhvPl" "qLRrAMb45JkhLcTEU4/m+fLyGvU16DYg3W3jOIqYZdABXA8MAzxg/54iWoiJ8ckzQ+bAs68f" "fuv5nU/caJmstySNG23sUJRsyiIRVqSjGrDQgGmCp0Bpwf1xW1ypr/oWMJJNJ7iy1AE0SkBj" "ZQO3tcoX5xauA+zfXcyVhwpstKHlgeNIsukkwIilBX2WGcL1OyDAFJBNGhydWfhDKf9xgKlz" "9fm55UM9t5xVxga+BeDhXBda0Gds1ag0yEDj+Qpxp9x/cAOPvvtKnPp+iI6U6L/3ltAs+4GX" "1igUkElFSCVi5LYd6VEqWPZUgC8lqdh2Srknabotjs8O8P6LVxGaZQu4uHKzuWvwoQyxWJh7" "4uAHECiP53YeQGqFVBKF5vdbSwz0jbLpORw68QB5Pr9oKUN/+vHM1Ynj1TFj3Yf1NrTc2y9L" "rVhcq+OrgED5+NJno9NksP9pNv02c429B42T7+ydE1p/NHW2jqGhE0DbAzdwCWRANrGNXOJB" "epIFQmaETLyXH5YuMP/rtT/dDZ20ANpmpzo92ygA5T2PFVGBwJEen8x9gKc83MCjkC4xVBhj" "fvE85+s/NnuMA8WzHx517ipTJp0ibIdRWuM6Lm+f2k4pN8jswk+r/ZE3Sl8fnlz7j4131fk2" "S5fbL5U87YV/s2SI9wi28n8B1CBijOJTRWcAAAAASUVORK5CYII=") index.append('cd_go') catalog['cd_go'] = cd_go #---------------------------------------------------------------------- chart_bar = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAa9J" "REFUOI2lkz1qlWEQRs+X3KiRQCrFxkKQkEqs1c40FrYWgisQC5vUdi5Be7MBW8HSTgUR16Bg" "lZ97551/ixskQiKBTDkwZ84zMNO0sspFanZac3fvZ2cVFpBZWBQaxbsXt6ZzAdSKB9tXiSqq" "IbJ5//ng/AbihWXxez/wbDbXVzmSOj9gLoFFMbyIbHS2wqHE6YDcfdkAVNEetAdPvFFrhjce" "xZW15GDkfwwe7kAVUyZTJoffCo1GNPGE9bXm4KwI7cEUAV+/QDjcucuRGMOLhS0jjEsTIX4G" "QG0J0AEe4MG+NuqFaOHZbFwual48//Cs3QIzx4ej6sxqKCsRMBTcwYyjeTGsESssl7coKR7d" "fEpkkhl4OXuf3jArOd6sCmYQQYgvDf4CipbAw/n+6wfmyta128h8MKvFWA6KLA3cqXkx7F9A" "SeJhiC1QV9SVMR/MeiFwMkIEJYWcMDBvWkFDERXUFQtDFsqsFseb792HTIigJbBobmyuEQXq" "TathYWxf3yLS8TBUlOnVzusuD1qD9qQ9ebvxmE7Ais6gAzqb69sfCS8ykoyispgu+s5/ANUJ" "nv/nEF39AAAAAElFTkSuQmCC") index.append('chart_bar') catalog['chart_bar'] = chart_bar #---------------------------------------------------------------------- chart_bar_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAglJ" "REFUOI2lk71L1XEUh5/f9V5fwhAKQiHuEoEOqRCEqENgBi2NzbVaTQX5J7i0OrQEIc1GuEQv" "BCISFlkJDg0tiVjgy/Xe79v5ntPwCwq6RtAZD4fnPB8OB/6zinbNe493LKsSBXJWoihBlEc3" "63/MV9sBQlQmB48hqqiBZOPJ2kFbg7YAl5SYlW/7QspGX08Hh07/HdB0QhTFJ0WyEaoVGk7a" "A3T2rgGgiiXBknAtGSEaPhlJlO5a5sDnvxhMXQJVipwpcqaxrgQxXMikDD014+CoCJaEQgTe" "vQVJMDzKoYv4pLRiGcF3FohLRwBCLAHBQxJIwn4wQlJcUFI2ersUbSq3nl+3FIUYE8knQkhU" "1AcQAR/Ae4iRw6bio+FiaeGTMTSwQufnjG02kM1d6lrHNz1VdT83hwAxggjiUmkQlZiN0Fri" "4sQa54fGOH3iLK82Fln99IK9HaGirXIrzpUGKaFNxccS4KLSaiwyOjhCrmRGBqbJRWLs3Dix" "sU/FWu63CGUcdYpLvwC7h9vUil6uDt0G4M7UA86cGgYzqtpykBKMT0DOIII5IYrR31dDFL5+" "2WNja4X1rWVmpx8y9+wG3R1d5RXud11GF3awIFjKWMpob2ZpYQuiYlk4Wb/C6oeXjA9P8vTj" "PJ1FleX3rzn4PtT+G9vVhZn+OYpipoDjBg3M5t/Mb8/+ANb5e33P8V9pAAAAAElFTkSuQmCC") index.append('chart_bar_add') catalog['chart_bar_add'] = chart_bar_add #---------------------------------------------------------------------- chart_bar_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhBJ" "REFUOI2lkztoVFEQhr/d3HXzgkB8EBHzAAujIIJgkdhFFK0kgmJnJxgrEUxpZWctgk00WAmi" "kCamCCpWKipopUHQRE0QyW72nnvOzJljsQEDbkRwymH+b/5/YOA/q9SqefXecopmBIUYjaCG" "V+PORP8f81krgA/Gkb2dqBmWQGPi4YtaSwctAU6MEI2VVUVioqejjTVn/w5oOCWoUYihMeGz" "MnWnrQE2eSUBYEYSJYlyRhI+JApJiBrtlUitiH9xMHYUzCjFSClG6m8MrwnnIxKho5KobRYh" "iVJShVcvQQUOHGTNBQox8tCMUGwpoU42AfjQBPgCREGUVZ/wYjhvSEx0Vw1rGJfmzicJSgiC" "FIL3QmaFp6wKhQcRCIG1hlGEhAtGiM1bnNL7nJ56Qlz6jPb24keOc7v6lczc+mbvIQRQRZ00" "HawD9ny4y+jAPPvGJqgO7ce9neX9szmGcZQtL5pC56AoQARrGEVoAlwwdr27xfDYOO0f5ylN" "naNz4QGD/b0c+vSFLOUONkZQxZzhNjjoqS/S3jcEJy//Pt61nfTmQma5awpHRiFGUCU5JWii" "r6eCGtS6dpC/nqHr0UW8+0YO1Gtt/KxmZDeqx7DpZZJXkkSSRKw7MjO9BMFIUdm+dZy+57MM" "busga6tQX1EWvpd57A+3/sZW9fTs7sn8x9KFspUGrJwWjXTzxJxd/wXTwHeEAuIx7wAAAABJ" "RU5ErkJggg==") index.append('chart_bar_delete') catalog['chart_bar_delete'] = chart_bar_delete #---------------------------------------------------------------------- chart_bar_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoNJ" "REFUOI2lk01onGUUhZ+ZfJN0QuKMLcSQSmsSsdOWiEMUxKZuLBUliMTiqiBSkQa3xXapKyW4" "c+HCuHEhLgptdTVgK9Kq9CcSm0ViMNpaktFEYzPJzPt33/u6SBdCZyF4l5fLc86Bc+F/Tq7d" "8vRnqymq4gViVLwoTpRP39pz333WDuC8MlbpRlTRBBITF2402jpoCzBB8VFZ2xBCTJSKHWwZ" "/e+AphG8KDYoEhMuy7NppD1Az5xKAKiSgpCC8GpIOJ+wIRFE2VGINGxk6Vz1ldDad7ajZ4Tm" "n9+AXX5t28FzR0CVXIzkYmTzR8VJwrhIiFAsJJ7eeYnu0tGzxeHDlAar3P11H/O16aksBSEn" "Aj/MgAR4/Am2jMcGpeW3Iwx0f80b46uUHzzE+tI8nTlP7wP99OzaU8qS89sAZyEIBGHDJVxQ" "jFMe6brGS5UFykPP4+qf09md4/bsAg3n+KSjsSOv1oEIWAfWgvdsNRXrEw/nv2fyyRnKwy9i" "Vz4mV/ibQk8vWahTrzxL3RgyNfeUnQPvQQQxgfJGjeOj85QefRm7/BH5guAbg6xcvk6tf4Rd" "xV5M05Jpa1sVYyAECIFqdpkX9v5G38Fx/O/TdHQm7MZe/rhyg3O7q/xFnp7gsE1LPrXMvyI4" "FldnmJpYITJAfe5DFEtzfTc/1ea4OTLBmoJxBi8e03LktXVP+ZlDMHaYm9kSB8bepOvOFRYv" "fMtsbZ2rX84w+cVxNgtFKn2PcbC/QhCPM47cO0feSxqE5IQUIl3V87x94iTkI7NfnWfx5zt8" "sPAut9YH6KtcRIISJRJF0aj3f+OxsbIZHX4oe2r/EKngvnNra6+Pvz/3S9seA/8Ar3F5y8ps" "0/EAAAAASUVORK5CYII=") index.append('chart_bar_edit') catalog['chart_bar_edit'] = chart_bar_edit #---------------------------------------------------------------------- chart_bar_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjRJ" "REFUOI2lk8uLDXAUxz/33qFrGGaEsnA9MmaEmonJeJWiKFFSiuzYWY6wkp34A2wslDwWShFF" "EgsWzHiGMiWv8hgk4977e53fORZXmXKTcuq3+J1+fc7n268D/1mFZs0DZ0csqxIFclaiKEGU" "U3srf7xvaQYIUVnd3YqoogaSjYtDo00NmgJcUmJWPn8XUjamTChRdfrvgJoToig+KZKN0FLk" "h5PmAD24zwBQxZJgSdiejBANn4wkSnlcZtTnvxisWw+qFHKmkDM/HitBDBcyKUPXxMccXX6d" "rmu7ZszfcHpkLKBoSUAEhgZh8C6IUHURn5R6VLLUWdRyhf6ePjSH/X8YWIgURCB4SAJJ+B6M" "kBQXlP62W8yas4zJM3t59+zcwKHLOwbeiZJ8IoREUX1oGPgA3kOMVGuKj8Yk+0Bv+SZt09rJ" "o5eoLNnNJjrYMm8nmxfuwtc8RXW/JodfABHEJWLK9JWvUlm8FfwD7p06w6R2x/iRF3x8eYMo" "AVfzFLXemIpzDUBKaE2Zlp+yohJp66ij4RWYkquDzF07QOfIc5KvNgys7sZEaMQphkSPnqe9" "0oPWn2DqWLqtC43vKZeH6ezewpS3Q7h6oKh1BynBylWweg2IsHHmHbo7F9Ha9gWTr1Aocf/C" "MKCoH2b6gtl0vHnI1BgpHF5/xDQJFgRLGUuZVTsfsHbPcUrF15h8A2zsz1Oa0MWnZ484ffJE" "8228faz3i4m2mhqm2jhm/L4bqILa/Z9lNHr77iIl4QAAAABJRU5ErkJggg==") index.append('chart_bar_error') catalog['chart_bar_error'] = chart_bar_error #---------------------------------------------------------------------- chart_bar_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAltJ" "REFUOI2lkz1oU2EUhp+b3jTWlNZKa2qkdqiIDhUdHPyjUuvuT9GCDoI66SjqKDhIwW6KTg4O" "4lZcnBSFSinSiFVBCfiHptc2UWyam3u/+33f+RzSzSiCZzy8POd9D+fAf5bXrHnp3qKzIiQG" "rBUSIygj3D238Te93wygEmHvltUYEcSBsY4Hs9WmDpoCIi0kVigvGbR1dLa1UIvk3wFhZEiM" "EGvBWIfyUyxHpjlALl9wAIjgtMFpwzHtUIkj1g5thFVpSzW2f3FwYARE8KzFs5blOUEZR6Qs" "2kJb2lH9UwSnDZ4x8KIARsO27dSihFgL9aQRIW71MJH+A0AlDYCKQRvQhiXlUFqIlKCtoz0j" "SCicf3TK6cSQJBoda5TS+BIrUsZArEBr4nqdXDiLV/zGrtxaip8WqcswrUlC7+wm8uvyLFYW" "8XszPF16iC/RymSl0Epx//UbDm3p5/jxk4RhyMDAVx5PPeNgH4weHiXtpwmCgEKhgHkHvtRj" "SBKIIqYrP3g/0MXR4WEuXr3N988F8ut7GRwcRIcBE9cnCIKA7s09nDlymo9fPuC7egQrEeaq" "y2Q7OhrL2XqC2ttpxsbG6OrqolarUS6XuXHrJn07G5o1HWvwpR6B1rB7D72vXjMTBAAsv7xD" "yhPGx8fJZrONAwtDUnjo53Xogy+lr3hXRq450QanDFX1k1KuxI79+8jnN9DZnmJhYYFisUgm" "k6G/v59cLkc1jJkvlXgyNfPbN7YMDQ0NZrPZyXw+35PJZFqcc6lKpXLW87xSd3f3JJBWStn5" "+flyGIaHfwGsy2GeQvtNQgAAAABJRU5ErkJggg==") index.append('chart_bar_link') catalog['chart_bar_link'] = chart_bar_link #---------------------------------------------------------------------- chart_curve = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAphJ" "REFUOI2tUmtIk2EUPufbvhpLatMiMp3RLGEmzQtKKjUsJLUaUWZLskwIUixtVIRl9quRCGHR" "/GNhKhWhGBRdhaUVSzMkL/Vj80JgKam7uH3fLt/79sO+4aBf1fPnHDjPeXgOzwH4H0g7/54W" "m+0H/2aXEZtvUz8i9Y32+0uHc4ePXJ8vMkzMFxmG5g4ZSv4kgAAAaefeUUlkTJqMCfb5pGyE" "1ajiHHv1vYhMBiIOEsQoiqBCgO+AVKfo7BwLd0ApfFCrBmc9kiDnJh2e7bprEvdCFnrdOSsf" "d6YrujrU6OIT0MuvIpwwXHBzvC7MQaqxlzqGLCpeW1K5Z/pTVcNnk8CweEfeZ60QiSm1Ew2s" "hFQhIpFKgTBI2Z6LGxcNpBh7qEic0Wwjk8m7fEvvjDs98UBdPRbYbLTf5bUZm7yp6bS92GQO" "EVLOWigAgH9NdDu/LiaQve8FJy8db4RCKlGcGH+uPD7Gry611Yp8XpNk8WqSHAAAUgAAQglc" "0u7fytgtBgQwvZUnEPBCDYMTFW4PIEPAEHgU/1AUkI0O6fgNan/IgfZMN6WwTE8Z1haWkd52" "If+ezlzQmv0xry1zILcto0gc+deu7wo5oJSADwR2ORGyRMJuc2Y+4NFqgRN4gswAlQhKitC8" "syVV1n1soIV18eWhGCkl0BoV/xMBpgEAdKbk27yTu8+7uJd8YGHLq5PWA6/L+nOCjsAtvzNw" "AwAAudmpUIxJFc+ogq2ODkgldRSZPACyAgFrrPXDTUsv2nElTuZjIkYFBp72Xx6pDHskN4fp" "nEfocNrkZRh0xljrh5uUibmx4rJSnRv75uok75sJZru+4IimXBMRcpB46gkFSoECBQAKQBYr" "/S0u1kXQUP+1uRDhX/ELTJsg8s3MDJMAAAAASUVORK5CYII=") index.append('chart_curve') catalog['chart_curve'] = chart_curve #---------------------------------------------------------------------- chart_curve_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtVJ" "REFUOI2tkltIk2EYx//Ptw3NtJwWadg6bGbOzHlolUZIJ7Isi45LlMxuUixtdKKI7hrVLirQ" "6qKgiIpQOl2UEYmaLYMMD0HlnGGYiqc5t+9z83vfLtZGQRcR/W/eF57/8+f3PO8L/A9lHGvi" "+VX2Hf/SKwQuPb19UXmX7Xd/LQ7v2Xt+ZLepe2S3qW14l6nwTwEEABlHX3NFVFxGqDDZPKFU" "hdvMGnF0c14DkbCMiD4womhO0BDwHcSzI2tqun4n4BxvtZoPQ27FpOhi1e5V2ecUrvEs8rhW" "T3tUY4x8WK2lMSmBPNJ0Jsrtm644zv5GkG5u4KNtdRrJUFiW2/++3NpqkQUV3QhrtpUGjGln" "uq0qBSsnIqZUggnEVfUnF/gB0sz1PGAc0K9gX1PXTvw659xD3fe0FV2+hWb7TcmwLN6TbuR3" "8i1VQUPakToOAN6Zs+9IsXG+lVuei2FFjsvYyRWR+x3P1Pu6pBlFnWcCfkmfXOfRJ48CgBIA" "GGc4bdiWItjrTARYGsMSGDw4JVB3qcsNEhhMvge6+4GA0I9t2dI8rTe4A8Phl7zlUs5WCNxK" "zKcLouV1Ht+4/cA8osmlUeK02OneCLXXK00ZcztdWe96v5U9/qxX+h+BYQKyKoTJWYHeDVWZ" "G0EFFbIoS9FetUcXM2t2emIG4qLi8arjYURj+FCicU7sRSEQcDtaN0hAPwBkW1IrJad4VxoT" "ayXf+GJhXJ5vWJQCWZCRErsOMvmwPDkTAC/1EzCGWwX0abky6RonIUcc8k4l0HHbhfarAJB7" "KiRUReHISSwGAJjXXMeTtkoQHocGP5JLJKPolqudnWHFNOmMs11ov6pOWj8HAAad/VJHbxMs" "L4oAAJbaItgHWsHBJQKApINPOTgHBwfAAeY/+c/wEMUTaHVvkLlkJeJjUvGlrwVNrY3ocTit" "hL+UsSTGAqISAiI44ALnlc2VfSd+AJZYNiQKi9gRAAAAAElFTkSuQmCC") index.append('chart_curve_add') catalog['chart_curve_add'] = chart_curve_add #---------------------------------------------------------------------- chart_curve_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAthJ" "REFUOI2tkltIVFEUhv+1z5kapqjxEmR4GdNuM0WTmnajTCLSMo0uNolREURFF5Oy6EJPJYVE" "BVkvRUVUlHahoqxgcCrMhxQ1qXBGIzWtvOTROWecOXv3YCMFPUS0XvaG9a+f7197A/+jkva9" "Erkl7lX/MsuCl09t7aFZZ9zXf212rV13ojvH0dyd46jrWuNY/ycDAoCkvS+FFBqZZGSBKp9s" "GFlZEK32ZGa5iFgKEdVwojBBiCbgM0ikmsvKPL8TCIHXcdE1nf1SQFV4af/81OOS0jeXvEra" "qHtlyea7pXHUq00irzaaq3r90rNNR38jSCxwiZ46Z7RmX79jWceb3cW1RToz0EVTVeX2oDDh" "SHOxQeK7iYjLMjgjYag4MH4QIKGgQgSFX6yz+ccZi3y/5ozZ2XwjLt/jn1jgvqTZUyZ4E5PF" "tdyikiFBwh6nAICBMeOuaRGR/nnLn6imjU1nsFpI5k1Nj0M2eLTwjY1HgnrNOs3ptU7rAQAZ" "ALjgOGRfMZ25nQ4Cil6YJnF4cZBR83alH8Q4HP5b8TeDBsaGulTNEjcwtAP7ruei+nR6Npgo" "Ju6PH0LLaizMWLnZQhSYueBdd4S9oXUYfe8L40y0RHWaFGu1YpMHH4HDB90wnOtzg7NLSuZk" "gPLydVXXFjcqykI+euyUzYfZ8Fgb1NryqAZXuf409N0OFjS4Ghb/jYAOAEgtmnFO+65e13rV" "cs3fN9VW/cE0OW01M7qdoMsOmDx3YIkJl3SI/EECznElj97Pkm0XBLF0tXNgBIEKK0/WnweA" "Q2lyrHFsLJCxZyidfDQCkiCLHPxIikrJgumlvvaRt82W1heVp1rUENviqO635Z84E63emoeR" "I+5vg09thxeA0itBl9BGAGDb+kBACAgIAALgg6f4aZ7pe4TsYS5YwgYgsxYoXwPwdBgQUAMH" "CX9Zrpyo/d7Oti2MUwxnopVDlKQ/48d+ADTsQgJxBI6sAAAAAElFTkSuQmCC") index.append('chart_curve_delete') catalog['chart_curve_delete'] = chart_curve_delete #---------------------------------------------------------------------- chart_curve_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAudJ" "REFUOI2tU2tIk2EUft5vm4WoW0oWFbPSirTLSi1DKbGoMMsKK01KC7pKV7snERUpRQRJdDco" "In+klBgUdLHy1oUYzrKbupQ5L22zze3b1ve9px820epXdH4dOM8553k4zwH+R8Tsq6bMC41p" "/9Ir+JLWtvbg1HONt/sXremrT9lWZRhtqzIM1pUZa/82gAFAzN4qUgSPihksSK88SlVAba5W" "7F6c+oIxYSZjTM8ZCyEGLQPMYJSoKS1tGsiACC/DtXqLUyGJDl7inJ2Yr3D0xDOXIynoXukM" "zd2ScGZ3T2Aut5qLcv2iwuajAxhE576gbkOF1q1buy2l4+3OM3UFsqBiRf6vanN8wOlHjGfi" "h1TvygktY4qAyXB+ewa4TVm9xdzn5AN2Rs7iX6fN8/TXGbbdWLz51GXJ/GQ/ddeVEzlMZKu7" "Q9WnF7YreyVwAIB36Ihb3NYqL4+9xv11V865ekbv0gQa78dpniQdSzZBrY6HtbEBfsyLwKDh" "CAjRqpUAwIkjT7dsqtBYkcGAgkr/CRwuHBaYMSda85qdX9GEIWMXMo+5GH7+DF/1H8BtLohM" "nAoA0O14TAS/VBJUX/pT35B3oshqOEiyWEPOL1kktmSS/f0har44p90aO+4pACh7j8Dhgawa" "xOV4X/PZ0+H56YmOdeqIpXCbLkBQSfDax8BcUeMmrytldL21re+MRBw3QyK+MaADAPaeHP9g" "7qQlB0KjFsHbfhUKP4LHHgbzs1rpkGTxTtz9+g0TLf0GcI4ba9jHuD1Rl7J3jLNk69IWEMJg" "NhSCww2ndSQ6Kmo6Wxw9U9q+S5bY41GFfxjJIbIZolMuSR6hDY5M2IhBrZX4dK8K+odWGMoe" "td2vkzLnH3jZ4OmUEuwN7F3k1siAPiNFbSknEIFASJcPY//6TYAgQ//oLj43t+C6KhemH8N+" "7SSAem3z4doKxn5/jrQEjRgdPkwZO3EsSOWp9nR1rUspMDT9jvPFT8nEVa9pO9r4AAAAAElF" "TkSuQmCC") index.append('chart_curve_edit') catalog['chart_curve_edit'] = chart_curve_edit #---------------------------------------------------------------------- chart_curve_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtRJ" "REFUOI2tkltIVFEUhv99jlPToGZGhGVjZTU1ao73zBCNXkLToszMkqIeutjVioKu+JBY04NG" "5ksPhRnlDGYWBAai2cVUBqcCLdMKLGu81DjnnBnP7NVDOCn0FC3YsBf7Xz/f2vzA/6j4E88o" "v6Jn07/MCuOXz/1fg7PLeqonPg5t2Vo6nJvXN5ybZx/anFfwNwMGAPHHW0gMDo3XCmqr20/j" "/6JIL4+sy25mTEhijNk4YzOJQc+AL2CUFmS1fphMQISX4XrboEtUZSe3uFLTLorO0RQmOVcH" "3rcmBtVawtlPxcAkZTqXva8zynvPTyKIK2qmEXujXjEVHMgc6Dhs7izxChp2Q9f6Yv+4MPZs" "n1kj8sOMMe7nBy4w0jSdWvgbILaoicaF34zJ/GPMGvfEPY+U3Wl5VHOSp55pq1ZMSYuluESq" "yi+p8AlijzYSAHhmzalSQkLHVmU9lnU7e8uQQ2LYntcNDfcO8sF396j7Uc5lAFCMUY2SMWrE" "9wecOE6bNkQLipwnjrouPdUZzJLEDgisz5M97/nq6MhEFhgSA6+i7rJbMhO0b+1pgiTpfASm" "Q0+IMCWbBM37iejphQ/MNst6RfleT0r/FRrqeUidt9fWtVXGaTyz59b6CIg43PBqwMdSxoez" "KpMzdq8o3xcauW0qlA603qyCf5AMVfZkMgRkaX4q+yYZ3Jq5yMGAAQBIK4m5pldwd2VIgjZg" "hgTu7gWIwzv6CgvTi5jX4yluOW9w/jHgHDe3s64VxyIqk45HfVKHxnI3TZvqCNKbwKVOEJcR" "t9EA7umHVtuN2cu3LAOUI5OC5JRZouzyWn681+0qnT+jeMHSLL0uwAFSBwEmot3aDYCDK92Y" "tSQMqttT2HTOaGQAELG3nkAEAgEgXFl0Fak7rkMU+kDqMABfTAAIEKcZMPDGhq66CzUMf6mn" "pTEOUrmOOIE4/32I8KcngHOAU/svZ49UQCCwcjMAAAAASUVORK5CYII=") index.append('chart_curve_error') catalog['chart_curve_error'] = chart_curve_error #---------------------------------------------------------------------- chart_curve_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtJJ" "REFUOI2tk1lIlFEUx//nzgzVFDpoUYlNpi20kaZkIZW0GFJRQdtkthJE0cZQ0EIEEUkhQUHR" "S0Eh+ZLUQ8uDD6lT2EINFVSEjjVtVqM2M98y3/fde3qwEQOfovN0Oed/fvz/3HuB/1Elhx5x" "1aW21f+yK9KH6JdvWSvOt93oP+xav+FM97pAR/e6wKuutYFNAwEIAEoOPmRXVm7JYOE8Sbk9" "w1qDfqNn+YoWIlFKRGFFlM0EPwFfQVzua2ho/9sBMx4X+MMxzeUYCXVTm1d+2pVIlpGeWJBx" "u2GW79bNAoqbk0g3M5UhXy+9EDnxl4PiYAv3vHrgNws37VnW+Xx/7csaKTx0xfukdXdaOPN4" "R63HpfYTkXK7oQSxp/lwfq+BmcFmTgu/T5mjPhQtSvXPOXZvR33BgXZ7YrDtqllYOkEvnsV1" "VTWX+kVQAABrRE5dRndUVo05qLxbI+exhl2+bZH78bhaWVG0kedPW72l+gh9EobRtOpFXaAP" "oFjhWOGqGcI0Aq6kdjbknVSr67RHUIeV0FCR1LA5JXU7d/hkiK4evXp7d6XQdS8AuNFLwMnw" "nTwIbidlH0F9HvbVzT2qpE2WsmFJpz7HNxGTR5UiYWoIG61JneW9PgCzQgrSM0jJsnRuR1lY" "PG0zSVaQSkKB8eVXFNNzy5C0DLFkZ1NlMSGzD3A9e/zPHbF3nQBQXlN00XQsSFb4EHsPWzlw" "lA1b2oinEigcMxdJWxePI6FYL0ApXKumd7PdUy8ziUojZg01sxUc6WBkhh+OkpCs8PXXR2QN" "G4Xn0YcItYV+WBIVBADTd91llwyuZMFG6lsm+/I+h0ZP8GimZcFSFkzHQsGIqTQ7vwLPPj5C" "45vGONuDFkbPGs/c6VtQdOYWM0OMZMQ1RjzM4D+vlAH0mBtAYgia3r7A4Ni5DCFzngJriAb6" "IAPVuGPQJLu8Kcj8zlOIpPu/AaB3apXGw52KAAAAAElFTkSuQmCC") index.append('chart_curve_go') catalog['chart_curve_go'] = chart_curve_go #---------------------------------------------------------------------- chart_curve_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxVJ" "REFUOI2tk21sU1UYx//n3r6xtqyFzuoV28GlazLTUEuz4Qu2DkKyIMIStSsgEROWCFOBZiTE" "Bfxi3ExG3DTug4kmEoKGbIPEBMVAuk0JkqjojLEL3Vql91pbWWN729u1PYcPSxcwfiKeT09y" "fs8//+cN+D+e/9hVtmc0/vz95HL14A/pz1U7R+Jn7/683b373YVQOLEQCs/cfjG8778ECAD4" "+75l/Ko1fgNXvV7WaE3XIo5SbsfOaUK4dkLIDUrIakbgIIAMwoKW8fG5ex0whu9Ex42/Fb5a" "ytMx5engO3y+8CQp5jtWXhhvs5wfE8k/qpsU1UZaqv2y/f35t+5xsDEyzXIzUYfq3ffas+kf" "Dg/9PFDjtOTjhuvXDtVB34nEkJanhwkhVKMB5QjTTh1ft2TAF5lidfCv1sdp8rGt5bvrdL6e" "+Ew8MldpicQ/Ub3truLGNnZmz8DoMuA7GmUAsNgknFEfWlN56rmvSg3750fwAuMtr8x/aX15" "TrXtv3mizqutnmix1ZMDAA0AUEbR7+3awMWjYQIMfNPgpijiTY4kDuUVEI4iXDm3/vO6gOHX" "maDaLC4u98D7xmX243DnLnBsaNuW4AaXy3VQEITjgiBYY4lY4ab9p1tlg1rxJDbZXWtbHpAk" "aaElOiV9RFi7ZmkIFGXUtDF9Y1Cn0510u919oVAIiqJAFEXT15P8IwrLV/bu3msx6FZAlmXr" "92azVXfp0sllgdOr12c/dDT4nnG7ezZ3dOBgf0+1LNd4QRCIx+MxyjLDe6eGIckSzCbzxd7e" "3s5kMtmzJEApPn2JxLgYvWhuNK8EANmciGhnLW93d3ebrFYrCoUCMpkMRj4Ypln/70kAsFgs" "ek19kfIl0lYrVKeklCQCMD2YELfn+JxhcHAQRqMRAKAoCjjwtGmmOYCtQCqVUgkAPPrqFwyM" "gRXTcOQnEXjCB0F4GOYVGqTTaczOzkKv18PpdMJutyNfqkJKpXB1+spv5F+3wQcCAY/RaJwQ" "BKFJr9fzjDEum80eIISkbDbbBABtuVyuSZKUURSl6w4wzUWylDoR6wAAAABJRU5ErkJggg==") index.append('chart_curve_link') catalog['chart_curve_link'] = chart_curve_link #---------------------------------------------------------------------- chart_line = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdtJ" "REFUOI3FkkFI03EUx99/rkVgsyzIrcMOkhadtDKZtUGNLi1t4IgFRUJCRIe/RQWhjC5JDHMg" "HjxEEF1qxSLsWkrrYFPTsEaHMkGitWmsTPb/vfd+r1NSYYLr0Pf6+H7el+97AP8ooxTT98NH" "TK2UCQrjtlIAumhdWNd61CMWdaw6gYTDjoVP+YworBSkq/bVAr59zHcL4junx1VjJBK8YoJA" "dNIE5g6tqffJtYb41yZfSCvdZ0Ooc06kcgAAhjp7JglEQWAedNy8FfoVcLBzdDayx751an4O" "sukv471j/TvuuJt6Ei5vmWY8zkJxGyAF7S3Ndm1hs4pEGpa2d73wM1P57dTC3JsJ7uwZ7Xc+" "X189dNfduJ1YXTzmrfAwkmlYbaeSghQUxIwoKgfC3KONu98OuAJ+1HQyFfMNF3Y1Dghy1YZX" "6RYAgPrTD0yt6TyzuvFbB+HolMM7+/Tx/uz43urCTNGwrLwg1QCyJYvirnw/Vvizp6U/8EdH" "qnK4OPRwc/3nc9vat0CxeEiQaivaT5RpVGuXMwMAGIGul6Zovsya1gjR9eHYvtjP4fzOuqQo" "CgLpwU3Tr0PLAeDAlfSHvvuT4rv0LLvSSf8mG2uM3xspzDBSdymA/68fe5PzNtXQbdkAAAAA" "SUVORK5CYII=") index.append('chart_line') catalog['chart_line'] = chart_line #---------------------------------------------------------------------- chart_line_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnVJ" "REFUOI2lk2tIk2EYhu9v36ZJTs3ANiMELUkCYZnLpk5IfwTN6SAJo5NREQNjJlGUIoHkTJaD" "UDCIIIIoiVFWUtFBWIKH1DxkYRaWieamzOO+733f7+2XYT8Ks+f/dT03D/cD/OcIq4Hm9+Y6" "FFl2QCZu1WoESlAqDduXH8clWvLPCXhBQcjcuG+QyySaE3pJ/a+C2TFfFSdkOCJOnyg0NrK/" "JsipeOcAYyWKQmtfXja6Z9LNNkVWrqkIDBE93kkAEGT7KQ8otYCxRyE3btqWC7LLOkcLU9Ub" "+6f8mOiY7qp9W5d0Ozbd1ag3iQojBxinbhUItajzrGpFIla5sND4a3t5exZjNPyWd87/voeV" "uTrrIt5oE17fjU3bSpl8dr8pMo4R6hCkoqMeTqiFEzLIZRoOSiYfrtvxsUGfk0UUethbY24J" "pKQ1cMJ0Ub0deQCw/fh9h6LQM4zJV3+7QUFFf4hp9NXjzImunQmBkaAgST5OaCIIk5zH4msX" "NKrTElnUzswHZqfn/FeeVvdViktwVkWbboHQ5g9hG743RaWYD35+0gzKLkSeOCQ2kU/qgDHG" "nJm6KzQ7dQ9IqD/Ut/B199rNolbIKe92cIWdYwrVcEqrW2oyapakU9sMHi5TS+mRGMGWlytC" "VMGaVAzXi5MQocIdz4OgSmHUkW/Q6BRG2HIYAKIHum3rh/o0vsUpUSOEw5pUDAAozb6OhJhk" "CBDWqJhC3PfaAiOM0Ko/9cEXmAgOjLXC+bwIAOB8VoThH73g4MEVVdlo11duio+8aErOwBad" "AUPj3Wjt9eLbl4Brxb9gtOucEAS7AGg5MAvO69vrx8//BG8zM+MqtYVZAAAAAElFTkSuQmCC") index.append('chart_line_add') catalog['chart_line_add'] = chart_line_add #---------------------------------------------------------------------- chart_line_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAl5J" "REFUOI2lk09IVGEUxe9785oQzT/RwtFkCEETV5aZaCmoi6JJExrEwEgwClfPyorSpjZWDOaA" "WLiIIFpUloIkkUopMy1sHFMRtUI0GEWZGc2/M+99371fq8QWhtrZ3989nHsuwH9K2snQ6qnT" "Kum6CjpzyDsBUEi7Gnb2jFlovGrbDoTValyZ9Y8Jne0VjN9TtgtYnvHfF4xNRJpNSVJLC/7T" "QYFtSAXEKiLe8LEuw7GUnVNMOjXKDNIiB10+AABJr7zcBpxbAPGd8emz4o2A/Jp+b+kRJX5k" "PgBz7oWBBk9Tyou47PoWU5aBkJ1DwR0yMG5RigoV0lihXlqasb699ksuIo947loJjA5iTX1/" "U+TnPYk9r+IyD3LUq0uyoszIuCpp5RfaBOMWwdiY0HkEcOZrj0n/1mwqyGXEz7vsOb2LhzOb" "BcPY6GF3EQDAoYq3KhG/gqg/+isDq23EmOX91HF8buBo4uLPkKRpfsF4EjDUxlN89lBovpyv" "BhNIFl4B4vGJbnqwDsi19cVKTGoVyCY1Xap477qWDBw9URfL5B8vGymYHsOT863G3QdSITjc" "CaPOTvw1Pl4lFdR+VQXhDSS+S3D+sNd+zP4HOp+a1iZ0bhmK/65lVteFh030AEy7AKKiwa+Y" "wfPBOQl5t9xTjW+GRM5159xm5+zKU4g8rWKjFmyxoitPIQWJOV73BVXi6NgMQLKYXhvs2B/e" "XglacBbWAGB5yQBogJktVdlZYrprjAi/nbAPFUX2wrKPw9SsAfUQ3dnyLzhLEm6uBWYuySSZ" "SRbTBOLJyW6q+w0BTU7hWkQGWgAAAABJRU5ErkJggg==") index.append('chart_line_delete') catalog['chart_line_delete'] = chart_line_delete #---------------------------------------------------------------------- chart_line_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApJJ" "REFUOI2lkl1Ik3EUxs/efchM51LJmdk20kzTwDSFmnmh4MjPMINFVGZIebUZGUQiYmS2i4SC" "CjShi5AMLEsrkkxTdCWmqKlFtpHze8u1zb17/x9vV4aZBNa5PPB7nuccHoD/HMG/QO7MbD3l" "OD1wqJb5FwHKes9Lj+QpeS82bDgBX1Agcc0ujvEcCuQRrhRtVMA5vVjNI/RFpgzdKWhqIn9N" "kF4xpAdCDJTiG6+vJtVaK5OvOyPUF4R+ceBe7ARgrScFXMnZZsA4Cwh5JqlvOLxaIO1y/5Ru" "nyhsxG4D9UKb+WiiSCUNToEAdTwsfe2FoRcNTgYQzhLl5oioF+VwOl3SL/fyd6mEYL/73S5b" "pLO58XiGrzIw8gB47GPgMZvAX6YAWWC4n8BbeKqZRziLR2iM57AfYLTQsjlx4m5oeiqi+MSD" "tELppq26NnmEVuCdaQSPTQDzE8vw3UXprY+x1377QUHFiGT/VEdrytxA8g6HheVUS6y4LCM8" "ICIHWOsdYCQYkEsJtq6euSWPRBtveDUoXIFTK0yKZYSfj0tDrE/lCQcTQu4ReXF2ftCuXGCt" "t4ERY+Ccaljo6HNyrDsjrvTtAACAKL38g56n5CLhsJjHqKbTqDG2XlHkyxOPVW3ZnQncbB0I" "JTywDiXMd/V5CHLviS59b14xZijB+rx4sYISRDqNGmP9uW1Fqr2nHyF+u2Rm+CZQYMFtD4O5" "N73zvNcRG20wmVefzRCKah+aHBaCcDUAgL8qqi5GUww+37rh05MeGHxph+GW9mnPD1daVGn/" "5Nqu/FGkqjMxqKyoRAQMgcH2x2CZ/OySBQdotDWjQ+uVTbh2EeSLLlkmRwG7bNTrQ7oZoNpD" "NSPj68EAAD8BzCM5j/Fs7WwAAAAASUVORK5CYII=") index.append('chart_line_edit') catalog['chart_line_edit'] = chart_line_edit #---------------------------------------------------------------------- chart_line_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAohJ" "REFUOI2lkllIlHEUxc83Y4OWY6MtalKDhktComlqYzmIFoHmkkmatPggrQ9j4lPJIEUiRk4Y" "REEFgUEqGVYEPVSWD2qOWRjiUJRk7kuuM99/7SE0Awm0C/fhcjm/e7gc4D9LWYloNvWARRBi" "AaE2zUoAwqUWexzKNEqVFS3bgczJ0c0MjnZLQn0kZWVuywVM94+WS0q/eBn9Q5S6Ov5PBynW" "DxZwXiQEq3p5JdY2lZCYJYio1lBEeXU2jwCAQs6cagBjaeD8qe7OvazFgOSL7X15O90CVNWO" "SK19Nuhmj7ZGv+tqnb9JKzg9wiWzaUBZmltGuptQaTrJy4tduF7aZuaceda3TIwneLwdCYtI" "WvN9v9/Aw03xYYyTksOmtUZOmUVRC040SMrSJKXdkjBPMDrS6B3Tc8s/xUwFO3Y3qdrsHZhR" "Ztgcj88vSn4ySfcdf16QIAQ7zzm59tcPcqxdOlPfq2d7hjritk72urg3nx7LNQQZ9xYC1IE5" "Zyj6Wm88IdPD2TEn7RQAFnJgtrb6jdC514/X7xg+F1zoC9D9U1G6wHXRRwFXB9ru18DT4ARz" "kjQF+vR5nSal9L0l+UL7gEJkl6SkoakiIb+lyuT8cVq/UUmMVfTecxDqV0AK8Jl3CEoqVjgh" "l5orTHoA0AjOLJlRq/wEp7ypcnclAHTV5uioU71s2BIJMfcRUjgRnR0KQfrh7u6Ab0TuNsBV" "BAAaLqittnWyl1NWPm/LNT5Y6BOcGr1aPwrJxgBFC/sjBwAB4XJgQ4gRnJCzb6zh4UsGqfV6" "XN/2/AcBWs03SDYBQC7aaqD1CMXQp070NJbVLxllqhJ3++2DTikkpBC/W0r8mSUgBCCk3y9M" "DU32b/GlCgAAAABJRU5ErkJggg==") index.append('chart_line_error') catalog['chart_line_error'] = chart_line_error #---------------------------------------------------------------------- chart_line_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArtJ" "REFUOI2lkk9IFHEcxb+zM+MUa+tmq+5O4MCuRCJSVpqoOIeMlMwUlFQyFAoiPGxFdDGkQ4WF" "uRAGHSKILiW5kJHiIRKsMDUtTEkpbGlGF0dFd4bdmd+f6VRUh0B79/d5j8cD+E8xmzEZR48F" "qWUFwUIhx2YANGFe3FpbLdkmPr/hBnZdXZK+qM3YFkq1Eb7KbRQQU7UbNkJfXJJvF9PTQ/7Z" "oKz9QxAIOU8p7np5vSC0XlxaQy16x4EgzzU5vAQAwFjnzoYB40og5HnS/Qc1vwMOtY19b8jn" "dk6tLEN0dPV913h39iOxuLPHV8RSghqJjUMOQLiSO17FURNVWQ0NBb/Sr7yTCcHJD4f15elJ" "0tY51u16vS3w6rFYuBsT69KJohSJIBxkzJbmsI1wpY3QjG3hZMBo6dn2A5/v+cpkRPGp4Vul" "Q2v7C+/ZiHjdH0ePAwDsO/00SCm+QIh1+48N6tqnkvIjgwMea6ZoOWtn0g4pk9E+TcORt+OJ" "kfT0Pd9ysvoDgYBfVdVVVVVvzM3N3WV/muX2EW/cjA9EViY80sGAt7G5mRFFEVw+H7xJGNyC" "L21vU1NTtt/v5zwez1bLsg7Pz8/zTNmViaBNyWVCMZ+Y7esrkuI1J1taUm5eu9avx2LlPlFk" "cnNzYWFhATRNA0VRiMvlGmxtba3o7e1dc1CCg9V5vJcSRMyvL5bcbrcAAKDreu16LGbU19dD" "SUkJVFRUQHl5Oei6Htd1vRYAwO12CxyhKPRkJB6kmIQIIaaiKAkA2MLzfJhlWaGjowOcTicA" "ABiGASzLCjzPhwEAFEVJ/DFiTk5Ott/v75Vl2ZuZmUk5jkuNRqMwOzsLgiCAJEmQkZEBGOOV" "SCTiGBoaWvz7iawsy7lOpzMsimKaIAisbdsOTdPOMAyjeDyeMADwpmkSVVWXDMOo+QHffVKj" "WMOgogAAAABJRU5ErkJggg==") index.append('chart_line_link') catalog['chart_line_link'] = chart_line_link #---------------------------------------------------------------------- chart_organisation = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAVpJ" "REFUOI2tkkFLVVEUhb/7vL/CF4KjkMLEsQhiIWWTpirZP/CXOBCcNEinTqzgJRGpTZoWCo79" "Dd7nvefsc+7Z+zgILhI+qV5ruM7iY7H2KYreBOOoHPWwe1plFxO1RCon7KxNF3fleqMALiQW" "J2G5X3JVu79vMPQB70tElKr6B8BVLez/dFTXjuHQjwQU4444cgOAo0+D/PHD+3xfpmtwcvw1" "mxmqStu2iAjOObz3NE1DXdc0TdN57/b2C7i1QYyR5y9W7zzV79pYX+tajb1BufXtTVZT1Awz" "5e3KQQHwevAqhxSQEJEgfNn8XgA82Z7JMbSkNoFlekkTT/svefZglVZTR5ZWWOwvsTC1gA+h" "86NE5h4+Zv7RLGaZMqmilrCsJNUu6CUwjBV1vMaLdH5qE2qK5Uz+BUgMLg9RM9RuAYJwdPGZ" "ECIhxM43zfw4PyPn/zTivR/pT3QDggTUKlAVg08AAAAASUVORK5CYII=") index.append('chart_organisation') catalog['chart_organisation'] = chart_organisation #---------------------------------------------------------------------- chart_organisation_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcpJ" "REFUOI21kj1oU2EUhp8vjbSDReggjakdlIIZbBWlSAkFqZkUJ4cuQcQtIAqCFHTsUAXBQYtI" "oJOjYJDG6BAVSxEHRW1BEHQQQkFK7r25P9/N/X7cQhVvKYrveM7Lcw7vOfCPEmmNey99G3YV" "vuzihpI7s6N/9GbSAGGsmN4HM/ksjh+mbpBNa3hRTBRlkVLjun8BcHzJ0rsQtxPieVEq4P+q" "Xq/bWq1mt/P0km02m9YYg9aaJEmQUhKGIVEUEQQBvu8TBEGvVq1Wf71Ko9HYdtJWlcvlnjf1" "D37X5buzN4zlWpxEg17gdtr+5q1nNz/NiyuvLlptNNoYjNHcLz0UAOeXz9lYxci4y0BbUBjK" "caxwnJGhMV6sP+bN2ms+txwySitO5c9QGjlNolVvokwk0/mTFEeLZNuKI4cm0BnNRK6EFgkn" "Dk/RHykySmu0UWijUFr3AJGM8boujmzjdDbZJXZztnAJgKszDzi4dxxhIau04snXR2hj0GYL" "IJYsrz0ljrv0eT9Yb63yobXCXGmJhecXGOjrx4odhjhZyc3vP7Dn+tR4kbHho3zZeM/qxxW+" "f3Nv7/gKk5XhBYSoCBi00MHaxbeLG3M/AQOz65/36w9AAAAAAElFTkSuQmCC") index.append('chart_organisation_add') catalog['chart_organisation_add'] = chart_organisation_add #---------------------------------------------------------------------- chart_organisation_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcFJ" "REFUOI21kj1oFGEQht/dW86LZ6eC8byEWJhCULAOgXAGNIqVIVocFhailVgJgqQSSxt/igOx" "sBQ55c4jCUfkegkSLASDRQwnotzu7X5/+818dksUN/iDbznvyzPDzAD/KC/PuL8aO2EsYmUQ" "CoV7F8Z+mfXzAEJbTB8EapUAg1jkThDkGZHUkDKAUoQw/AvAIFZ4/EYgHApEkcwF/F+1223X" "bDbdTplss91u1zEziAhpmkIpBSEEpJRIkgRxHCNJkqzWaDR+vEqn09mx03bV6/Usm/sHP6u3" "UL1pxeCqTWSVfbfp4B6cWuG73vXXlx0xgZjBTHg0+9QDgEut805bDaUNTrz7jHNRyUzW5ou7" "Jo5Cvl3Cem8ZjbQP35LFycpZzB46g5Rs1lGlCtOVGUyNTWFy7T2O1OaLpQ+r8J5cxO6N5zg8" "vhczWxECSwRiC3YES5QBpNKITIjYDHE8MigdmADmbmR+sDiK/YIQWLJ4ufEMxAzibQCt0Fp/" "Ba0NjpULEGstlF9cg5Z9CADDqIBvI4XfW2JvYXSxuKd8q7qPgsDfxPCLxcd+gYzi2390BfF1" "64rP3jj77hPDPTy9wne+A2cD84cR2i1IAAAAAElFTkSuQmCC") index.append('chart_organisation_delete') catalog['chart_organisation_delete'] = chart_organisation_delete #---------------------------------------------------------------------- chart_pie = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAyNJ" "REFUOI21k0tMXGUAhc+9c+eBcxk7Q8troEAZidKWUKlj0qrtBlNDotHEjQsTNrpyIabG0DZN" "N6ZpZUHQErtok1rdUC0xNnUpiNBiqBSYYTqMQijUGQgtTP/3f+8dF9qkjW49q7M5X87mM/BY" "Pp87aT9UqkdIeURokRRKQkgxyYS6Lty3P42GDgbPvx5nj2+MR6Vv5sQhodTF57e93OSzQtCG" "i8qyHVhYSePb1DeDdebgrJTuUamd7ovvt4w8ATjzW++bOwMt31WEa7GqNjBN0vCVTByw9+Hy" "jfP3A6U3klGvczKZKI+llopYzhffGvp431UAMPvmTsaEUpcq7Z24RbIY3ZzApt5CoqwBhfxd" "UMqPP+10ftRSWRariobwTI0NyvSlVz8cjwGAWSSkpyN6yM7xFaTZHTBHYIcvBlv4MXx7aLrW" "98VNwdR7ifowMvcEYpEgWuoiNte0BwBMJkmXzx/ELMlAORIR00Zb5FlMZn8BZfIDRxr97c0R" "n9IeVjYUsnmJ6oowOBddAGBRLlul4cCEgXZ7DxqDcSz/kcPUwtSFpshXtZzJjnhFGSayDIy6" "oEUXz8X9kFI0/QNgvCq0PfBS+X4U7t3Fuam++5Kq/t6trnPLWxPW9fDu3NoDsdeCAUY9lDwP" "UllQjPsAwOKML/46P97+/dzVdcnF6d5849DhjdC7JTZ/xyHTh4d3JyCkC8ZK4NRFRdSP1TUC" "rXju7weEXx6euTL42dKua60k2ONxnta76m0j+ztAKbhgYMIFZyUI4qC++SmM38hBSX4NAKwf" "Fvdf0KR42mNiQDc3BHRzAzzXhXVrFiYlkExCSBecAx17y5FZLGAmdZs4nPUDgAVKLfchfUcf" "SAac6DaI+TT8NXXwCIVLKARn4MJFIh5GJruKbGoBDpfd+bFj6wBgGgMD616RdRs3p4BUBv7q" "GnicweUciiooIVGkGmOjM/h5ZHRx5c+l1/Jjn1z5lwubB1/pNLj6UiUam5yq7TB/mkCpUGh7" "8YVjX3tScsdVPzoePbs+cor8p0wAUGhttU3uHvWkPlLSOglHtlU/WJvF/5m/AJ2FvlMcUiZg" "AAAAAElFTkSuQmCC") index.append('chart_pie') catalog['chart_pie'] = chart_pie #---------------------------------------------------------------------- chart_pie_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA2NJ" "REFUOI19k0tIHHcAxr+ZnX3Ijpvu2uiujxifRNMYrWFbbIqBYggIKS300kPBSwuGHGpIKbYl" "l1KWEg/BVsFDAmnoxbRK+gg0hJI20WaLiVXX6LrJBjWyatXddf7P2ZnpoQ+SS3+n7/L9+C6f" "gqf4Yu6cvitlHxfiBDd5lEsBLniccnmdW299FvS94h05WUGf7ij/hoGZTzq5lJdefO7VGpfm" "g6lYKC3ai6XVeXyT+Hq4Uh2eFcI6K8xCz6X3Gm89I/j8fv8b+zyN35b4y/FEbmHamIfLUdGh" "t+HKbyPbHuf1aNDuikfri0OJx3ksZ/Jvjn7QNgYA6sDcuRCX8nKpvg/3jCR+yU4ia+ZQX1SN" "9cwKCGEf7yl0nWksLQqVBX1oiOgg1Lx8/P2JEACoecPoaw926im2inm6CFrg2OsKQedujP8x" "Ol3u+vIup/Ld+io/FtY4QgEvGisDOjNJHwCoVBjdLrcXs8YCZEEgoOpoCRxAPHkHhIrTBaFc" "aK0LuKRpY3VLIpkRCJf4wRjvBgCNMNEslAJUKGjVX8B+bwWWH6UwtTR1sSbwVTmjor2ipAiT" "SQpKLJC8haYKN4TgNf8IKCvzPe85WnwE62srGJoa2BZEXujPdQ8t5ya16/6DqY0dfkiDAkps" "OLYNITVIylwAoDHK0r8/mGi9Nje2KRiP9Wf2jx7b8r3j0AeLBWP62PjBenBhgVIHjFgoCbrx" "ZMOAKVnq7wUGuzI+c3X4/OPaH5oNb5/N2LxZW6UryYcAIWCcgnILBXYT4cAtSJ7FJmEoK/fn" "HgHQvk8fuWga+ZhN+aBZV+0x66phWxa0e7NQiQFBBXayPyIcjqO9KYrKUAN+TozD0X/ttE5F" "zqsgRLN2ydvypXaPbKgBW1yATRhsg8A0CDij2M5eQ+uBw7BUC4cjXbAUEy8f6gDgnFKVwcFN" "O097lLtTQGIB7nAENqOwGIMkEpILbO9m4FZ0nGw6DQA489oI6kpboEDxqQDgHxu9ai2mjru+" "u5HGzduwU2lYlAOSQEiKP3e27MTaBGI3egAAsZ968HBjBg4c/t+ZAGC9uVlXmXXWFuYJxzSj" "KIiW8M7GbLQ38mlV7Z6POlqOoiHchqXMfUzM3MZKOjfwjOD/iPaGY1CUXgUodoBdOM5QfCjz" "4V8PgspZXCDHrwAAAABJRU5ErkJggg==") index.append('chart_pie_add') catalog['chart_pie_add'] = chart_pie_add #---------------------------------------------------------------------- chart_pie_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA2pJ" "REFUOI19k0tMXGUAhc99MDN0LqMzQ3mWzkyZkha0oaXBxNa2LmhqSDQ1MY0uTBoTSUxYFFOj" "+KhuGmJk0aAlNqZNW+KGKoTY1DQuVGKxGOqUx3QYKBAKZIAAw3D/5517rwsfaTd+q7M5X87m" "KHiML8fPGVtStnEhTnCLN3IpwAUfplze4vZr54O+Q95LL1fSxzvKv6Fz9OOjXMorB55+Iabp" "PliKjZLC7ZhaSOK7iW+7d6jdY0LYZ4WVP32lpeaXJwSf/9l+cqen5vuwvwKLcg0JMwnNVfG8" "sR89v19a97ivNAadpuHGeFFoYi6H+Uzu1d739vcBgNo5fi7EpbxWYuzEPTONX7NDyFqbiBdG" "sJx5BELYR0/lm96tKSkMlQZ92F1ugFDr2vEzd0IAoOZMs60heNSYZgtI0knQPMd2LQSDF6D/" "fm+iQvvqLqfy7XiVH6kljlDAi5odAYNZpA0AVCrMZq3AizEzBZkXCKgG9gX2YDj9GwgVrXmh" "XKivDmjScrCwJpHOCJSF/WCMNwOATpioFUoeKhTUG88g6q3E/Mw0RqZGLscC1ysYFQ2V4UIM" "pSkosUFyNvZWFkAIHvtHQFmpr9hzuOgglpce4eJI57og8kL7ZvPF+c0h/Za/bnplgz+rQwEl" "DlzHgZA6JGUaAOiMstk/HtypHxjvWxWMd7Rnor3H1nxvuvTBZN5MHOuvi4MLG5S6YMRGOFiA" "xRUTlmTTfy8wWU//6I3uL+Z23aw1vW0OY0lrV5WhpB8ChIBxCsptxKd60DR1Fduys8j6wgjJ" "yMZnAPQfZg9etsxch0N5l1Ud8VjVETi2Df3eGFRiQlCByuR1HLB/xN63WuCN1YGN3kZk8PaR" "w67eqoIQ3d4ib8jnGjxydwxsMgWHMDgmgWUScEYRvv8N9rx4Er6HP0O5+jq2zfQhGinWbLhn" "VKWra9XJ0dPK3RFgIoWCsnI4jMJmDJJISC5QtLUIX1kMaB0AOtaBD2agkxQ0V4nqAODv672R" "PXTkuJZIfm3HozGntBigHJAEQlJsqH5JEzc9/oF3IFgGFMBWToOtYem/MwHAcm2toTL7rCOs" "E65lNSIv9pVtrIwNnir/1GP4P6wqtnVdXcDWah5zGc2W3PnkCcH/MXiq6n26ttSiOkrEUd1F" "B273Sz855/8CgsPMPnmI/moAAAAASUVORK5CYII=") index.append('chart_pie_delete') catalog['chart_pie_delete'] = chart_pie_delete #---------------------------------------------------------------------- chart_pie_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA3tJ" "REFUOI1tk11MW3UAxc+9vdzbrrctLdApjG/EBRyDQWocKBiDI8PgpqKJMRoTM8ODD6CYiZrF" "F7PN8bDoQLfJlrksSxBHzHQu2UMxjE0M2A1KoTAon7apdG25H//7VXzSYOQ8nfPwO0/nUNii" "ryaP8Ruq2kEUpYloxENUBUQhoxJRbxCj9XOnuZY725IjbWWof0z3/U/riape2Jf+dKGJMUOj" "DLgtWZhdmcKA/0rvLrp3QlGMTkXT377wbunQfwpO/tF1OI8t/SHDmo1VdR0+YQqmTRr7+Spc" "vns2xm6+6HGmGkc9JTaXP5TEUjj5Uv+HVdcAgO6ePOYiqnrJzedhXAji1/gdxLUESiz5iISX" "IYryJw698f1St8W102nGY4/yECXt0vPtIy4AoJOC0FHtrOfn5BVMSTOQdIIskws8ScPgvX5f" "tunMb0RSj5TkWjG9RuCycyjdZedlTewAAEZShGZTGoeJ9WmougI7zaPCvhuj416IkvKeDur0" "vmK7SdVS4OJeVPw1gKqsPRCrhj7GmfIgI8pKmULpoEGhkn8CBVwOlubnMDY71ldo/y5blpTq" "nAwLHoYG8XJWAJbMN+AorEJ84XEEbp4/yYiyJO80Z7J1thpE1pbRM9YdU0T1dFeiuWcpcYe5" "YS2fY2I/7zm0OwS7oxaxBwGwlAqb/RHwGXkORpbkhd8DI5U/Tl6LKjI53hUu6G9YN7+5KQVm" "dMHXsPRswtaQt470ogNQ/rwKdgeFRd80EhuGThnxvYwoyJcH73/feypU9FOZwHWkZHlKK8rl" "qeADxJ6bqzt6oKzAUdwCsvo1aFZHGp8PLTmPL25XXBy4cjHIXF+o6dOE5PGURL7UivNZrTgf" "KcNAfNGLHfUv9DhKWkBWe0Gn6VCThVjxjqPdWy35w5YuAGAgioyxIb6u7fewujMdJDAFwbUB" "41UPCsqboYbPw8RugiTysTY0hva7h+APx98KDx+N/rtE8XDrKymnrV/LzcE8F4GlMhM65UaG" "6zacbhYkkYuQdwJtt2qWF+Lckehw1y//+0K89plGSla/ufmatbC17VvMXP0Aa6ERcHl78XAl" "qZ4LPtk3ErF1Roc+E7Y9EwBEysr4c09Ric532mjQBny3BrE4PyvYMx11TSf897CNTFvDqWhU" "dVm1jxbn/dCF9ZTCGcM0Uk0HT0xObwcDwN+x8qR2EPPudAAAAABJRU5ErkJggg==") index.append('chart_pie_edit') catalog['chart_pie_edit'] = chart_pie_edit #---------------------------------------------------------------------- chart_pie_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA3VJ" "REFUOI1Vk1tMHHUYxc/MLHspw7K73XKHBYGtpQV3C6IVK5iGakRrtPZFE5PGtPXFh2JqFC+N" "iTENCQ8EbWNj2thU+wC1LbE20cSkRlu7ZAtyZyGAlOJCC7LLzPwvc/OhqcJJTvKd5Hy/5Hv4" "BKzTF8PH5TXOWyljz1Od1lPOQBmNaZRfo+aBz/3uBtfpfYXa+h3h4dAx+HEj5fzsTt/uMsnh" "hi6YyPFsweT8KC6OfHeqSDw1xJh5jOnGwbNHwtc3ANr7214pcYa/35xZgLt8GQPKKCRbxFNy" "FOf/OL3itF+u91vNsfqKrMDIbBpzyfSr3e9FLwGA2DF8PEA5P5cjl+C2ksCvqzexqqdQ4Qlh" "MXkHqko+yjaa3w3neAK5fjcq82Womn5u79EbAQAQ04rSWutvlKfIPEa1CWgGxRYpAJlm4PKf" "3QMF0pe3qMYPVxRnYnyBIuB1IVzklYmutgKAqDGlRcpwYUgZBzcYvKKMGu+jiCV+h6qxdwwm" "dEbKvRLXLcwvcySSDHmbM0EIbQEAUSWsigkGRAiIyDuwx9+A5PRfiE/Gz5R6vikgGq+t9k2g" "8H47QFOY+5vB5XCAMVoGAA6VaCTXHXQ+nVWHxYU7OBnvWGEq72xLtZycS910XPdVTueoV7YX" "lTcguvwLflp9AYw7wDUiAYCDaGSmb+xGpHf40j1G6Im2ZGl307L7TVsbmzCUgSZh365gQXEd" "vPlRVLs+wVTWY7i7lAudk6kHJyjk/OXBniPt06Hoz5M1hY1LGaN6qPgzU5IC6YhZvivYH8wK" "+mCmexGKvoHd8o+YTcyBM3IVABw/zNSd0ZX0CUujXXp5yKmXh2CZJhz9Q1gL22+V1ByQQG8j" "9u0VPHnoAwRJHzaldGoQfycAiFBVh7mmvs6fqHXyyjKQiXFYKoHm0+AqibyY5ddgsRnAtmAq" "fShrasXb1bHlnpeuUgAQha6ue1ZaOyjcigMj48jIy4dJFKzsMOAricDSBmFbBLX7t8LiC3C7" "E3hk52uFAD264RdWG55pFgj/ileUlqW2CcjY8zjywh6YSgy2zRG/OIba/dsgSNmA5zn0ff3h" "kmBYz/4HAIDFqipZJOax2cPZ728/dMEpibOwjX8A2OtaIiTPViyODGCi99OeDYCH+q09et82" "rE22ZcO2rAe2bfyfbcCyAMuO/wtY2LaYjaxykAAAAABJRU5ErkJggg==") index.append('chart_pie_error') catalog['chart_pie_error'] = chart_pie_error #---------------------------------------------------------------------- chart_pie_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA5RJ" "REFUOI1Vk11MW2UAht9zTtvTekppTwsdbVmhIMGxGhiGi63CsoQJwagzanAmW5ZFjCbGiD8X" "RLM7I2aYLHMjmYkkc1ETpiUaMy+MCSYbA4NDxt+6RqHQrqWF8XO+c77v9LT1wp9s79Vz8z55" "b14OD+SzuTP2XV3vp4x10TxtozoDZXRKpfo1WnjxI5f1kHjpGb/6YIf7D4ZmP+yguj5ywPlk" "rWCyIs8VUGmrwN21BXw7/9VwgB++zVjhPZY3To281jD+kOCTWwPH9loavnNLPiT1DcwoCxBK" "PA7aW3Dl5qVNS+nZNlexc6qtvkyeX95BIr3z/Oj7LVEA4IfmzshU1y9X2vfidyWGX7cmsJXf" "Rr0tiEx6FYRoH5Qbne80VNpkr8uKR6vsIGr+8tG3b8gAwO8oSn+rq8Me19awoN6BalBUCDLs" "1IyxP0ZnfMKFSarqffXVEpZSFLJDREPAYdfypB8AeJUpPYJZxG1lCbrB4ODteNzRiKnYdRCV" "vWkw7lxznUPQ80WsbeiIpRn2uCVoGu0BABPR2D7GGeDBodm+HzWiH4k/45i+O/1FreNLn6ay" "Vr/bhomYCpUUQHYKeMxvBmO09l+BqnmtHkuk7AlkUqu4OD20yYh+bmC752Jie8J0TWqKr9+n" "YRM4qKSIUrEIppugq5oAACZN1f76bfFG8/dz0SzT6McD6ZrRwxvWEyV18Y6hzBwea6oHZQWo" "agkaKcDtMiO5riCva/F/FijalbHZq8Nnl0M/7lPEfo2QxZ/9FdJSmQNyIDB7IP5Lfjv7FOhu" "GULaD2isqsRqKosm5/2Nus5OSYjtf2np5bTzhEcpjmg1wcg3VoslF6jG8ZMn4fP5sKdSFhKL" "k+BIAqdfeRp1oRAqPC7YuN3Q8vKy2QRCTIVdcjx/sM1yPbeB1WIJLxw5gs9ffwM3GS36/H4+" "HA6DKSl8OnQWqdQ9mB+Rb737Vl/LyspKH8+dP58t7qinuMlpzM3MQip3AgBO31uHQgjt7e1F" "JBJBd3c3urq6oCiKZmibEQBwOp2iCQCk6OjVrUPtR2VF+XreJbsB4IKzDAKjlsHBQUiSBAAg" "hIDnOZPZbI4CQDKZpP+fCQCea2xslWpqf2prb3dVV1UJKHcgk8kgFotBFEUEg0F4vV4YhrGZ" "SCT48fHx9EMCAEJHR0dYkqSoz+erEEVRKJVKfC6Xe5XjuKTH44kCMDPGCqlUKksIOfY3yfWw" "KF1CoWcAAAAASUVORK5CYII=") index.append('chart_pie_link') catalog['chart_pie_link'] = chart_pie_link #---------------------------------------------------------------------- clock = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA05J" "REFUOI1t0k1Mm3UAx/Hv8zzt2j48o0DLigxwrDgVh4kvIBHRZCY6NSYjbslcosbDYuLReTBZ" "MqNxXsy4mrn5clFjxg5zpNGR6TjIlrk4SMOLwMYAkdKyp33a56XP0/b5ezCiB7/3X/I5/CQA" "8T6y2ccJSTAkwNVkBqUXcflPpQskJIVLQqLsy7wefYHfASRxmmA+zslgx5Ejoc6jO+3bZ7Nz" "GWPhnHq+KkEPgID0Qeuw/FBHojsQiknl2ZOLQuZgbIhVKfMtx8O7X3s7cu/hVmNppLC8Ohe4" "3HpR00I1IkEfAKci4zkW+9ZfsXd1H0CpFS1r5tRqokS/7JWR5VBHWF8YKSwuzmlX27/TOrd7" "NDkO7m0da0FHK1q0bN/Gby3D6p9Lv4Tlpv4moT6orSnslm59xmBFqGc3lWTbRPKC2q4GCNk1" "Hu5qoqFeRiChGzWuz+WoRBTq9PPcb55zt5kzM+Fa6VUJ4NjnFz8JNOx6N5nQaHAFh/Z1kjcM" "Ni2H9tYWAKoCvk7dwtcEmew6OUv5+NM3B47LAJnKPb2+AL/ksXdPDLsqCAaDjP34A0XDoOK6" "XBr7me49cYysgyM3UnRDAwABgHLZ6ql6MobrE4tFcGuCOlXlj5UVxn4aJz01ybPP76dxh0pu" "00E0BCmXrR4AGcCzLSy7guP5uDWo+JA1StRpGumpSV46MMQjvX24Vah4PpZdwbMttgRe2U4X" "S5FndsYDLGVs7muLghzm0cf7eaBnL2q0HtOF1YxFMCKRK9l4ZTv9r8CxrhQNA73scvXmBsEQ" "1IWDPDX4JPHGekKAFoZfb2bx8CgaBp5jXdkSuLYz6jrmodma0i23VfliRPBcb4KuRB0IWMla" "jF7LUDTWmd+wMPNrMwhlFED65+t9R0+99Vhyx/BCQVNb4xqxUAjFl6n5gopUxfBcqtUqqrhr" "p+9svnP9zLHTWwKA4TeemI9Go2p2M187MTKvzEoqshIGwK+VaVYrvPdyUshyY0Sia3bgzN87" "GSCVSjUXCoXvw+EwZqlgmPk7H9q56XFr44ZubdzQ7dz0+PLy/AeFQt5sjsclXdcvp1Kp5JbA" "NE3HcZy1iYmJTiHE01PffDTN/3R3/5dfXdP1ScDyfd8C+AvBLp7YWS6FhQAAAABJRU5ErkJg" "gg==") index.append('clock') catalog['clock'] = clock #---------------------------------------------------------------------- clock_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA2xJ" "REFUOI1d0+1vE3UAwPHv3bVre+vWsU7bDTa6DREHZYpsLkyi2UJE0YRFTJBEHS9MDOorfWFC" "gq8wJEQSXhijQY0vjGEbMQhZgMUZmZsLDsOy7AE2trCHsrVjfby7Xq93P19pjJ+/4PvmKwGI" "T5FzrZySBF0CTL/MfukVTP4je5mQpHBDSOQdmbcDL3MXQBJf4U5Wcdpdd+yYp/7dzfr8hfjM" "anq2V71UlCAKIGDiiHZU3lkXanJ5glJ++vSckDkS7GJJWv2Rk96Gt074th6tSS/0pR4szbh+" "qbni93tsfG4HAMOSKRgaHQ9f1yNNh1HsjKZNfb4UytImF/LIsqfOuzHbl5qbm/H/UXvRX19W" "oNIwMOc30GY38Gc0wmUl/BU+p8YWhr1yZVulUJ/yryg0SPe/Zr8l1AvrSuOWkcbLaq3qwqPb" "7N5WSUW5jEBiI21zayaB5VMo3bjEk7lesyQ3NeW1s29KAB99c+WsqyLycWPIT4UpeKOjnmQ6" "zbpmUFsTBqAo4If++zh+wWr8IQlN+ezL4+0nZYBVq7rFEeBkC+zaHkQvCtxuNwPXr5FJp7FM" "kxsDv9K0vYp03MCQN5ExPe0ALoB8XosWCzJp0yEY9GHaglJVZXlxkYHB35gYv0PnSwfZ9LhK" "Yt1AVLjJ57UogAxQ0DU03cIoOJg2WA7E01lK/X4mxu9w6HAXz7S0YhbBKjhoukVB1/i3oJDX" "JzJZ3wubq1wsrOo8sSUAspc9e9vYEd2FGihn8NZPjI7/jOkkya4ZFPWtGQAFoK71UMRxeFFV" "vaSSDnt3B/HICpFILarPw+DoRaZj/bQ/20Jny0GskjiJ3EhF6TalTAYwdeNqan1lanrxEWvJ" "Nb7tu8uDlRSSaSEZFv3D3/P0jmZs2aa5+gC2ZNEW3QeI9xWApT+vxqqbO+2dIaVjetV25608" "s/OPuHk7xuDYMkvJXtqiz/Nq03sA7Gt4jYS2yNDtIZfrn1nOvfPcvUAgoMbXk/apvnvKtKQi" "K14AZHuDydgI47Hf+eTAd5y5cRyv4kEg8gpAf3//Y4ZhjIbD4ZKVleXU9bHJs2YujqXFyi0t" "ZghyCc2ZDkRCEdb1ZdJanOHxITIp87wE0NPT4zcMYwyoF0Ls6e7unuR/Wk+Ez8jIHwhJlLqV" "EiFLyhc3z89/+DcIRptY1mKkdwAAAABJRU5ErkJggg==") index.append('clock_add') catalog['clock_add'] = clock_add #---------------------------------------------------------------------- clock_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA2lJ" "REFUOI1dk0tsFGUAgL+Z2efsdLvsFrotbWmpIFYKgUCtItHgQaRGacSAJWI9kBg8mKgHDQl6" "QRMbaqJRosGjUQvE0MZGaHyFiI9UU7LpQ/oSSttl2247u52ZnZ2d+T1JjN/xO32XTwIQbyGv" "tnBKErQLsDWZvdIBbP5D/hKVksIVIVHwZI6VP8FfAJL4BP9yBaf9dR0dwYbj682pc5mxtD5+" "Xr1YkqAZQEDqkHFEvr+usskXTEiF0dMTQuZQop0ZKf0FJ0Mbnz8R3nCkWp++sHJzZsz3XXWf" "pgVdwn4PAMuRKVoG++afMeubDqK4OcMYOTNTmadVLhaQ5WBdKDt+YWViYkz7pfYrraGsSNyy" "sKeyGONZtJxBsizAn8ludW7655Acb40L9T5tVmGjNPkpex2hnltUGmuuNV5Sa1UfQdNl2z1x" "YlEZgURWd/l9bAEnrBDJXuTe1fN2YHVkJOTmn5MAXvusr8sXq3+9sVIjZgue3dfAsq6zaFjU" "VicBKAn4vH8STxOkM/MsGMo7Z1/cc1IGSDtVuz0BXr7I1s0JzJLA7/czcPlbcrqOY9tcGfiB" "ps0V6BkLS15Dzg7uAfABFApGc6koo9seiUQY2xVEVJXbt24x8P1PpK4P8djj+1mzTmVh0ULE" "/BQKRjOADFA0DQzTwSp62C44HmT0PBFNI3V9iLaD7ezY3YJdAqfoYZgORdPgbkGxYKZy+fAj" "6yt8TKdNNtWUgxxi565WtjRvRS2PMv/1x+R6P+Tp2UlykQSj8Qf1PkABqGtpq/c8HlXVECvL" "Hru2JQjKCvX1tajhINnes5R++5LtTx5l09FX2FCpoqX/iB2OLmUVgOod+1cLlv5wrhhYqwZK" "jE8XqCjzkQgpSI7H8LsdbH/qGOHJH5Guvo/f+ptgvEqanby5xQdw7aOXBluOn/mgMbLSnZou" "qUt5m/SdDIon43qCtjszhJINcODVu2/43q5CEVK971/R/cIDN8rLy9XM4rJ76sINZVRSkZUQ" "AA8FY5hD3xDpPYFtpTGBfE7BVZhTAPr7+9dalvVrMpkMzM7eXrk8ONxlr2ZwjLmoY8xZ6wKl" "TFkmFVUCsuQoBvqSYGpOdt2SeE8C6Onp0SzLGgQahBA7Ozs7h/kfVw/XvmFm519WXKnGiURd" "D9HV1pd98x9TT4y3N1K76gAAAABJRU5ErkJggg==") index.append('clock_delete') catalog['clock_delete'] = clock_delete #---------------------------------------------------------------------- clock_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA31J" "REFUOI1NkVtMWwUAhr9z2tLT9kCxBbnIZQXCAhvWFxzJZEbERMmi4qZB4tTF6IOJPvlmonHJ" "ksXEPagJc0O3N2cGyyakzi3TbWq3DHdRImVcBwzocBx62p5bb8cHksX//fvyJb8AYH+KmH6S" "TwSbXhssWaRT6MHif0udpUJwcN4WMAsib/pf4A6AYH+Da6OMg666/n536N3H9LnBtcm4On3K" "O5wToA3AhvG9Wp+4ra6i1ekOCmbs4IwtsjfYy5IQ/56PpYZ973vq+6rV+aHEwtKk82L1iCy7" "83hcBQCMrEjG0Oha3aNvaX0ZRz6paRNfLFWk6BAzJqLorpOU6aHEzMykfLX2BzlUnCFgGFhz" "Ctq0gpzUqCwu4mblYe/K/B+SGOgI2N4WedlBgzB7lM6s7R184GisiTae9dZ6nbj1PI83BSgt" "EbERUNQ81yf/Jetx4FOG2Zo+ZRWlJyakfOp1x5cjLLp7T9fPPPLO09UlbrxGgT3PhBBsk3VN" "p7wsgN/vprkhwOp4hO2pS7jlXU7TzFdZOWlMBIhnq9oLNhRSGbY3B9FzNi6Xiws/nyOpqmQt" "ixvnD9Hh+5vKtjdo6nqb+vb30PXaz50Apqm15TIiqlUgGPRg5W18Xi/3Fhe58MtljKUzvNJd" "j1yyE2U2RpGQobikEjlY53cCZHQNTZcwHAJWfvP3NTWFT5ZJLkToe64Gf6gba/UkRV6BhduT" "qDq2kFkPiwAZUx9PpnQEZ4H5uE5eEEGU6Ax76OsO4G/swVw5huDawCUXk9PifHf/iZs7Pjgz" "tSkwtEtJVUUxLa7euo/LDebdn2guXcDf9CLm8gCiK0smuYV7v97i67XdTKdKRgGcAJZujFpG" "+tVY3tEq1uQYPn6ZXTUzPNq5m0x8EEeRjanWs3rlTw6s7WNxXZ3ANkYBHABLY6MrVeFn89sq" "HF3W4u+u18JJclSSTw0h+WyMRA0LV8YZSPUjigU9vp48cO3IhyMPCwAOv7Vjyu/3e2ORE7Q+" "9S13Tn7E1G9R3HVhlPgyp62X2N8TskVR8Ag0xXYe2+REgEgkUp5IJH6UJImp2TUy/4wSCnfi" "821lfixmH73bcuP63IPPEomNdHlZmaAoysVIJNL4sCCdThuGYSxHo9HQXxPL9uEjXznaWxqw" "JSFaWl68f+TQwBzA+vPHT1xTlNuAVigUNID/ADmmm1a2q6g6AAAAAElFTkSuQmCC") index.append('clock_edit') catalog['clock_edit'] = clock_edit #---------------------------------------------------------------------- clock_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA2BJ" "REFUOI1N001MHHUAhvFnZj9mmZ2tCwvZXRAKLCztUsRiVJKGhKDGVD20sSZtEzUevNSb9aBp" "Yk/1YmziyWhqY0waLaUmlYZoBYQmtqat9IABCrRUKLBd6MJ+zMzO7M78PRitb/Jcf7dXAhAn" "kYvP8bEkOCjA0mT6pFew+N8Kl4hKHq4IiZIr89YT+7kDIIkv8W3VcsrXdPSo0vJug3HvTGYu" "nVu4oF6sSNAFIGD6kH5Y7myKprxKRCrNnloUMociB1mR0t9xItD65rGqnYfrc0tD23+tzHnH" "6oc1TXGo8rkAmGUZ29QZWH/daE4dwOPkdX3ms5VogV7ZLiHLSlMguzC0vbg4p11vPK+1hGxq" "TBPrXhZ9IYuW14mF/EzFTqtrS78F5JreGqHu1lY9tEp3v6KvLNQzm57Ek9cSl9RG1YtiODzV" "VkN4h4xAIptzuDG3QbnKQzB7kY7iBctfnJkJOIUjEsDxr4c/9YabP0hENcKW4I2BFrZyOTZ1" "k8b6GAAVAedG7uJqgnRmnQ3d88kX7+w7IQOky/FnXQFuwWZPMoJREfh8Pn75+SfyuRz62jXu" "j7/PnoRCLmNiytXkLWUfgBegVNK7KrZMznKJRKqwHEFQVXmwvMz4r6Mk5WGaU6/h1cfY2NyN" "CPsolfQuABnANnR0o4xpu1gOlF3I5AoENQ1pY4Km5EvsiO9FrIxSzSq6UcY2dB4DJWM6XzCQ" "vC5LaQNHkkEO0NvTTnd8m1BtGCf/I7HUEZ7RJikWitglY/oxYOoT+VyObMni+u2H+BQIKl4S" "6gJ1yQNQmuLGt+fQwibxyp802LexTX3iP8AyzMvbm6szs8uPeLj1kLNDd1ieuQp6llC1gWst" "gXBxijdp6T9Ov++KFXeXxwE8ACs3L6/Fu19wOqOegdm04yuXddq2vqG1ux+PO4WoZKlP1SJc" "A7+qEFQ6vB1b398/O7o+Kf97ltNvPz9/7NWn1Y9ejjjR/BjtyR7U0Cai8ggkD3/8MA+4uKV5" "6pI7cWz7vasnUykPwMjISJ1pmr/HYjH/6uqD7U7jfCX54oeK7PUg+RqRA7to2NuHHNiF5E/g" "DbbjD7UFM7PjUQlgcHBQM03zFtAihOhpy3w+KSquKlyBcN1/EgLhCMlFVoQrkCq2hRC3/gZ3" "wJ/qk/xWFAAAAABJRU5ErkJggg==") index.append('clock_error') catalog['clock_error'] = clock_error #---------------------------------------------------------------------- clock_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA2hJ" "REFUOI1dk8tPXHUARs+984KZC4MMdigFysO2YShqNCqRYCNGE+mmxJK0TbRxURfujC5MaurG" "PoyPRWNiNNW4UWOgi0olWizQBGnUKiVUwEJLy7R0GOgwd+a+79z7c9H4iOcP+JLvJEcCEG8j" "a49zRBL0CbAVmW6pF5v/UDxDUgpwTkhYvsxL8ef5E0ASnxDaqOFoqPHAgUjzoS3G9VPZ+Yy6" "MBA9XZKgA0DAzF59n9zemEwFIwnJmju6KGT2JvpIS5mvOVzW8uKr5Vv31alLg/mb6fng+boh" "RYl4lId8AExXxjF1eu68YDSl9hDwCro++0E6WaRTdixkOdJYllsYzC8uzisXG75Rmiscqk0T" "+3oOfSGHUtCprQjze+2H0ZWln8rk6s5qEW1Tbgdoka59SrcroqfWA631k61nog3RIBHD48EH" "qqmqlBFI5FSPX+bXcMsDxHKn2aEN2GFtdrbMK+6XAF7/bOi9YFXTG61JhSpb0N/TzIaqsq6b" "NNTVAlAS8OXwNXxFkMneYU0PHPv45a7DMkDG3fyYL8AvOuzcnsAoCUKhECM/fE9BVXFtm3Mj" "Y6S216BmTUz5Pgp2pAsgCGBZekfJkVFtn0SiHNsTxKJRbi0vMzJ6gZnpy5jbfsRc0VDMk1AV" "w7L0DgAZwDF0dMPFdHxsD1wfsmqRmKIwM32Z3Xv6cESJ+po2VuRDaIaOY+j8O2AZM4WigRT0" "WcoYeJLM+9/tJpscQG0d4oupg9Qo9bTVPkFDYgc3iv3Y1vrsPxccUx8vyMFdOSXCxalVUq1x" "Sr7Ds+0H8YSP53v4CFbUNB31XWiOyW/mK12PniAeBLAN86xtav1zXiAl15f4fFBglRw84XPz" "7gKuX6Lku7ieS8Eu8nBDN5prSD8vTdwNAKR/Pbuy+aFnvPZkoGcu44Us18IND7Ft0yNEw5VE" "w5XEIlUYjkFNRR1T6UnGFkbXrBLd0t+xTExMPB2Px0ez6xvekcGrgU07j2E5Do7vYJUcWmtS" "dLY8x6XlSS4sjOV01+3OHGc2CDA8PHx/Pp//NplMohXzqrZx46P8+P5dkiTuxSSkmUupE09K" "cnnoyq0rvNlxMr4lttXuPd57T6KmaaZpmrcnJyebhRBPTX/1zh/8j+a30Meujodea3q3GDai" "xVVtVQf4C1yXs8pux1BlAAAAAElFTkSuQmCC") index.append('clock_go') catalog['clock_go'] = clock_go #---------------------------------------------------------------------- clock_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA3hJ" "REFUOI1Nk99PGwUAgL+7thxcD2gprF2R38uMKNNFh8vGMjODg+1lxJkACzM+LBp9dE8u0aeZ" "EHUPJkZdJtEHY8wYkSzBOeJmTZy6mWUT00GBjl+lBUrHld5dr+3d+WA0fn/Al+/lEwCc9xBz" "nbwrOPQ5YCoih4RjmPyP7XGCgovrjkDeFjld3csMgOB8judRLec9jYODUsuZej1+aX06pc5e" "lq+UBOgAcGDqpNYvPtkYbHdLASH/4PycI3Iy0MeykPqGc+WtQ29WNPWH1YejW4vL0+4fw1cV" "RbKo8NgAGEWRgqFxJPmy3tx+ApeV1bToR8vBbfaLhTyiKDWWZ2ZHt+bmppVfG75VWioL1BgG" "ZjyDNptByWqEKsu4G7ogrz78pVys2V/jyE8oCRetwvxFDhUd+VLa1fbYrbZxuUF2I+kWe3bV" "4KsScRDIqBa3pzcoVrjwZq7weO6yWZaLRsut7QEB4O0vrn7g9jWfbQsq+EyHV4608EhVSWsG" "DeEQACUHvp6Yx1YcUutJNjTX+5++dvCcCJAq7txnO2BvF3hqdwC95ODxeJj84RpZVaVomlyf" "vEn77lrUdQND9JM1pYMAboB8XusoFURU0yYQqMC0HLyyzMrSEpM3Ikzdv8eLR3vw75DZSBs4" "Pg/5vNYBIAIUdA1NL2IUbEwLijasq9t4FYWp+/c4fqKPvfs6MUtQLNhoepGCrvFfQSGvT2W3" "Kw7X17qZWcyQXZoiHv2TcI2fdcvCW1XJ2maW77+8yN4dAVZSG+Q22eru7va6ABo7jzfbNi9U" "lHv4K3INqbjJ4OAA4XCY6qoqfvs5QiIe49jRl2hrbaUu4EfUN/wLCwseAeDAW589h2B9VVbQ" "25+t3uTU6VOMjn7H1N3bhEIhOjo6SCaTpNNpVpNJPP763NnXh5SxsTFVBLj1yRt/lMz8x151" "plhZ6QVA9x8gp+fp7++nq6uL3t5eenp60PU8KU/jOwA+n09y/zvLhVefj925I3rm43EAYr+P" "gmMzPDyM1/uPVNM0XCLsKjwYgsMkEom8ADAxMVFn23ZclmVlZGTE2vP0M8XQzrBbkcvda2tr" "xGIxJEmiqamJYDCIZVksLi5mI5HIqhsgl8sZhmEk0ul0i6Iogz/dvPFhOByukySp5DiOmE6n" "zwiCkMhms+PRaNRrmqazsrKiapo28DcOip2lxaGlAgAAAABJRU5ErkJggg==") index.append('clock_link') catalog['clock_link'] = clock_link #---------------------------------------------------------------------- clock_pause = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA0pJ" "REFUOI1Nk0tsVGUUx3/fvTPMdHqhZaZ1SqWVUlLj4NikUWzExqQsfCQmEiBBErUu3LjVrkiQ" "DW6MrEyMBt0ZYykLhDRK4zMREhVQGttCSwf6YvqYx52ZO/d+95s7n4vBxpOc5fmdk9/JXwDo" "DzAqBzglNIc1SMtgSLyC5H9VvkhSmFzRAq9u8GbLy9wGEPozwoU2zoS7T5yI9LzzaHXh3Pps" "1p47H7tQE5AG0DB11Dlu7O9OpkKRhPBmzsxrg6OJwyyJ7NecjO59492mx4532pnx4v2l2dAP" "nZcsKxLQFK4D4CoD33UYfnCkuif1GmZQcpzpj5eSZQYN38MwIt3R/Nx4cX5+1rrW9Y3Vs90n" "7rrIhTzOXB6r5NCxfRs3Os7GVjO/RY34YFzHnrBWTPaKu58zpHTs3KbZu/tq78VYVyxEpBrw" "1L44rTsMNIK8HfD77AaqyaQ5f4HHK+fltsr0dDQovy4A3vvi0keh1j3v9yYtWqXm2HAPBdtm" "03Hp6uwAoKbhq4m71C1Ndv0BG4754advHzxpAGTVrmfqGuplnyf7ElRrmnA4zOT331GybZSU" "XJn8iVRfG/a6i2vspCQjBwFCAJ7npGu+gS3rJBJNyEDTHIuxvLjI5I+/MPX3Xxx68SV2PhJj" "Y9NFt4bxPCe9BfCrDk41imsKZND4+7pdptmyqGyssW93Jwu3bpJdWaFdFjCXc7QpFU+fPn3d" "APC96lSpXEWE6mSyVQJhgBFl4OlBTEOQSqXo6+ujkM2CskmlUvT39yOlHGgAXOfnkm2T9yTX" "bq4RjkBzNMzzQ8+hlKJWq6GUwqm6SF/i+z5SSqSUGACy6l4ubq5MzyzmWCus8eX4be6vFBFS" "4fv+VkspcV1va1hKiQmw9Mfl1V39h4L9SXN4JhuEPeUxt5Dj1+urRP17JBIJPM9jcXmVQEnd" "loiLIAjIZDINiQBn33r2TktLS2x9sxCcGr9jzogYhhnl1fbGdqUURt2nrgMhZSNnvu83ABMT" "E+3FYvHbZDJJpVy0K4V7n9QC/YIQOi13mHEpJZ7n4Xme1loLpRRaa3zfRwCMjY1Zruv+CfRo" "rQdGRkb++e+y0dHRW0qp9EOZVyORyIFcLhd6KPbGvzYkzT84ciuOAAAAAElFTkSuQmCC") index.append('clock_pause') catalog['clock_pause'] = clock_pause #---------------------------------------------------------------------- clock_play = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA2FJ" "REFUOI1dk9trW3UAgL9zkjQnp+maJtO03dqlq3Za7WBjdsUxJ/XByx5sdUIdqPgwFB9E0LfB" "BHG+yPogiihThGFF1j3sQtUWbw9GVoe0Rttu7Zpe1zTNcj859/PzYSji9wd8Lx+fBCDeRq72" "ckoSDAowwzKHpacw+Q+Vi8QlH+NCwvBkXmx8kusAkviEQGE7pwPtx48HO07sqC2ezc5lSvPn" "1QuOBD0AAlLHtCH5gfZ4tz8Yk4zZ0wtC5lhskFUp8xUnld0vvBbaNdRaSo8Wl1fn/N+3Xg6H" "gy6hgAeAbstYukb/xrO1RPcAPresaTNnVuMV+mTLQJaD7Up+frS4sDAX/rXt63BHg0VU1zEX" "82jzecJljeaGOn5vHlZvpX9R5GhfVKj3h9d97JZufsphW6hnc77OncnOi2qb6idYc9l7T5TI" "NhmBRL7kMjm3hR3yUZ+/wJ7qebOuOjOjuJXnJYA3P7v8vj+SeKszHiZiCp7r76BQKpHTdNpa" "mwFwBHw5dhMvLMhkN9jSfO99/PKhkzJAxm55yBPgVSwe7IpRcwSBQICJ776lXCphmybjEz/S" "3bWdUlZHl5som8FDAH4Aw9B6HEumZHrEYiFMV1CvqqytrDDxw8+kpqd47PEncBu22MrpiEgA" "w9B6/hVYNQ2tpqD7JEz3TvdsqUJ9OExqeoqjA4OM21+gLVRx7nMw1wawan4AZADLqKXKlRqS" "3yOdqeFKMsgK+w/08crrb9DV04NtO+xv2UcisgslfgnkxSUAH0B779GE5/GoqioUCx4H9sYI" "yj4SiTbUUBBZwE/pK8TCUZS6EI7jYPn/bNnR3/qNDGDW9CvF3PrM7MptNgubfD56neX1IpJp" "I+k2K6tFymUd07G4VVujqbGJWCSKWdWv+gGSH716rffEmQ8664vDqbSj3q6YZDaz+DwZ1xPY" "koN+t4HpWui2gSJbmJaJrumG/59Zhl86eKOxsVHN5gruqdEbvllJRfYpAHiuQVu9gemYbAtE" "SC8vMXXtD9s07CN+gLGxsbuKxeKleDxOtVIsVQtLHzquOCJJ4s5MQkoZWvWg4ZjKxkaGqckU" "9zbsGTr3zsikH6Bareq6rq8nk8kOIcQj0yPv/sX/iO97OH81+ZuSzxZ5euczueZQa/IcI/wN" "fjCnWxDPxQYAAAAASUVORK5CYII=") index.append('clock_play') catalog['clock_play'] = clock_play #---------------------------------------------------------------------- clock_red = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAz5J" "REFUOI1tkd1rW2UAh5/3nNOeNj1tiP2cramts7NCBIVqa5h1im6LQ5hacAO9EEXsZRVFh/Zq" "ooheeVNRFGXIbmSOEqqoy6T2gxJ1ZqYf66Cl1M1+LIn56MnJed/Xi0md4PMHPPx4fgJAj2IU" "7uUtoTmqoewY7BcxytxA/mtahcm3WuAqg2eDh1kEEHqMqkwTJ6vCx4/bXS+0V5bHNtRvs5dq" "L8Z85asIUqJ9P+Xe/Z1h9R+8UwRahDt/clkbPNV4lDVx9UtO1HQ/M1zb+fTN5eVTWT+dsOzc" "sCMb6pB1taA1Rr6I2L6K1/hJyb5/GHCLxfT7a615+g3PxTDscE1h4VS2dOG8Y1qvO/L2bmx3" "h+DPFwjOJbHzOXRPBGE8HyhdjNeYob6bdKDXWTfpFpc/Yr/wrY+rvFBHQ8ObActpQJd9rAOP" "Yja3IbSm8ucV/DNfYThV5N1JfGuuXPZW08KUxwRA/uVj74m2nlfU3h6MaznqnnsJKSWZTIam" "piYAtFLk330HfUsL/i9TmMmFt0Pnp08YALVusE/WB6meX8AYPAyAaZqMj4/jeR4A5xIJ1KEj" "2NMziKZbEQURBTAAlK8iKlBL9fIydrhj97qVlRUmJiYYHR2lvr4eqzOMnZ5HhRrQfiWyK9CV" "CmgNxRJKSgBc18VxHJLJJENDQ/T19aEqPkgPrUF7PgAWgPZlSuTyg17bHkrpRUL33IVlWUSj" "USKRCI7jIKXETS9R3R5GbG6jpUzduCBhbGYo3tePOP0FSiosy2JgYADHcQAQCKzTn5M5+Bhi" "ZR0qlcS/DTxv3EwtpsXWBrp9D3+98RrF+UW01mitKS4ukXt1BNnVSdWVdURiOq18NX5d/A/F" "2JEXC729HxjhlkClsZnQuW+w/1gF36fc0sHWI49jFHLoxGzJnp0baV67NPYfweTk5IFgMPhD" "aWNT3nb2jElzCBUKXp+/cQ0vW2D1ySe0NgwQ4sFoNPrjbsR4PN6czWbPtra2slrI53qmkh+K" "sjeoKn5E+xIt/VSNlInMww+N7N23r35paen7eDx+RywWu2wBFAqFnZ2dnfWpqakurfUDobmf" "fud/+HR7+7OtmZlfgaJSqgjwN7iXi/hLLq32AAAAAElFTkSuQmCC") index.append('clock_red') catalog['clock_red'] = clock_red #---------------------------------------------------------------------- clock_stop = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA0VJ" "REFUOI1dk01rXGUARs9770xm5uamM80kTkyT2jRaa2yEio3BNgaiYNVNgxVqRUWwIO5EN1Ko" "LqwbaRaiiFKXKtJ0UQtBG6t2YQoipmEwiU3aqU3STCdxMl/3+973dVEw4vkBh+csHgGg3kVr" "DHBCKEYVeKbGkHgGj/9QP0dO6FxQAldqvJx+mj8BhPqM+EYbJ+Pbjx5N9BzbZl8/XZovVhfO" "GGdDAf0ACvKHrSPag9tzfbFEVrhzJxeVxuHsKEui+DXHkztfeiN1z5HOamG88tfSfOxi53nT" "TESk4hIAJ9DwHYuR1efsHX2H0KOaZc2eWsrVGdR8F01LbE+WF8Yri4vz5uXub8yeFp9Wx8G7" "XsZaKGPWLDpamvi9Y8y4VfglqbUOtirjAXNFZ6e49jlDgTJOr+u9XVO954xuI0bCjnjo3lYy" "WzQUgnI14tf5NYKUTnP5LPc3znhNjdnZZFR/QQC89cX5D2OZHW/35kwynuL5kR42qlXWLYfu" "zg4AQgVfTlxDmopiaZU1S//g01f3H9cAisHd+6QCWffZsyuLHSri8TiT339HrVol8DwuTP5E" "3642qiUHR9tKzUvsB4gBuK7VH/oaVU+SzabwIkWzYbB88yaTP14iP3OFJ546yNa7DNbWHVQm" "juta/QAagG9bWHaA40u8CAIJpWqdZtMkP3OFZw+NsnffAF4IgS+x7ADftvh3ge/a+Vo9Nbyt" "LUahaHNfVxq0JA8/Msju/j0Y6S00PFgqWsRTgrW6je/a+U2BY/1c02LDZTPB5enb9PWmSepx" "Dgw9BgIiCanXXuTJiz8wohQRIJUa9rPZgg7Qufdgw3WqB2p+U7vRFLJQcGlriZFN6ohAcmO1" "TuadN9GHhhBdXdDZiejowF5ZycQApj55/beBY6c+6m2ujOULofF33aN4u4QuNSKpCETIe0qB" "7xMuLxOFIbS340h5JwFg7JVHr6bTaaO0vhGdGL+qzwkDTU8CICMXR0qE5+G7LjIMEb6/KZiY" "mGivVCrf5nI5GvVKtbFx4+MwUsNCqDtnUiLvKDUc931UNouMIqTnbQoajYbjOM7K1NRUj1Lq" "8Zmv3v+D/+Gl03O3pqd3R0rhK4UCAik3/gG90qcauiC+1gAAAABJRU5ErkJggg==") index.append('clock_stop') catalog['clock_stop'] = clock_stop #---------------------------------------------------------------------- cog = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwhJ" "REFUOI11U09II3cYfb+ZTMw0kSGCScaCf0BcKksiioRID+LJs+c9dVlowWMPsrISFnbx4lkk" "tIeweFDxLFgIpOgGJKv5A2XBi0pxoxlDNDOZ37+ZXmpY6fadvg++98H3vvcI/gcnJycvOecv" "PM8DY+zDwsLCb9+aI183tVrtB9u2/06n051SqfRleHh40Pd9lEql21qtlkin0xHXdb9fWlr6" "65GjPBZnZ2c5xlhdUZTPxWIxzjmXlFJQSqFpmkwmk3HHcT5TSuv5fD73yFMB4PT0dLW/v/9X" "0zQJgEin0/mZcx7VdZ1wzmFZVtjzvF9GRkYGkskkeXh4mE6lUuLw8PDPAAAwxpTr62sfAKGU" "Ih6PhxVFAeccADA5OUkopWFKKS4uLlAsFv1ut6s80eDo6OidYRivXdeFlBLtdhuXl5fQNA1j" "Y2MIBALgnMNxHFQqlfcrKyurAEBKpVKZcx4TQoRN04zato1Wq4Xj4+OPjuOs9fX1wTCMt7Oz" "sxnf9xEOh1EoFFqMMVsIcRPgnE9NTEwolmWh3W5D0zQ0Gg0QQtbW19f/AICtrS00Go3DRCIB" "y7IwNzcXjcfj0Y2NjSFFCAFKKYQQkFLC931EIhEYhtF7r5QSQgh4ngcpJRhjsG0bjuOA5PP5" "crPZjEWj0fDU1FS02+0iGAyiWq1+5Jyv/bv87czMTIZzDikldnZ2Wp1OxxZC3PRE3Nvbe2ea" "5mshBAKBABRFwdXVFaSUGBoagpQS3W4Xtm2jUCi839zcXO35YHd39w1j7M3o6ChhjCEYDCIU" "CvVOCYVCvXMSiQTq9fqPqVTKK5fLxQAAuK7rmaZJdF1HpVLB+fm5rSjKd/Pz88TzPGxvb/sA" "nEwmEx4cHMTAwACpVqveEx9ks9nc3d3dT47j3MRisWld1z8tLi4mhBDI5XJfKKXTUspPtm3H" "OOe/HxwcvHqShWw2+4oQ8lzX9WeapjWklOr9/T1ub29BKVXHx8cbqqo+U1X1+SP5P2n8GsvL" "yy+bzeYLSikIIR/29/e/Ged/ABs7pW66cvR9AAAAAElFTkSuQmCC") index.append('cog') catalog['cog'] = cog #---------------------------------------------------------------------- cog_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAzxJ" "REFUOI11U09MI2Ucfd90prW0pBQj09ldKbBZBLK2jUrqEk8Yr8Zw5mI2Jv7Bkx5wNxKyyRou" "HCXBjQebvUHCGg4kYtJYpDsRN/wpRiAbTUFlazsh/TPT+eb7vvm8CNlN9J1+L/m9d3gvj+B/" "sLW1dZMxNun7PjzPuz8+Pv71f/2Rp0mpVBq2bfvPbDbbMk3zSW9v7wtSSpimWS2VSolsNht1" "XffyxMTEr+ca5fzY2dm553nevqIoh4VCQWeMCUopKKXQNE2kUindcZxDSul+Lpe7d64LAMD2" "9vbtzs7OTw3DIACirVbrfcZYPBwOE8YYLMuK+L7/QTKZ7E6lUqTZbL6STqf5+vr6hgoAnucp" "p6enEgChlELX9YiiKGCMAQBGRkYIpTRCKUW5XEahUJDtdlt5JoPNzc27sVjsluu6EEKgXq/j" "+PgYmqahv78fqqqCMQbHcbC7u/vF9PT0bQAgpmk+Yoz1cM4jhmHEbdvG2dkZisXiQ8dxZkKh" "EGKx2J3R0dEbUkpEIhHk8/kzz/NszvnfKmMsMzg4qFiWhXq9Dk3TUKlUQAiZmZub+x4AFhcX" "UalU1hOJBCzLwtjYWFzX9fj8/PwlhXMOSik45xBCQEqJaDSKWCx2Ua8QApxz+L4PIQQ8z4Nt" "23AcBySXyz2q1Wo98Xg8kslk4u12G8FgEHt7ew8ZYzP/mt+JvIgbh9VttNwGWs2mdP6SzUCt" "+/FFiMvLy3cNw7jFOYeqqlAUBScnJxBCwCLHsAIHeHX4NVzpvob8Lw9g7m/g98e1eQUAlpaW" "PqeUftbV1QVVVREMBtHR0YFkMom+vj78XM4jM5SGUATSxlsQhOH1l8cAyI8UAHBd19d1nYTD" "YZTLZaytrdmrq6uSMQbGGGqNCjQSxdvDHwMAPnnzK1ztSYGAPBcAgJWVlY2BgYEr+Xw+c3R0" "VAmFQtdVVZ0cGhqKEkLw7dY38vlLQVL47QHeuPoO5r57F822hdLBgXuxhdnZ2fcIIdfD4fBL" "mqZVhBCBRqOBarWKzvbltrlXRBAqVksLCBIVP+78AIB8+cwan8bU1NTNWq02SSkFIeT+H4ni" "NRDyIQE6JdCElAs/LTyZ/gcjPKOlcoGYJAAAAABJRU5ErkJggg==") index.append('cog_add') catalog['cog_add'] = cog_add #---------------------------------------------------------------------- cog_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAzNJ" "REFUOI11U09Im3cYfn6/5Iv5lkiI0CRfC8Zc7ObaGMok1JPIBm6n4WG79LKVsQ28dOwgLZVQ" "aPEiu22I7BJ6U3bbpRbcIqah0mpMt1ZQqLqoqYlZ/nxfvt+/79tlBgvbc3pfeJ8HnufhJfgf" "rK+v3xRC3HAcB5zzh+Pj4z//1x05v5RKpfdM0yyn0+l2oVA47u/vv+C6LgqFwkmpVIql0+mg" "bduXJicnX55x6Nmwubm5wDl/QSndzuVyUSGEYoyBMQZN01QymYxalrXNGHuRzWYXzngeANjY" "2LjT29v7vWEYBECw3W5/I4QI67pOhBCo1WoBx3G+jcfjfclkkrRarWvDw8NyeXl51QsAnHN6" "dHTkAiCMMUSj0QClFEIIAMDQ0BBhjAUYY9jb20Mul3M7nQ59K4O1tbX7oVDotm3bUEqh0Whg" "f38fmqYhkUjA6/VCCAHLslAsFh9MT0/fAQBSKBSeCSEiUsqAYRhh0zRRr9eRz+efWJY109PT" "g1AodG9kZOS667oIBAJYWVmpc85NKeUbrxAiNTg4SGu1GhqNBjRNQ6VSASFkZnZ29jEAzM/P" "o1KpLMdiMdRqNYyOjoaj0Wh4bm7uIpVSgjEGKSWUUnBdF8FgEKFQqFuvUgpSSjiOA6UUOOcw" "TROWZYFks9ln1Wo1Eg6HA6lUKtzpdODz+bC1tfVECDHzr/i9D+jhdefpL5DHB2hrfmfbF289" "9V3e7Ya4tLR03zCM21JKeL1eUEpxcHAApRQuVZ4jVM5jcGwSPYn30dl6hD9XH6m/X7265QGA" "xcXFu5zzuwMDA4RzDp/PB7/f37ViL2aQ+vQL6Lu/gaz+AK3zGr6+i7S8u/euFwBs23YMwyC6" "rqNYLGJnZ8eklL4zNjZGHMcBqofwxxLAJ991c/FmDHhcMtC1kMlkFk5PT7+0LOtNJBK5puv6" "84mJiZiUEpXMR+rDzz73BPZ/BescwwLQanrwchdlek7gK0LIFV3XL2uaVlFKeZrNJk5OTvC6" "7yr7I/+7PLJ1ND0a6qcEO38R5bruj29943lMTU3drFarNxhjIIQ8vKWtX7Bqh19Th8Qd6pYd" "uD99/Nh58A+8Zq4hX5DTQAAAAABJRU5ErkJggg==") index.append('cog_delete') catalog['cog_delete'] = cog_delete #---------------------------------------------------------------------- cog_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA0BJ" "REFUOI11k11oW3UYxp/zlXCWZCepW87OQlPibMdql7jJCMNVpVUQRRxFvRKUyYq7dOzG6UYQ" "Br3wzgvB2jmKSKGhVw6C1YtFmh5tpMHTsWVjru1o06xJTrPkpOd//ufDqxaL8716X3h+78XD" "8zD4n1lYWPiYUvqB67qwLOuHoaGhiafpmH8fmqYdMwxjLZ1Ot1VV3YjH4wc9z4Oqqpuaph1K" "p9NB0zRjIyMjd3YYdmcplUrjlmUtsSxbzufzMqXUIYSAEAJBEJxkMil3Op0yIWRpcnJyfIfj" "AGBxcfHzUCh0SVEUBkCw3W5/QimNiKLIUEpRr9cDrute6Onp6Uomk0yr1TqZSqXs2dnZ33gA" "sCyLrVQqHgCGEAJZlgMsy4JSCgDo7+9nCCEBQghWVlaQz+e97e1tdo8Hc3Nz1yRJumyaJhzH" "QbPZxOrqKgRBQCKRAM/z4I0i9j8ugAseh1G7BZhrHzKqqv5JKY3ath1QFCViGAZ0XUehUJjv" "dDpX/X4/JEn68tUT9mnFq0M8MAgpcQJbD+fxV+4G5SmlL/T19bH1eh3NZhOCIKBarYJhmKtj" "Y2O/AICaffPl+MFTp0PSS2g8uAMfYyG0/xCkZw4LvG3bIITAtm04jgOe5xEMBiFJEgBgNXfk" "jUDs5BfhZ18HqUzBt4/BSukuqM3hxh+myw0PD79TLBYdXded7u5u0TRNRCIR6Lre++n7rNzd" "+8r18HNvM+b6t2B9HQBRbJWX3AnVe/xIp/d3Tcxms9cURbls2zZ4noezOY/e2CaiA2dhrn0D" "VrBhtRLYyBdx8+/I9xe/mjq3G6Tp6ekrhJDPwuEweJ6HpxdxQKwi+vxbsDa+A+fzQJ70oJov" "on38Ipat6Eejo6NXdh+YpunKssyIoogHv2cRYaugbgwV7Wu4MGE0Ylj+tehpobMQJAVdXV1M" "rVZz9+Qgk8mMNxqNc2dit9n3LkygPHUJ68sF+OMptNZ1t033vZZ9GP3RMIwopfR6Lpc7v6cL" "mUzmPMMwA+X7Fdu6/RMSqUEEAkexVrqHm48ONzXf4C2O445yHDewA/+njQDw7pnw9otHZP7U" "sQRbo+6TnzWhvGX7x2dmZp5a538AKXyNyEqJVIYAAAAASUVORK5CYII=") index.append('cog_edit') catalog['cog_edit'] = cog_edit #---------------------------------------------------------------------- cog_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA0FJ" "REFUOI11U11oW2UYfs7JOWljkqWnqz073UyXbqSsapqtFxkFh1RBvJHRXW5XFVF304FedBtu" "CE6KULwSwbGb4ARpWZlgmVQIZLYLLSVp0m00c2g6as1MDLE5P9/5vvN9XmjLCvpcve/L8zzw" "vjyvhP/B8vLy25TSc5xzuK779cjIyI3/4knPNqVS6ZhpmpupVKqVy+V+j0ajzwshkMvl/iiV" "SgdSqVTIcZyDo6OjD3c08k5RKBSuu667Jsvyejab1SmlHiEEhBCoquolEgndsqx1QshaOp2+" "vqPzAUA+n78cDoc/NAxDAhBqtVrvUUq1QCAgUUpRr9eDnPP3e3t7OxOJhLS9vX1icHCQzc/P" "31UAwHVdeWtrSwCQCCHQdT0oyzIopQCAgYEBiRASJISgUqkgm80K27blPTdYWFi4FolELjmO" "A8/z0Gw2sbGxAVVVEYvFoCgKKKWwLAurq6ufTkxMXAYAKZfLrVBKuxljQcMwNNM00Wg0sLi4" "eM+yrCttbW1IHPG+ePGQFa/53kAg1IVMJtNwXddkjD1VKKXJeDwu1+t1NJtNqKqKarUKSZKu" "TE5O/lieO7tPSGjveuE0SCWPav0EhoeHNV3XtampqR6ZMQZCCBhj8DwPQgiEQiFEIpF/l3Mv" "dB5+M7rPOA61VYCPbsF1XZimCcuyIKXT6ZVardataVowmUxqtm3D7/ejWCze61Ye34gFH35+" "5NRYGLQMy+7H4/wcvrpjN/7aNk3G2NPdI87MzFwzDOMSYwyKokCWJfAn36J/8BWEnnuApZu3" "cfKdi7h/+0ssPem89e7V6TO7QZqenv6IEHKxo6MDiqLA7/cjyDfRsz+EsGaBk18AweG1lhF7" "9QP0heujF86PfbJr4DgO13VdCgQCqFQq+OHOnPnn2k10RJPgVhGC2xg60w/u/ob29jLiQ6eR" "CD86uZvE2dnZu319fYcymUyyXC5X34oVpw6/9PprWg8Fd34GILByax09A10ANxE8MAR77fvQ" "2KmuuT3PND4+foxzvnnu6NKDl89+c9An/wrBGgDEMywZvkA/qvcLWP/u45k9Bjv46bPjNe4h" "7HlCAecA9xgE9wQXEJxDcIF/5mLlb0FDpBHzZN5XAAAAAElFTkSuQmCC") index.append('cog_error') catalog['cog_error'] = cog_error #---------------------------------------------------------------------- cog_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAzRJ" "REFUOI11U99LW3ccPd/beyPZjYtJbdJr24gtk5lBDDLJJpOBsP0Bwt4Kg/VlA6ms7MG1tLOF" "Dvfg055E+pKVMtHtH7BMzKaN1VZD3FqpyJK281ei3pl7c78/756Ulm3n6XPgnIdzPhyC/8Hi" "4uIlzvlFpRQYY3f7+vru/JeOvEqKxWKH4zgvM5lMLZ/PbyUSiVO+7yOfz+8Wi8XTmUwm5Hne" "mf7+/idHHu3oWFlZGWeMrWqatpbL5eKcc0kpBaUUhmHIVCoVd113jVK6ms1mx498JwBgeXn5" "WmNj41eWZREAoVqt9jnnPBIMBgnnHNVq1VRKfdHa2hpNpVLk8PCwq7OzU0xPT/+qAwBjTNvc" "3PQBEEop4vG4qWkaOOcAgGQySSilJqUUpVIJuVzOr9fr2msdzM3N3Q6Hw1c9z4OUErZto1wu" "wzAMtLW1Qdd1cM7hui4KhcK3Q0ND1wCA5PP5R5zzmBDCtCwr4jgO9vf3MT8//8B13RsNDQ0I" "h8O3uru73/d9H6ZpYmZmZp8x5gghdnTOebq9vV2rVquwbRuGYWB7exuEkBsjIyP3AWBsbAw/" "la5PO9zGJ2e+Q09PTyQej0dGR0dbNCEEKKUQQkBKCd/3EQqFEA6Hj98rpYQnGM42d+DOxmUw" "xuA4DlzXBclms48qlUosEomY6XQ6Uq/XEQgE8MPal1CSSqYEuFBay8m3SOrsB3j45y8oPF9A" "dOHDF0KIneMSp6ambluWdVUIAV3XcW/jCj5651NIX0EqCQUfW/YLRMwYHmzcx1J5ViwN0YAO" "AJOTk9cppV83NTXh4OAAgUAAnmCQvkKp+gxcCQjFwSXH3/QQ6XO9qHFXP/jmN08HAM/zlGVZ" "JBgMolAoYH193fEszxRSIP5mAkJJSF9h0y4jGjqNx8/nsPD04a5H0XocYXh4eHxvb+8z13V3" "YrFY15NzP/5FGQNTDHXBcKE5iffOf4yl8jxmV3N7xPVa1r8HfW1Mg4ODHUqpl9FotEYI2ert" "7T3lOA4mJiZ2V96+R95N9DXPPp35/Y2A6vrjJti/1vgqBgYGLlUqlYuUUhBC7j5O/jyi/BPN" "ZV0auAlxpPsHvlnA1tbJjV0AAAAASUVORK5CYII=") index.append('cog_go') catalog['cog_go'] = cog_go #---------------------------------------------------------------------- coins = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnNJ" "REFUOI2NkM9vFWUUhp/5ZqZzL/YXbakgalIoiUJqJDEhGJeycOPSP4GlO2PiritX/gNdsjIN" "CWFpGhLjwrpQFGsqpkqJCOXC7b23987MnZnvO+e41l4S3vVznrzviZiQ8W+vr0aN+1bhNKqx" "itVm7Lqg6698cHB70s1/Ut59c+QPbpiVO2b5ttnRlvnODRt+d+bP/7PJRIPqdDL/HlRPIPTB" "93HZDCp2/qUEKqD1P0R+AFYh432oHRLsGDtRYGLI8Cd85xu0ztHyiHTxChqOsy9ooLjsLOns" "21j9FE1PoKZI0OMC+2F1torrXTU9jRKraG0SEUa/E3o7WJUj5Yj2uXcmTyhd9UW6/NnZ1qsf" "g1UgReaLvyj/WKe99D7Wekqc9cEC4idMMLXPk+WPIAxBhiA5SXsZXxwSu11sPEKKEWm0jPgJ" "EyQAWmAhB2vQ+jk0Y0JQpuZWsdYzJOsRT88jk56oQZFiDxncRZsOVj8inj2HNEbdu4+VBVHT" "x4rHnFpwDG4tWghWi9iuBVtPxBtRukjcXsGlJ7F0EbM+wRvZyQtoq0PTfU776k1cMg1UmB9m" "1dG9y907X37lJCiRc4RyjzD8lTD8hWT6EqExfNGlOXyGNILLlsD3YfyYqDqgNX+Bxtt5Fzyb" "4+7PpDMXSWYuki5coTx8QJwtICdeo/XWh2h2hvLR15hVGIEQBoz2N2kq3UyC1+26d+8Td+oS" "cRrjxzl5b49i0L1TfH9rXoOtTU3RWZr58Q3IcYkRiifknb/xDdvRw825Fd/E11XsmgbWJLBj" "qlvi2Xj306N9gIcbcyu1cF2DXgshWhOvO2LRlm/cxr9yPYpgZzeXlAAAAABJRU5ErkJggg==") index.append('coins') catalog['coins'] = coins #---------------------------------------------------------------------- coins_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqNJ" "REFUOI2Nj81vVGUUh5/71ZmhM60WMqXQGAolKTVAFxgMMfGTRDddudIVLtipC6Mm7ogsQBP/" "gC5ZuGClCxdYDQSikhir0FLByofaQDvtzHTunXtn7rzve45r6Jj4Wz/nyXk8+qyzND7p9fwr" "ArsRCcRprsqyb+XM4AuPvu5389iyhWcS8+iCarao2v5JtTWvZv2CxlfH/nySDfsaRMrhU8eg" "+xBsE0wTv1BBnB74XwJxIPkqntkC7eI69yH3cVa3sX0F6hQX/4JZv4TkbSRrEe08jtjt7H98" "IPiFvURDh9B8DYl2ICo4K9sFen1yqBvky6KyGyEQJ7k6D5v8jm0sot02Lkso7T/SPyHzu59E" "1Q/3FkdnQbvg0oJJ75LdOUNp1wm0uEZQaIJanOmToKIfh9U3wMbgYnBtwlIVk9YJ/GW0k+DS" "hMir4kyfBGcBSVHbBu0h+Qb0OlgrDAxPosUartDgSr3M5a1XOP2F0ThtJc12/bNL5xfPhmIF" "l67gthaQ3jqa/0MwtB/XU/LGbTRL+W59kKXBkJdefJnxkYNcvvVV5frStU/f/mj0mO+M4kU7" "CUoThINThOUZUIc1SuHpgwyMjPHNWoWZqaM433F07CTOMzx/+AR/Zf6s76zg+T42W8HGN7Hx" "b4TlZ7E9xaSb9Oo1akmDyCsze+hdAD54dY4D1SMYxfOt4WJn81eiyjRhZZpo5DhZ/R5BYQS3" "Yw/FqddIkg1uPfyRc/OnADj37Snu1m7ie7jg/TdL48HA0Ot+sYwXepheg2TjD+LVle/jv283" "N+8s7OpCutCsF/aN7mMzW6WV1vjhxjX2ZOlV78HF4QnTC06L05NiOewsiyoy7wxzM++17gM8" "mBue+PzewJc30vA5IwSRh5sump/fGTZv/Qulunaad46ZygAAAABJRU5ErkJggg==") index.append('coins_add') catalog['coins_add'] = coins_add #---------------------------------------------------------------------- coins_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApxJ" "REFUOI2Nj81vVGUUh5/71XunLVOhTWlpUaaWRCUaFiQmhIUxIUEWrAgJGwIbFy4gMTEmboCN" "8S9wwcJElmyIJi6kaoguYKGFUKhAoRBobDudznQ+7p25933fc1wS7Zj4Wz/nyXk8+qx7f3rW" "K/ybAhOIBOI0V2XRt3J56Mjqd/1u/rFs/vW2Wb2qmi2odm6pNufUrF/V1q+TT/7Nhn0NIsPh" "a4eg9xfYBpgGfrwDcfrm/xKIA8lX8MwWaA/XfQa5j7O6je0rUKe41h+Y9R+RvINkTaLR9xG7" "nf2PDwQ/niIqv43ma0g0iKjgrGwX6O3Zci/IF0VlAiEQJ7k6D9v+E1tfQHsdXNamNPNe/4TM" "730RjX82lew+AdoDl8YmfUr26DKlscNoskYQN0AtzvRJUNHPw/GPwLbAtcB1CEvjmHSTwF9E" "u21c2ibyxnGmT4KzgKSo7YAWSL4BRRdrhYGRWTSp4uI6G/e2WPnFMvdhKOLriqJfH/tJvgrF" "Ci5dwm3NI8U6mr8kKM/gCiWvP0SzlNrdJml9ikNnLhJXDnjdezf2Pvht7svb00szvjOKF40S" "lCqEQ28RDh8EdVijxDv3M7Brkpe/V5n94BTJ05t4355mcPk6lTdGvXTTng2dFTzfx2RLaG8V" "LdaJp45ji+uYtIZrVLENIZmowPFPX7VfmkRTotAarnVrd04lO95Bop2g+8g2lwniXbjBPSS7" "DxCMPCa7+wND339C3l0jA9qtAEm8bnDhZGk6GCgf85NhvNDDFHXaG49prSz93HrxsFF7ND8W" "hYNp9Uk19iMfE6Q0N5XltYCo7N3wnl8bqZgi+FicHhXLu86yoCJzznDl4PnmM4DnV0Yqtful" "b7aWa4fJGNCEIhrzbyX7S+f+BtFqdkj3XdhMAAAAAElFTkSuQmCC") index.append('coins_delete') catalog['coins_delete'] = coins_delete #---------------------------------------------------------------------- color_swatch = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAH5J" "REFUOI1jZGRiZqAEMFGkm4GBgQXG+Jub8R/GZp48g/HfigI4nyliAuP7yylwvqDuHEaquYBi" "AxgpDUR4GJx/uR7uR0PxQEb/U1lw/kazaYzx617A+QuDJIZlGIRXrIX7cWVHMOONmbfgfI10" "NcZ/pesQ6aI7aDiFwcB7AQDLxiQ7BvBImgAAAABJRU5ErkJggg==") index.append('color_swatch') catalog['color_swatch'] = color_swatch #---------------------------------------------------------------------- color_wheel = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwpJ" "REFUOI1Vk0toXGUAhb//3v/+87pzZzKZZJJJ0poKTduQOOBzEVoFG9SKbXZCcK0LV+4qFhFc" "uBFERHci6EZdFCmYhdZiEWlBWg0VsTbvadJJJnPndWfuPP57XbRieuCDszjn7I7goELMzLK5" "cCSMLk4a8enDhpnPCXTO7G3ljM6NyUTvy6NjnR8OVsR/JrI8d0QExQ+fjOTPnUoVmE0eIq8c" "UoYg2q9i+RtY7e96llv7XG213k6/QOX/gb9efyQZ3L14xj5WeG5ohmRM47NCGo9RYBybHMcR" "XoNu8TJybWlJ/d5cFOdxJbfeVVGj/dFLiZnC6dwUf6ibRHGZJEYUhzgBMdrI/jVEM4aIzBOa" "4Yvt7qUL0HlLkhh+uWAkzj6bneam2sIhzyCD2AQ4xHAIsPEQzQjslTDrK+jESXT5yhvuQucr" "GVETi4+pLDKWwaRLhoAsPdL0SCBJAZFOA1wD3A5s3MXMH8Uano9Vrn3zqlRWfnYsPsItBHHG" "iAEOIVk0A4AdaqiVodyGexW4p2DvNqaZp1+2npAYh0bTVorNQGADJiEKgS0gBVied79cisKO" "gqIJXRfyY/T2xIRkP6IDpQja0AsfALRDaIXgdJIYtQFo1O/TrkHg0/MV/X5ay/62LFZleCLe" "FHgtqAMVDWYHlAE2Jk5tEKoeeE3wmzAqae2W6PXTa7K9o66vh+GJuYzgyiooDaEPWoMdhTQQ" "b8SRuwOw34BaneDpYWrX/0b3k1clK+EX3/7ZfW32pJSpumR3E7o+WBZUFDghJFuCTD0Nbh1m" "pnBXi7i/bpcDkl8bXFBXvdv+Z9//5HEspckasL8O1SJUNsHdgP1t8EtROD5CPRZh6+cizW70" "/ae4vCoBaOh3frzkjff/6Sw8/3iKwukI9VUIy9AzIBgHP69prLXZXFqneqP+cRr16UNnYqhk" "UymdTwjx5itzjjP9aJKJtMVAoJGlJsGdCuFvezsqqH4wz/IngveChwceyGJ5Nkf13BD9ZwYF" "h4dCrUfRd0YIf5kifvEsp9YO5v8FbSlEs7CsPfcAAAAASUVORK5CYII=") index.append('color_wheel') catalog['color_wheel'] = color_wheel #---------------------------------------------------------------------- comment = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYRJ" "REFUOI3VkTFIW1EUhr/zXoi2pA42FYoUpBUHh6JLN4cOUsVJMLzQ0bFbxwoiLnmTk1OhzmIV" "QajmSQQREalLHRShRi2C1EFSwRQT8+49DpI0YtRupd90ued+/zncA/8aKR8SY0GjW9RxRAaA" "6G2CqmYs8m56qCd7reD5wdzUyncthUbv4svXA0366d3EyOcoQAQgMbIcEy32DXS1claAYqgY" "BWvBKBgLxioC9L1qYX3nuHX/WDqAjQgAD8LG+KN61xGhUFKsVokK1iqhvQoEaHgYRdEnlQmq" "KYu2qvOfKW7+yVXAeSR3YgvGqroRBy5CMKoVqRwgKAD5Qgmx5AAcgOnR13kV5mdWs8Rj0PJY" "eBF3aGtyiNUJxsDTBuFls8v8xg92j35lw7qzzdprRDwEF6C78xmDb9oBOM0XmV3bI/PtcMuo" "9N9YYy2SqSD7M/dbJ4Jt9fz0uZdKD98rVWQ/GPu4sKVeKp1P+ovvb3sntS7f+pnnlnBJIDX5" "offTX3f9P7kEidbZD7dlIP4AAAAASUVORK5CYII=") index.append('comment') catalog['comment'] = comment #---------------------------------------------------------------------- comments = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAi9J" "REFUOI2tks1LVGEYxX/vnbmT1oyJ+bEKKj9qkYvwY9OqhYFSS9H6A4qCaNkIkW1qIOgfEMVw" "IzitInI0zIUStsiQUjFNSVESnEpKZ+7ce5+nxcxEyUyrzuZdvOc8H+c85sqDxBkxeg1jaikE" "JY3KuATsl/Fo2/rB76BY3Lje0Xi2qa6qgBYc1wtPvd+6Gp9eOQ7cP8ixUD3ZVFeFD3gKng+O" "D44HjqfYdpDWhhoM5lShAYO/u+XEoKiCL4Jqtse/EDQGgwHNiX2FjxvJsmcza7U7u/sRk1sF" "kK7Y6GUAg9lTGLKEoaAqjuvq4UipTXLfRUV4/mat/lLriaPN9dV5cb5KKOdL+fSHrZ741Mpp" "yzIknowvMP95h2Nhm8qyQ2x/2zvSXF+Nr+BLdrWMKBlfcTwhZAdpaahBVRut4Z72/refvvQ+" "evou+f1nmsm5TVxP0Lwvongi+L7i+oLrKxlP/kgBGI52TKOamltNMji24AJpY0AUVBVRkPwr" "iogSsAwGY1sAnY9HSjFUDIzNZ6yAdUthL5MRwiWBv4oELUOJbVERDuH6AuBkM0qHwyiz4lk3" "h+9cXDbK4NDEIksbX7O+REJURkK4rsePfYeRqWWiA69TivaZYvl2xUY7wfT33b5QNrO4zeDY" "vIJZxWhKMa/EBO7Fo227/zyS7lhiaXx2XbsfJtLdsRfnCnGKTtDZOxm2SpxN0JD6nB+52z5b" "iFf0TkOlqXKUCRWrpZj4v+AXd34hIsodX9cAAAAASUVORK5CYII=") index.append('comments') catalog['comments'] = comments #---------------------------------------------------------------------- comments_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAopJ" "REFUOI19kk1sTHEUxX//N+8NrWnVR6sbgpoi1AIzC5GINFJtEBaNEJtuKiRY2LQ2tWk0xEp0" "IYTYNJQIFe20EZGOppWIMh1fUQ2ipjKTVhmdmffe/1roiDQdZ3MX9557zz33qgPNXWu0knqU" "KmM2CClEd2uP1dPesOPTzLSpDY4crqlYv2lV8SxcSNuOrzcyerA9/H4pcHpmjYHIik2rinEB" "R8BxIe1C2oG0I1iWSbB8CQq1cjaB5t9p02QQRMDVGpE/M/4HUykUCmSa7Aq8+5wovNc/Uhb/" "/qtATa8C6P1nOncDKFRS4LqhuW6KkLZtyS/Is0j8shGtuT8w4t8VXD5/s78kS8528U77UhQe" "Gm1s732/2jAUXde6XxH9GGeRz2Jx4RzGxpPzNvtLcAVc/We1jBYyrpB2NF7LJFC+BBGpMNoa" "qy8/G441nb31PDHxM8WjF1+wHY1kfdGCozWuK9iuxnaFjKP/uQLQ1lATRmTqxYcEV0OvbCCl" "FGgBEUEL6GzUgtaCx1AolGUC1J6/mUeGhVdC0Yzh8RzX2u3NZLTPl28xntSICE8iHQy8fsBk" "chzbsQmuqQb8aQ/Aum11CwzUUu0azTdOVQ1XVB5aFP+R2lqYb7Gs2MfjwdtEYiG2bAxQGdjJ" "lCdG+O0dxr4ODqlc991/prMW1OVLJ7YXnriwl301VeAx2LP2GOcf1uPBoO3O3VTOL7nRWN2u" "IDbwZoz4ZAxL+diz9hgAJysvUVayAYWam7NBbdMjn0DplVA0lZj4lomO9tHSUwdAS3cdw99e" "IkhuBd68qSKEh6KNgCv6XP/LPryYdERa8SqT8OBjQF3M6cFMBI+WtqDUUQUFAj8QaX3aGmv4" "DQwRPvavUuXtAAAAAElFTkSuQmCC") index.append('comments_add') catalog['comments_add'] = comments_add #---------------------------------------------------------------------- comments_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoZJ" "REFUOI19kk1IVGEUhp/vzr3K2DhZpkZgv2pCuspcFZERkdRSLAkqgqKI2lob25QQtO0/ijZR" "RosocqywGAkl7IcyqDTJ0gqcJjVn5s7ce04LNULUd/Mtzvecn/ccs+tUa7kYPYAxq5hJSgqV" "Ngk4j1oatwxMD9ticehgbWXF2pKCGVhwM14o+naooaWjtxg4Of2PheqKtSUF+ICn4Png+uB6" "4HqK49hUlxVhMCtnatD+V20SBkUVfBFUJ2rMJdsYDAZ0EvYVPn6Nhe919q8aHknkmslRAKlv" "frgDwGDGFW5Ywg1bFTeT0ZzcoEMskUFFuN/VX7q9evn8qtLCKXgqS9akL3kd74aOt0R7V1uW" "ofV623t6vgyTH3JYFM7mZ3x8XlVpIb6CLxOjpUVJ+4rrCVmOzbqyIlS10rp5fNuV7r4fTWfu" "vIr9/pOi/c0gGU/QKV9E8UTwfSXjCxlfSXvy3xaAm421Hagm33yOcS3yPgOkjAFRUFVEQaZe" "UUSUgGUwGMcGqDt7O0iahVcjPWkrEDgq4kfTaQmFchzi44KqEm+9xO/IRZJfP2EXLSFcsx+o" "dgMAazbuW2BhisW3Tt06sbWvcvPu/OGx1PpwjsPSghAjbZdJvrhNRW0DpQ3HKMzL5mfXA+xv" "b6Nmtv3WNz+sA3Pl0rFN4c695WzYc4Rg31MY7ID5eQzby+iORPvnPJKdza0f2l4O6OMaR6X7" "rv6veNNifVRjiz0bXNfUHlLcxVcjPak9thlJvH5QNO/eYdzkDxLA2GgAP8DQrHeaFUzmoTxR" "sdblLsi/0PP8mfc9FWQ04BD/Zej9ZnxVPTerB9MVrS9uTMSGDlpilomlg4Ke3/ZYTv8FQ+hU" "kT8ZXDEAAAAASUVORK5CYII=") index.append('comments_delete') catalog['comments_delete'] = comments_delete #---------------------------------------------------------------------- comment_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiBJ" "REFUOI3FkVFIU1Ech79z75ozppCZZSkMZ5FBaiQSgYHEqBCCQFF6MwjCCAJfzBcJovkiEYJE" "Qb0FpmBl0sgHK9PKh2iQBDk1yMRyqXNqd+7e++9BZhNzr31P53D4fud/fgf+NyqxqGkLZOkx" "aUepasC5lSAi/Taqoav5dGjDQa0/8KTz1ReJm5ak4tn7SanzPx+raXnkBHAA1LQMuJXEqqor" "CokaEDMFS8C2wRKwbLBsQQFV5R7efp4pnJhRpcCIA4B0Mys7w6VrSmHEBVuSRAHbFkx7LRAg" "c7sTQXatT5BMQrSTbv47xeZO1gJ+O+bCtmHZIrpDg1UTLJF1KRGgEACWjDjKZg5AA+i6Xrkk" "ir7uwRDZbvDsVHizNQ7kaLjTFJYFuZmK4n06fSNfGfs+HzLToh83PMF2Ut8zNN7eMzRRi0IH" "8B3J58KpQ+TvUDwd7mYg2MuKEQEzkru48KsRuKFIQd3NQOjWpQrvvb77iOsDR4vKyMvaz8Do" "Y959GmQyFG7TtpT9gbbK0jzv1Tuvl8emes3SgyVYmkVJrg9LxTl2+Dggl/8ZcN7fXwBy7mXw" "28XO5jPu+aVZxzbl5mzRFQAaT97Fm1OMQrk2fSPAw2u+CaAgsQ9Hfhij08Ou4PQbmnwPaH1R" "j0tPQxBDT9VBgr1l7vTo6uwJz24P4ZUpIss/GQoOsrgQu52yxGTKG/a0olSDggyBKCIdIx0z" "TX8A+HETi/lME5gAAAAASUVORK5CYII=") index.append('comment_add') catalog['comment_add'] = comment_add #---------------------------------------------------------------------- comment_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhBJ" "REFUOI3FkUtIlFEYhp/z/3NrnKTUrhY6KRYFYpsWgcUQXcxVMKIFEQRRCFHLciNtmjYi5KZt" "S8fuJA1OlDVFJAQVSJHjaDeaQGcwnZsz//layJiRirve1QeH5znvOR/876ji0NIVKjNz0oNS" "fsCxFCAiYY1q7+s4Ev3roDUQut/77JPkC5Ysl4evx6Qt8GikpTPoALABtHQ+9SjJNfsba5nO" "Qq4gWAJagyVgabC0oIDmPdW8+hCvjcVVAzBkA2BVoaxitcs0lCKbF7QsAAW0Fgp6TghQ6nYg" "yLr5BgtTBPWCm/+0+PdP5gQZW2JCZy0tYtoMmC2AJTIPFQUKAWAmm0dpEgAGQN8V34wo+m9F" "olR4oLpcUVNhULfewONUWBZsKlXUV5r0D40z8j0ZLTin3y6+RlQrChPg4O6tnD68E4BwTzvW" "izvYJyaZcjvkm9v5+EIweUixTNquhqLd5xprBq6fpX5mlB0+P07vLjLvBxiOhAnFx58YS8KB" "UJevYUvNxRvPUyVv7sl2nx/X6CDq5nHcsbt4q8qpS+d8iwpOBMLbQI4Nvvt6prejybMmlVWu" "jV44/wCuJeByDFvqI+U5rZZ9QjHBJoc+6j+pSr70k8vESQPTv0yGPhtirkSwb++GA7b4jyrT" "bpI3U0xNCqNxg2Gn4+WKGgB0n9o8WPlzonHtrDaSTiUxtz1y6XZ6/2+atg8OVMA7VgAAAABJ" "RU5ErkJggg==") index.append('comment_delete') catalog['comment_delete'] = comment_delete #---------------------------------------------------------------------- comment_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm1J" "REFUOI2Vk09Ik3EYxz+/d+90utm00lLxz5xQGBUWEmnejJJUsjTFDkGHbh7qEgVdt0OEhw5R" "GXWqJLEE1yZaJCWBJA3LMp1Siq5/Ts1N371u+3UIRSHSnvPzeb7P832eR/AfMfq48OTSwo5W" "g2U3oZ89oE2eMWwUHvfkNZjMVS0ptkoy9pVjStyGf2i0WN0I/KXDVmvOOn3XsqmIwOhH4oRO" "0qbtWLZkW8X6yvaj5sx6V7K9XAn7H7I4Lfj+aQF9MTythYPFyr9gX1tOuSXzlDs5v0LRpm4j" "jDMYLUmYQr5vsdC3sgONT4bV2muezYawvI4QNUDcMpwr+zBnhbDmV6FN3kAxRtB/2fjx4vX8" "kr5QUXihxwugKjp3q0vsVSdK7KiGPw19HXIxOxEkbVcF+tdmDHESbS6HqZ43ci6UsP/gxecj" "y0KqkByrKc1nXoNwRPK5rwWL/o6IyMD/7jopaXFogSxm+4doT2gUA0E1BVwrYypbrSaDIgTa" "EkRj8KW/mYJD54ifeMVwey/ezgAfur1kVF5FSUpHIlNX+7RiYlRCJAbDYz/QBzuw7S3FbN6B" "f2CMxLImTKn2vxqt/pzTojEpDaoCegQGR77TdOsGRTttGLP3kHv8Hqo1E4CgtoSIEVhTQApc" "rS99VTWl+ShCcP+ZH4CJGUkgJEm3CtKSBK6+z4xMzvii8fPe1QXEyhoRdQgMAIcLszh7pACA" "2WCYtt5Rut6Ov49KUf3o8lHfv24HgHqHx+cPhOQdz6Csc7oX6xzuK+tCK7DTc+3m0/eyzuEO" "1js7z6+Xv+YXGpxdeTEi3QIcDy6VN29E8DcpmPqTFKKsowAAAABJRU5ErkJggg==") index.append('comment_edit') catalog['comment_edit'] = comment_edit #---------------------------------------------------------------------- compress = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAplJ" "REFUOI1lkk1olFcUhp9775dvdH5MJpjWiNEW1ERRERf2J9DuunQjKaIW6kqCC+OikNaFZOFC" "XBg3iiAiWlpIl1101+qui9JW1PhT0DhpWlAjTWYyM998557bxfyY0QOHAwfue57znmtoxczM" "jFta+mc9mE3ZbP4H7/37IQS894CiqqRpmjrXc3VhYXFyampqGSACuHV9+IBWzk3Y/BejjVCI" "c7k869b1EkJAVTtV1fc8enR/PIrkPNAUuHVt+LAJ3CyO9Nn//jXIivDq1SKLiy9RFVQD1loK" "hQKFQh+iBhHv2uSRhePv7h2ycW/M1vy3iASCKi7KovWYF/cqD+erO86VlndeHtleWBMUIKEj" "gOGToe37UH3GwEAW8K0UrN1E5cHtkZfVDT/bXMZ78WANq8M2i+fvhSdgDoIZA/M5pdJjCAJA" "rQZJbQUNSpo0SJLVBAAomdgxXzoLQQikZDIRIK8nuR6CKtqe2S3gGRhYD/Q18UPaetwWqJFU" "V/CqiNS7CDorzJf+AnMEzFGwX/J07n5HQESMcz2mSdDtQYtAiDOOubmvQVMCDdasWiFJXJTJ" "lLPGAOkKqwCaAkm5wuCG/R3321kv1xB1hCD9xhhUFe9D9xkD4dTdn3670G4EDKmPEbWIWu4s" "7PnVOXOjWOxv/8buFT499ngamG43JifHi4ODW25Xq5XdqkrDJh+m6ZI651oE2mVityPA2NiY" "y46e+UZt7rhrPP+u8OzK9yJ+YxxHP6ZpgjGW8nvj51m78RAw7d4UmJ2dDcUPvrrx8XB+6M+S" "7Oqv/FI1Jow0Go3NIlIXSZfnM5+N7t9WfOf3p/UdbxEAbD3xcMIYJiKSSx9VL16OorIFydbr" "kfVe9I/e04dTmzsZCBf+ByZ5VTV+OVeDAAAAAElFTkSuQmCC") index.append('compress') catalog['compress'] = compress #---------------------------------------------------------------------- computer = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkdJ" "REFUOI2FkztolEEUhb+Zf5NAko2bmKjxibVRFJ/YSBRFEbSxtBNsxcrWUizCbm3QzgfRQi0k" "jaS0SGK3uIJoowGFZLOLa/6ZO3Mt5t8FxeDAnRkY5pxz7z3X8J+1tLT0SESue+9LIoL3Hu89" "zjm890/NZh8XFxe3ALOVSuXawMAgufcQIwqgyuhohfn5N5Q2Yb0YY5wdHx/fNTQ0xOcvXxER" "YlSiRohKiJE8zynV6/U8hNAfQkBEEBE6nQ4iwtra2t+SWV1dI8bI+QuXcM5RCiH07969l2Zz" "HQBFUQVVRdOFCIyNbuH1q5ccmDpCiBFVTQq89zSb69yZXQYMxoBJG6aIdqvF/ZvHcc7xfvkd" "IQQmL19NCkQERTHGMDq2FWstxlpsEcZa2q0WGhPj1KFjaFS0qIH13hMVjLFkWfZH2OIEiBpx" "zvGj/JmHzSoRkgJftMdYQ1Yq9diNtVhjMNam2mhifNh4wM+2oFETgHMO1ZSCzTL2bxsE07WH" "4du6FAoS4+2td4ljCdB7nwBskWe71eLTx38bK7MZzrnCC6lTPQV9fSXu3ThMiBHvhU4nRzXS" "39+HNYoC1qS3oJocqZoUbGxszCwsvD3TNUqe52MjIyP7RYSVlZU8y7IBm2WowtTBQ+zbsxOA" "HdsnEBH+mIVqtXrLOXfl5KnTZ8vlCi+eP/klIo+ttSe89we7w9R1bAjhQw+gVqtNGGO+T0+f" "Y7hcRiRQyizV6szPWq02vNnQ9YZpcnJytdFoLM3NPTva9X/BVN/sM8BvM0uOIHds4G0AAAAA" "SUVORK5CYII=") index.append('computer') catalog['computer'] = computer #---------------------------------------------------------------------- computer_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsBJ" "REFUOI2Fk81rlFcUxn/3vu8kxTTJZBpTpaEYqv2gtrU0ldKCRWT8oNBuugpurODCTRcu6p8Q" "WpBkkSzaVOmqZVqhVaEofkHSojWJiGYgUjGCJq1R54tM5r1fp4t3RmhFeuG5527OeZ5z7nMU" "/3NmZmaOOef2Wmtj5xzWWqy1GGOw1v6gnpY4PT3dDUxks9lP29vXkFgLISAAIvT0ZDl9+lfi" "p7DuDiFM9Pb2vtDR0cHthXs45whBCBIgCD4EkiQhLhaLife+zXuPcw7nHPV6HeccpVLpv5J5" "9KhECIH8zj0YY4i99239/S9SLlcAEAQREBEkfRCAXE83J0/8wuub38aHgIikCqy1lMsVvpiY" "BRRKgUovVBO1apUvD7yLMYars5fw3rP+o09SBc45BEEpRU/uObTWKK3RTSitqVWrSEgZN785" "iARBmjPQ1lqCgFKaKIr+Bd2MAEECxhiWO29ztDxCgFSBbX6P0ooojh+zK63RSqG0TmcjKePR" "+W9YqTkkSFrAGINI2oKOIgb61oBq2UOxWHEAzC5MstxdZOPDXlYbq5y/cRxrbVpAN/usVavc" "uvmkL7q651hYvUd++wf05zZxYe5nLt0o0EhyaYFMJmZ4/xZ8CFjrqNcTRAJtbRm0EsYvfMeW" "V3fjteet9XnOFn/kvTfep/DnKeJGo3Hk4sXzH7aMkiRJrqura8A5x9LSUhJFUfuD1b/JqGfZ" "89p+AA7t+JqT18cJnCAeGho61JI6MjLyuTHm45c2vjzQ2Znl+E/fB+fct6WVh5/NLf6uri1O" "cTh/jOEz+3gmakehJWolj46OrtVan8vndw2s7esjk4kZHBzMTE1NvnLHX/+qZpa3bXh+Aw/q" "d6ms3Oe3a5NUyo0jj7exUChE8/Pzl62177T831zfK2NjY1u3Hlw3jFIHFXQK1BAZ/2P8r8P/" "AHwmniS499yQAAAAAElFTkSuQmCC") index.append('computer_add') catalog['computer_add'] = computer_add #---------------------------------------------------------------------- computer_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArpJ" "REFUOI2Fk09oXFUUxn/3vjeTkJBkJk2DQ2vrLKSLFlE6YqhKoRC1CiqouJEuKthloZsu7UJE" "RSRZddHQ7tRQXaiIVGwJNoKLpBGLA1FjVNqMf2rmn5nMu/e+c1y8SaBK8cJ3z92c833n3O8Y" "/ucsLi5eCCG85L2PQwh47/He45zDe/++uVPiwsLCCDBTKBSe7+sbIPEeRFAAVYrFApcufUZ8" "B9YnRGRmbGxs1+DgIKs/3ySEgIgiKiBKKkKSJMTVajVJ0zSfpikhBEIIdDodQgjU6/V/S2Z9" "vY6IMPnYUZxzxGma5nfv3kOj0QRAUVRBVdHsgQCjxRE++fgj9h94gFQEVc0UeO9pNJqcnrkG" "GIwBk12YHtqtFm+98iDOOZaufU2appSeeiZTEEJAUYwxFEd3YK3FWIvtwVhLu9VCJWM8cF8F" "FUV7M7Dee0TBGEsURbfB9iKAqOCc48+hVc43phDIFPje9xhriOJ4m91YizUGY202G80Yzy+f" "Y6MdUNGsgHMO1awFG0WUxwfAbNnDsNYMAHS/mqWydI6JK38QCjvY8DN4b7ICttdnu9Vi5fv/" "+mKiPUf+x+84fPwUfeX9bH77OdX5y+yqF7MCuVzMGy/fTyqC94FOJ0FVyOdzWKM03z7Nvc+e" "pH9lDr58jYGRAvfs2cuNlW+Iu93uO3NzVw5vGSVJktHh4eFyCIFarZZEUdQ3catG/11lePLU" "tqr4TImh5G9u24WpqamTzrmnH5o4dGRoqMCHH7y3GUJ49+HrZ48dee6F3OCvn5Js/kYHaLci" "llb7Q7SVPD09vdNae3ly8vHyzvFxcrmYSqWSm5+/uu+g/+HN9d/XHrH5yPpog+Zfyk9rNjXe" "v7q9TKVSaX15eXnx4sXZg1v+7+1G9dHZ2pmrL97dvf7L2gkrZq9Ye1OQs0e/kNf/AZXnl40I" "lh8oAAAAAElFTkSuQmCC") index.append('computer_delete') catalog['computer_delete'] = computer_delete #---------------------------------------------------------------------- computer_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAr1J" "REFUOI2Fk8trVEkYxX917+1u0umxH+l0Xk5iS1DxQYygCDKMAzNDXIwKPkBwNyK40Y3gxj9A" "XUgHEV1ExF22PkAi+IaZQdISNSZRzGuRh+h09+1g5vatulUubiJElCn4qr7NOd/5qHME/3OK" "xeJ1pdRRKaWjlEJKiZQS3/eRUvaL7wEHBweTQF8qlToYi8WpSQlaYwCMIZ1OMTBwF+c7U3u0" "1n3ZbLatvr6eyakZlFJobdBGgzYEWlOr1XBGRkZqQRBEgyBAKYVSisXFRZRSlMvlryVTKpXR" "WvPb73vwfR8nCILo6tXtVCouAAaDMWCMwYQNGsikk9y+dZNNm7sJtMYYEyqQUlKpuJzpew4I" "hAARXoilWqhWuXB8O2nrDa2z97ATW/j092Oyei2OUgqDQQhBOtOAZVkIy8JaKmFZLFSrOAv3" "2dkOddmjJPPdVCbX4w7cCBVoA0JY2La9gmD53ZYbJhOPkGjeRWl8lKjw+WFVM8mG1pAArRGW" "wHaclWAhWFM3xJGdglT+V2pz/UTjgumhMaSyuTORwPF9H2PCFSzbJp+Lgwjt0cggPZ2jJDv3" "4s1cxYoqIokOHG8Cb8NJysP3QgJrac+FapXxt6EXOqNDHD4Ayc79eDNXsCIKv5rn/ZMiEw2H" "ySXawm/0fZ9IxOHcn1sJtEZKRXX6IU11mtymP/Dn+7CjBs/tYO7xM941H0PaqzDGIKXE8Tzv" "4qNHD35eNop+/0/H7h1tWWnamHt1iXQuilf6kdmnzxmO72Pd2o0ANDc1opRiRRYKhcKp1trt" "wqET13jTf5rZqb+ItXfxad6Vz/7rinysxZBSfnFsEARjX7LQ29vbKIQovJ34gP/6Dvmun3A/" "/Mt4cdRkMvXbz56/8uJbubGWm5aWlpLrusWXY7NcvHqZpw8HmBYJXsR+edVz/vU3wQCfAdr9" "cQFCw/cnAAAAAElFTkSuQmCC") index.append('computer_edit') catalog['computer_edit'] = computer_edit #---------------------------------------------------------------------- computer_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArlJ" "REFUOI2Fk01onFUUhp97v0nidPIzE9PSkMESSQ2hpRjSgkKpTVu1IlQwoiBuRBR3LkTEZXfi" "oiS4qRh0JdhQF02hbbqQgqW1NRN1YWpSJFWw0BY7k0mYznd/znHxTSMVSg+8l7u573nuve8x" "PKIqlcrXIYS3vPe5EALee7z3OOfw3n9rHnZwfn6+B5guFouvdXRsIvUeRFAAVUqlInNzZ8k9" "pOthEZnu6+sbKBQKrNz4mxACIoqogChRhDRNyS0uLqYxxvYYIyEEQgg0Gg1CCFSr1f8jc/du" "FRHh+RdewjlHLsbYXi4/Qa22CoCiqIKqotkGAXpLPZyePcWOnaNEEVQ1I/DeU6ut8vH0AmAw" "Bky2YFpaq9f57L09OOf4eeFHYoz0v/xKRhBCQFGMMZR6H8dai7EW25KxlqHOZdpufwlxMzt3" "7UFF0dYbWO89omCMJUmSB2SThHxb5PCT1yj172Zb91/c6Vrhq9okAhmBb32PsYYkl9vobqzF" "GsOurstsH9lHd/8oA/kTzFz/lT9Xm6hoZuCcQzW7gk0SBrdsApPFo5M7jOhFuvreJNZnKY++" "zfuVM9zadgRVwXufGVhrWavXWavX+WM5y4JBeX3oMuWDr0JzgavfnOKZdz+hff13OhhGdeA/" "gra2HJ++8zRRBO8DjUZK7t4yW203XaUGsb4CKsT1nxjc/yGN88fR8GxG0Gw2j1248P1z94OS" "pmlvT3fn4HY9R3HfG0jjCir3GJsYRtxNHissUx45xPo/PxBC4IFZmJyc/MA5d2TvsD0wULJs" "fSpPXL+KqqPy3TXGJkYwSQ/kX+TiF0c5e3NoZcNgampqszHm9vj4QZqXPmLHxOck9gYaqpCN" "UKssSX6YW7/9wtLs0ZMbBjMzM8nS0tIV7/3YeGEOG/39wIgRn6rqRoBUFERAtPIviQCWs4SM" "WiUAAAAASUVORK5CYII=") index.append('computer_error') catalog['computer_error'] = computer_error #---------------------------------------------------------------------- computer_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArJJ" "REFUOI2Fk89r3FUUxT/vzbTF/JgmcaoNxkAVFzVVEmppUaq0pcUiqAuX0oKKS136B7SLIqXM" "LJWgXSpdqYgUqWZRRSFJQWxsErSa2kjEZiYzzeT7ffe++1x8Jy0Vig/Oe29zzzn3vXsc/7Nm" "ZmY+VtXXRaSsqogIIkIIARH5xN2vcHp6ejswOTAw8Nq2bT3kImBGAkiJwcEBLl78ivJ9VF80" "s8lqtfpIb28v13+/iapilrBkYIloRp7nlOfm5vIY49YYI6qKqtLpdFBVGo3Gfy2zutrAzDh6" "7DghBMoxxq0jI6M0m2sAJBIpQUqJVFwwYGhwO198/hljeyaIZqSUCgciQrO5xnuTs4DDOXDF" "huui3Wrx/tv7CCFwZfYHYowMv/RK4UBVSSSccwwOPYj3Huc9vgvnPe1Wi2SF4p6nnyFZInXf" "wIsIlsA5T6lUuge+ewJ8cOUNfq6cZ6V3kY+aNQwKB9L9HucdpXL5jrrzHu8cznsAMhVGqrv5" "8qezLGmFZKkgCCGQUtGCL5XY9VAPOMdvnbcQE4Ip1TFlR+UJdu/cTztbp/Hnj2S6jogUBL7b" "Z7vV4teFYhZGJwJHx04SkxEtYiSW127w1Mhz3A4bvPP18+yVEwXBli1lzrw5TjRDROl0cs4v" "BmIy/ri1iJiiJkgUWnmb8UcPcls6XNr4kHKWZeempr55YXNQ8jwfqlQqu7KYoVF5uDKKWiQm" "46+1JYb6djJ74zuuLv/C+Mqr3JOFWq32bgjh5f0Hnj1cu3qCLOQEC2QaeLw6xoHHjjG99D2X" "r11m4p/jPJD3X7tDUK/Xdzjn/j506Ah9/f2oRsolT612br1er/c9ecqt7xs93DO1cOmmOI4s" "n2YeuBum4eHh1fn5+ZkLFz7duzn/3WzMAWzkiW8Xpsjh4Mpprm/W/QsX2Kz40E/V3AAAAABJ" "RU5ErkJggg==") index.append('computer_go') catalog['computer_go'] = computer_go #---------------------------------------------------------------------- computer_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqpJ" "REFUOI2Fk01olFcUhp97v28SkzTz50RqHMR0k0UUlEaUgghCiqnSUuhK2lXBhZtuBLddli5K" "shIhKNJNmVW1JVZBEUuhhSRaSYIRYlViKjI4kxnzOd8998fFjAH/8MJ7792cc95zzvsq3nNm" "Z2fPWWu/FpHYWouIICIYYxCRX9S7AmdmZnLAVD6f/6q7u5dUBLwnAIRAoZDn8uVLxO+oeth7" "P1Uqlbb19fXx3/1HWGvxPuCDBx9w3pOmKfHi4mLqnOtyzmGtxVpLkiRYa6nVaq9T5unTGt57" "xj4dxxhD7JzrKpe3U6+vARAIhAAhBEL7gweKhRy/XbzAyM49OO8JIbQZiAj1+hqnpuYAhVKg" "2heqg2ajwY/H92KM4ebc3zjn2HrkizYDay2BgFKKQnEzWmuU1ugOlNY0Gw2C8+xwfzE0pKm6" "YUJnBlpE8AGU0kRR9Ap05wXg4UVGR4t8NHaCD7P/4p7MtRlIZz1KK6I43qiutEYrhdKa/dlb" "lHr/Jzc8xvqDS+Syw4R7v5J/niE2xhBCuwUdRQxt6QX1Uh6K1TXLSHGV3K6juGSBTaUyLbfC" "4IERxtZutBPoTp/NRoPlu2/qYkcpi9Tuo6MqSq/Tla1CK2H9caudIJOJ+eHb3TjvEbEkSUoI" "nh5ZodCcJtPj8XYB7eug+wliuFO5x+8rZeJWq/XT9evXDr4USpqmxWw2O7RZFukJ82Hwsy9V" "MFdQrsn8dEImXSdSinjfSR4/vMorXpiYmPjOGPP5vv2fHCrXz7Jt9CCmepo4zjF/NWF6YYCa" "HsA5y3MLzrk7G16YnJwcUEpNjI8f4YP+fnTShYoeEXUPsPBH9dntuScnvj//58+vz2eDQaVS" "iZaWlv4RkY9FhOFNd9k5mPCslpjV5ZVvjp1ZrrzNeC8AHel+NUN15I4AAAAASUVORK5CYII=") index.append('computer_key') catalog['computer_key'] = computer_key #---------------------------------------------------------------------- computer_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAs9J" "REFUOI2Fk89rXFUcxT/3zss8cJCZaZJJh4xGkcaFjUSpSxEKFcWFNBUaY4VCoZtm778gLppm" "GQwVCYi4EXUh3UyaRaHqzPiDJMWg1AlNnpnBzM83zLv3vntdvCFQoXjh3Hs333PO93z5Cv7n" "VKvVz4wxV7TWnjEGrTVaa5RSaK2/FE8qrFQqWWA9l8u95/tPEWkN1uIAnCOfz3Hnzvd4T1B9" "y1q7PjExMZ3JZHj41wHGGKx1WGfBOmJriaIIb3d3N4rjOB3HMcYYjDEMBgOMMbRarf9a5vi4" "hbWWC2++jVIKL47jdKn0LO12BwCHwzlwzuGSDxY4lc/y3bff8NLZV4itxTmXONBa0253+Gi9" "BgiEAJFciBF63S6fXH8NpRQ/1+4TxzHFd95NHBhjcDiEEORPjSOlREiJHEFISa/bxdlE8ezL" "53DW4UYZSK011oEQklQq9Rjk6AWwzqKUovn0Q263b2EhcaBH4xFSkPK8E3UhJVIIhJRJNi5R" "vP37p4Q9g7MuIVBK4VzSgkyleCafonu4gx8dcLowzp/7R/hunH44YDgcciW+RqPf5NdfqkmI" "SinkqM9uu8Uf//zGhXPTXL76IWEY8sKjR7jyPX64f4+lpSV83ycIAqrVKo1GIyEYG/P4+No8" "lUqFBw9SvH7+PDdXbrG7s0OxeJq5uTmCIGBlZYUgCDhz5kUuXbpIvV7HGw6HN+/eLb+hlGJz" "c7M0OztbAMTzz81Q+elHFhcXyefz9Pt9ms0ma2trXF78AKMHZLNZHtuFhYWFrwqFwsXrN254" "X3y+Qa1WwfM8MpkMAGEYYoyhUCiwvLzMxsZGfEKwuro62W63G/V6nfn5eaZLJQRwdHTE3t4e" "vu8zMzPD1NQUxpjj/f19ubW19ffJMhWLxeNOp1PL5XKvlstlJicnSafTAK7ZbF4VQhz0er2v" "t7e3x6Io8g8PD5thGL7/L4Bnnqv7sJSzAAAAAElFTkSuQmCC") index.append('computer_link') catalog['computer_link'] = computer_link #---------------------------------------------------------------------- connect = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAohJ" "REFUOI2Vkj1PFFEUht/ZOzPOwBpB3fClNgYKCws/ChoKoiZYWJjYWJkQC0IstDKhMEZbjQkJ" "If4AYrCw0AYN2VCIBCQqUVlUCCzs7Dczs7sz9965d3Zs1LhxMXrq931ynpOj4D/n3pO1AcbE" "bC2QglJ+WflbOJmM1C/S6g5o1MNFkPACcUFBNGpqEbiQWFkvU3Wv8vR82kxVsrNS1vtFJBHW" "JVp1BXGDgAUCeZtjt+arewKKNrlhaPX+w20EPIjARATKBbK7HnQCrO/YYC4731Th8av1vhLL" "rh5tPRajPETJ9UG5gM8F9hsE6byLtfXSxOvJK6MNG0zPp03HVacY/XhRHpqNbRQH0I7jMPUY" "8jYHZQGIoiFnVSCrbAYAfgHuJCO15FgfTK3eq6knUNnMhOLIHFlYFmHC6CBxQ0Vhl0MngFfx" "EHheEQBiPwHtVaubC9EbN2PQ1DpajH5SWTklQiHGUulvYdpy0NaiwmMcvu2D11imAeBLvycI" "BCgX2C7WoOsKzHifZqBw/+y5RZIvpmBZDjZTOfhO5WtC2FaDgu/xRAyAzxT4NEDZkTjQQtDR" "flrNvc/hzNAqXk5y6bvKiwrF1U8Ld2UDwPWC4a42DT4NUKMclAkUHQFDI0A0iOVnSRlCnvyc" "vL36++FVABgZX7plarikqzHkbA+tBoFGIuzTFASBwFa6jILVNfbu+UhDGQDU64+Wbhq68qBV" "j4GyABqJsJVxUSpVQasMrEpBK+yNadPxZj+j1hh72HkwjigKsZ2vYttyYBdqE1LKmZCxIpcs" "k/Bta+6H8x8At0qRzoYgiJDZcWCX3cHFqWvJZuGmAFalnRu7bk76ggqfDr19Ojz3r2UA+A5Y" "z3SvHbteLQAAAABJRU5ErkJggg==") index.append('connect') catalog['connect'] = connect #---------------------------------------------------------------------- contrast = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiRJ" "REFUOI2lkz9rIlEUxc9EmRkcK0XBYougpFgLi0DadEvAymIkpfsVhO38BgsLgbBdmg0IjtMF" "Qdhm20hIGwmSIJtCjP8Y583EmXnvbuM8kshWufDgceH83r2H84APlvK+YVlWRgjRJKIqEe0T" "UQLAiIh6qqqe1ev15/8C2u12LZVKXR4eHhq5XA6qqgIANpsNptMpbm5u2Hq9bjQaDXtnFMuy" "jq+vr4kxRmEYkud5tFwuabFYkOM49PLyQq7r0vn5OZ2enp7Eur2tOK3r+mW5XEYikcB6vYbn" "eQjDEEEQwHVdzOdzDAYDjMdjCCF+mqaZlgDOebNSqXzSNA2MMQghwDkH51zeu90uWq0WDMNA" "JpPZF0J8ew04yefz2Gw24JwjiiIJiKIItm2j0+kgiiLc398jnU6DiE4kgIiONE2D7/tSGJ9u" "tyvFQgjc3d1B0zQQ0REAJLcAbCeRYwshYNs2LMsCEcl+fI81e1szB77vQ1XVnZfjNWIvisUi" "PM8DEQ1ee9CfTCbQdV2KLct6s0rsS6lUguM4EEL0JYAx9uP29vZvEAQYjUZy5/d+VKtVOI6D" "2Wz2qOv69zdJvLi4OF6tVn+enp6QSqUwHA7x8PCAZDKJQqGAg4MDMMawWCzged6Xq6ur3ztR" "rtVqNQC/stls2jAM6Ukcptls5hLR116vJ6O885lM08wEQdBUFKXKOf9MRL6iKI8AemEYnvX7" "/ef3mg/VP2mgoIEzH0stAAAAAElFTkSuQmCC") index.append('contrast') catalog['contrast'] = contrast #---------------------------------------------------------------------- contrast_decrease = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmZJ" "REFUOI2lk0FrE1EUhc+YMjNmBiqhjbVQsNi6aBepVIsiWOqq0JWLlK4kf8GC4KL/QBSE4q6r" "QqGTrApClxXcJJZQREhJQ2owQoy0SZNMZt6b9951kwyNRVx44cHlwPk49/Iu8J+l/Sk4jhNT" "Sq0T0QoRTRJRBECJiD7ouv5udXX1118BOzs7z6LR6Pb8/Lw1OjoKXdcBAIwx1Ot1HB4euu12" "O5VKpTJXojiOs5jNZsl1XQqCgLrdLjUaDTo/P6dWq0W+71On06HNzU1aW1tb7vuu9cy2aZrb" "s7OziEQiaLfb6Ha7CIIAnHN0Oh2cnZ0hl8uhUqlAKfU+mUzaIUBKuZ5IJCYMw4DrulBKQUoJ" "KWXYp9NpbGxswLIsxGKxSaXUy8uA5Xg8DsYYpJQQQoQAIQQymQx2d3chhECxWIRt2yCi5RBA" "RAuGYcDzvNDYf+l0OjQrpVAoFGAYBohoAQCGegD0koSxlVLIZDJwHAdEFOr9vu8Z6i0z53ne" "I13XwRgbMPdhj18nEHABzgNU/SKoQLnLO9iv1WowTTOM7TjOwCjMD7B4ewlLd57C6zIopfZD" "gOu6b/P5/HfOOUqlUjjzAMBjYILBEz5MzQS7f3Ew8BO3trYWm83mQbVaRTQaxfHxMcrlMqae" "T8CID+Hm8Bimxu+CS47TH9/w+SjnM198jPQBe3t7FcuyvjSbzRWllD4yMoLp6WnYFzdwYTWg" "GzqG7WFwwXByWsLPWr3sXRdPrhxTMpmMcc7XNU1bkVLOEJGnadqp97A1PnYrHuc8QOmkdJR/" "8/XelXv4Vz14NZedezHz6bL2G2oMrJn2uL60AAAAAElFTkSuQmCC") index.append('contrast_decrease') catalog['contrast_decrease'] = contrast_decrease #---------------------------------------------------------------------- contrast_high = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiJJ" "REFUOI2lk79rIlEQx797a/yBP4oggRQWKRUrixiw2O4IpAoc6Y8U6YX7F2wODgS5Zv0BZ2Nx" "bSBwzQmSIiCYIIGAEMmliSL+euru+t7MNbfLJWJzNzDwePD5zAzMAP8Z2tsP0zR3dV3PE9EJ" "gANm1omox8yXOzs7xfPz8+FWW6VSOW00GuLp6Ykdx2E3bNvmfr/P9XpdlEqlD9tgo9Vq8Wq1" "YiJiy7J4MpnweDzm+XzOjuPwcrnkQqHAhmEcu9w7ACiVSpFIJFLPZDLQdR3T6RRCCDiOA9u2" "MZvNMBgM0Gw20ev1AOCrYRgRTxAIBPLZbDYRDAYhhIBSaiOr1SouLi4QjUYRj8cPpJSfPAEz" "H+/v78OyLEgpN7JWq8E0TazXa3S7XcRiMQA49gREdOj3+7FYLKCUgpTSq1ypVDyYiHB7e4tg" "MAgiOgQA358OAMCDiQhEhGq1inK5DGb2hO7bZdwRbizLQiAQ8CRu5bcdJZNJCCHAzDeeQCl1" "9fz8jFAoBCmlV9mF3VRKIZVKYTKZgIiuPIGmaV+ur69/2baN+/t7mKb5CnJFZ2dnGI/HeHl5" "eVwsFp9frXKxWDRGo9HPfr+PcDiMu7s7PDw8wOfzIZFIIJ1OQwiB4XCI+Xz+vt1u/9i4hVwu" "d0pE3/b29iLRaBR+vx9Kqb+XSTDzx3a7/X3rMR0dHe0CyDPzCRGlmHnFzI+apl1KKYudTmf7" "Mf1L/AZVcKkKKqdBPgAAAABJRU5ErkJggg==") index.append('contrast_high') catalog['contrast_high'] = contrast_high #---------------------------------------------------------------------- contrast_increase = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnhJ" "REFUOI2lk0FoE1EQhv814W3IBoS0iaVQNab1kCAVgoWK2kM9FHrKIaV4kFzFkwVvBT2LCEL1" "1ouFQjd7KILQY/WijSUIFltDaA1WTCttQpPdzb7d98ZLsrQWvTgwMAz8H/8MM8B/hvJnQ9f1" "qJRyhogmiShBRAEAFSJ6wxh7PjU19euvgMXFxWw4HF7IZDJaLBYDYwwA4DgO9vf3sb6+bjab" "zXw+nzdOWdF1fWxtbY1M0yTXdcmyLKrX63R4eEhHR0fUbrep1WrR3NwcTU9PT3R1ZzriSCgU" "Wkin0wgEAmg2m7AsC67rgnOOVquFg4MDFItFVKtVSClf5nK5iA8QQswMDw8PqKoK0zQhpYQQ" "AkIIvy4UCpidnYWmaYhGowkp5cPjgIl4PA7HcSCEgOd5PsDzPBiGgaWlJXieh3K5jEgkAiKa" "8AFENKKqKmzb9oXdLBQKvlhKic3NTaiqCiIaAYBgB4COE9+2lBKGYUDXdRCR3+/WXU2ws8yi" "bdujjDE4jnNC3IUREdL3LiGgBGFtWCCi4vEdrNRqNYRCId+2rusnRknfTyIxlED/hT78HKxC" "SrniA0zTfFYqlb5zzlGpVPyZhRCQkLjyYAgXE+eR7E0iEU+ity8K62b9TupRivmXOD8/P9Zo" "NFZ3d3cRDoextbWF7e1tDN4dgBoP4tzZPgz2XwYXHDs/vuHjp2LbaXtvT5xyNpvNAnjV09MT" "0TQNjDEIIcA5RzX1FeOZcXDBsfr+HWp7e6OlJ58/nHqmXC4X5ZzPKIoyKYRIEZGtKMqOfatx" "dfz6bbjCxfLrZZSebiinnulfcePxNXIcF27bBecuvrwoKwDwGyCQoUlLbcDQAAAAAElFTkSu" "QmCC") index.append('contrast_increase') catalog['contrast_increase'] = contrast_increase #---------------------------------------------------------------------- contrast_low = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhFJ" "REFUOI2lUzuLGlEU/ib3OqM4biEqCFrYxspm2+3CwlaLYJ38BSG1iIJFILBNfkC2kxSyIFlI" "sWmzheMPWFgGG1+IrI6PuXPPSZMZdCXVHrhwOJfvwbnfBd5YxutBt9tNW5ZVZ+YrACVmFsz8" "xMx9rfVNrVab/Zeg1+tdx2Kx22KxmLRtG1JKAEAQBFitVnBd11NKfaxWqz9CjAibu7u7i3Q6" "/bNUKpmJRAJEBN/3EQQBACAejyOTyZiu69Yqlcqfh4eHJwB498+2LYS4zefzMAwD+/0eSilo" "rREEAfb7PTabDVzXxWKxABF9azQadkRgmma9UCgUpZTwfR/MDCICM0e94zjo9/uwLAvJZLJk" "GMbniICZL1OpFIIgABFBaw0iis5wOMRgMIDWGtPpFJZlAcDlIcG5lBJKqSPVUHkwGESOxuMx" "pJRg5nMAkIevEIJCklA5vDskZ2ZEDojoUSkFKeWJMjNDax0BM5lMuKfHiADA/cvLS2gNjuPA" "cZwjR2GfzWax2+3AzPeHDr6ORqOR1hqz2QyO45wskohQLpex2+3ged6zEOLLURK73e7Fdrv9" "vVwuYZomJpMJ5vM5hBA4OztDLpeD7/vwPA9KqQ+tVuvXSZSbzea11vq7bdu2aZoQQoCZozCt" "1+u1YRif2u12FOWTz9RoNNJEVAdwxczvAWwBPDNzn4huOp3O7DXmTfUXSLSFFf70IKkAAAAA" "SUVORK5CYII=") index.append('contrast_low') catalog['contrast_low'] = contrast_low #---------------------------------------------------------------------- controller = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmxJ" "REFUOI2d0k9Ik3EYB/Dv+/6s5mixLhEhM6g8ufIfA+mmXbqOCR2M8FAKHUICV4GsurgkPfkH" "XgShXfToCCG2RS9EzSHEQGj4dwvzMInl3Pvufd/f89uvQyWEl+Vz/34enj+Ym5ubnJmZuYMT" "liqE0IjowcTEhP9EwODgYM6yrGXLsuYjkciF/wUUAIhEIqcBLNu2rQLoi0ajP9Lp9JjjOGEi" "AhE5nPPPtm2PBoPBj8cAANB1/eHS0tJoU1PTYUdHR1FV1faurq5GALAzK/h5cICVqmUT0Yv+" "/v6xf4BsNvtOCNHLOSciOtPS0gKXywXDkTBWv0B59ggAcDY6jnjhmySi2NDQ0D0AYNls9rXX" "673b3Nyszn/VGoKBEBhjMByJp0kP3huXcfX6JVxsuwZXTy/aOjsV0zRv+P1+VyKRSCmpVMoI" "BAJuIQQmP706mm24ewQmV8CFgvNugDEGAKjVaqjVapienq45jtOnVqvVRgDHwgDgPiUBu4R8" "Pg9N06SmaZKIwBhDKBRSHccZVznnUkqJ4e6Ro+DfTplMBmtra9je3ka1WrU45y+npqYkYww+" "nw+c8ysq59ysVCpQlN8HeXzzCYQQ2NzchG3bMAwD6+vrkFLq4XD4OedcTyaT4JyDc44GIkrv" "7Ozcam1thZQSnHMsLi5+LxQK58rlsgfAocfj+eD1eu8DgKqqt3Vdf5tIJNqJ6A1isdiTeDwu" "C4WCLJVKslwuy9nZ2cN6P1ElooW9vb3K/v4+DMMAYwy2bbvrBgYGBvJCiIXd3V0Ui0VsbW3B" "NE2qF2j4s/HIxsZGTy6X8wkhQESr9QK/AEBYYP4wdN8eAAAAAElFTkSuQmCC") index.append('controller') catalog['controller'] = controller #---------------------------------------------------------------------- controller_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtdJ" "REFUOI2d0ktoXFUcx/HvfWQ6GZIYK4hKMII2tIsxaRqCr00bLQhdhRRcRGQQmtAuRAqaqmVw" "1XEwdZVBLoEK3TSLgGnJQI1jGAjpNAzUaQ0NhiGxTdN24mDCvO6955x7XGhLpCv73/8+f/4P" "Jicnz6dSqQ94yjKVUo6U8sT4+Hj0qYCRkZEV13XTruteiMfjz/9fwACIx+MhIO15ngkcTyQS" "5Vwud873/c+llEgpfSHENc/zzg4ODi48AQBks9lTMzMzZzs6Oiq9vb0l0zQP9vX1NQN4S9fZ" "3tnhesP1pJRfDw8Pn/sPUCgUriqlBoQQUkq5p6uri3A4TM3X1PI3ML74BICWRJLLf9zRUsqL" "o6OjHwFYhULh2/b29g87OzvNC7cde7B/CMuyqPmaMz+38kvtFV57/SVe6NlH+MgAPYcOGfV6" "vTsajYbn5uYyRiaTqfX390eUUpxf/ObxbJ+++Rl1YSCUwbMRsCwLgCAICIKAiYmJwPf942aj" "0WgGnggDRJo0eH+xvr6O4zjacRwtpcSyLIaGhkzf95O2EEJrrY1Hoe+uJR93yufzCCEQQlAO" "7shK+KEe+yEbEtLncPcxhBCv2kKIerVabYlEImitOf32GEIIisUinufRaDS4cXeB5s5q09ED" "79Cxdx/zyz8y+9v3eN5zmFLK3NraGobxz0WFEExNTd2bnp6upNNp5ufnK/fE7aBnfzfKVHS/" "+B7KELwRfYv76ndpK6Uy5XL53e3tbdra2giFQpim+UwymWx9tJNjXx7UTUYL7x/4GIDTAw5X" "bqXAuGybUspLm5ub1a2tLWq1GpZl4XleZPe3/bnz0F3eXCQxFwMg8VOMYukmGu2asVhsXSl1" "aWNjg1KpRLFYpF6vy91AEOjx3M1FQthcuZUiZNgs/JoFjAn7343HV1dXj6ysrLyslEJKmd8N" "LKXuf8VJbU+tzZ40mG3VUEHr1FLqwdjfxiuHAhtK9t0AAAAASUVORK5CYII=") index.append('controller_add') catalog['controller_add'] = controller_add #---------------------------------------------------------------------- controller_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtdJ" "REFUOI2d0ktIlFEUB/D/d++XjV8+C6wma4rKgrSHiRDRxtrU0oxaGOGilCKigp7EGETZkLXS" "YDBatEmCwCihbCJ7agzVFJVhgzOhYwimjc73uud+t02J0arO/v87nD8HbW1tl1tbW3fhP4dJ" "KcNEtK+5ubnsv4D6+vo+27Y7bdu+HgwGi/4V0AAgGAxmAeh0HIcB2NHU1DTa09NzwXXd40QE" "InKFEC8dxzlTXV397C8AALq7uw90dHScKS4unigvLx9hjK2rqKjIBgDnVS/Gf/xAr2U7RHS2" "trb2wh9ALBa7L6XcLIQgIppZUlICn8+HjKuQib6BduoQACCnKYQ7ya+KiG40NDTsAQAei8Uu" "FRQU7A4EAuz6p7BeXVkDzjkyrsLJh7l4lFmMZav9mLd2OXxVm7F2/XrNNM01ZWVlvq6urogW" "iUQylZWVhpQSl19cnLrt8IZjMIUGITUUGgDnHADgeR48z0NLS4vnuu4OZllWNoC/wgBgzFCA" "M4ZEIoFwOKzC4bAiInDOUVNTw1zXDelCCKWU0n6HrrwMTW2KRqMQQkAIgaKvz2l+4qn5+u6x" "fH3uAvi37YUQYqkuhDAnJydzDMOAUgpHN56AEALxeByO48CyLFDvbaxiKb5y7/H8mUtWwXr3" "AB+f38KCsdnQiahnYGBgS2lpKZRSEEKgvb19KJlM5qXT6VwAE1sTnXzFwUbDF38MPDkHI78A" "ixcGMPy5N61LKSOjo6NbxsfHkZeXh6ysLDDG8kOhUO7vTrZX6Z5v3hJg25GpnvTG+cgmN1cn" "opupVOq03+/P4ZyjsLAQjuMY07/NY2rIfHuveNad/XCsbzABTKQ5JEeK1dXVJaSUNwcHBzEy" "MoJ4PA7TNGk6YMwpuvbhRTcN29lI8xkY+67hy6AmlVKt+q/Gg/39/VV9fX2LpJQgouh0YFP7" "cOPTnQvt98lUPfO0gMfYkAfv6taH3vmfCO5+sxMs1fQAAAAASUVORK5CYII=") index.append('controller_delete') catalog['controller_delete'] = controller_delete #---------------------------------------------------------------------- controller_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAulJ" "REFUOI2d0U9om3Ucx/H38zxZTJPGZVKtmzWdm62j0Lm0tdD5B0EvRbxkKXio6MkWdpAyqE6Y" "0dPisGVQ2kIpbCiCvQjZYDq7DKrSpZvbyA5O22lRXJB10WTmyfPn9+fxMKjITu4Ln8P38HnB" "ly/z8/OTMzMzr3GfYyql5qSUb01MTHTfFzAyMvKj67pnXNc9kc1mH/m/gAGQzWbDwBnP80xg" "KJfLVYrF4lHf99+RUiKl9IUQFzzPO5JOp7+7BwBYWlo6mM/nj7S1tf3d09NzyzTNVF9fXxOA" "d3GFaq3GiuN6UsoPh4eHj/4HKJVKZ5VSLwkhpJTygc7OTiKRCLYfYH9/FeO9twFozh3j1K+/" "BVLKT0dHR98AsEql0seJROL19vZ288T1uVC6P4NlWdh+wOFzcc7bO9m7X9M8GKZp76uknhkw" "Go3G093d3ZHFxcWCUSgU7P7+/qhSisnljzZvGxsYpyEMhPDglxzxR/fjOXdo3jmE1prp6Wnt" "+/6Q6ThOE3BPGSC6JUCXTxNr6eXB7Slur32F8+calmWRyWRM3/ePmUKIIAgCxgbGN4sAWmuu" "rpzF+f0c8ZYE6s4p2va9ybXFSUwDkskkQojdphCiUa/XMYy7Dzn07LsopbhxY42ovUJrVwbc" "K1z85DOaEw4t1h8sfzmHEAIhBKaUsri+vr4JCCFYWFi4Wfz6pNOaiBLf1kB76xBoVP0ST7x4" "iNDN0/YH7x/+y/f946ZSqlCpVKhWqwCEw2Esk60v7Fj7IZHch25cI9AOvQeeQvtlIpFVdqXS" "sfT2C8dnZ2fHTCnl5+Vyub6xsYFt21iWxTb5U+yhjld6o/HbBLIChsXlL1YBjXZXebizHeX7" "B7/JdnVZ+Xy+Ojg4uAvoCYVC1Go1Qj+fpOPlccMMWRhbHseM7OGx1POYkT0Y4d2EYh2E40/G" "bl0/32oATE1N7XBd91ulVFIpxXOhPKbyRKADAq3vJgj4dw9Aa9DB5X8A6Bx78dG7/4IAAAAA" "SUVORK5CYII=") index.append('controller_error') catalog['controller_error'] = controller_error #---------------------------------------------------------------------- control_eject = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkJJ" "REFUOI2lk7FLW0Ecxz9NQp45nxXlgQ4iCE4Bp+hc3V07dzM4GLCF/gkKxaXaxbGLq4uDg4OT" "oLg9MGQTNA6KYEIuXt67+/06VEKtdOoPbvlxv899jvse/Ge9+7vRbDYXgVVgWVUXVBURSUXk" "1Ht/VKvVLv8JaLVadRFpJElSNcYQRREAzjl6vR7tdvtKRHaXlpb236i0Wq16s9nsOOdUVdU5" "p91uVzudjj4/P6uqqrVWz8/PO2dnZ/VXBi/aP+fm5qpRFPH09ISqkueeKCrjvUdVSZKEfr/P" "xcXFFfBpZWXlsvACWk2S5NVwr2fZ29tla2uLQqGAiHB/f48xhtnZ2Wqv11sFKACIyLIxBucc" "IoJzjh8/9hgMMorFEtvb25RKJVQVay0TExM455b/BCxEUcRgMADg+/ddVAEU7/MhpFgsYq0l" "jmPyPF8AKAHo7928PBlfvnx+01NVsiyjWCySZRnee4YAEUn7/f6HcrlMlmXs7Oy8AgCMjIyw" "vr6OMYbHx0eyLEuHVwghnHa7XSqVCqqKMYY4jjHGMDY2xujoKKVSCRGhUqnQbrcJIZwODbz3" "R9fX1x/jOK5OTU2xtrY2PP3PNTMzw+3tLWmaXqnq0asknpyc1EMI32q12vvJyUmstVhrh0bG" "GO7u7jg+Pu4OBoOvjUZj/02UDw8P63meN+bn56vT09OMj48TQuDh4YGbmxvSNL3y3u9ubm4O" "o/zmMx0cHCxaa1e998sishBCIISQishpuVw+2tjYuPx75r/qFxVtcA2Z25GNAAAAAElFTkSu" "QmCC") index.append('control_eject') catalog['control_eject'] = control_eject #---------------------------------------------------------------------- control_eject_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvtJ" "REFUOI2lk89rHGUYxz/zzszO7O5sdrObSbqJNI1N12WDEpVY8VKULfgPCEXwUDz4oxWh0INH" "ES/iQZqCB4Ve41lEhVjoQUptardW1jXQlNDMpsm6mJ39NTs7874ebKuoN5/Tw8P3+3lOH41/" "THVVzSrBnCZwgeyDc0dJWprEW39Ha/49rz1cTlxUjmlQXnE7x1eK3cpsaricMuOykgp/JBrN" "fqL2436ufqM9eW0c0bhyVus9Apy4qBxb8PTpJ5vVytTw1LTrltKpJLZlADAMxnR7fbbveZuN" "dmrtizuPrweSm1fOaj0DwDQon15qVpfc0bnFI/OObRkMw5juIEIBlqkzOz3JRCZdkrd/OffK" "wiZr26UhsKFXV9XsyqFO9aV5//VjC4eLtmXwmx8yGiuCscTQBYMwpjuMKWQs8vl8wt+7U/RH" "pue8+LEnlGBuZaZTmXbd0sOyVNDpR5y/9DNvXLiKrmlIqdhpBzjJBPNHFkpHre2KEswJTeAW" "08FyOpWkP4qJJQxGMe9d2iAMBgjd4q3Vq5i6QCrwBxH5XJaMbC1rAlcA2aQelW3LIAglAOc/" "v4lSAIo4CtD1BG9f+B5D1/CHEVnHwoj7ZSBrACj1Z1EpRawUn7z5zAMASAVSKqSCIJQYukYQ" "xkTRGAAD6HRD0egNwhcsUycYR7z76TWQf0EBEqkMH762RMY22P+9TzfUG0BHKEnL862a7/dw" "bAOpwE7nSE4UsJxJUtkp7Ewe3UggJThJgx1vl3aUrSlJy9Ak3vW9bH0msbXpOOnS4SmbD14t" "PfquFCgFEsViMcVW84Cfajc2d3i+rkk8fevr97vpkx+pgmiPu/t3n83mC4nHCimEphFJhRCQ" "c0wO5Szu7h7w1Tff9u6H+c/q4rnL62e0Xw2AcUTjy92nkidzP3Dw3eVTx0qVUnHGZXIiRRQr" "7re7XL/ncfvWxmZLzqzdMl5eH0c0/lOmRXP7+JxsVNLR3nJCDspRHDOUdsPX8rWmWal74ol/" "y/R/dP4Dap5vXp5YAPwAAAAASUVORK5CYII=") index.append('control_eject_blue') catalog['control_eject_blue'] = control_eject_blue #---------------------------------------------------------------------- control_end = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAj1J" "REFUOI2lk7FrIkEUxj9z4uIUuwS2SBUIpIlopZKU/gH+D1dqEyG1+Qdypd01Oa5JGzgDkio2" "ERbslkSsg1pEQZedzejMvHfFxb1cwlV5MM3jfT++N/MN8MnKvG+MRqMKgDqAGjOXmBlEFBJR" "3xhzUy6Xh/8FjMfjBhG1fN8vCCHgOA4AQCmFOI4xmUweiahTrVa/f7AyHo8bo9FopZRiZmal" "FEdRxKvVil9eXpiZWUrJQRCsBoNBY6vb2domotbBwYHrOA7u7wdIkgRaaxhjIKXEfD6HEALF" "YtFdr9etu7u7SgoAUPd9v+A4DpbLJbrdX3h4eAAAMDMuLr7h8vIHoiiCEAL7+/uFOI7rAJAF" "ACKqCSGglAIRgRnodrsgIhwdHQHgFCalxO7uLpRStbeAkuM4iOM4HQSA29tbzOdzMP/pvQVo" "rUvpClvB65MBALLZL9BaI5PJpOLtzGazgTHm7yUSUZgkCXK5HIjoVWzQbrdxcnLyzwpCCCwW" "C2w2mzAFWGv7URQhn8+DmaG1xvl5G1JKMDN8309d5PN5TCYTWGv7aZCCIKhorX8Wi8WC53lY" "LpdIkiQVCSEAAK7rYjabodfrPTLz12azOdwBgOPj46FSqhMEQbRYLOB5HlzXRTabTY/ruphO" "p+j1etF6ve40m83hhyhfX183tNatw8PDwt7eHjzPg7UWz8/PeHp6QhiGj8aYztnZWRrlD5/p" "6uqqIqWsG2NqRFSy1sJaGxJRP5fL3Zyeng7faz5VvwH+WXvTugCrUAAAAABJRU5ErkJggg==") index.append('control_end') catalog['control_end'] = control_end #---------------------------------------------------------------------- control_end_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvBJ" "REFUOI2lk01vG1UUhp+5nvGMv+LEycQ4kZoGGtdyBUqFQlFZVCBXgh+AVLGrWBLU0n9QiRVi" "12woK9iQrgEBVajoCkpTcKlkJpbSyrTjJjGmmfFnxjP3skhaVS07zuro0XvO0XukV+OZqlxS" "M0owqwlsIHuAPSVpaRJ37UOt+bRee9ycWlFpQ6e0ZHsnlgqd8kxysJg0opKSCn9POM1evPrb" "znjtVnvixijEub6sdZ8sOLWi0pbg+NmXm5Xy1ODMtG0XU8kElqkDMBiO6HR7NO67daedXL2y" "+eLaUPL79WWtqwMYOqWzx5qVY/behSOH59KWqTMIIjr9EAWYRoyZ6QnGMqmivPPnhXfn66w2" "igNgPVa5pGaWXvAqb8357y/MHypYps436y3ssTiRBClhGEo6g4jJjEkul4v725sFf89w029+" "6golmF3Ke+Vp2y5aps7ffsAXVzf4pb4LgESxvHKDi1c2+ac7Ip2IM3d4vviS2SgrwazQBHYh" "NVxMJRP09iIiCUrBl1cdft7YRUoFKGCf+/2Q3HiWjGwtagJbB7KJWFiyTB2vFx4IJQBf/XSP" "5qMCSFBKoZTCH0RMZ030qFcCsuLpAaUUkdq/FtMNwtEQTdNQSnKAkQqGQUQYjgAQgNcJhNPt" "B5iGQEpFTDeIgoDL507yzvGpJxakgowVY+dRj04QcwBPKEnL9c2q73dJWzpSQRQMufzRSbx+" "iFQwaeeRav8H6YTOA/ch7TBbVZKWrkncm9vZWj5+t55Op4qHpiw+O/8GXj888A0fv7cAQC5j" "8NeWxx/VW/UHvF7TJG7s7ncXO6nTn6hJ0R51du69ms1Nxu1sAqFphFIhBCTMGOMpg8bWLt9+" "/0N3K8h9XhOvXVv7QNvQAUYhztcPX0mcHv+V3R+vnVkolouFvM3EWJIwUmy1O9y873Ln9nq9" "JfOrt/W310Yhzn+G6YjRODErnXIq3F6My34pjCIG0nJ8LVdtGuWaK44+H6b/E+d/AQg2eOdW" "FgEKAAAAAElFTkSuQmCC") index.append('control_end_blue') catalog['control_end_blue'] = control_end_blue #---------------------------------------------------------------------- control_equalizer = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmFJ" "REFUOI2lkz1LK0EUht8bQ5YMQUlIkUZBsJCwQSTaL2i5rb8hlQsW3h9gI6S0sxUUiUWaFBaC" "qQRBsFgwBBUDGgs/iLtkdDY7c85tbhavcitPM8zA+/Aw8w7ww/n19aDT6SwBcAE4zFxhZhCR" "T0RtrXWrWq1e/BfQ7XZrROQVi8WyEAKWZQEAlFIYDofo9/tXRLSzvLy8+02l2+3WOp1OoJRi" "ZmalFIdhyEEQ8MfHBzMzSyn5/Pw8ODs7q41zqbE2EXmzs7OTlmXh7e0NjUYDcRxDa41Go4GX" "lxcIIWDb9mQURd7p6elSAgDgFovF8jhsjMH19TXiOMbh4SGazSb29vbw9PQEIQRmZmbKw+HQ" "TQBE5AghoJQCEYGIMDExgcFggJubG2xvb6PX64GZIaVEPp+HUsr5DKhYloUoivB3D2ZGPp/H" "wsICNjc3Yds2iAhSSuRyOcRxXEkAzIzxGkURjo6OcHl5if39faysrGB+fh6u64KZwcwYjUbQ" "WuOzgf/+/o5MJoPBYIDb21vU63Xc3d2BiJKXYmYIIfD6+orRaOQnAGNMOwxDZLNZFAoFLC4u" "YmtrC7ZtI5VKIZ1OJ3eTzWbR7/dhjGkDQBoAtNatXq+3lsvlyqVSCaurqwiCINF2HAdEhOnp" "aTw8PMD3/Stmbv3TxJOTk5oxpl6tVicLhQKklJBSJtpCCDw+PuL4+DiMoui353m736rcbDZr" "cRx7c3Nz5VKphKmpKRhj8Pz8jPv7e/i+f6W13tnY2Eiq/O0zHRwcLEkpXa21Q0QVYwyMMT4R" "tTOZTGt9ff3ia+ZH8wfJkHt0cHtuQAAAAABJRU5ErkJggg==") index.append('control_equalizer') catalog['control_equalizer'] = control_equalizer #---------------------------------------------------------------------- control_equalizer_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxpJ" "REFUOI2lk99rW2UYxz/nzUlOfrVJT3bapinrurZZTGdX0VrwZkw70T9A3O0meLMpOLzyyl2I" "qMMLO1HwUpAKouIcblAHRW82p3YOaozNktCm3RqDzUnSJCfnvK8XuiHqnd+rhy/P57l6Phr/" "yMKiGlGClCawgNhfdV1JqpqksvyCtvX3fe3ecPSCivp1MnNWfX4u2ciOhNuzYb+XUVJhd0Vu" "qxVY/WEnvvZ9beBazyW3ckZr3j9w9IKKBgUPnXxwayG7r31i0LLSkXCIoKED0O70aDRblDcq" "+VwtvPRx4eByR/LjyhmtqQP4dTInp7cWpq3u2ckDY9GgodN2PBp7Lgow/D5GBgfo74uk5a2f" "zz4znmepnG4DN3wLi2pkbri+8PiY/dzU+P5k0ND5zXZ47/IGM2P9SAnvX9lgIhkm0WdgmmbA" "vltI2l1/JXrsfEUoQWpuqJ4dtKz0PbgnFT8Vd+m6krcvlvji0494/ZPbbNY6REMBxg6MpyeM" "clYJUkITWMlIZzYSDtHqengSpFQIn87OrkN+vcTiuRcplwpIBfaeixmP0Sers5rAEkAs5HMz" "QUOn40gAPAlKKQbjAR6ZmeT0K+eZmT6ElAq77RKLGuheKwPEBIBSf4JKKdqOxzuXyhSufc5b" "nxV59rFhRg8f49QTo0gFUkHH8XDdHgACqDcckWvuORh+wU7dYb1Q4t3XXqJU/BVPqftPo5Si" "L+hj5/cWDceXA+pCSaoV21i17SbRoM5QPMD8kSlefuNDZqYfwKdp+PwGUiqkhGhIZ7OyTc2N" "rSpJ1Tfx9Kt4Uu6zZHEyNpBIJM0QqUSQzW6C558cBSASDpI0DaaSEUrbdb79ZiW/zpEv6555" "3Xf7q3ONyPE3VULUeo2d4sMxMxEYTYSZT8dxpUIIOLy/j+G4QXF7l0uXrzTvOOYHa+LRq8un" "tV90gJ5L7uL2TOh4/Dq7X189MZXOppNDFgP9YVxPcafW4LuNCrdu3shX5dDSTf2p5Z5L7j9l" "mvSX51Myl424d2cDci/jeh5tGczZmrm65c+uVcShf8v0f3T+A8f+ctvh9YATAAAAAElFTkSu" "QmCC") index.append('control_equalizer_blue') catalog['control_equalizer_blue'] = control_equalizer_blue #---------------------------------------------------------------------- control_fastforward = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAklJ" "REFUOI2lk7FKK1EQhv+bXbJkMQlCQBERBKtgKhXbPEDeIzYGrLNPkYgQb29rE7A0lRBIt5CQ" "TgiLYAyadc96ds85MxbRvaLcyulm4PvmL2aAX9af74PJZHIIoAGgzsw1ZgYR+UQ00Fr3Dw4O" "Rv8VTKfTJhG1KpVK1XVdOI4DAJBSIooiBEEwJqLO0dFR70eU6XTanEwmSyklMzNLKTkMQ14u" "l/z29sbMzEIIHg6Hy7u7u+Ynl/uMTUSt3d3dkuM4CIIAcRxDKQWtNebzOZ6enuC6Lvb390tJ" "krRub28PMwGARqVSqTqOg5eXF3S7XUSRAAAwM7rdc0RRhMfHR7iui52dnWoURY1MQER113Uh" "pQQRgRk4P+8iiiIQEQDGxcUFhBAQQmB9fR1SyvpXQc1xHCRJkm1lBnq9HpIkAfNqdnn5F8/P" "z1hbW4NSqpYJmDkDVxsB27aglEKxWAQzw7IsKJWiWCwiTVNorfE1gR/HMfL5PIjoA9Zot9uI" "4xi2bUFrDc/zkMvlsFgskKapnwmMMYMwDFEoFMDMUErB89oQQnz0K9nr6ysKhQKCIIAxZpAJ" "tNb9+/v7cRiG2NjYQLv9DyYieN4K3t7exsPDA3zfHzNzPxMcHx+PpJSd4XAYLhYLlMtllEol" "2LYN27ZhWRa2trYwm81wc3MTJknSOTk5Gf045evr66ZSqrW3t1fd3NxEuVyGMQbz+Ryz2Qy+" "74+11p2zs7PslH8809XV1aEQoqG1rhNRzRgDY4xPRIN8Pt8/PT0dfWd+Ve/rr4cZiPnqIQAA" "AABJRU5ErkJggg==") index.append('control_fastforward') catalog['control_fastforward'] = control_fastforward #---------------------------------------------------------------------- control_fastforward_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwFJ" "REFUOI2lk09oHGUYxn/z7czO/ks3u9tJslkwiU3WZYuaIrFQikXdgp5F6LV4tKLtqT1U7FW8" "tQeJUAU9xLOKCrEQ9GJNa0okrsEYQ7tJmu2SzOyf2Z355vs82IqoN9/L+z4P7/Pcfgb/mNpV" "Pa4FJUPgANmHtqsVTUPRWHzD2P77v/HoOHVNZyyTypzjHp8rtqvjKX82ZUUVrTTeQNS3u/GV" "23vDa7daue9DSX3pnNH5q+DUNZ1JCI6dfXK7Vj3snxlxnHI6lSRhmwD4/ZB2p8vW3cZ6vZVa" "+HTj8cW+4selc0bHBLBMKmePbteOOoML05MTmYRt4gcR7Z5EA7YVY3wkx6GhdFmt/nzh1al1" "FrbKPrAcq13V43Njbu2FCe+1manHignbZGO3BxhECpSCB17IQCoKQzb5fD7u3d8oegOrkXn+" "vYbQgtLcqFsdcZxywjZ54AVcvH4btysBUGguXl/moBtyr9Unk4wzMTlVPmJvVbWgJAyBU0z3" "Z9OpJN1BRKRAa7j04TIHvRClNKC5/NEt3J7E60nyw1mGVHPWEDgCyCZjspKwTfqBAkBrhdbw" "9sc/4Q8UKEAprnyyyp4bkM3YmFG3AmTFo8CfWxNpDUDMtJBhn1zGQmuFMC1k4JPLWPSDCClD" "AATgtgNR7/QCbEuglCZmWkRBwPybJ2j7kphlEYUB8+dPIgzY2+/SDmJ1wBVa0Wx49orndcgk" "TJSGKOgzf/4Ebk8+1AHvv3WS/Y4kkzS519ihJbMrWtGMHXn5HSKlDjtqczqbKxTGcglePFbC" "8yO01mgNrzw3yX43ZKaY5vcdl+++XVr/lac/d6P8zdhvX15pp0+/qwuiFbb3Np/J5gtxJ5tE" "GAZSaYSAZDzG2LDN5s4BX3z1dWc3yH+wJp69sfi68YsJEErqn+08lTw9fJODb26cmSlXy8VR" "h9yhFDLS7Lba/HC3weqd5fWmGl24Y760GErq/wnTtLV1vKTq1bS8PxtXvYqMInyVqHtGfmXb" "qq41xBP/hun/4PwHVy2FMSIzPs4AAAAASUVORK5CYII=") index.append('control_fastforward_blue') catalog['control_fastforward_blue'] = control_fastforward_blue #---------------------------------------------------------------------- control_pause = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhNJ" "REFUOI2lk7FrIlEQxr8Li4vLokgeaCUIVoJVEmy1t736Ok1jwP/CXGl3RTyuSZtGSGslKHYL" "ip0gaiFCXHbNW31v5gr3Nhq5KlPNDO/73m8e84AvxrfPjclkcgugCqDMzEVmBhE5RNRTSnVv" "bm5G/zWYTqd1InoQQhQsy4JpmgAAKSU8z8NisRgTUfvu7u7XBcp0Oq1PJpOtlJKZmaWU7Lou" "b7dbfn9/Z2Zm3/d5MBhs+/1+/YwgxP6Ty+UKpmni7e0NzAxmBoAoF0Jgt9thOByOAfyoVCqj" "q9CoKoSIxK1WC09PnUj8+PgTnc5vuK4Ly7KQzWYLnudVAcAAACIqW5YFKSWICMeLOcwZwAeJ" "7/tIpVKQUpYB4Co0KJqmiSAIzpD/GTB/9Hzfh23bOBwOxcjgdFYiCnOcmZ2e2e/3UErhlMDZ" "7XaIxWKhAUcjfNRHsWVZ2Gw22O/3TmSgte65rot4PA5mxvW1OBtBCBFRxONxLBYLaK170SMq" "pbqz2ey7bduFdDqNer0W7YfneajVjnUikcBqtYLjOGNm7kYEpVJpJKVsDwYDd7PZIJlMwjAM" "BEEAwzBgGAYSiQSWyyVeX1/dIAja9/f3o4tVfnl5qR8Oh4d8Pl/IZDJIJpPQWmO9XmM+n8Nx" "nLFSqt1sNqNVvvhMz8/Pt77vV5VSZSIqaq2htXaIqBeLxbqNRmP0WfOl+AvvrXwWgcqhRQAA" "AABJRU5ErkJggg==") index.append('control_pause') catalog['control_pause'] = control_pause #---------------------------------------------------------------------- control_pause_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAslJ" "REFUOI2lk09vG1UUxX/zPOMZ2+M6sT0xTqSmgcRYrkBhEZVdBTISXwCpglXFCinZ9BOAhLpi" "13wIdw2LLgxSN0huU3BbyYwsBWHacZK6ofH4vz3zXheOqwi6427ePffdc+6V3jsa/4ryHbWq" "BGuawAFS5+WuknQ0iVfd09oX+7VFcn1f2YZOccfpXtvJ90qr8dF23AiLSir8iXDbg2j9txdL" "jUeny7VZgHt/V+u/Ebi+r2xL8NHND9rlUnZ0Y8VxCol4DMvUARiNZ/T6A1rPvKZ7Gq/cPXy3" "Opb8fn9X6+sAhk7x5tV2+aozubV5Zd22TJ3RNKQ3DFCAaURYXVnmUjJRkE//uPXFRpNKqzAC" "DiLlO2p1551u+dN1/+utjct5y9R56U+ZzBShBClhHEh6o5BM0iSdTkf9k8O8PzE8+5MfPKEE" "azu5bmnFcQoL8jf7D/i2cgiARLG7X+O7u4f8059hx6KsX9kovGe2SkqwpmsCJ58YbyfiMQaT" "kFCCUgCKUCmUUoAC5nV/GJBeSpGUnW1N4AggFYsERcvUGU/leaNEAlKquZgEdS7mjwJStoke" "DopASiwI83M+dTENQKr5/UU8noYEwQwAAXR7U+H2h1NMQyDlYmVFKNUFPCcnrQgvXg3oTSMu" "0BVK0vF8s+77fWxLRyrIZLIoxfwVFGSc3PkmYMd0nntHnAapupJ0dE3iPTxJNXLRP5u2nShc" "zlrc/mrrzVc9GwR8/+Ucp5MGfx93eVJ/1HzOxw1N4onqntZ+4mdrjZdm5dfaQf/k1YBMMooe" "EQynEkPXMHSNdNKgdXzGT/fu9Y9m2cpfbNaqe1pbB5gFuD8efRj7bOkBZz//cmOrUCrkcw7L" "l+IEoeL4tMfDZx5PHx80OzJXeax/Xp0FuG8106bRurYm3VIiONmOymExCENG0nJ9LV1vG6WG" "J97/r5n+j51fA8I/e2uTZnkjAAAAAElFTkSuQmCC") index.append('control_pause_blue') catalog['control_pause_blue'] = control_pause_blue #---------------------------------------------------------------------- control_play = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAihJ" "REFUOI2lk7FKI1EUhv/dyAy5iKIETCGCksZgqtE+D5D3SOVAGpvNE2xp5wuktTCFLoKpBMFG" "BjNMJ2gimAhmmDvembn3nG2Sy6ps5enugf87H4dzgW/Wj8+NMAz3AbQANJm5wcwgooCIBlrr" "vud5t/8FRFHUJiK/UqnUhRBwXRcAoJRCkiQYjUZDIjo+ODg4+aISRVE7DMOZUoqZmZVSHMcx" "z2Yzfn9/Z2ZmKSXf3NzMrq+v24vcz4U2Efnb29srruvi7e0NaZri7u4OWmtIKTGdTiGEwN7e" "3kqWZf7V1dW+BQBoVSqV+iLMzGBmnJ31cX9/j/ke8PLyAiEEtra26kmStABgCQCIqCmEgFIK" "RAQAHyBEhN3dXTAzpJRYW1uDUqppDYio4bousizD/D0HMQDGxcUfPD09gYggpcTy8jKKomhY" "ADPbqURkpwNAqbSEPM+xs7Nj+3meQ2uNfw2CNE3hOM4HQKlUQlEU6HZ/IU1TMDOEEHh9fUWe" "54EFGGMGcRyjXC5bCyKyYSml7ZXLZYxGIxhjBhagte4/PDwM4zjGxsaGteh2u0iSxIY3Nzfx" "/PyMIAiGzNz/cImXl5dtY8xvz/NW1tfXIaWElNJqCyEwHo9xfn4eZ1l25Pv+yZdTPj09bRdF" "4ddqtXq1WsXq6iqMMZhMJnh8fEQQBEOt9XGn07Gn/OUz9Xq9fSllS2vdJKKGMQbGmICIBo7j" "9A8PD28/Z75VfwGM35vsLpav1wAAAABJRU5ErkJggg==") index.append('control_play') catalog['control_play'] = control_play #---------------------------------------------------------------------- control_play_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuZJ" "REFUOI2lk81vG2UQh599d+1df6R2nG5SJyhpIDWWq6IgFHoAqQK5Ev8AUq8VR8qh/Q+4Im7t" "qdx6CmeEgCoU9YIKbcGlktkaJSU0dj6MVXvX3959h4MJQsCNkUYajeYZzYd+Bv+w8nVZFMWS" "oXCBzJ/pjmiahqa+9YHR+Hu9cRxcuCHpmEVxw+2c38gHpcXkYD0Zi4qiBX+kvEYvXvnhKFt9" "2Jr9bhLi3b1idP9qcOGGpB3Fq5fPNcqlk4NL865bSCUTOLYFwGA4Iej22H1Wr3mt5Oan2y9u" "DTU/3r1idC2AmEXx8tlG+aw7urZ2eiXt2BaDcUTQDxHAjpkszs9yYiZV0I9/vvbuao3N3cIA" "eGCWr8vixqlO+e0V/70zq8t5x7b43R8zmgjfPmmTn3UYhppgEDE3Y5PL5eL+4XbeH8Xq6bc+" "ritRLG0sdErzrls4hrWACNy6XeNerY0IaC3stYakE3FWTq8WXrJ3S6JYUobCzaeG66lkgt4o" "ItJTWCOIaG7d9rhXawOgBfx+SC6bYUY31w2Fq4BMwgyLjm0xHGsAIhG0FmDqm9/8yi/7fbQW" "/EFIJm1jRb0ikFEAIlNQRIhEEBFEpu81zTjhqM+55TRaplMMxxFhOAFAAZ1grLxuf4wdU2g9" "hbWAacYIx0NuXn0DfxAhIsw4JkfPewRj0wM6SjTNum9XfL9L2rHQApGernAMd/ohWgtaQzph" "sVffpxVmKqJpKkNTv3+YqW7v7NSeB0OWTzpEejrBzatv0u6FaD29y1o+yW8HHX6qPKztUaga" "mrq588WHQeriRzKnWpPg6Olrmdxc/IW5JMow6I4ilIJsOsaprM3T/Taff/lV92Cc+6SqXr+z" "9b7xxAKYhHif7b+SuJj9nvbXdy6dKZQK+QWX2RNJwkg4aAXcf1bn8aMHtaZe2HxkvbM1CfH+" "U0xrsd3zS9orpcLD9bjuF8MoYqAdzzdylUasVK2rl/8tpv8j5z8AQS2VYZW03LAAAAAASUVO" "RK5CYII=") index.append('control_play_blue') catalog['control_play_blue'] = control_play_blue #---------------------------------------------------------------------- control_repeat = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlJJ" "REFUOI2lk7FLW1EUh7+WkocPqShPFJFI0CmQxVQwi9Xd2bVjFg249I/o2K2DQxeFLDpkcHBw" "CIKS7YWEbM+IOkjAPLzxJe/eczpUQqt06pkOl3u/8x34XfjPevf6oN1ufwK2gU1VLagqIhKK" "yLm1tlYsFhv/BHQ6nbKIVIIgyPu+j+d5ACRJwtPTE7e3ty0R+b62tvbjjUqn0ym32+1+kiSq" "qpokicZxrP1+X5+fn1VV1Rijl5eX/YuLi/JfBi/aP3O5XN7zPB4fH1FVVBVg3AdBwGAw4Orq" "qgV82draanx4AW0HQZD3PI9arUa9Xh+b/QlZXl6mXC6TzWbzrVZrG/gNEJFN3/dJkoR6vc7O" "zg5LS0vjyarK9fU11WoVYwzT09MkSbIJ8P4FUPA8j+FwCEA2m0VEEBGstRwdHTE7O4uqYoxh" "cnKSNE0LY8DrXaMoQlVJ05RqtUq32yWKovGd0WiEtZY/DcLBYEAmk6FUKnFwcICq0mw26Xa7" "qConJyfkcjl836fX6zEajUKADwDOufM4jj8vLCxQKpVYX19HRCgUCvR6PRqNBru7u3iex8TE" "BM1mE+fc+djAWluLoqgVxzFzc3OIyHidjY0NVldXEREWFxe5v78nDMOWqtb+SuLZ2VnZOfet" "WCx+nJmZwRiDMQZVxfd9fN/n7u6O09PTeDgcfq1UKj/eRPn4+LicpmllZWUlPz8/z9TUFM45" "Hh4euLm5IQzDlrX2+/7+/jjKbz7T4eHhJ2PMtrV2U0QKzjmcc6GInGcymdre3l7j9Zv/ql+U" "h4CDhh3OBgAAAABJRU5ErkJggg==") index.append('control_repeat') catalog['control_repeat'] = control_repeat #---------------------------------------------------------------------- control_repeat_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwpJ" "REFUOI2lk91rW3UYxz/n5CQnb13apKddkm1dNE1DhtIp2XQIQ8lAh4g3wsCrsTudN/sPFLyR" "CcIGXghe6E29HDqq0BV2IdK91HSF9Cyw1rQ56UsWzGvzds7v58Vqkemdz83z8PC8fuGj8Jzl" "bsiYVIkrKgYQOkg3pKCqCKyFT5TKP+uVv4PzN2XQrZHOGo2z2WgrE/N3Z/1uJy2FpNlXzUrH" "k1/eGy08rI0tDW3Mu1eV9uGA8zdl0Kty+vJLlVxmvHtpwjBSAb8Pr64B0O0NabU7lLasolnz" "z/3w5IWFnuD3u1eVtgbg1khfPlXJnTL615Inp4JeXaM7cGjt20hAd7uITYxxZCSQEqtr1z5I" "FJkrpbrAA1fuhoxljzZyb001r0wnTkS9usbT5oD+UOIIEAJ6tqDVdYiM6ITDYU9z90m02Xdb" "wTevW5pUiWcnG5kJw0h5dY1v71jML20ciiSlOPCSdCLG5x9OM3UykXrxaSmzqh69pykqRjTQ" "mw34fXT6DvNLG3z0Xob0sQBSPmuUEsxyh69vPaK5nyA8GmJEVGcVFUMFQj6XnfbqGr3Bs20z" "8QBCSISQDG3J9Vt/EIvoSClpdm1CQR3N6aSBkPr8mVIK1rbaSAn9oeCrn0psbpZZK3cAEBJ6" "AwfbHgKgAo3WQDXb+wN0t0oum+DL7xcREn57XGdzs4yUgu9uL5NMxBnxutj7s0Nr4DKBhiYF" "Vaup56ea7XPHoxEuvmLwzul3EUJyLj3GTj3Jr8tFPrvyBn6Pi6BPY6WwTc0O5aWgqikC6/5u" "qDDpWS8Gg4HUiXEv67vdw5fePzOBc6BHMupnvVLnUf5hscxrBUVgudbnP20FLnwhI2pt2Nrb" "eDUUjniORfyoioItJKoKr8+Mcnzcx8Z2nds//9LeGYS/KahnFhc+Vh5rAEMb88ftl30XRu9R" "v7N4aTqVSUUnDcaO+LEdyU6txf0ti9WVB8WqmJxb0d5eGNqY/wlT0l06GxdmJmDvznrEftp2" "HLrCazaVcL7izhQsdebfMP0fnP8C9GuCUkaZuZIAAAAASUVORK5CYII=") index.append('control_repeat_blue') catalog['control_repeat_blue'] = control_repeat_blue #---------------------------------------------------------------------- control_rewind = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkZJ" "REFUOI2lkzFLI1EUhY/j0zFvBoIQMAERBKtAKhXb2Oc/bCEYSVD0X6TJFiEEttzG1iZgm0qI" "pBtISCeEICgBM2SSNzPv3buF7qwxbOXt7oHzcQ7cC3xz1r4Kg8HgCEAJQJGZC8wMIvKIqKO1" "bh8eHvb+CxgOh2UiuspkMnkpJWzbBgAopTCbzTAej/tE1Dg+Pv61EmU4HJYHg8FUKcXMzEop" "9n2fp9MpLxYLZmYOgoC73e704eGhvJTgI/bv/f39vG3beHt7QxRFEEIAAJgZURQhl8thPp/j" "8fGxD+DH6elpz/oAlTKZzJK52WwumVutFl5eXiClxN7eXn42m5UAwAIAIipKKaGUQhiGqNd/" "4kNHGIao1WoJLAgCbG9vQylV/Awo2LaNxWKBer0OZgYzI45j1Go1ML+biQhBEMB1XcRxXEgA" "zAwAsCwLUjogMgCAra0tOI4DIdYT6N9KWmt8TuDN53NsbGygWq3AcVysrVkIwxDX19dwHAeW" "9Q6RUmIymSCKIi8BGGM6vu8jlUqBiFCtViDEOogIxhhUKv/2VCqF8XgMY0wnAWit209PT33f" "97GzswOtNc7Pz5PeWmucnZ1hd3cXz8/P8Dyvz8ztBHByctJTSjW63a4/mUyQy+Xgui6EEBBC" "IJ1OI5vNYjQa4f7+3g/DsHFxcdFbOeW7u7tyHMdXBwcH+Ww2i3Q6DWMMXl9fMRqN4HleX2vd" "uLm5SU555Zlub2+PgiAoaa2LRFQwxsAY4xFRZ3Nzs315edn76vnW/AFP9XLbnh0vwAAAAABJ" "RU5ErkJggg==") index.append('control_rewind') catalog['control_rewind'] = control_rewind #---------------------------------------------------------------------- control_rewind_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvlJ" "REFUOI2lk82LW2UUxn/3vfcmN19NJtNkzIx0OpqmIYMyKmOXRUnBf0AsLixFXFmxdiG4UxCE" "oau2i4IbcTWuRVSYDnRZO9XUYoyBmTJ2kvmIoc3N982973Extoi686weDuc8nIfDz+AfVb4q" "s6KYMxQZIPlXuyOalqFprL1nNP8+bzwWp69J3LYoLmc6p5Zz3dJsdLgUtYOiaMEdq1qzH6r8" "eJCq3mlP3Zr41G5eMHpPDE5fk7ijeOH8c81y6ejwbDaTKcSiEZywBcBwNKHb67P9oFGvtaOr" "X20+szbS/HTzgtGzAGyL4vnFZnkxM76UPz4fd8IWQy+gO/ARIGybzGanOJKIFfS9Xy+9vlBn" "dbswBDbM8lWZXX6qU3513n37xMKxnBO2+MP16A4DwEBrGPmatjshm3JIp9Mhd38z547tRvyV" "yw0lirnlmU4pm8kUHi+PJpoPv6gCoBHGnuajL39hpz0iHgkxf3yh8Gx4uySKOWUoMrnYaCkW" "jdAfBww8zcXrGwAEIgzHmvevrB+aCbgDn3QqSUK3lgxFRgHJiOkXnbBFfxTwwfVbiGhENN5E" "c/HKDURARNBacIc+yXgYK+gXgaQCENEAmMrAiU0hgQ9ANGzixNOYlo1ojZbDK0ZegO9PAFBA" "p+upWm/gEbIMVs4VcBLTGMbhJy6/8yJOIo0ybUSEhGNy8LBP1zNrQEeJptVwwxXX7RF3LAIN" "K+dOYlomgQY/ED57axHTstAa4hGLncYubT9ZEU1LGZrG7f1kdXNrq/6wO+LYUQfPFz59M/8k" "98QXPn4jTz4X5fe9Dj9X7tR3KFQNTcPc+vaTbuzMikyr9qR7cP+lZHo69PR0FDDwtaAUpOI2" "2VSY+7uP+Oa773t7Xvrzqnp5fe1d4zcLYOJT+3r3+ciZ1A88urF+9kShVMjNZJg6EsUPhL12" "l9sPGty7u1Fv6ZnVu9ZraxOf2n/ClLe3T83pWinm7y+F9KDoBwFD7dRcI11p2qVqQ538N0z/" "B+c/AfbSfS/7zfqzAAAAAElFTkSuQmCC") index.append('control_rewind_blue') catalog['control_rewind_blue'] = control_rewind_blue #---------------------------------------------------------------------- control_start = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkBJ" "REFUOI2lkzFPIlEQx/9eYDe8kCWbbGFlYmJFpFLj2fEBaO8jHNhIYqt+Aq+ju8IrLc/iSCyu" "kFDgkdCtQLYzQRqFYtd9+GDfm7lC3Quaq5xmksnM7/3nn3nAB2PlbWE4HG4DqAAoM3OJmUFE" "PhG1tNbNra2t3n8BQRDUiKjueV5RCAHbtgEASinEcYzxeDwgosbOzs73d1KCIKgNh8NQKcXM" "zEopjqKIwzDkp6cnZmaWUnK32w07nU7tde7Tq2wiqq+vrzu2bWMymSCOYyRJAq01pJRot9sQ" "QmBzc9OZz+f1q6ur7RQAoOJ5XtG2bURRhNPTbzg7+wEAYGb0+310Ote4v7+HEAJra2vFOI4r" "KYCIykIIKKXAzAAYL3Xc3PTx89fvFCalhOu6UEqVASDz0liybRtxHIOZwfzc3G63cX39B1kA" "QB5ElAKSJCmlCp5fXc7MjJWV1w2xVF8sFtBa/zORiPzZbAbLspZW2Nv7jJOT4yWAEALT6RSL" "xcJPAcaYVhRFyOVyYGZ4noeXA4KUEsfHR6knuVwO4/EYxphW6oHWunl7e/sln88XHcdBtVoF" "AMxmMwDA4+MjqtWvcF0Xd3d38H1/wMzNVMHu7m5PKdXodrtRGIZwXReWZSGbzSKTyaBQKMBx" "HIxGI1xeXkbz+byxv7/fe3fKFxcXtSRJ6hsbG8XV1VUUCgUYY/Dw8IDRaATf9wda68bh4WF6" "yu8+0/n5+baUsqK1LhNRyRgDY4xPRC3LspoHBwe9tzMfir+rWW3xec/YTwAAAABJRU5ErkJg" "gg==") index.append('control_start') catalog['control_start'] = control_start #---------------------------------------------------------------------- control_start_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAudJ" "REFUOI2lk99rW3UYxj/n5CQnP06bNO1JTAu21TWGDEdV6tSboWQg3gtjd8NLN9D9BQq7Eu82" "L9QLb+udIEMH7WBX0m3V1EFMA22pa9K1IWtz8jv5nu/rRV0Z6p3vzfuDl4fneV8eg39E4aZM" "i8mMYeIC8b/HTdHUDU115ZpRe37feFZcuCVO0CK35DbPL2Va+elobzEa9HOiBW9glmudUPHX" "w0RpvTGxNlKU71012qcAF26JEzZ57cqrtUJ+qncp5brZWDRC2LYA6PVHtNoddh9XK+VGdPn7" "rZdW+prf7l012hZA0CJ35WytcNYdXD8zN+uEbYve0KfVVQhgBwNMpyYYH4tl9aM/rn84X2F5" "N9sDHgYKN2V66YVm4b1Z76OF+RczYduidjRgoDRag9bQV5rVjaecmxsnmUyGvIOtjDcIVp13" "v6yaYjKzlG7mU66bDdsWT9sjrn21xmfLWwBohLXNJrfX6+w1+jiRELNz89mX7d28mMyYhomb" "ifUXY9EInYGPCIAA4Ivwy2aT7+78eQIm4HUVyUScMV1fNExcC4hHAioXti2aHYWIgAYR4Ye1" "A1bv73ByyghaC15PkYrbWH4nB8RNABHNSRae9SJgGKdfPmWgBfpDH6VGAJhAszU0y+3uEDto" "op+T8MHrU3zz6TunACLCWDjA4VGH1jBQBpqmaOpVzy56XhsnbCECk24aLeBraHYVX3/y9gkD" "DU7EYq+6T0PFi6KpW4am+uAgXkqHtiuOE8smx2xuXF4AoNVTABy1FTcuL5CKh9iuHfN7cb2y" "x1slQ1MNbP/0eSt28QuZNBuj1uHOG8nJqVAqEUFpQWnBNCHhBEnEguzsH3P75zvtJ8PktyXz" "zbsrHxubFsBIUf5x/1zkYuI+x6t3Ly1k89lM2mViPIryhSeNFg8eV3m08bBS1+nlDev9lZGi" "/J9mOhPcPT+jy/mYOlgM6W5O+T49HS57RrJYC+ZLVfOVf5vp/9j5LwlecWi2Wox8AAAAAElF" "TkSuQmCC") index.append('control_start_blue') catalog['control_start_blue'] = control_start_blue #---------------------------------------------------------------------- control_stop = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAglJ" "REFUOI2lk7FrIlEQxr8Lh4sPOTGsKCJCIJVgtUkd0/s/pBBiFcHm/gDLK9OlvCZtGgsLCytB" "SbdBsRNCIihCXPeZt+t7M9foosndNZlm3gzMx+8b5gFfjG8fG6PR6AxABUCZmUvMDCJyiair" "tW45jvP4T4HxeFwjorpt20UhBCzLAgAopeD7Pl5eXoZEdHt+fn73CWU8HtdGo9FSKcXMzEop" "9jyPl8slv7+/MzOzlJL7/f6y1+vVDgi22L9PTk6KlmXh7e0NzAxmBoDobds21us1BoPBEMDV" "5eXl49FWqGLb9n+HiQiz2QxCCBQKhaLv+xUA+A4ARFQWQkApBSICADSbzUggnU7j+voazAwp" "JVKpFJRSZQA42gqULMtCEATY1gcUux4RQUqJRCKBzWZTigj2cXfDu9i3sKvDMITWGvsW3PV6" "fRGLxRCGIQAgnU4fCO+yEAKLxQJhGLqRgDGm63neRS6Xw2q1AjOjWq3+lSwej+Pp6QnGmG60" "A611azKZDD3PQyaTOdjBzjsRIZ/PYzqdwnXdITO3Di6x0+nUjDG/HMf5cXx8DCklpJQRthAC" "r6+vaLfbXhAEP+v1+t2nU354eKhtNpv66elpMZvNIplMwhiD+XyO5+dnuK471FrfNhqN6JQ/" "fab7+/szKWVFa10mopIxBsYYl4i6sVisdXNz8/hx5kvxB9daiHTqrkSmAAAAAElFTkSuQmCC") index.append('control_stop') catalog['control_stop'] = control_stop #---------------------------------------------------------------------- control_stop_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAs5J" "REFUOI2lk0tvG2UUhp8Zz3h8S33rxHUCSQOJsVyBglCo1E0FciX+AKJiV1ViQ9n0F4DECsGq" "3fEHwhohQEordQltwaGSGSwlVWjHuRgr9Ywdj+2Z77Bw0nDbcaRPOjo6z9Gr99Or8Y+q35I5" "0ZnXdGwgezzuiaKjKdyNj7T2X/e1k+bybcmYBtU1u3dxrezX5lLD1ZQZVUUJ3kh32oN446eD" "XPNhN//DJMS5d0PrPz9w+bZkEjqvX3u1Xa+dHV6dte1KOpUkYRkADIMJfn/AzhO35XRT619t" "vbQRKH6+d0PrGwCmQfXahXb9gj26uXx+MZOwDIbjCP8oRADLjDE3m+fMTLqiHv16892lFus7" "lSHwIFa/JXNr53r1txe96ytLC+WEZfCHN2Y0ESIFSkEQKvxhRHHGolAoxL39rbI3Mt3MW5+7" "uujMr5V6tVnbrpzASkBk6o1CEAGlhKfdgEwyzuL5pcrL1k5NdOYNTccup4PVdCrJYBQRqSn4" "wRd3po0o8qUFPn1/BSXgHYUUcllmVGdV07F1IJuMhdWEZRCMp3QkAqKm77giJSgleMOQbMbC" "iAZVIGsAyPGiiBCJICf6j2ciPFemBIJxRBhOADCAnj/Wnf7R+JJlxggmIQD50sKpD3J6bCZh" "cHA4wB/HHKBniKLjelZj0etferFc5HAQIiJ8/N7y30ClpkoySYPN5i7dMNsQRUfXFO79/Wxz" "a3u7degHLJxNTL9PTkGlpr4sl1P8vtfjl8bD1lMqTU3hxra//cRPX/lMinp34h88fiNbKMZf" "KKbQNY1QCboOuYzJuZzF491nfPPd9/29ceHLpv7m3Y0Ptd8MgEmI8/Xua8kruR95dufu1ZVK" "rVIu2eTPpAgjYa/rc/+Jy6PNB62OKq1vGu9sTEKc/wzTsrlzcV45tXS4vxpXR9UwihiqhONp" "hUbbrDVd/ZV/h+n/xPlPq0eBJ+ktxFQAAAAASUVORK5CYII=") index.append('control_stop_blue') catalog['control_stop_blue'] = control_stop_blue #---------------------------------------------------------------------- creditcards = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk9J" "REFUOI1tks9LVFEUxz/3vTdNjo1OpegYOmiFjT+oQJJZtIhyEUIgQtCiXdA/0LrdbAr6B2rZ" "uhHaJLSJFoIyIcSMg0JMWoipzTN1nHnz7j0t3jg6jF84nAPn3O/3y7lH3X85//pmf+R52LGj" "ACKAGEQEMQImyGIMxgj5ovvh05vZWepw7gxGX1zsuQJYICfDLVkL2vdJdFcecAoOAogCCRSo" "K4kRRJtAWZ+QhC3VcZpAFQoFGR4e5mtul66Oc5Sr+nSfZH+U+W9/mEnFAcjlcoyNjanjviUi" "AKxvH/F2/mejPo6VjX0yC5usbOwT7EiaBJzj4u7oZQAiYZtI2Gagu43CrwPWt4+YScXZ+edx" "FlQ+n5dkMgnA8vIye3t7RCIRbNs+84GIUC6Xq8Vi8XM2m33lVLY+IuffgxFKpSkmJydxHAel" "1JkEAJ7nhePx+KAx5pkj2of69js7OwmFQnhra8jcHFKtYiWT2LeuQvsKVH8ABis8QrxnaiSR" "SFy3nz681LtT6ZvY/Guj2m/QrRQqncba3cUulbBWV+HLAjplY0kZdBVV+03I9nGrvXaTz2w2" "KyPr65DJBCdpDBjD/vQ1orcPQRkQDeJjx1J83xrFalmS54HW4PuNiGby+DULTC0IXQvIT39j" "g2BoCKV1Qx2tOZjs44J9CMavP/SB4OBaHITGx/EGBk4caE1k4h6E4yAGMNDWj+qabnXgui41" "rYmk00ilgngeKholuIhHjTmlFJ7n4bpuM8HS0tITY8y7WCzWblkt5prgui6Li4uP/wOvyUdx" "OavZRAAAAABJRU5ErkJggg==") index.append('creditcards') catalog['creditcards'] = creditcards #---------------------------------------------------------------------- cross = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAi1J" "REFUOI2dkbtOG0EYhc/M7Hpv3l1ILBQcISuiihaJNwCRgoIqVWKlgCahoEKyROtXyCvwIol4" "ALpFdDEoXq8jEPiy9t7mkiKKhW1RJH83Ov93NOf8wD+OOj62n77pnNhqNdTZWfAcnB9+DvLJ" "5Mv0w6edJQPVajWgGTcKLFSnp0sm+eFhoBhC4vpfeZGfjA7ev50Z/IVhGIBpQhItzE9OgjmY" "aCGrOqjUaqj4/kcu8n3VblMCAKrdNuUwmRDbpsR1IUcjyMEAcpJtAQUUWEg9F7rnI4u6yHqx" "WHm4s8jlZUlmEY7aJq8+JtSyGPV8iOEA/PEBquRgrgvd95B1I6RxLIZlVn1zcZEBAHmaUx0d" "mblmJMy2mba6AggJSAlIgSyKkMZ9MeT5DF66Ajk/zwyeV4v7e4lSADc3QKcDCIG0F8tFeMkA" "AJJcbVJKKAQHyhLgHOAcVGPU43xzcX/OYNxsBozKkFk2wEugXgfq6wDnMHwfhGphvL09d2Iy" "BxMWarYD3fOQxj2k/b6QnBNr9QV16q8wjfuY9nrgk/HW+vX11ewH42YzYGChZtnQXQdp9Kft" "kRLVhBEn6XbF+EcHdu0lrFoNVKuEtxubAQBoAICiWFNaBVASaRRj+qsvxkTNCus0dqsi7yaq" "KJjuOCCUgkq+BuBqFuFx/2CPVfRvxWggxwTOYtudRsPUmJ4Yrsvy+4d3G9Ht98VCcbezs9fZ" "3TWXhCcmP1839p7T/2t+Ay4yDJrl8k3tAAAAAElFTkSuQmCC") index.append('cross') catalog['cross'] = cross #---------------------------------------------------------------------- css = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAaxJ" "REFUOI3Fkz9rVFEQxX+7+yDhLQsSwSJhF9IkzWqRaGGTQuv0fge/jK3gN7Cz0SKwTRKsTBHY" "sMEkYJA1RFiyLnm5784fi/veGsUugheGw2XmnDvMnNtoNFvc5TTvxP4XAo3d3df+t4SZYOa4" "C2aKWYmIoipARESIMZIBLC8/nBPdHXerIgm4G2Y6RzPDXTk62kkCACH8wN2rZCpIJK1IdaSO" "Fhc7xFgkgaRs5Pk9ut0Nrq8nXFyM6PWeYBY5PHxHv79Nq5VxfDxgMvmCWUQk0BSJc+Vud4Oz" "s4+I3NDrPeb0dI/Z7Durq08RCYxGO+T5EiIR1UiMgaaq4C6oRgCm0zEnJ3sUxYT19We020uM" "x0M6nQesrT3n6uorqulRkRuaZgWqQhIC1YhIZDj8wP7+G9ydlZVHDAavOD//RL+/jVmsOIEs" "xoCZoFoSY8Hm5gtiDJTljDy/j5kwnX5ja+slZsLl5WdUZT7UTCRUaiUHB29/m3QdtzdSDzyh" "kIUQMIssLLRvFf/ae32vfQE1Jv9lIgXD4XtEkrvcAyKOWYmZVu0K4BX+YeX//ht/AgYVj0lu" "Ur2gAAAAAElFTkSuQmCC") index.append('css') catalog['css'] = css #---------------------------------------------------------------------- css_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAixJ" "REFUOI3Vkk1IlFEUhp/PmZjPbxoLA/GnkSxUCjXUChMXkbgRCloEbdsKrYIQ2rZw01awTatW" "bsQW/QkuGkVaJGWOaKlQ5A9ak6M5fnPPPbfFp0LQwm0XXu7inPc5h8ML//3zMpkh96+CqqDq" "cE5QtagWEbFYK4BBRDDGEAeorm4+NDrncE73FQGcU1Tt4a+qOGeZmxuLAABhuI1zbr8YNUQm" "u286ULSR76cwphABIrISBCdJp9vY3c2xvj5Pbe1lVA0zM6M0Nd0gFouzsDBOLvcVVYNISImI" "OSSn020sL08hskdt7SWWlibY2dmkru4qIiHz82MEQTkiBmsNxoSUWCs4J1hrAMjnV1lcnKBQ" "yNHYeJ1kspzV1SypVAUNDd1sbX3H2mioyB5x1QLWChEIrDVYa8lmX6JqaW29TU1NC0PDD/jy" "c438bp698DcXKs8Q2JC4MSGqgrVFjCnQ3n4HY0KKxR2C4BSqwujkM9a9Ta51dXC6vJ7x2RGm" "Pr3F/6HERcL9DYpMTw//dekDvXr/hlu9vdgSy8WqHsayw3Q0dzI88pySMAxRNSQSSRKJJL6f" "xPdT+H6K0tIygqCMzfwGx7zj3Dx/D4D73U84V9GCdY64SIFs9gUiUbqcCxFxqBZRjZL3K7/B" "7MokH1Yy9Pc8ZeD1XfxYgpjn4R0l71f6qh6lz5542NnSRX1lK5/Xppn8mOHb8tbjIwEiSOUA" "ntfnQcrBNs4Nvhtc6/8Dh0J8xTtya4AAAAAASUVORK5CYII=") index.append('css_add') catalog['css_add'] = css_add #---------------------------------------------------------------------- css_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhlJ" "REFUOI3VksFLVFEUxn/OvHR606BZRCozNkG2yAK1ghYR1KqgZRi0ahW4bCUE4SLaBkFEf0OL" "QogiBgobodooCSMKaljmSMWkDvPmzj333BZvmgpauO3Cx12c+/3O4Z4P/vvTViw+8v8qqAqq" "Hu8FVYdqAxGHcwJYRARrLQFAb+/xltF7j/faVAzwXlF1rVtV8d4xP1+IAQDGbOO9bxbjB7HJ" "NU2/FE+USmWwNooBMVkJwy6y2WFqtQobGwvkcqdQtczNTTI4eJlkMmBx8RWVyiqqFhFDQsS2" "yNnsMCsrbxGpk8udZHl5mmr1G/n8GUQMCwsFwrAbEYtzFmsNCecE7wXnLABbW+ssLU0TRRWO" "Hj1POt3N+nqJTOYAAwMX2Nxcw7m4qUidQDXCOSEGgXMW5xyl0gtUHUNDV+jrO8HUvWskZt9h" "1lbRzgz10+dwoSGw1qAqONfA2oiRkatYa2g0qoThPlSF1Sf32Vv+xJHRMTryx4g+vKRULNCV" "rBOImOYEDWZmHv/10y09fcDZ6+Okll7D1B3Czi4O5fopF98TGGNQtXR0pP9Y2++9e++IKj9I" "HczDpZutvAQTPeyuNghEIkql54jE6fLeIOJRbaAaJ+9wuIva7DPSk2OYqEwN2N5KUk+307aT" "vL8Z7Zlo35O+ld3vgiDxme2vwsdy0jXqentHgBiSHa99/3IjoW39mvBrin94saB3fwI3x48B" "j2QMqAAAAABJRU5ErkJggg==") index.append('css_delete') catalog['css_delete'] = css_delete #---------------------------------------------------------------------- css_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhpJ" "REFUOI3Vkk9IlGEQh591l1x2NcqERNwFjRBTwfxDRXgx6lYH6VCnrgXdxYg6VOfoFEHHyEOX" "CIIOSR7c7BAZSYmmLim5CMWiru5+3zszb4dvXTp08NrAMDAzv4dhZuC/t9j09BP/r4KZYObx" "XjBTzEJEFFUBHCKCc44EQGtrb03ovcd7q3oE8N4w01o0M7xX5uffRgCAINjGe18tRg2RSKui" "PY8mSiYbca4cASKykUodIpPpZ3e3yMbGAtnsEGaOublX9PRcJB5PsLj4jmJxFTOHSECdiKuR" "M5l+8vkPiFTIZgdZWclRKv2ivf0Mt15e4ubzYQ4kGxFxqDqcC6hTFbwXVB0AW1sFlpdzlMtF" "OjtHSKebKBS+EaijrbmLO5PXCaSMmSJSIWFWRlWIQKDqUFXuvr6KN0fohVCE1sPH6Wo5xXZl" "h4dfHzF2chzVgIRzAWaCaohzZQYGruBcwLOlx5zvvoZ6Q00xPOuba/S2naUUlhmfGeNycpCE" "SFCdIGR29kVtHxUJUW/8+P0dZ4KYw6ljK9imLzNMye3yNJ8jEQQBZo76+vRfZzMqUkFUOHow" "i5ii3ihsrtLU0MKntRxf1j4zmu4jNjFxw3sfIhJ9l/cBIp43NkslDAktpCIhx5q7Od1xgY+r" "75lZmmK0oYcj8RSx/f78iXuxnaHsSGpqcfKni3Fu/T4LwP4B7bfZUR9PBWjHxgPye/k/rR2U" "NMh1fdQAAAAASUVORK5CYII=") index.append('css_go') catalog['css_go'] = css_go #---------------------------------------------------------------------- css_valid = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjJJ" "REFUOI2tkk1L1FEUxn8zDmUzTKWWouMMSaGQkwutIAIhK1oZFBlBrdu06gvUV2grzL5FGdmi" "IgRXSqsMjDElX2is0QwGZ4YZ7/+ee26LecGdER24POfAeZ7z3HNviH+M65mxCRE7Gf6b5vtv" "b/XefXn7cqO+lrly09rgeaKruy10EPnB9MQZG9hBY80ra/WGNXutgXOvuzu7WjY2c6UDHQQi" "bSYwU8mTvWEbBB8C1elTvcmWjc1cyUt4ODQ5/8QDqHpUFaeKOocVQcQhYvm1t0velzgWj1Ou" "VPiZ32Iw1sUhwkQGNUFPz7nmRO893mv9eLwXvFc+73wl82WKkA/x9OJDTrQeZWlphkiDaEwJ" "72suamSHqmvi6dYOHp+9A1454gTnLNZWawLeK6pKNHqcZHKYSqXA9vYyqdQFVC2Li29Ip8cZ" "aomwsjJLofAdVYuIISxiUXWoCsnkMOvrHxHZI5U6z9raHOXyb/r6LiFiWF6eIRptR8TWHRjC" "zgne1ywBFIt5VlfnqFYLDAyMEYu1k89nicc76e+/yu7uD5yrDRXZI6xaxTmhJgTOWUQs2ex7" "5uczeO9JJIaYnX1GLveJdHocVVvnGCLWGlQF5wKsrTIycg9rDUFQJhrtQFUoFrcYHX2EqrCz" "8w3npH5tR0TE1NUCFhZeNPfRaNj/Et675sJrKESMMahaDh+O7WvWeq7NuvEvoIEegIhIlWz2" "HSIWEcF7g4hHNUDV1e0K4Ov4n+MPYk/BOUmcYdEAAAAASUVORK5CYII=") index.append('css_valid') catalog['css_valid'] = css_valid #---------------------------------------------------------------------- cup = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAklJ" "REFUOI3Fk79rE2EYxz/v3SVN0yalF/BIxaC1CFKoQsGIYLG9FoqjoJOSri5uTuLkWPBfEHGs" "m4ODCMFBpUtbpwshWA017RFsk7tLetfc+zqUhAql4OSzPQ883+fX54H/beKk4zjOjBDiqZQS" "pRRSyoxSCsDrx+I4Xp2dnf32l0ClUplTSr1JJpOFbDaLEMe6Qoi+EABSSprNJkEQ/FRKPSoW" "i5+E4zg28MGyLNHrePzY+Irn/qLtNuiFXQASqTSZc3my1nkK14qoxBC1Wk1JKZeE4zgblmVd" "Hx0d5f3L59S+fDxz5su3bOYfP6Pb7VKtVjf1Uqm0ur29PTQ5OcnUzTsEXguAOApRvR5CaAxl" "xsgVprh4Y44rc3cZHjORUuK6btqoVCrtxcXFTBiGJBIJbpeeoOs6AEEQnNqF67rouo5Sqmns" "7+9/tizrPoDv+9TrdUzTHIgAg0WGYcje3h65XI6joyOklO/0brfbXllZeQjQarXwfR8pJXEc" "E0URYRjS6XTwfR/P8zg8PMQ0TXZ2dlBKLRlbW1vtfnXXdRkZGcEwDJRSg8qapqHrOrquUygU" "MAyDXq/3e2Fhwdc8z5PVanUznU5jWRYAmqb9ldT3x8fHSSaTtFotpJQv+iANG4Yxs7a29mp6" "evpqEATk8/njS8Rxnz4SiQSpVIrd3V0ajUbZtu35kygLIF0ul18bhnFvYmJCmKZJHMf0ET44" "OKBeryvgrW3bD079BYD19fULURR9V0rpUsoBxkqpOIqiS8vLy/UzSftX+wM9djfziZ3Q7AAA" "AABJRU5ErkJggg==") index.append('cup') catalog['cup'] = cup #---------------------------------------------------------------------- cup_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqFJ" "REFUOI3Fk09oVGcUxX/f+2Yyr5NMJBPqU6zBxj/VgIltWpMGDSlJEFwUsnApwV2r1I0IgrgP" "iF26cOuuUChxYVHKQK3RjouE0LRvnA5JDEyTlyGT+ObN+GbefNdFUQzabj27e+H8uOfAhfct" "9ebgum6vUuqyMQYRwRiTEhEA/9Wu2Wxe7+/vn98GyOVywyJyu6Wlpau9vR2l/uUqpV6BADDG" "UCqVCILgmYicHRgY+FW5rjsK3HccR0VVn+XZx/hekefeP0RhDYC4nSS1czftzh66+gaQeIJC" "oSDGmHHluu6s4zjH2trauPv9NQqPfvnfzPuHRvnq26vUajXy+fycnpycvL60tJTo7u7mwOAI" "gb8FQLMeIlGEUhaJ1A46uw6w7/gwh4ZP88GONMYYPM9LxnK53POxsbFUGIbE43FOTl5Eaw1A" "EATvvMLzPLTWiEgpVi6XZxzHOQNQqVRYWVkhnU6/hgCviwzDkLW1NTo7O2k0Ghhj7qiRkZFT" "mUzmZ4D19XU8z8O2bWKxGCKCiBBFEb/nM8w9e4hf26LeCPnkw88Y/Hg8pTo6Or7c2NiYqVQq" "LC8v09raus1sjOHBn3dZrD6h/8jnfJQ+SGbhJx7/8YDFv0s3LN/3TT6fn0smkziOA4BlWViW" "hdYarTWZhTscO9xH02rSt3ucpmoweHQIkAtWFEXzPT0930xPT/9VLpfZ3NxEa00sFkMphWVZ" "rG+tEldtfH3kOwAujd5i/85eFMq2gFoURdmJiYkvisXij0EQSLVaxbZtbNsmkUjgB5ssFGeY" "un8OgKl75yh48wjyYtsvAGSz2b31en1RRLQxBmMM9xZ+4OmLDEO9Jzi461Pyq7PMzP/GyuLW" "jbcA/6Xj53dNodR5BSkBH5Gb2ZurV14C3e1METMqVboAAAAASUVORK5CYII=") index.append('cup_add') catalog['cup_add'] = cup_add #---------------------------------------------------------------------- cup_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqFJ" "REFUOI3Fk0FoVFcUhr9775tknGQimZS+NiVpTKOLCK0SMLbQMMWotHRjoYgLybIKVnAhtEi7" "LAWhW1ddiNpdESKlrVEy2KISBCXS5k2H0YkxmrzETJo3L9M3ee9cFxJpaOu2/+4/cD7O+TkH" "/m+pvxvP895USp0UEay1iEjWWgsQrNeSJDk9MDAwuQFQLBaHrLXnmpqautva2lDqGVcptQ4C" "QERYXFwkDMMH1trDg4OD15TneXuAMdd1VbwaMH37JoH/iBX/MXFUByCVzpB9+VXa3NfofmsQ" "m2qmXC5bEdmrPM+77brujtbWVn785gvKN66+cOc33tnDe0dPUa/XKZVKd8zIyMjpSqXS3Nvb" "S9/uPGHwJwBJI8LGMUppmrOb6ejuo2fXENuGPmDT5hwigu/7GadYLK4MDw9noygilUrx7shx" "jDEAhGH4r1P4vo8xBmvtolOtVq+7rvsxQK1WY2Zmhlwu9xwCPA8yiiLm5+fp6OhgbW0NEbmk" "8vn8/vHx8Z8AFhYW8H2fdDqN4zhYa7HWEscxQeEC4bXvaDyuoF9yYceHqN0Hs6q9vf3tpaWl" "67VajenpaVpaWjY0iwgr4+dh6me25Q/QvGU79cnL/P7rVZanfjuugyCQUql0J5PJ4LouAFpr" "tNYYYzDG8GTsW7bmD5AuF1BnD5G5d5Ge7nYS7Akdx/Fkf3//kdHR0alqtcry8jLGGBzHQSmF" "1hrxZ0m/sgU+HYWvl+Dzezihh7GqZ/2UFZApFApnHcf5qLOzU+VyOZIkQUS4e2wnu/btp+XB" "D0T1OVaBYMUwVWZ2wy8ATExMdDUajfvWWiMiiAj61vek/xijK9fA0Q8JFmIqcyZp/CVf/gPw" "X/rlYNdnq08efaJFvS7azgr2zPtX5KunNqFJ5gM1CoQAAAAASUVORK5CYII=") index.append('cup_delete') catalog['cup_delete'] = cup_delete #---------------------------------------------------------------------- cup_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArpJ" "REFUOI3Fk8trVHcUxz+/uXNnknnGGOdqpIlOIhJCDTYNcWF0hokt2sdG7U6CSxHctNI/wEUV" "uy/Y2lKyCaQBF4ILH4yvqIiaWNQZhpE8dKbcjBkzd66TO4/frws7JVKy7tkczoHzOXwP3wP/" "d4i1RSqV2iWEOC2lRCmFlDKolAKwmr1Go3F+cHDw6QeAdDq9Tyk17vF4ukKhEEK85wohmiAA" "pJQUCgVs215QSh0bHh6+JVKpVAK4ahiGqL+zmH9yH8vMUTLz1J0KAHqLj2BkCyFjK10Dwyjd" "SzabVVLKA27gR8MwRCAQ4MqFc2TvXV9Xb2e3wl/sRQt8TGvhpnA2jvyqjY2NnZ+bm/NGo1F6" "98SwrRUAGlUHVa8jhAtvMEzfUJCh+B42bP+Kzk8O0uIzMJ9cC7nT6XRpdHQ06DgOuq4zMnYK" "TdMAsG0bgPqba2jV5/iDu1nOvsAjqgRDmwmEI7iLxeK0YRhHAcrlMouLi7S3t/8LkSv30Vef" "Eo5+jpOfwOMTzM+kqDU0ipti466pqamLTY2VSgUpJeVyGdu2sXI30CvThHsOsZr7GaEX0QNB" "WhoFSptHkf4tJ12zs7Ol5nbTNPH7/Xi9XqyFG7RWHxPu/ZrV1z/h0mtUS9swb8/g/vRbqp6O" "5Xg8XnZZliUzmcyMz+fDMAwArIUkWiVFpP8Lqn/9guZROKVuzDuP8SXOUtY2IaU80zRSq9vt" "3jU5Oflbf39/3/yjS3SG31IXETa232VDxMPqykcsP3xB22c/sGRDPp9PJhKJ+ForC8CXTCZ/" "Nx+cOXz0xEXSE9+Rm5vG2zUAtqRj//e8WlEK+CORSHzTvJvrn6wAOxaLHUln8vXqs8tsHxjB" "799JbiaDs+MYr0s0arVa99rh/zwTwJG9bZXBHsM91BdF6c60s7R0/Muzf75cz51/A4HaNAlx" "1ICiAAAAAElFTkSuQmCC") index.append('cup_edit') catalog['cup_edit'] = cup_edit #---------------------------------------------------------------------- cup_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAq5J" "REFUOI3Fk09oHHUUxz+/mf2X3ew21rbTok0xWoMRa8seIsVql0a9eNGCF5Fc9eJB8FR78OAl" "BY+e9KDFW3NZD0JEjSIqW2uzgbqzLkvSQFsc153Nzkymm8y856EEUwSvPvgevo/HB77wffB/" "j9lrXNc9YYx5V0RQVUSkrKoAwe4uTdNL1Wp19T5Au91+TlUv53K5yUqlgjH3uMaYXRAAIkKv" "1yOKog1VfWN2dvZ747ruOeArx3FMshVw8/rPBN5tht4dklEMQLZQpHzoCBXnISafnkWzebrd" "rorIC8Z13euO45wcHx/nyw8v0v3p6//M/Ojpc9TeukAcx3Q6nRV7fn7+0vr6en5qaorHnjlL" "FGwCkG6P0CTBGItjTzlUX3yY8tFnOX7mZcb27UdE8DyvmGm328O5ubnyaDQim81yZv5tbNsG" "IIoiNL3LsLVA+fBp9kcDSseO43ketm2jqj3L9/0fHcehUCgQxzFra2v0+302NzdJkoTo1hKl" "A1UqR04RbnxL98Z32LbNzs4OIvKFtbi4+MluvjiOERHCMCSKIoJel/DmEuUDE6TDOoeefB3r" "z2/IZiw8zwN4z2o2m0OAMAzxPI9SqUQ+n8eyDDt3ljg4/Qrc/ZXGZ58zPhFj/N9I/mqSJEm/" "VquFVhAE0ul0VorFIo7jAGBZFumgRU5HlB/YQkZroEIaXuWRs+/Qb16GbX8BwEqSZHVmZubN" "er3e8n2fwWCAZZSoc4WJyZPI1ioqMdXz08j2bQqF3zk49Ty55gf5vVU2QHF5efnTTCbz6oNp" "yxRNwOHHx0jDBqrbXFtsUT3/BMbeB2MvcfXjC55JpHbfLwA0Go2j8svFjROvfYRtraOJD+ie" "Cwt7bJo/bqzQrr9/5V8AgB8WTvU0kaKKoiL3pMo/XkEERK/9DR+wZXpo+af/AAAAAElFTkSu" "QmCC") index.append('cup_error') catalog['cup_error'] = cup_error #---------------------------------------------------------------------- cup_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAq9J" "REFUOI3Fk81rVGcYxX/v3DvJmGQm4NfVmKR1YgUjxkDEiNYwJdHSLlrovgzd6UIXRV34sRAU" "F4Ib/wJx6you1LY2QdJUh1KTLNo7HYaJitHexEwmM9eZufe9z+tCIkrBbc/uOYvf4YFz4P+W" "ev9wXXdAKXVaRDDGICJJYwxAdc2Loujq0NDQ3AeAfD4/Yoy52dLS0ptKpVDqLVcptQYCQERY" "WlrC9/2nxpjvh4eHHyjXdUeBnx3HUfp1lSePH1L1Flj1XqCbdQDiiTaSm7eScrbRu3cYE2+l" "WCwaETmiXNd97DjOYEdHB3euXaD4+/2P/tx3cJQvjp+jXq9TKBRmrGw2e3V+fr41nU6z40AG" "v1oBIAqaGK1RKkZrspMNvTv4dP8IO0e+Zl3nekQEz/Pa7Hw+vzo2NpZsNpvE43EOZ09iWRYA" "vu+/S75451v85gyXe7J4nodlWRhjlmLlcnnacRwSiQT1ep1SqcTy8jKVSgWtNVprwjCkoQO6" "N+7ixK0MwltPRG6rTCbz5cTExF2AxcVFPM8jkUhw/dEPGAkJRBNoTdf6zxjo/pzc/K/MPc9x" "Zu8NLOJJe3Z2dhWgVqvheR7t7e3Yto2WgCO7s0RGiCRCMCxUnrGn+xC1oM7Zh98QqYZlV6tV" "KRQKM319fYOO41Cr1YjFYjR0QGSEJ68KhKLREhJGIavNKoM9h6mFr3lUmnoV01rP9ff3Hxsf" "H/+7XC6zsrKCZVk0dAMdaZxUL1tSn7C1M03cWsem5Db+fPYbU8WpRT9k31qVFdA2OTl5w7bt" "77q6utSpe2M0goBAAho6IL2xnwPpo/zxdJpf8j+9DCJGX17hrw+2AJDL5XqCICgZYywReVfj" "H6e/YqD7EJP/3H8eKkYXLpH/z5g+pu3n8SNjtTWJ0v9eprTmvwF4sGf3/agM2gAAAABJRU5E" "rkJggg==") index.append('cup_go') catalog['cup_go'] = cup_go #---------------------------------------------------------------------- cup_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAq1J" "REFUOI3Fk0FoU3ccxz//914STdpEO+mzVYN2BdFCp0TMlE0cttCz4KUqKWMMdtltXmTHISh6" "lV2U4kG0Fj1MBIvS7VBnL9qBy0tiamrE1iwua15eXt/Ly//vQVqUOa/73n4/fny+/Pj9vvB/" "S7xbWJY1KIT4QUqJUgopZadSCsBe7bXb7XOpVOqP9wC5XO6QUupKOBxOxuNxhHjLFUKsggCQ" "UlKtVnEc57lS6mQ6nf5NWJZ1BJgyTVMETZuFR79jV15SrywSeC4AoXVROrt7iJtbSH6WRoUi" "FItFJaUcFpZlPTJNc09HRwd3LvxI8cG9j+786cEjfPXdaVzXpVAoPNYzmcy5UqkU6evro//z" "wzj2MgBt30MFAUJoRDoTfJLsZ286Qd+OFWTLR9/QT6VSiRq5XK4+NDTU6XkeoVCILzPfo+s6" "AI7jrDk3s9eI6FkSu0f56+FFXrshlNpcNWq12oxpmscAGo0G5XKZrq6uNQjASvEXIq0ZEruH" "cRbuEI4lCc3fwKsn87rruvWxsbETAMvLyzQaDaSUtNttfN/H8zyC0k269w0hXQsjtgXp19mw" "04SnM93G3NxcfdW9UqkQi8UwDAOl1NoJVdikVSuh6VWE5hCOV2GlSePliqbZti0LhcLjaDSK" "aZoAaJqGpmkIex4te4b1xjwyeAKtF9BaQnlNslfzQTa/9K0A1huGMTgxMXF5YGBgl+M49PT0" "0CrfJ1i4jbn/EMq/i2jbZKc89GYIZMt/kn02enz8+eTqKwsgOj09PW4YxtHe3l4Rzp9l0+AB" "/OpFDCOB9avPAodVPLnnVmTy68wXl17b/8oCwOzs7Dbf959t/vuSvi3dT/DPA/6csllcNyzD" "W1PbR0ZGyv8Zpnf18Hzqp46NG79xak33af7VqdGfi9c/NPcGKaZLcEMEB5sAAAAASUVORK5C" "YII=") index.append('cup_key') catalog['cup_key'] = cup_key #---------------------------------------------------------------------- cup_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsVJ" "REFUOI3F089LI2cYwPHvO5k41agJxnasFS0mFKpYtwi1BOsP1raxtwoLsiBSodJeerGelv0L" "Vnr27m0vgntooRZJF2pBh1330kmCoElMzBjX1jjVMZP37aEoFcpe97k97+HzPO/D88DrDvHf" "xLbtD4QQS1JKlFJIKVuUUgDV67d6vf5oaGjoxS0gnU6PKqVWGxoaultbWxHiX1cIcQ0BIKWk" "Uqngum5OKTU7PDz8q7Bt+y7ws2mawv+7ysGz36k6Rc6cEr53AUDwjSZa3nqbVvMdugeHUUGD" "vb09JaX8VNi2/cw0zTvNzc38+MND9rZ+eeWfY4m7THz7gIuLC7LZ7PPA3Nzco/39faO3t5f4" "x+O41b8AqF95KN9HCA2jJUy0O867H43y3ugXNIbbkFLiOE6Tnk6nzyYnJ1s8zyMYDPLJ3HcE" "AgEAXNf93y4cxyEQCKCUquinp6e/maZ5D+D8/Jx8Pk9bW9sNAtwM0vM8yuUy0WiUWq2GlPKJ" "GB8f/3xzc/MngOPjYwqFAplMhnw+TzQaxXEcEokEjY2NbGxsYJomJycnhMNhDg8PTX13d/fs" "unqxWCSVSqFpGrOzs7iuS6FQYHt7G13XmZ6eRtd1SqUSlmWxs7PzvV6tVmU2m30ei8Xu5HI5" "HMfh3v37rKysYFkWHR0dDAwMUCqVWF5e5ujoiMHBQZLJJAcHBwua7/sv+vr6vllfX//DsixC" "oRAA8/PzXF1dMTMzw8jICFNTUySTSTzPI5FIPAWIRCLG9SoLoGlpaenp5eXlh18tLLD2+DFb" "W1tomnaDuq5LrVaTkUhkY3Fx8bPV1dU/b91Cf3//+/F4/MnExESsq6sLTdMol8tkMhkMw6Cn" "pwfTNPF9/2Uul9NSqdTRLQAIjI2NDYRCobXOzs43DcMIKKW0SqXytRDisL29fQ0Iep5XLxaL" "x67rfvkPBzZQhBiV7eYAAAAASUVORK5CYII=") index.append('cup_link') catalog['cup_link'] = cup_link #---------------------------------------------------------------------- cursor = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAZZJ" "REFUOI2d0D1LQmEUB/B/3UtZDi0O4rt4/QAXh7boA/QVmkUI4vpQBkESJFqQBoGbq9Cgtggu" "TupyIYWLk1MERiIIDqLe58WmIC6Z5RnPOfz4nwNYStf1K2vvt9q0NoQQ161W63ptgDEGh8Nx" "Va/Xb9YCOOfw+XxwOp2X1Wo1vVYCAHC5XHC73ReVSuXu3wDnHJxzeL1eeDyes2KxuBT5ERBC" "gDEG0zTh9/sRCATOCoXC/b8BSilmsxmCwSAURYnn8/mHPwNfZwghAAChUAjhcPg0m80+rgRk" "WYYsy5AkCZIkoVwuT0ql0othGCal9CSVSj0uBSil6Pf7qNVq89FoBLvdDkrp7nw+PyKEbCcS" "iQ2bzXauadrO0gTNZvPDNM2DRqPxOhwOoarqxmKxyHztEEKmuVxuugzQhRD7sVhMZ4xp3W4X" "qqqCUnqcyWT2Vj5xPB4fRqPRNwDQNO251+t9DAYDRCKRzclkoq0ECCFTS6LzTqcDRVHAGIsn" "k8mt73PZCvxw0pNhGLftdvudMVZNp9Pm9/knqKDhmC8VkJcAAAAASUVORK5CYII=") index.append('cursor') catalog['cursor'] = cursor #---------------------------------------------------------------------- cut = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjtJ" "REFUOI1jYMADVNKna9lWLZvHkDaTFZcaJnwGSIvw2XuZqLrJvP/CgiJRXw/Xh9cAFiYWVjE+" "TpGvgjxsMDGltJm6Pqz6m4kygJmFiU2Qh4udg4GBn4GBgUEqqV+9IMBiu7QwDyPcEnwGsDEz" "sgvxcDAw//3NJhjeI1sf7rz17z+Gv+tO3EoizgXMzJx8XOwMTCzM9nXRTuu0ZEQUOjYcjXq9" "MOcFPn1wENy5qfPyo4//+zaf/3bn5df/ZmWLctDV4HABJJTZ2JiZuNhZGNSkhDlbVx9eeKor" "bgq6SpQwEHZJkpJXsZrILyaq/urVvEt87Gyan7//Zlh1+MqxRetPpmCzCm6AqH2WhK6l20E5" "XR2Vz18+f1ExtdQ1Yn/HIMjNwfDjx/fv3L+v235lYNiPbgAzjKHhlbZA2cjAatfy6Q4Pr5zb" "rqxvGSHP9Y/h+U9Whle8ikoqembx7779evrpztlzWMNAXFHJ7fHNyztfbJp4SEZZ04ONmZnh" "5pO3/w89+cZwdNmSQx+e378ip+YxgcHengOrAb9//Pgqpapn5NC49qiJZ1jGhb37bx4+/fjt" "yyf3v1xZnGt/8+T+xWycnNxCP8WEsRpw8+LB/O9fPrBIqWhZXti288yVE+sd/v35/Y2Nm5ed" "Q8tFjl9EQu3f379//37/9RVbYMIDUtw9XQHG14ubdyx50/P//hP3P01affe/YeLCG+h6GNEF" "UICKB7uBbcQFPhFRhW8f3r28cW6lyZezW94gKwEAu8TLuuvYe8AAAAAASUVORK5CYII=") index.append('cut') catalog['cut'] = cut #---------------------------------------------------------------------- cut_red = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjFJ" "REFUOI1jYMADVHLnGDrVrVzIkDaTFZcaJnwGyPJxW3gYKdnLvP/CgiyuFVrPRpQBbKzMbCI8" "XOLMXEzsMDGljGk6itpaR4kygJmJiU2Ql5ODkZmVn4GBgUEkdrJapLXufgkBbuK8wMbKxC7E" "w8nwl4mBRyiuVzrf0/CgkqTQt/+MTNOJdAEzBy8XOwMzA7NVpovpfkdDFbGNx67OmpfvNQ+f" "PjgI797UeeXRx/99G89+efD663+vuqVz0dVgdUE9VJyZiYmdk4OVQU1GhLt20Z4D25qik9HV" "okRPtwCDvLSYVJUIn4DxnOfP9p7lZrf5/O0Xw6rDV4/tOn/LB5tlLMia9VS1d4gJCmr8/vHt" "s6yhvvE/FVkGQS42ht+MLL+Y2NkNGBj+H2NgYPyP1Quy4rK1woICGodOn7E+duVK4t8/fxiY" "GJkZjj76wdC6u81hx4MVR2ZK8GfgDAMpUZGAhy+eb8h//+OYhJCI2z8OdoabT9//N2gOZjhy" "5dq891+/XFVRkC+rl2TgwmrA77//PskICpttMlA5ZKqmmnbr1t3Dtr1RZz+8/fCZ48GrtDuP" "Hy/m5uRSEPjGLobVgFsPHrT++/tXWFZQ2Pbsvfsb7z14GMb0798TVmYW7gdcDKLcPFxyf//8" "/fn3788v2AITGpAc8j28bGqrGBiYGRgYGGZJCxXc9Hb4v99U++5Fd9v/K9Vkl+DUjA3USzJw" "LVOTnn/SzuT7el2lnR2cDDLoagC6MLeyQGvuwgAAAABJRU5ErkJggg==") index.append('cut_red') catalog['cut_red'] = cut_red #---------------------------------------------------------------------- database = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdVJ" "REFUOI2lkr+qGkEUxr/dHdllJaTyz2IhwQRiAml8ijS3uSBJlzewsssj5BFMEVME8wCCYEgT" "sNzGIkUaBeVqsaILsuvMOSfVLF5UUuQ0M2fmfL/zHWaA/wznPBmPx75S6g7AeyJ6KSIvADAz" "z0Xkj4h8zrLsR7fbpQvAdDp9xczfqtXqm3q9jnK5jDAMISLY7/dI0xTL5RLb7fYXM7/rdrur" "R1Ymk8nPxWIhzCy3QmstcRzLaDT6YnXuGeN1rVb758yNRgNE9Nbmym6YGSKCzWaDIAjg+z5K" "pRJEBMfjEUmSYLVaodVqgZlxASAiiAiUUtjtdsiyDCICYwwOhwPyPIdSCiICEbkE2AvP8xAE" "AZRSUEpBaw1jTCFiZhDRJcCOYIwpRI7jgIiKM9d1ISLXR7AOrMAYA8/zQETQWkNrDc/ziiY3" "HdhiIioA1oFtchPAzEV3C7SrnZuZked5ASj+gTEGSZKgUqnA9/1Hb+84DqIoQqfTwXq9vu6A" "iD7MZrPv7Xa73Gw24fs+HMeBiCCKIqRpivl8jjiOH4joroCfdxoOh8+Y+aOI3Luu+zQMw8JZ" "lmUPWuuvnud96vf726uA8xgMBk9Op9NzYwyLyO9er5dfq/sLg994i8xMQqcAAAAASUVORK5C" "YII=") index.append('database') catalog['database'] = database #---------------------------------------------------------------------- database_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkpJ" "REFUOI2lkzFoU0EYx//33oX3SCyK2DSlQpBYaJS2ukgp4qAUcekiBN10tTg52KGLKKiDawep" "iAGROIhTIdJSh9CIKFHbQouKNCWlKZqYxIaX3N33Ob2QEMXBb7rvjv/v/v/7OOA/S7Q38/Pz" "jpRyEsBlY8wQMw8CICJaZeYvzPzI87zFRCJhugALCwvHiOhZOBweiUQiCIVCCAaDYGZUKhXU" "ajXk83ns7u5miOhSIpEodFhJp9NLm5ubTET8t1JKcS6X41Qq9cTXWW2M4319ff/MPDAwAGPM" "Bb+X/oKIwMwoFotwXReO4yAQCICZUa/XUSqVUCgUEIvFQEToAhhjwMyQUqJcLsPzPDAztNao" "VqtoNBqQUoKZwczdAP/Atm24rgspJaSUUEpBa90SERGMMd0AP4LWuiUSQsAY09qzLAvM/OcI" "vgNfoLWGbdswxkAphfXie3z9uYJfuSrq9b1D528Oz6Tvr9zpcqCUglIKxpgW4MNWBj8CGzh7" "ZgyHDw5iae2leLNavH1qqv+A1Q4gotbt/qMSEd7lX+PE0CiMZTDaPwEjFMaGxwHwVAugtUap" "VEJvby8cx+mY/fdqEQGxD5Px6wCAG+ceIhYegYBw28d4JZvNPo/H46FoNArHcSCEADOjtlfB" "2vYyPm5nMD3xGPdeXYVrO2Cw1/GZksnkESKaYeaLlmXtDwaD0Fpjcf0Fyj0rGB85jcHISXze" "yWH5UwZb3yoPOgDtNTc319NsNo9qrYmZ159u3L0FIa4JoIeBGphn387uTP8GbcWBhGWdLyMA" "AAAASUVORK5CYII=") index.append('database_add') catalog['database_add'] = database_add #---------------------------------------------------------------------- database_connect = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqtJ" "REFUOI2lkk9rXGUUh587988kmYTUFpPcpoPgNCUYMIhIzUqhmwoScWFo136A4CrgB3BlltlI" "3CgoRNBdcGRCNloIIkEYix3qlEyStkzDpHfu3Dv3vfd93+MiWIoNuPAszwMP53fOgf9ZznnN" "7e3tsud5y8BtY8y8iMwB1lrbFJH7IvJllmU7Kysr5gVBo9F4zVr77dTU1OszMzNUKhXGxsYQ" "EaIoIo5jOp0O3W73Z2vtrRcE9Xp9d35+/t1qtYrjnDsgWmuazSatVuur0jl8YXp6+j+zz87O" "Yox5z/s3KKxf2tvbI0kSlpaWKJfL+L6PiJCmKb1ej+PjY2q1GtZangm27nRGB8ORbx5GnYtV" "nhAEAY1Gg4WFBUQErTX9fh+lFJ7nISKIyJlgd1e8+8mj30d8O+e/FPLHgy6vXuhjjKFSqeB5" "HlprtNaICJydBGMMJYCWfng5U2ZuLADXsbgX57hzUCasvUG9XmdjY4OiKNBaUxQFxhhEBGvt" "mSCK81mV5wyznMMnCb5rCS5c5osffkUpxeLiIuvr6+R5/kz0T6wSQJJkL6dZTpLlDNKMB4/6" "jPgQvlLjl3sp7XabMAwxxpwviAbDa3mhSLOCfqqIk4zWUY+nsWL0ypv8+Jtl+YMPERGMMWit" "sdaeLfSjrWZwehB9dmlynJMoYbxcwi95BC6oouDo4IT3b7xF4Ls4jkMYhlSrVdrtNlprPO+v" "08FoxfWN1iRDxeFxRHyaMBxkZAPF1bDCx7euE/guYRgSxzHNZpP9/f3Hxphl72mS7rgEN++e" "xBwd9oo8HX46PWGj69dYvjTpvDM5nk/sNH5Ca02v1yPLssdFUXztuu7na2trXeftT7ZG3YHz" "vRmqG30VjN/9biV//jM3Nzcn8jy/qrW2IvLn6uqqep7/DQMWlkpAltvuAAAAAElFTkSuQmCC") index.append('database_connect') catalog['database_connect'] = database_connect #---------------------------------------------------------------------- database_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkRJ" "REFUOI2lk71rU1EYxp977gn3coMK1SaRiGmJX7Xg4F/g4GAdHBSCxcVN0KlODiIOIg7uLnVo" "F62LpWIwNaLgR4eCKSJSRMVGU5KINzTB5CbnnPd1kHtNieLgO533HJ7feZ7zAfxnWf1NPp93" "pJQnAEwaYw4w814ARERvmfkDM98OguBJLpczA4BisXiQiO4kEolDqVQK8XgcnueBmbGxsYFW" "q4VyuYx6vf6CiE7ncrnKJiuFQuHp2toaExH/rZRSXCqVeG5ubibUiT7GeDKZ/GfmdDoNY8xE" "2MtwQERgZtRqNbiuC8dxEIvFwMxot9vwfR+VSgXZbBZEhAGAMQbMDCklGo0GgiAAM0NrjWaz" "iW63CyklmBnMPAgIF2zbhuu6kFJCSgmlFLTWkYiIYIwZBIQRtNaRyLIsGGOiOSEEmPnPEUIH" "oUBrDdu2YYyBUgrW6wdAaQHva1+Q8rZuf3RUXDpWpBsDDpRSUErBGBMBaHkeQ/Vl7D9zAc7o" "ODpvFsW754vXHvPqD9EPIKJo9/BQiQjBy7vYd+Qk3I/PYM1Mwvt0HyOZHbYBT0UOtNbwfR/D" "w8OoVqvodDpRTuHX4KZGgeMXf2e/uhM2WyP913h2aWnp3tjYWDyTycBxHFiW9ettJFJorzxE" "fOE8up0q2gBaTRvGxvqmzzQ7OztKRJeZ+ZQQYpvnedBaI1aax67GCnYP9SDFV7S+aXyu2qYX" "0JVNgP6anp7e0uv19mitiZlXD7+6OdX+vn5OkJUhwRUC35oo0vWf9KCIeh8RMJgAAAAASUVO" "RK5CYII=") index.append('database_delete') catalog['database_delete'] = database_delete #---------------------------------------------------------------------- database_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqtJ" "REFUOI2Fk0Fok2ccxn9f8iZfSFNzqG0zA0rWDacyRRAHbscduimyy8IGwobbRWEXWWWM3cYO" "evXgYXqwHmZvDkahrGUrqwbRrd2mqEutJiytifOLTZrkS773ff87TGs6K/4uL/zheXgeeF6H" "x4yPj7tKqYPAh8aY10TkVcBaa6+LyLyInPV9fyqbzRq6cAAmJye3W2u/GxgY2JlKpejp6SEe" "jyMiLC8vU6/XKRaLVCqVGWvtB9lsttRtwsTExE+FQkGstfI8giCQ2dlZGRsbO9etDT1+dwwO" "DvIi0uk0xph3um+K/4oiIpTLZWKxGK7rEolEEBGazSae51EqlRgaGsJayzMGxhhEBKUU1WoV" "3/cREbTW1Go12u02SimMd4k9zg/9+e+/kcY/0+CXPlIAIoKIEA6HicViKKVQShEEAVprRISE" "zqEqHqnXD5HM7ObR3a3cnDhzck0FrfWqyHEcjDForXH9HFs2tUgk38S7c5Oo06F3Q4pE3+bk" "mgRPBFprwuEwxhhU6zcym+okXx6mvXSBaNyhMHeLTqv90G+v7At1JwiCYDWB1hq7fIVMX5Hk" "0H78xW9xIlUiiV5ijfmybZTffuOzi3+tVrDWPhVaS704Rap3geQr7+GXThOKaDq1DIs/XxU6" "zQO7j03Pre5Aa43nefT39+O6Lq3FGdxgnoEd++ncP0M4KrRrWyj/8itTzX3VbceuXlszJGPM" "x7lcrpHP56nfnSZh/yawaZb+PIXFp+GlWZr5gx/rex/UdHT4mb8AMDo6mrHWfhUvnz/8/pGz" "3L7wOYv3LuNu3kXrQd3ei+49Vw299MXIyEhlXYMnfP3p9uD4J0cVIcPc5EUKC/mVDRuTbw2f" "uPH7evMO///QFw++LCzcQK88tG3XzISww++euH5rPTHAv5qhoZeywxTuAAAAAElFTkSuQmCC") index.append('database_edit') catalog['database_edit'] = database_edit #---------------------------------------------------------------------- database_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkpJ" "REFUOI2lk99Lk1EYxz/ufdfW1kSp+RMssTKsLOsmuqmrIIggglFB4H1XdR1El/U31IWDCCG6" "kJIEox8IQjJdUUQa5EaTZjZb6ny395zn6SJmLpMu+sKB83DO+Tzf7zkc+E/VrS+Gh4dDruue" "BS5aa/ep6h5AROStqn5U1bue5z1NJBJ2A2B0dLRHRO43NTX1trS0EI1GiUQiqCrFYpGlpSWy" "2Szz8/NjInIhkUjkaqyMjIw8y2QyKiK6mXzf16mpKR0cHByongusY+xvbm7+Z+b29nastaer" "tVudiAiqSj6fJxwOEwqFCAaDqCqlUolCoUAul6OrqwsRYQPAWouq4roui4uLeJ6HqmKMwS+m" "ifppcE6hqqjqRkB1wXEcwuEwruviui5+eZnywgTbO05Qnk0jcgBr1x7h9x1UIxhj8H0f3/ex" "1mK+vqCx7Rj1rX0EV15jl2drIgT+dGCtxRjza6zMUfnynNiOBuyPIVoPXmY18whrKps7qHY3" "xqf8+Qnx7nPgTfIqeY9tDat4cynqZTb0V4CIrHW3xfeE6irEGktI+ROoYJcn6Dx5jZbKZHTs" "1vFYDcAYQ6FQIB6PE9riINnHNHQcRkpvUFnl6PlupDJHODzNrkNnHPCu1gCstf3j4+MrMzMz" "BL+naGzrJRJbQM03qHNIPZwGBPGmie/dia1Urry80dNT85mSyWSniFzf/WOg/8ilOwEnMIua" "RUDX7QrgbO0m/y7Nh6GbD2oAVY3d7ltQIxGkLqAiiBhRVVQUFUFFQQREUz8BEx6BydrVaSAA" "AAAASUVORK5CYII=") index.append('database_error') catalog['database_error'] = database_error #---------------------------------------------------------------------- database_gear = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAptJ" "REFUOI2FU81LG3EQfdn8bJZIo2CiiR5K1zaWCMWPqyAUahFsqRQWe/RUwUP/gd78Dzyblnqo" "eLUSKkSC0IPgIQdbVKiIsgaiYTWGxN3sb2Z6UmhE+o4zvDdvvkIAkMvlIkqpNwDeE9EzEXkK" "gJn5l4j8EZGs53mbtm0TWhDK5/MZZl7p7u5+nkwm0d7ejmg0ChFBtVpFrVbDyckJzs7OfjLz" "jG3bp/8obGxsFI6Pj4WZ5T4EQSDFYlFWV1e/tjowAAz29PS0xu+gr68PRDTZGlfMDBFBuVyG" "aZqIRCJoa2uDiKDRaMB1XZyenqK/vx/MfEdYERFEBEopXFxcwPM8iAi01ri6uoLv+1BKQUQg" "IncFbhLhcBimaUIpBaUUgiCA1vqWtLKyAq114t4WtNa3pFAoBCLCwcEByuUy0uk0LMuCiGBh" "YeFFEASfLy8vfywuLs4ZNw6ICFpraK1BRCAinJ+fY2xsDCICy7KQTqeRyWQ2JycnHzHzh6mp" "qeitgyAIEAQBiAjhcBhEhGQyCQCoVqsoFAowTRMjIyMgIsRisS/r6+sNg5nBzP9UFxGsra0h" "Ho8jlUphd3cX8/PziMfj53t7e43e3l4MDw/Pzs3NiaG1huu6SCQSiEQit8Op1+twXRe+76Or" "qwulUglaazBzUKvV4DgOSqUSwtPT078dx3lrGMaDVCqFRCKBWCyGoaEhVCoV+L6Pzs5ObG9v" "S7PZlMHBwRgRIZfLZR3HeRkCgOXl5cfM/ElE3hmG0RGNRqG1xv7+PsbHx3F0dISBgQF4nofD" "w0NYloVsNgsiUqHWvS4tLT1sNptPtNa8s7PzsV6vz3Z0dLweHR39XqlUUCwWZ3zf/3Z9fZ3f" "2tp69d8fuIFt2zIxMXHnFP8CrK+1GKhZEdQAAAAASUVORK5CYII=") index.append('database_gear') catalog['database_gear'] = database_gear #---------------------------------------------------------------------- database_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAl9J" "REFUOI2lk8FLVFEUxr+ZuTLDGysQxxnSGtSERimKFgUh1SIhgjbBUKv8A4JoKQRtilq0iGgT" "2EI3YbY2BE2EiSmi3ESUFTJjozPKPJkZHd9799xzWj0bG6RF3+oe7j2/+51zOMB/KtAYTE1N" "hZVSVwBcN8YcFZE+AMzMn0Xkh4g8dxxnNp1OmybAzMxMPzO/6OjoOJ5IJBCNRmFZFkQElUoF" "tVoN+Xwea2trGWa+lk6nC7usTE9Pz+VyOWFm2Utaa1lYWJCJiYkxPy/YwBiIx+P/rLmzsxPG" "mEt+rPwDM0NEUCqVEIlEEA6H0dLSAhFBvV6HbdsoFAro7e0FM6MJYIyBiEAphY2NDTiOAxEB" "EaFarcJ1XSilICIQkWaAfxEKhRCJRKCUglIKWmsQESZzI9jWWxjpfgVjdobwpwd+CUQErTW0" "1jDGwBgDIoJLHrraUxh5fRma3cCeDvyEJ++GIazhMcEjwsG2PqQSp1FztjD56277uaex1vmb" "65tNTfR/J/ZwceAGjDAMGzAEK5VlHOs6i01vGx/z85VTD9G2C8DMICIQERzyYISRK3+HZgKx" "hjYaVbeGE4cGsanrwfdLmfIOgIhg2zZisRiKxSIcckCGEN9/GMQGRhirlTzaWhP4tPwWmZ+Z" "dc9gqHGMw9ls9mUqlYomk0lsk4ux7CN47MEhDz3t/TjTM4QPuQzmFmfLDuF88QG+7Fqm8fHx" "bma+IyJXg8HgAcuydpw9K9+Wk8nBwPzim1UvIBdW7uEb8Nc2Nmp0dHSf53lHiIhF5Ovj9Vu2" "kZDlwvSU7mPJf/cbkA2mUrTVB2kAAAAASUVORK5CYII=") index.append('database_go') catalog['database_go'] = database_go #---------------------------------------------------------------------- database_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqZJ" "REFUOI11kk9IVFEUxr/33nVmejM6TjijOYmUiZkaQS4nWvVHgjbBUEEQJC3Kdat2UYugZUhg" "gbZIDXFT/inTTTCElQSZZprN1JgO0xvnj2/ezHv3nhb1hhrr21z47jm/893DlQBgbGzMyRg7" "DeAc53w/ETUDEEKI90S0TET3DcN4EQ6HOcokTU1NHRBCPAoEAgfr6urgdruhqiqICOl0Gtls" "FrFYDIlE4qUQ4mw4HI7/RZicnJyJRqMkhKD/yTRNmpubo6Ghof7yBDKAttra2nJ/m4LBIDjn" "XeU+E0KAiLCxsQGXywWn04mKigoQEXRdh6ZpiMfjaGpqghBiG5hxzkFEYIwhlUrBMAwQESzL" "QiaTQaFQAGMMRAQi2gaQ7QtFUeByueDxeODz+VBdXQ1VVeFwOCDLMgTnaChMu78MH59dutt2" "qQSwn2BZFkzThGma4JyDc17yOOcwl0fR3lGlBrtudFY2t99+c6vpJAAwO4HdYFkWFEX51fQb" "6M3NwuP/BG/LMWxFx1FR2bLT21AYGe+h7tIS/5xuA+wEqrUKb8cpcH0erprdMPg31B89pFo5" "rZcJISCEKE23gfbJOYfOq2CmvkBWkpDkLTiqkoChI/e9oDDLsqBpGvx+P9bX15HP50sbdhhf" "0Y4Z7NglQ1gaZLEJyJUgs4jFwY/GwlL6MuOcX4xEIsOtra3uxsZGOJ1OSJIE/fME1PxzBDpD" "oOIzSDyL+afpvJJZyyiShMXVzasXBmMjEgAMDAzsEUJcJ6Izsix7VVVFG41ib+gEisleMObF" "wnQu/zqy1lObzTyuqQFCD35kAUAq/xh9fX2VxWJxX1fgyUD9kVC7tRnBh4lk7t3bxJXu/pWH" "5fXbALZe3Tl80+PzdW+l9Pzy0sa18/dWhv9V9xPyJrAgr2pENgAAAABJRU5ErkJggg==") index.append('database_key') catalog['database_key'] = database_key #---------------------------------------------------------------------- database_lightning = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArVJ" "REFUOI2lkk9oXGUUxX/vTzLJG5LaJjNmoI/Rkpaki5YodCEuaguCLropBgsiCII7Q4XsunRZ" "cFF3RhcptFAX7gLBEUEEQZQgfWIZNZVU6GMymck4mbw3833fvS7SjIVm51neezmce86B/wnv" "qOHa2lohDMMrwDXn3JyqngZERBJV/UNVP8/z/JvFxUX3DEGtVjsrInfL5fK5mZkZisUiURSh" "qnQ6HbrdLltbWzQaje9F5O1nCNbX17+dm5u7GMcxnnekQKy1JElCvV5fHV5s//zqZbHcyu2x" "M+OFKEBAnSDW4PlFpl/6hGDs+SFBu92mVqtthwB6761g26RXo+kL8xOjZcQa1DhkkJG1fmPs" "5CKWSbbTlE6nQ7vdplqtIiKEAGnciBF5Z6T4ArbzE/7YAtY2yXfrPLav4HZiXOM+zWYT3/eH" "nqgqYZKcHaUzeD+aWpiAAMlSCPvsPvoab+Y9pk68SRiGGGMIw5BerwcHkeCcI5zqnlhA7AeF" "ydOozSCogDGoBMjeI9w/n+HU4oiQ4GWMKeD7Pqr65AVjbo2XLkxnzQeIU0ajWZCQ5yqXyVq/" "I2bAXvM+Wv2QgRQwxhAEAaqKtZbQOb3X/fuH79Q6o05GBu6X66Xq677LdzH7O/T8UwTnv0BG" "Spg0xZj94f/WWsKTr/148zDK+trspJfzUdb8lb3dx5jSNezxi4yPjSPGoKo454Ye9Pv9gxQO" "Ee6PfDUalbyePU750qc0dnrYLPuv955HpVIhjmM2NzcPFBwuH345/4Z17tRWe+rjh1y6Pv9X" "WqxWqxQKBTzPQ1WpVCp0u12SJGFjYyN1zl0ZNvHPO2fOqbUy++5msrq6+qKI3FDVq77vH4ui" "CGstrVaLPM9TY8ztIAhuLi8vN44u+1NYWVmZGAwGs9ZaUdUHS0tL/af3/wI28YkJ3vzOHAAA" "AABJRU5ErkJggg==") index.append('database_lightning') catalog['database_lightning'] = database_lightning #---------------------------------------------------------------------- database_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnVJ" "REFUOI2lk81LW1kYxn83ntsbcrEopiZ+gIIUBovduhJXs+imULEhLQS6LO77R9g/oLiZxaym" "UkfJRhAcBnEWgaCCdqUtkmi8Xr+/bkjMOeftKkFxyizmXZ33vDw/nofzHvif5dxtFhcXPaXU" "S+CNMeYXEXkKWGvtVxH5JiK/1Wq1vzKZjHkAWF5eHrbW/tHd3f08nU7j+z6JRAIR4fLykuvr" "a8rlMkdHR/9Ya7OZTKZyz8rS0tLfpVJJrLXys2o0GrKxsSGzs7O/N3WxO4xnqVTqPzP39fVh" "jHnR7FXzYK1FRAjDkHg8jud5uK6LiFCtVjk7O6NSqTA0NIS1lgcAYwwiglKK8/NzarUaIoLW" "mqurK+r1OkopRAQReQhoDtra2ojH4yilUErRaDTQWrdE1lqMMQ8BzQha65bIcRyMMa27WCyG" "iPx7hKaDarVKoVBgb2+Prq4uwjBkeHgYgK2tLXZ3dwmCIDk1NfVhZ2fn0z0Ht7e35PN5AHK5" "HFEUsb+/T6FQQESYnJzEdV2CIHDW1tY+lkqlJ61FmpubO0okEk9WV1d5/fYtf37+zObmJul0" "mpGREYIg4OTkhMPDQ3p7e29zudyj+fn5y5YDrTXFYpH29nYAJiYmKBaLZLNZOjs7ubm54fj4" "mJmZGQYHB6+AZEdHh3f3Gd9dXFwsaK0fAeTzeUSE6elpfN8HIIoijDGsr69/HxsbS1Yqldq9" "z5TNZn+11n4ZHR193N/f77iuSxiGbG9v43keAwMDpFIptNZn5XI5trKycngPALSNj4+P+L6/" "0NPT0+15nnIcxzk9PX0vIqVkMrkAuPV63RwcHBxHUfTqB4eVfvWHuBFKAAAAAElFTkSuQmCC") index.append('database_link') catalog['database_link'] = database_link #---------------------------------------------------------------------- database_refresh = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsBJ" "REFUOI2Fkk1oXGUUhp87ucmYmZuJGZxJdFqj0kqjWAltIQoiIrUiqAvJaPFnJaJSEMSVutCN" "O6F00VW6aGAsJAVbq8EhE2ytFDdlaOjPtE1/bjQ6k8hIMjaT3O9833EhE9rU0nd5Duc57+E9" "HsDExETc9/1XgN3W2i2quhlwzrmzqjqjqgdWVlam8vm8ZZ28Uqn0mHPuUDab3drX10cymSSR" "SKCqLC4u0mg0mJ2dZX5+/hfn3Bv5fH7uFkKxWPwpDEN1zumdZIzRcrmsnxY/vj48Ntx283wM" "eLy3t3e9s9uUy+VomuVcqrN96ua675xDVZmeniYIAoIgoKenh6uNy/wYfsf1xhVELGIsudQG" "v0u6nt1deLV46M2juwB8ay2qSjqdZmFhgWq1ylLH35yOTnF/KsfzD7yIVYtTi3UWq5bl5eYL" "L+/fOXPsw8lNvqqiqgRBgO/7iAhT9XPc154hE89yplbm6l9XMJFhQ2ojIkIlvFT6fs/kToBY" "6wQRwRiDMYbLSxXO1Mocu3SEpfoN3rn3fb56ai9zv/8p58PKyW0Lk7uGvh7qBFhzYK1FRBAR" "3nvwI4wx1Go1Gv80EBFUlfaowyaz6ee+3IODX5u3OGhtb0HWgEb44Y8jqCrbvaeXxvPj9rYU" "nHNrgy1gJKs4dRytHmY5uoFzjtXVVYY+G/zZRPKMiQSJJPRFhHq9TiaToVqt0mw2/yPH2jkc" "fkNHqg3PdPL26OuYSDKPbHwos2NwkPMXL3Li5KmiVygUXgLGBgYGkv39/cTjcTzP493CW3R3" "dfPko0+sxdeKc+baNUqTx08baz7xAEZHRx92zn2uqq/FYrHuRCKBiPBtOM49GR8Ry7nKBSQS" "xFiMyAlr5Yvw4Nxxb/3LjoyMdEVRtElEnKpWDv42UpRI0tP7Lmy967//n4aHadvyweaxO/X/" "BYr20Tj6dpFTAAAAAElFTkSuQmCC") index.append('database_refresh') catalog['database_refresh'] = database_refresh #---------------------------------------------------------------------- database_save = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAppJ" "REFUOI11ksFrXFUUxn/3vTt5zzeJpmCSgUFTiFZTUSFgCy7tqiB1URiUQCgUKf0D3LW7Lrpo" "oesSBbOpcSdIIJpSF0oslMSELlxINaMRJ4OTZoa+vDf33nNchESS0G/5Hc7vfOdwDMDCwkJi" "rb0AfBJCeFNVXwdERB6r6m+q+nlRFPcbjUbgiMzS0tJpEbk3Ojr6Tq1Wo1qtkmUZqsrOzg69" "Xo9ms8nW1taPIvJxo9HYPERYXFx8sLGxoSKiz5NzTldXV3V+fv7Lowki4K2xsbGj/jHV63VC" "COeP+lZEUFVarRZpmpIkCZVKBVUlz3M6nQ6bm5tMTEwgIsfANoSAqmKtZXt7m6IoUFW893S7" "XcqyxFqLqqKqxwH7hTiOSdMUay3WWm5+02EoOUHe95wYHOCrlX8w0emRz+7+oqKG7e4uD1b+" "Pnuwgvce5xzee4wx7OYFH5x5g4+mBvn257+4Pj15aPLcD21EzMNoP0EIAe893ntCCOSlo9Pz" "AHz/qHXQWHjoltB+2scY+f+Izjmcc4QQiOOYKDLECi4It69OIaIoEKNkFsqypPusvwcQkYPp" "+8C0ElGUjhvzfxAZ8EGQICjsHVMhqwiR955Op8PIyAhJkhxE9aKUwRNHFYyxGGKMiUEjVA3O" "e/p9jw0hXFpeXv56cnKyOj4+TpIkGGPo5S0qxnL1wyG89Pd+TkGNkNoBbt1r8m/3GXZ6enph" "bm7u7fX19Wtra2sXoyh6KcsygtSIqSDs8sXKFV7OXsUQ0c7/5NP37hCRkpd9LMDMzMzvwGXg" "8uzs7FC73X7N2vrKyRqMDfY49+4ZhgfqEMHTos5o1ZMNgDUG87zfn7ry3U+nXnnh/eFkmNS+" "iBeHEcFoQEzOr80nbHUd/wEeyZOnH6V89AAAAABJRU5ErkJggg==") index.append('database_save') catalog['database_save'] = database_save #---------------------------------------------------------------------- database_table = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoRJ" "REFUOI19kk9oVFcUxn9z5703o2+IwX8DmpiAC5vG1iIiFgrq0o3SGgqlraLQXZcuXHQhgkuh" "YLsIXXRTFAUVcSG1QhQVggHTCYEmpCKpJdOMoTFTJzrvnnNuFwkvFlIPXC7ncO/v+7j3KwwN" "DXV6778ws4EQQr+qllX1iZndVtUfBgYGpnhLRd7777q6uj6vVqtUKhWcc7RarV2zs7O7xsbG" "DgPvvBWgqod6e3sxs3yYJAnd3d2Mjo7uuHCrHtQCovbGUlQCqjYSmZmICPV6nTRNMTNmZmbo" "6+tDVTlxYOP/qp+5PPV+FEIISZLgnCNNU6anpymXy3R0dKCq/Dj+Ld4Erx6vgpggKpz+8Bze" "WykSEQCyLAPAe58riAhf7zm1qnrrteBFiVQ1P6yqZFlGoVDIZ5ceNFYFHN6znkyUKIRQds6R" "JAmLi4vEcUwcxwC0222++mgzAFeHZzm6r5oD5pqvlxyIyM+1Wu3Tnp4ekiShs7OTLMsYGRnB" "XInrjxq45Us3HjUgBOII+rauJfNK5Jz7cmJi4l5t8s/vO0pCs9UmLRVpsY6Txz6jUqnkDo7s" "3Zw7+H2miYhRABgcHIwXNuzPPt6d8vjJPFFpDcW4TDEuLYXFQau9lJOoAAa8u6XMNz+NrzzK" "2StPw/w/7XDrcSOEEMIvvz4Pb9bt0UZoLvq8n/jjRTh+fjhE+ZctJ7HoCtypzQHkuyuAN7j/" "23wuuH1TgqqxAhAhLNs9+N5G7o7PcWDnSgqvDT/nk32b8n7y2QJFxwrAqxFCYOe2CvW/X7G9" "uoanf71E1VAL9G9NmHy28J8sqJnlABV7eObi1AfeLPWieFFUDK+GqKwSJXjRfHXzX+mZehw7" "gJXYAAAAAElFTkSuQmCC") index.append('database_table') catalog['database_table'] = database_table #---------------------------------------------------------------------- date = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhRJ" "REFUOI19kF9LG1EUxH83uzapMcYgQqWIpJEtoUVJxaf2UbAI+XA++zkEv0ApKQgSZTEmFsoq" "RQRREt3Eu+eePjTZpP7pwMDlcGbunIExTLVa3dzZ2fkRBMFXwAfMkP76+vqX3d3d79VqdXM4" "+ysC6IBeAf7eHm9rNaKDA1y9zsJw6QrI7u/zZnWV34eHPGxvswCsgBn9Qj6bxS8WERFmSiWs" "51FSBaCrSrZQQER4PTtLZiJ1+s75PidnZ4gIrXYbVyrRm5ujNzOD5HKctFqICCenp+Qm7wZM" "B1yxWKS5uEi712PF8yirkhFBrWWQJPy0ljNreeccn6zlXpUVyPiTCT7Oz/Mhn0cfHkisxVmL" "8zxeifB+aopABCNCttvlPknGKRqNhiZJ8iKttRrHscZxrKqqSZJoo9FQhiU+wWAwIAxDKpUK" "nU4HEeH29patrS10WOwImecMwjDk/PycQqHA2toa5XKZ6elpkiRJOTL6x2A0rNVqqGrK4+Nj" "KpUK1loGgwFxHKeaJyc8jnhzc4NzDmstl5eXOOdwzqV7z3YwaRaGIUEQICIsLy9jjCGKInzf" "B9AMoADOOTcprtfrqCobGxvk83mccxhjuLi4SI3SDrrdLnd3dz1VdcYYJul5HsYYRIQoilha" "WqLf72OtHZ/QarXwPG92GOtFjBKICEdHR2OD6+vrb81m8/N/1Y/Q7/d/AfwB7h4+GltqMzoA" "AAAASUVORK5CYII=") index.append('date') catalog['date'] = date #---------------------------------------------------------------------- date_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnBJ" "REFUOI19kcFLVFEUxn/3vaczqTPTFIVSBKZODZbTZEaU0CLDEqb/obW0atfWjdHKRS0SXLYW" "wpAiKpByAmMwfTg6ttFKMmimmXFy7rvvtGisCa0PPjhc7vnOd74Df6Di8fjA2NjY21gsdg1w" "AFWj09vb2z8+Pv4mHo8P1N5+NQHkQDYBZ2qKI8kka3Nz+KkUh2qfNoHA9DStPT18zmSoDg1x" "COgEtTOF5kAAJxLBGENLNIq2baIiABRFCIRCGGPYFw5j1bn+XQcdh6XVVYwxZFdW8KNRSvv3" "U2ppwQSDLGWzGGNYWl4mWL83oHLgRyIR5tvaWCmV6LRt2kWwjEG0Ztvz+KA1q1pz3Pc5qzVb" "InSC5dQ7OHXwIN3NzUi1iqc1vtb4tk2jMZxoaCBmDMoYAsUiW573x0U6nRbP8/5JrbVUKhWp" "VCoiIuJ5nqTTaaEW4i5sb2/jui4dHR3kcjmMMRQKBQYHB5FasDuw9hJwXZf19XVCoRCJRIL2" "9naamprwPO83d4T+ciAiKKVIJpOsra0hIogICwsL5K2P3JmYoFD+htZV4q3ndgvsiNQjn8+z" "uJEmH8hx+VIfRw908WJxktmFSc4Pt93bc4V6Mdd1yXya4czJBMYyJNquYpTmwumLgAxbgAD4" "vu/XN6dSKUSEvr4+NgsbNKgWbsRvAXD7ykM6DvegUEELoFgsUi6XSyLiK6Wop23bFMsFFj+9" "ZvTZTQBGn95k9cs8gvxwALLZLLZthx1nz6vS33Wd2fnnXOzp5/H7BzQqh5nMK0DdVwAjIyMz" "4XD40v/yyHx9yUr+Hdqv0mA1cqyp+/uju08iPwHWR0BCkHJtKAAAAABJRU5ErkJggg==") index.append('date_add') catalog['date_add'] = date_add #---------------------------------------------------------------------- date_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnRJ" "REFUOI11kcFLlEEYxn/fztiuruu2mqBF0aYZS6GsQpeCogIj8BB06dQlCIKg/6Bbdy9BeIj+" "gYJAqCzoUNSXCLLYh5trREpFhmnfuuvuzHxvh1bbyH7wwDDMPPO8z8AfvFwud258fPztwMDA" "eUADXkN6ZGTk5MTExOtcLneusff7EkAJZAXQk5Psy+dZmpkhGhuju3FoBYg/fkzP4CBfZmep" "X7hAN9AP3tYrJONxdDqNc472TAajFBkRAEIR4qkUzjlaOzqINaXeXie0Zn5xEeccxYUFokyG" "8u7dlNvbcYkE88Uizjnm378n0Tw34JUgSqfTFHp7WSiX6VeKrAgx5xBjqFnLB2NYNIZDUcSw" "MVRE6IeYbk5wrKuLo8kkUq9jjSEyhkgpdjnHkZYWBpzDc454GFKx9k8K3/fFWvtfGWOkWq1K" "tVoVERFrrfi+LzRK/IdarUYQBPT19VEqlXDOsb6+zujoKNIodovYTgZBELC8vEwqlWJoaIhs" "NktbWxvW2m1tGf2VQETwPI98Ps/S0hIigogwNzdH75dppu9do/KphOruJTY89q/Blkkza2tr" "qNlJ7Ldp8peuEs8epVp4SvDyOU9O6xs7jtBsFgQBMvOQw6cuklh8gXf/Mm0fHnLwQAZRchMA" "3/elXq87Y4w0a3NzU8IwlGdnWySaeSDN/LjVI1NndKQBwjBkY2OjnEwm22Ox2HYqz/NQSqH2" "9FCZnST56Dq16lcqQPhT4RSfNUCxWEQp1aH1jr+KPn6Rd2+esL+zFa1aCFcsH78pROwdDbC6" "uvqqUCic+G8Zuo+ezAgr81MkQqglO/m+d3jtyt2p278A8CJiLIYmOpsAAAAASUVORK5CYII=") index.append('date_delete') catalog['date_delete'] = date_delete #---------------------------------------------------------------------- date_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsNJ" "REFUOI11k8tvU0cUh7/rexMnxfHFhIQgkpqQNMSlBRuLTQkrkKhSRWIDS8SKJYj/gXWlCAkE" "QaxRVy0qCKSyQGqwUjWKFRfjJxVg52EnBuIH1547MyxISHgd6UhHR/P7zm9mdGAzjFAodGJy" "cvKfkZGRnwELMNbTikajY1NTU7FQKHRivfdeBJADXQasu3fZE4nwcnYWNTFBz/qhMuC9f5++" "gwdZjMdpjY/TAwyDsTGFbV4vlm0jpcQXCCBMk4DWAFS1xtvVhZSSTr8fzxbXH+oOyyKVzyOl" "JJ3NogIBatu3U/P5kB0dpNJppJSkMhk6tt4bMHKgbNtmfvdusrUaw6bJoNZ4pEQLQdN1eSYE" "eSHYpxSHhaChNcPg+QDY1d1NY3QU7TjoVgtXCNRGSol2XQh7cc/+hOn7kfrKI1SjcM4AjJmZ" "GRWNRvlaaK2pF3/n7bN/6dx5DHswwuv/Yzx9cHPZ+pKg2WySTCYZGhoil8vR/vYxA92v2PHd" "USr5p7QbLbr8ffi6v7W/CEgmkxQKBcLhMKH+KqKyir3vJM3F27R/Y/A8nqIlPFTfLIc9W4V6" "/dsikQhaaxqlR4jVv7CHxnEWpjDaXtHm66JTreIExxm7dCfzmYMNiLk2S2PBpfeHUzjFa3ja" "XFprg5Sn59CHL6JcPwCeTwEApfQ9hvua9B74hdbSTcx2TXMtSHl6jv4zN2jr2Y9lWQDaA2gA" "pZQCyMZ+4/WLGVzdz2LiCgqHemUPpdgT+k9fp1RVBINBDMPYdFCtVqnX6zWttfovdovvx87j" "ffk3mT+miT+okHo4hwxfYGlNMjAwgOM4CCGA9xtHOp3GNE2/ZVlk8iVaT/5k8NAx3pRXeRHP" "0jtxmZWmF6NQoFgsIqUkkUhsAiqVyvT8/PxRgERmiV+vX+XI6F4anTspjxxnIbcMLH/0To7j" "PAd4B2xWTn5WIjpwAAAAAElFTkSuQmCC") index.append('date_edit') catalog['date_edit'] = date_edit #---------------------------------------------------------------------- date_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn5J" "REFUOI11kk1rU0EUhp+be2PSjzSJMWAR1EpNSZTQ2JWo4MKFCOJCEPwb7kUE/0AXddOdqKvq" "olApRTeC1FRrSsSapK0fNFqsGiVfNbkzc1w0SVNoXzjMzOGcd545DOzIisfjl8bHxxdisdhl" "wAGsVjhjY2PnJycn5+Px+KVWbrsJYBXkJ+DMzHAklWJ9cRFz9SrRVtFPwDc7y+Fkko2lJZpX" "rhAFhsFq30Kfz4cTDKK1pj8cxrVtwiIAVETwBQJorekZGMDTRd3Z+x2H3NoaWmvyKyuYcJhq" "KES1vx/t95PL59FakysU8He/G7BWwQSDQbKDg6xUqwzbNkMieLRGXJeGUnxyXdZclxPGcMZ1" "qYswDB6nm+B0JMKpvj6k2US5LsZ1MbbNAa0Z8XqJaY2lNb5KhbpSOxTpdFqUUvtGeWNe1hdu" "S628KSIiSilJp9OyawbdajQaZDIZyuUymcXXbHx4SG84Sf3bLNIabFt7GiwvL1MsFgkEAhwL" "Fjl45CwDgylKa3PUfuVQSnWMdhm0k6lUChGhWVnnz+oMgUMhdHmaaPwmm+8fU69X9ycQkZaR" "8Dv/hMjJa/DvHQsPHtEf2qL89TU/ci/2JuhWrymi638JhOuYxmcQg66+YejiLbYKUziWBhAP" "IADGGNOhMIrj3o+Ejo5i6lnEbDF2fQTT/I7fXyAydAGz/nyHoFKpUKvVqiJiLMuilH9GTzhG" "b+AXon6DZbP4tAAYzL8C0dgxGp/meHknkbAAJiYmJJFI4Djb/8r7/h7JG/exPV8Q9acN2Rmb" "3TPCjw9L5KfvTjkApVLpVTabPdcuGW2WeTt5AzGyHWIQY1rn9qrFo/Xh/4gLbABxTu/dAAAA" "AElFTkSuQmCC") index.append('date_error') catalog['date_error'] = date_error #---------------------------------------------------------------------- date_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApVJ" "REFUOI11kstrVFkQxn/3ETvS3WnbKBOfkIeRq46ZNo4KOjsNEnAnLgbBhXtBQVxk4V4ECTKr" "MAthmGH+AMGdA75oxSG22KQfGYmJikQjmb6de/ueU+e4sLUjakFBcaj6zvd9VdAJJwiCo5OT" "kw+Hh4ePAz7gtNMfHR09MjU19SAIgqPtt49DAHWwi4B/8yZbCgXmHz/GnDjBxnbTIpC6dYu+" "vXt5PT1NMj7ORmAInE+/kE6l8HM5RIRMPo/yPPLWAtCwllQ2i4iwtqcHdxXrz3W37zMzO4uI" "UKnVMPk84bp1hJkM0t3NTKWCiDBTrdK9Wjfg1MHkcjlKmzZRC0OGPI9+a3FFsErR0pr/lGJW" "KQaMYZ9SrFjLELj+agZ7envZnU5jkwStFEYpjOexRoSdXV0Mi+CIkGo0WNG6w6JYLFqt9XdT" "KWWjKLJRFFlrrdVa22KxaGmb+FW0Wi3K5TKDg4PU63VEhL9mLxKpJtdP38d3uj73ut8CKJfL" "LCwskM1mGRkZob+/n5ZWbN0QcOb3AiutENve0BcMrLU4jkOhUOCP6gVu/32FxGgSpdi8fgdB" "30EacZOTUwETP//5NcAnEABtEo7tPoNYgxjBYHm1PM+PWw8TJhEX74wzcpncNz0AiHWCWMPc" "uxrKaLRRKFH832rw07ZfCNUKxed33/qABTDGGMfpHFasY7RofujZjjaCWMPr5Resz/Tx7/w9" "ni48o6nY7wM0Gg2azWaYTqczruu6AJFucePBVRKTEOuEgQ27ODQwxqO5uzx5+YSJA79xauzX" "aR+gUqngeV6P73cUnd9z4wtJ5+6M4bhrKb0ocWn/NRZr7zsmLi0t3SuVSoe/5wdAGAu3q/9w" "tneCN9V3xHE8B/ABp85fDAe2u+AAAAAASUVORK5CYII=") index.append('date_go') catalog['date_go'] = date_go #---------------------------------------------------------------------- date_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArRJ" "REFUOI11kE1LW1kch5/k3uQ65t1QYulCHcUSnDRU6WoENw1qIatusnQ138HNbFxIQBdZ+wX8" "AoVuuikDIUqg6SJ4YxyRiTESvL4kt5ncc889s5holZn+4AeHwznPec4fvseXTqfflkqlg/n5" "+TVAB3yj6ktLS8t7e3vldDr9drT37yWAJqguoH/4wIvXr/mrWsXL53k2OtQFjI8fmXz1iosv" "X3DeveMZMAe++1cIGQZ6LIaUknAigdA0EkoB0FMKIxJBSslP0Sj+R9YP6zFd5+jkBCkl5vEx" "XiJBPx6nHw4jx8Y4Mk2klBw1Gow9/jfga4IXi8X4+vw5x/0+c5rGjFL4pUQJwdB1+VMIToTg" "Z89jUQi+KcUc+PXHBr8kkyyEQijHwRUCTwg8TSMoJS8DAealxCclRq/HN9f9blGpVJTruj+s" "EEINBgM1GAyUUkq5rqsqlYpiNMT/ZDgcUq/XmZ2dpdlsIqXk9vaW1dVV1Giw9/H/H6Ber9Nq" "tYhEImSzWWZmZhgfH8d13Yfeg54YKKUYDodYloVpmlxfX3N1dcX09DTZbJZSqcTExASWZZFI" "JFhZWQk9AQgh2N/fx7ZtNjY2sG2bVqtFuVym0+mQz+fRdZ2Liwuq1SrhcPj3J4Byuczp6Snv" "CwWKxSLNZpPJyUkymQztdpudnR06nQ6Li4vkcjnOzs5+8wMKwPM8r1arEQqFANja2kIIQaFQ" "YHl5mfX1ddbW1nAch83NTQDi8bihA/R6PWzb7qdSqcjh4aEPYHd3FyklxWLxAWrbNkoptre3" "yeVynJ+f/60DmKaJpmnRQCDAzc0Nnz99YmFhgUwmw+XlJY1GA8MwmJqaIpVK4XkeBwcHtNvt" "jm+k+0c0Gv1VKcXd3R21Wo1kMkkwGLxXJRgM0u12UUrhOA7dbte1LOvNP6ofcNR3oPQsAAAA" "AElFTkSuQmCC") index.append('date_link') catalog['date_link'] = date_link #---------------------------------------------------------------------- date_magnify = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmBJ" "REFUOI19kUtPU1EUhb97z6G39AKlQQSiCQ8RrBpIIXGizBgYYgfOHPpD/BOMif/AxBEJiWHo" "o0QMdtBQHg4EAYsWsIU+zssBpdSIrmQnJyd7rb3W3nAJL5lMzs7Pz6+MjY09BiTgNUpOT08/" "WlhYeJ9MJmcbf+ckgC1wh4BcXORGKsXO6io2naa30XQIBEtL9E9MsL+2Rn1ujl5gFLyLKYRB" "gIzHMcbQkUighCDhHAAl5wg6OzHG0N7Vhd/iuvmOSsn69jbGGPKbm9hEgnJ3N+WODkw0yno+" "jzGG9Y0Noq25AW8LbDweJzswwGa5zKgQDDuHbwxOKWpa80UptpVixFqmlOLMOUbBl60O7vf0" "cC8McfU6WimsUlghiBjDeFsbY8bgGUNQKnGm9aWLTCbjtNb/LKWUq1QqrlKpOOec01q7TCbj" "aCzxL9RqNXK5HCMjw7xeXkHJdqomRkRKhD7h+ZMHzd4rBXK5HLu7u2wVzogPjDN5q4+2iKRw" "Uuf7jxNevfnE6PUIQOtFwDXOlkqlcM5RrLVzd6iX47rP/i+D9gRDN69xXBVNzh8CFyIXQlVl" "CYII2lisdVTrFmU8nAiaPVdGuEAgPKo1hTIe2p4TnAfVShUpAwDnAw7AWmtbyel0mt7QclA4" "Iox4xKKSrlgb+0WFPN2hsJG5dFAqlTg9PS2HYdjh+34z1szUbbKb+3z4+A1fRKjUNN7JV2b6" "jyisv+PF08FnEiCfzyOE6JLy70QhMNkHoPE8j8LZDodbnxm8M8Xe3u5LCVAsFt9ms9mH/9vH" "JQTVnzEODpedQsR+AzluOAV579DUAAAAAElFTkSuQmCC") index.append('date_magnify') catalog['date_magnify'] = date_magnify #---------------------------------------------------------------------- date_next = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlFJ" "REFUOI19kU1rU0EUhp+595rE3qQx1OLXqrZEroolluJC0Y1QEeLejW71d7hXCu66FDfuRZdu" "RCIIpZRL06aCtCpSiK1JTJOZM8eFSY348cILwzDvOc85A79kkiS5vri4+LZcLt8AIsAMHM3N" "zV1ZWlp6kyTJ9cHdzxBAA3QHiJ4/51Slwta7d/hqlcnBox0g+/Ilxy9c4PPyMv2bN5kEZsAM" "uxBns0TFIiJCvlTChiElVQBaqmQLBUSEw+PjBCPUB+dcFLG2uYmIUN/YwJdKtI8coZ3PI7kc" "a/U6IsLa+jq50bkB0wBfLBZZOXGCjXabmTBkSpVABLWWnnO8t5ZNazntPRet5bsqMxBEowTn" "JyY4F8dov4+zFm8tPgzJiHDm0CHKIhgRsq0W3537RVGr1dQ5909ba7Xb7Wq321VVVeec1mo1" "ZbDEP9Tr9UjTlOnpaRqNBiLC3t4eCwsL6GCxQwV/K5CmKdvb2xQKBWZnZ5mammJsbAzn3IGH" "hX4jUFWMMVQqFba2tlBVVJXV1VWSJOHWozUCA/evlTj6L4JhaKjd3V2891hrUZSTExkev/jC" "8vZ/RhgtlqYp5XIZEcH3HBljOF7K8uy15+q9V7cDQAG89340XK1WUVXm5+eJ4xjvPbLvsH1L" "FCiTRzPkMsHTCKDVatHpdNpxHOeDIDigMsYQhiHGGEQE6TjsvtD51ufT+lf6++5OBFCv1wnD" "cDyK/vqrB5Kuo/U14vN6k0vTX3j44O6TCKDZbL5eWVm5/N80IJ2zfEybXJr5xLH8zgeAH5Ss" "RfvGMRAIAAAAAElFTkSuQmCC") index.append('date_next') catalog['date_next'] = date_next #---------------------------------------------------------------------- date_previous = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnFJ" "REFUOI11kk1rU0EUhp/JvTa1aUxjrChSSm2JXJQWLcWF7hQqQv6AC/9Aly5cuHDlxpVddyeu" "xK2gOxeKRGgRGy/9SBW9rVoETWlsks6cOS5M04j1hReGYeaZ95w5sC8TRdHV2dnZN8Vi8RoQ" "AqbtcHJy8vLc3NzrKIqutvf+XAKogn4HwqdPOXX+PMn8PL5UYrB96DuQfvaME+PjfH37lt3r" "1xkExsDsvUImnSbM5RAR+vN5bBCQVwVgW5V0NouIcPjIEVJdqTvr3jBkaW0NEWF5dRWfz1Mf" "GKDe34/09rK0vIyIsLSyQm933YCpgs/lcrw7eZLVep2xIGBElZQIai0t5/hgLWvWctp7LljL" "jipjkAq7E5wrFDibyaC7uzhr8dbig4AeEc4cOkRRBCNCenubHef2U5TLZXXO/dfWWm00Gtpo" "NFRV1Tmn5XJZaTfxH7VaLeI4ZnR0lGq1ioiwtbXF9PQ02m7snlIHAeI4Zn19nWw2y8TEBCMj" "I/T19eGc63gP1Enw4n2N+08+I7uW5/cmSZIEVUVVqVQqRFGEtRYRwXXVHwK8+2J4vPCRE4Ue" "krVff8Ws1Wp477HWsrm5ifce7/1+git3yjcel5Xjg2lCY3A7+3RVJY5jisUiIsLw8DDGGJIk" "IQxDAE1lelKPjhd6CFOKbTlkpwVAqVRCVZmamiKTyeC9xxjDxsZGBwSQ2vrauJks16j/aGGb" "gjQdxpiOgyDAGIOIkCQJQ0NDNJtNrLWdSeTW3Yf6qnKMwnCGbys/eXC7cNDndKAiwuLiIjMz" "M3/mYCD89Opi0V56WTmK956FhYUDAd1qNpufAH4Dgctg14RHe0QAAAAASUVORK5CYII=") index.append('date_previous') catalog['date_previous'] = date_previous #---------------------------------------------------------------------- delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAl9J" "REFUOI2lkltL1GEQh5//nszdskKLde3sQiVZdiBKiNiLIlK62YtQzK5j2S/RV+gLlEkRYRAd" "ScWwIBCiICqK1m13azNrPay5/g/vvG8XkpVaN87lwPMwM7+BFZa1uJFLpxuNSKcY6TauF9Vo" "tJExbeke8dS15p4bmX8KCqlU0jPm0trd8fpISwvWuhqwbbyvRSYGBpicKH1RWqUP9t7uWyIo" "pFJJJfpK7YlEJLJvLzL6Br4WwHWxVq/H2rKF0t375LMfZo1xzx++/qhvQZC7cGGHNjypO94a" "Cx/ajwzdoTJnY4lHVSiIpQ3GtaHpAN8e9vNpLF9USh87dmtw1AdgoCvSUBerbm5Chh8gzhza" "qRCslNFTJaQ8gbYreE/62ZBIUO04MeP3ugACABo5F9mzC/32JZXJ76hX83eqLDpwKLoWlc1Q" "39LK1Kvhc8DFAIAy0hAIh+H9e3Acai/fXDay8c4zBGc8Vh08grzwGgDmV/AUulxGz0wTEvu/" "uSulwYC2FL9X0OrzXO5jvDpSg+RLjHeeWZ72+Qht3sp0Novx5PPCBKLV1dLICCYWR6YdgmuC" "S1gxBjF+gtvi5F8PoVFXFwTa5/X+CK8qlh4PETzVhnZ8WH7/PIiFiAEdoOZUO7nBe8w4laKy" "vF7445Ged7QnxciVjWtqIxsSJ3A/ZnAzGbSrqdoZJ7RpO4XBO2RL72aNkfNtD971/SUAeNZx" "MmmUuhQSt37TrqOEojEAKsU8mdfDzIr9xRiV/gUvEQA8PZtoFNvuVH7dbbSOGtdDBfQYonqM" "uNdOP/yQWcysqH4Ct+5AeSaDkFQAAAAASUVORK5CYII=") index.append('delete') catalog['delete'] = delete #---------------------------------------------------------------------- disconnect = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAr1J" "REFUOI2FkktoFGkUhU+9urrS6dGEpMVEHYY4UUFwIS6iLgRH0NWAoKC7yCxEmNUQHBwYcSOu" "dOHKnW5ctMFHUIlxgo8hj9VEMIpRY0zHTtOdTlWq+q//Vf/fPQtRBNN61vd+nHPPNfAdPXrU" "sAt20JVw2S256iRS9lKZnKdUjM4VzF+Nby3nxwse5d6o1qpPJhqJUtBKwnNNFCo1vF0kw/a3" "ADXq/u7aum9tiwmR1CGkASZMhLFA2jHgh+H+pg7y+elUMfVDuL7NSTMhUI04mJCIuULWs/Dq" "/TLmF4IBsxng6NHtMqT04vtKhJhLuDawQgTCGgWhDH6VQEb09VcRrv3rb9Jvbv8tpbROHt/a" "/9ulCRYx9df6tlQ6mzZRqnJYpgsSEsgwXvocIT9e8AhLX1fhwqGNXsV1HAdTU1NXBwYG+n85" "fX+vivnIhnVZL9PqQCQJno+/AyPsR+tTVSVBp10be5x0xp4tLKqMSc1SqfSso6Pj7s+Zam0u" "yA1XSv6xRqPulOd9BJWVNzkdXjAA4MrD4iYp6vNd7Q6ETFBe4ZifnZG+zB5oL9/qp5T2CSH2" "TZV3bVZSPtANNRIz6/iHyT+YDQBhTXabqIPxBorLFJm0gZb27lRpZvqfnp4eJ5fLYXBw8PGW" "7JPdLxZ3bpsZ+7PwKboNAHHMOy0LiHkDhHJUggRrWmxs/GmzM/b8KXaQdxBCTAwNDfnADf/L" "o390QFhva4sJyoGICjAuUfYl0rYFb8NO3JscT5Tbc2q1uq0j+emUXiKjubWuFcUcKcuAbQG2" "aUDXNQpzS1he1mf+u3P2yWoA254NiJexHK0UYiawUAxRC2IwwsGJAI3iiZCoy80ezl6J6aiF" "1MGX1Ro+LPiJpOyMlslrULkktC52JsHii8lzqikgiMPDUdm4qZnYH4lU68sbJ2Sz4dX0P7YL" "jqnaHUJ7AAAAAElFTkSuQmCC") index.append('disconnect') catalog['disconnect'] = disconnect #---------------------------------------------------------------------- disk = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgVJ" "REFUOI2NkjtrVkEQhp85Z798GJREBSMkIl5QsAp4gRi1FfwHFqJFmlgELbTTxspKRBQhKURb" "wcYm2FilUMQi2KlYiNiIYkK+y+7Oa7HnCDaJ28zAzvA+78zYqauvrgv2Y5wBDhpsBwUwQwBQ" "V0ZVGZKTs36NdOzjRox33z268DwAx5Zuzs6BcXSyiwC5GCYxjE5dGdu6FWaw3nPWemns8/f1" "6afLnx7X8y/HKoyzCF68+Y0LJLHw4C3uAjM6oagPk+hFJ8vMqcPl84d3d7vdhxXYXgHuIiYn" "psIdXYQaOsFwF71h8yfxenWNkU5NfxBHAmg0uYBSBFCZgaATKgyjH53eQLiEC1zi248+CAug" "kCUkGDTqt65M0wkVoYKYxcbASe64gxByJ6aM5AQw8wxI3HnyHjOjslYdkouUvF0IAOPju4ip" "BomAwOW4Z/ZMTIKBIUpHg+yO1FhwBzNiTFAIIGdQI2F/EwqyynxKECYhOTFaawFSdhpJhDAM" "JKTiV5TcPSMXwhlEtQQie0G+fXGK/3k3Fj+QUiEJlRm5na7g/srcps0LM4vknBg2NxGKV2FN" "wempS1sSeHZyFOAEyZVd1s5g5euzTZtP7DtHzpmYheQK2e3LMPmB44dGMYNrs0tbEkzscHIW" "iJ92cn75HuiIYMaknVB2jhzJ/4ntZsoxs2Zmq38AgMJvXVyB7IAAAAAASUVORK5CYII=") index.append('disk') catalog['disk'] = disk #---------------------------------------------------------------------- disk_multiple = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmhJ" "REFUOI2lks1LVGEYxX/ve+8dx3E0xSjBiqxQ2iQIabXUhZsgstxkK0HETf4FtahoU0GryEVi" "EWirFolBSbaxNHQoQ3CTmuMHzuQHM87M/XzfFkMNmpvorM/ze85zeOA/JQBuPP42WRqGjBtQ" "URJiLZlDSCgpNtAINlM5RqfjnfGh9tm9ABMgl3VobqrjUkOU1xPL3Lp+epfp+YcEWtE/METT" "vgk67n2abDlfx0I8UR94LlZIciBisb5h5x0CXE+xnbZXx2ZWLy++uPJ1VwIhBAZg52xazp2k" "9UyU0ek1ettqkUAq6+F5AcOxNFrJVwNwYheg2BLYtsf6lk38p0Pvkx9FpUUwMpWgIhpiNZHv" "JBoxaiorwnTen9BjsdWmhcG2zyaApzW28pFSYmhBLmvT3JjvZHhimZsdeztJopSYXBhESIB0" "1sPCpLLMwJABWcdjM+0D8G5q/c+g7UPKgeS2ixCqcIIKwMDCV4qtXBIpBYYGL1A87GlAKY0G" "DDQRExzHIZVxCwDTlNRUwdScT7SohLCVwXY87r5cRArwA4UKFBrQWoOGiJVPIAHmV3Zmno7M" "splSuJlSfKVxAh9DWghhIjAQwgAt0Vrg+T6u6xcSTPe1dk0D7bfH508dEbz/4tVYwqTnYim+" "cvN7NGihCJshHgwusZHKFAC/9X1lJ9b/ZrYhUPlOFDn6Y90cjBxDIElm43SdfYQkTNZx/wbE" "+lqvxoD2Ox/18So4HE3TUt9IeagaJGzb1Rwq8YmEwBSi8Mp71dD9drz2aPGF8qJywmYZvvIQ" "SiF0gBJZ5pbmSaQ8Zp5d23f+n/QLT0IXTQxChrUAAAAASUVORK5CYII=") index.append('disk_multiple') catalog['disk_multiple'] = disk_multiple #---------------------------------------------------------------------- door = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAATZJ" "REFUOI2lk7EuhEEUhc/sElZhs0KBeBCleAyP4A2U3gGFd1AIOpVX0IhKIUhkE9XPf+85V3F/" "/66En2QnmdyZYs5858ydUnp9zDJ6M50GMDe9uT3dD0mIIEhCykl6W0nHzsF5+VFAIta2d4Eg" "QgFJCBEQ2/X99dnvBKQjSLy/PSKa24NENASLy+twr7sFJEJ0hFJMdIhEyEFat4C75W1uSUDP" "PYmgIdxg1knQCLR1QlGihsi/COpEtjr9u0NyrAzH2Nx4xcPTEO7WbUGNhRZfWcfjAaqP+f8Q" "GOj1NwsvzwsI9rG0qm4Cs3oSIq0JrxFSrslOCzXkmUEo0/+iCOXT/pFBWhiMthAhBB0h5QxC" "zHaeHqX0+ri6vIiqqmA3h22/T/f/5E8QEcTdaA8AcHR8Usqs3/kTB9l0zpDbjAIAAAAASUVO" "RK5CYII=") index.append('door') catalog['door'] = door #---------------------------------------------------------------------- door_in = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlRJ" "REFUOI2dk71r1WcUxz/PfQ1JA03xDXILMQZp2mI6uHUrnYRMUtDFIahEUQT/AAnd3EUIiEuX" "ioOF0lI3KVQqJkHRSsRiribSoibevNT8nue8PB2uXr24tB44fKfz+cI53xN4j7p74eRZdz2t" "puuV/zN47+KpB+4+Utu6g4XmHwyUqtoBTE1NZXfndZtZRyc+z5Rwalt28MHOEdycvHAHTYkO" "wMxoNBoAhBC6NOe7DOz9EgjEjWVMIjk7SYXS2wCAa8VVMpkQQqfNDDejaC0hL1dxSWQ3NKVu" "QAiB5/EZP7d+6AKoJtwE04RrwjWS3YmySWX83NfZzbmtvzP34jpDg0OoGlcWL7F/8GAbroms" "ikvCNEEOZHc0FVRMjW++2o+4oaaoK2LCzWKW7x9+x8Fdh5BXziaRrAXbtz7lz6yIJCoqRlJh" "pVghmSAmQGD000+YK27xS/MnhnrBVLEU6e97wUcfLlMtb7Imm5RUjWiJWqlOvdxDvdxDOZSZ" "mZ2jtbTGvuFxRApcIyaR1kqZZnMLMVXbZ1RRLv14GRXD1Gg0BlE3VpfWObxnkhACKUVcBZeI" "ibAcK+BO0kjp1zM3wm/fzoTRv8Y48dlpVp9ssPy4xZGxY2+uIEV7ByqYvoK5oyJvgqSqhBDI" "lpn84nhXmJLE9rBEXBIhODk7pvFdwMTY0Y7za4BI27V34GNcBY0vIf+NuhGmp6fz/Pw8i4uL" "Xfl/Ww8MN+nr76fe00etp5dqrc76RotH92efhf/yhecnh7eV/il2KWnUTXe7ayNU6gdcitV/" "AeCTrcuGGFT8AAAAAElFTkSuQmCC") index.append('door_in') catalog['door_in'] = door_in #---------------------------------------------------------------------- door_open = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAY9J" "REFUOI2dkstqE1AQhr+T5lIbC0Zq6SIurEUQXLrri3Ttyo0IPkG2voAQEN/IlVUiLhrJJiDR" "SqrJmdtxEXNVMTowzGz+7/z/cBL/UecvnzyPsGfmNq7+i/Ddq6cfIuKkfuuIi/5bWpWaLQCd" "TqdEBPN298V89KBQIagfHHH9zgnhQbl4g4mwALg77XYbgJTS2izlnNbDUyCRr0a4ZkoJxHQd" "sCme7+5OuCPjIW4CVCjhvzpYFa3uZkK44iaECZAoEWSdLAFm9keAm1DMCJWZgzIDmEyp/M7B" "ZuvPl10zRScctvqUYqjKErDqYNOJquBmuGSa175w88aI2s4E+VuEJWBKWMY1c/l5h7ADsgzX" "jzgHbOZPKSGSCVNCM67KKFchArG8HcB0OruBKW6ZlKpEBKa6pQPNM7FmQoWUglIC39aB6izC" "Xus2YYrl71CGWDip2+2WXq/HYDBY+/+r8+y4T3N/n8Zuk/ruHrV6g/HVJR/fv/6U2KJePD4+" "rHyb3jXkfrjdi7B2qjbOQqdffwARdkfhusDSKwAAAABJRU5ErkJggg==") index.append('door_open') catalog['door_open'] = door_open #---------------------------------------------------------------------- door_out = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAktJ" "REFUOI2dk71r1UkYhZ/53Zvkmhgw4kdWI2oM0UCCoNvJ7lbu32C3aCHbiLCoYCGkFWuFiAhi" "HawsRAvRRhFh1SRc40cisVhcsnujbu5v5v0Yi7smudioAy+nOs+8czgT+I4zdeXEeXf9Q00/" "VL/FOHP15At3H+rc3M/c/DR9RYeuAMbHx7O783nMbEWPjWYKnM5N/azfPYSbk+eeoSmxAjAz" "BgYGAAghtGnOU/T9eAgIxI+LmERydpIKxVpAJnO3vLVi/jxmhptRNt4iy0u4JLLblxvcad5k" "KTUI3atmANWEm2CacE1AILsTpbkKqG/8k21bf6DPNnD99RVMDRXD1Li44wBZFZeEaYLcAmgq" "W4BfL/zytH97P2PDY6gr+4b2Iq6ICZOTN5D/bzaJZC3ZuvkdL7MikqgevvDTtV3bdo6NDY/S" "KBssyzJiQnKhp7oeVUMkYapYivT2/MvGDYt0VJq8lybF7dP3f6u/np1++OQRRajQValRq66j" "VllHtISKIVLiGjGJNP6pMD+/iZg6VkO8d+7B6M9nQm6WTVSVV6/mMHVMDTcnpYir4BIxERZj" "FdxJGldDHHy3l7kwS5ErnDp4tq0LOnO5lYEKppEQqrg7Kmt6oKocHTlOttzWgRACSWLLLBGX" "1OpBdmztBqpKURQc23+8rQMhBERaT+ju24GroHEZ8l+oG2FiYiLX63UWFhba+r9WjwzO09Pb" "S1eth85aNx2dXXz42ODN88d/h6/5hZd+H9xS/FfuUdKImw6760Codh1xKZc+AR0ym5uzjKnS" "AAAAAElFTkSuQmCC") index.append('door_out') catalog['door_out'] = door_out #---------------------------------------------------------------------- drink = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnNJ" "REFUOI2lkM1LVGEUh5+ZeZ0PUtSuYdKnkiTGiJuGpCIkcuumpYtWtnHj2hZt+hsisIXgRqmF" "q0AIKQ3ENpEgZDMZNQ3mqIw14/Xe+77ntMnQrDb9lofzPPzOgf9MDGBubs4kEomrqnpZVXtE" "5KKInBERT1Vxzm2p6mcReaeqb621r5ubm1/19/dbA2CMuZ/JZMZSqRTGmF92VSUWiwG0iUhb" "EAQ53/fZ2dmhXC4/AO7FAURkrKurC8/zSCQSRFGE7/vUajWq1Sq+7yMi1NfX09HRQV9fHyIy" "BmB+CsJyuZxsaWkh/72O7XgCyaTRRBIUbLiHC2p4EpFrPcZaIY9zLjwouJXP55/X/MB8qqQR" "k8Gk6qhLCgrsWUu1FvJ1r0bla5FoI2+BW7+eCDA7O3vFOTffeuqsWd5U1iu77AaWIHI4URqP" "JbnkxaiV3lvg5tDQ0EuA+L5gYGBgUVWvFz8WbI+ntDZmUBRR5Xh9it4T8SPwoQb7mZmZueKc" "mz93vt3sxBup7IZk7De2Pq0egQ812M/g4OCiql7/UMjLte7TDPScZvvze/kT/M9MTU09XV1d" "1aWlJZ2YmJj82575fTA9Pd3unLvhnDtnjCEMQ1S1fXx8/I6IvBgeHl47uB87APYCj5LJZK6p" "qQnf98lmsywvLxOGIfF4nM3NTYIgWLLW3h0ZGXnze4Pn3d3dxzs7O7HWUqlUAMhmsxhjaGho" "wBjDwsJCbmVl5RnQdkggIg8LhcJYtVrF8zzS6TSe5wGwsbHB+vo6pVKJYrGIqj4+cgLA5ORk" "r7X2tqreEJGTInJBRBCRNVX9IiIvoih6Mjo6+maf+QGUXGiVWqkKyQAAAABJRU5ErkJggg==") index.append('drink') catalog['drink'] = drink #---------------------------------------------------------------------- drink_empty = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnJJ" "REFUOI2lkc9LXFcUxz8z7+roMP7qc1FhSslQiQhT3FQiRYJI3Lrp0kVWduPGtVlk07+hBMxC" "cKMkC1ddFUlqoNiNVHha33sE6VTFMaA44/PNu/ecbupgYppNvnA2h/P58L1c+MzkADY3N43n" "ed+r6neq+q2I3BeRr0TEV1Wcc+9U9W8R+UtV/7TW/jEwMPBmamrKGgBjzNPu7u6lQqGAMaZt" "V1VyuRzAkIgMpWk6niQJFxcX1Ov1n4AneQARWRoZGcH3fTzPI8sykiSh2WzSaDRIkgQRoVQq" "UalUmJiYQESWAMx/gla9Xu8cHBykWCyiqu3Jsow0TcmyjEKhQKlUIgxDnHMtgJsGj6IossfH" "x3ieB4BzjjRNSZKE6+tr8vk8fX19hGFIEARWVR+1BdPT069VdTKOY1ur1TDGYK3l6uqKy8tL" "rLX4vk8URQRBYIHpubm5120BwMzMzO+qOhmGoT08PKRYLNJsNrHWUi6XieP4Dtz+xtvZ2Nh4" "4Jz7rVKpmHK5TEdHB1EUsbe3dwd+r8FNZmdnb5pIb28vnuexv78vH4M/mbW1tZcHBwe6vb2t" "Kysrq/93Zz5crK+v33POPXTOfW2ModVqoar3lpeXH4vIq/n5+be373O3wDHgWWdn53h/fz9J" "klCtVtnd3aXVapHP5zk7OyNN021r7Y8LCws7Hzb4dXR09Ivh4WGstZyfnwNQrVYxxtDT04Mx" "hq2trfEgCH4Bht4TiMjPcRwvNRoNfN+nq6sL3/cBOD095eTkhKOjI2q1Gqr6/M4TAFZXV8es" "tT+o6kMR+VJEvhERROStqv4jIq+yLHuxuLi4c8P8C6eiceQc1eGsAAAAAElFTkSuQmCC") index.append('drink_empty') catalog['drink_empty'] = drink_empty #---------------------------------------------------------------------- drive = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXhJ" "REFUOI3VU7uqIkEQPe30MI2vZNBAQTAz8RsuaLKf4Rf4AxfubznJynyD4gOMBAPBTBDt7qqu" "jaYZ7262m2xB0dVNnVOnqGrgvzdVBYfD4WcIYcbMICJ476M756Jba+GcWy8Wi3kk2O/3H8aY" "stfrwTn3WxURiXGapijLEufzeb5cLtcaAJj5q9ls4nq9IsuyCKoDRQSXywXdbhfj8RjH4/ET" "wFptNpuPLMvKPM9xv9/f5BIRRARKKSRJgjRN0el00Gq1UBQFTqfTXBPRV7/fh/ceSZLAGANj" "TKxeVyIiCCHg9XphOp1it9t9au89Ho8HbrcbrLUxiZkRQoj36k1EoLVGu92GtRbaOTcDAOcc" "mBnb7RZKKTQajTcFFdFoNAIzYzgcwns/09ZaEBGICMwMZoZSCiGEtwl8V1GNWFtrIzCEgMlk" "EpNF5I+tVHEkyPM8Mtfl1qt/b2cwGICIoJ/PZ7FarX7Utiyelde3st6qiBR/9xH+hf0CrzJz" "5J8g6VMAAAAASUVORK5CYII=") index.append('drive') catalog['drive'] = drive #---------------------------------------------------------------------- drive_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAihJ" "REFUOI3Fkr9rk0EYxz+X933Ja5tkMLRqK6UdhHaILlJqBwsNhboI4j9QcSvSxaVQ6NzVpUMX" "RxGHahUaRGtABHHSxiSFuAQiRlOpTUmTu/fuPQfJa4ogbj7w5Z477vvjuAf+d4luUy6XX4Zh" "OGuMQWtNEAQRlFIRpJQopXYWFhaykUCpVJrxfT8/MDCAUuoPF2tt1HueRz6fp1qtZpeWlnZc" "AGPMal9fH/V6nXg8HpF6idZaarUaqVSKsbEx9vb2VoAdsbu7OxOPx/PpdJpms3kirtYaay1C" "CBzHwfM8kskk/f395HI5KpVK1tVarw4ODhIEAY7j4Ps+vu9H7r1JrLWEYUin0yGTyVAsFlfc" "IAhotVo0Gg2klNElYwxhGEb77pm1Ftd1SSQSSClxlVKzAEopjDEUCgWEEMRisRMJukIjIyMY" "YxgeHiYIgllXSonWGq01xhiMMQghCMPwxA8ciM8cel8oV/O0O8dcbF0hCAJcKWVEDMOQ8fHx" "KLK1FmMMnw7e46S+MzcxzfnTF3hVfMzbj5s0Y4lfAul0Onpfb9yu+1ZlgxuT85iY4dK5OV6U" "HjGVmeZh5Rluu93ObW9vz/dMWbR2sR//iicSXJu4DcDd7AZPC+tYsfV7lP9WU3eG2jevz/ua" "kOW5+6w9v4XvxHmw+aTj/IvA0OXEqSPVuDp6ZpT94xqHrW+8+fCa5g95758SAEwunl1DiEUB" "SQtHWLv+br2+/BO8Y3V9/fDsbgAAAABJRU5ErkJggg==") index.append('drive_add') catalog['drive_add'] = drive_add #---------------------------------------------------------------------- drive_burn = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAghJ" "REFUOI3Fk01rU0EUhp97c6/3tvloyjW1WqmULoxCEVeupJBuiv/AXX9B10KhW9f+B6si7lwY" "EEt2rkRoaFJJXUSLtE3FGo12vt2YMUWkSw8c5szLnPe8M3MO/G8LhkG73X5lra0ZY9Bao5Ty" "LqX0LoRASrm5srKy5AlardZimqaNSqWClPKvKs45H8dxTKPRoNvtLq2urm5GAMaY9fHxcfb3" "90mSxCeNJjrn2Nvbo1QqMTc3x87OzhqwGWxtbS0mSdLIsox+v39KrtYa5xxBEJDL5YjjmGKx" "SD6fp16v0+l0liKt9frU1BRKKXK5HGmakqaprz6qxDmHtZaTkxMWFhbY3t5ei5RSDAYDer0e" "Qgh/yBiDtdbvh5hzjiiKKBQKCCGIpJQ1ACklxhiazSZBEBCG4SkFQ6LZ2VmMMczMzKCUqoVC" "CLTWaK0xxngfYkP85tsnlI/eUz7e5ca7h/6LIyGET7LWUq1WvWTnnMevfGxx7esbsmAScanA" "kbV/CLIs8/cblTt8vOLzB+TnB2TJPNQC0u6A67vP0FoTbGxsvFBKLY90mV+llCxnT7ka7zIx" "fYGkPwl3AO2g84P2l7ED38r/sk+3eBTf426RaZLPZbgNTAA9Cfe/PQ7PnBbJoXsJPy8e4pyF" "g9/4aw19Ds9U8OEyY1HIMSXOBSLU05XzMEbEdycJkvIvlbh5SKyjiWIAAAAASUVORK5CYII=") index.append('drive_burn') catalog['drive_burn'] = drive_burn #---------------------------------------------------------------------- drive_cd = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAp5J" "REFUOI2lk81rXFUYxn/n3nsyE28ywcgQcEwgE7WUUSru/IC0CVoRXFZcWEQIusvObiLBYsWF" "/4AupaALdamNkXxLUsRNBUs1TrCZSRrHMJNM25nMPR+vi5LLBHHlgRee95zzPO/DOTzwP5c6" "BhsbGwve+wlrLc45rLUnyhjTjRenpqYmU4H19fXxOI6Xi8UiSZL8a4qIpFhrzdLSEtvb25PT" "09OLEYBzbnZwcJC9vT0ymUxK6iaKCNVqlVwux9jYGOVyeQZYVKurq+N9fX3LIyMjNJtNkiRJ" "y1qLiKCUIgxDtNb09/cTxzELCwtsbW1NRs652Xw+jzGGMAzJZrNks9l0ercTEcF7z9HREaVS" "ic3NzZnIWku73aZer9PpdNJLzjm892l/vCciRFHEwMAA1loia+1EGIY0Gg1ardYJwn8JxHFM" "oVDAGDMRHX/P/Pz8CYFuy91YRCgUChSLxdQBv+3eozZ0nvffOsutmuWhnoC79b+4fnOH6v49" "zj0zzBPFUeotz+khzZXPl/ix3MJaS2CM4c+G8Pb5ErtNTysRMpHi+s0dXnpS897LeVZuVOjt" "UXSscLthmb34HJVDUoG58u0q2Z4I4x68dqDg7Jlhfvjd8Mn834yfGaadPDgzDo6MUKvVcM7N" "KYA3Pv7uzRdLj1194dlTWC88mgvp1QE6hFbiubFraLY9XmD44YhqtcI3a+UP7nQyHwUAWvS1" "tV935irVHR5/JKJXBzgR7ifCQVto3PfksgGnhyIO9vf4eu2Pn1QYfLFy+ZxNw3Thw+9Hw9Bf" "Ebjw7qtP6adH8+geTccIdxptDg6bfPrtL1aEa4GoS1/OvHLrRBoB3vnsZ313v/a8BMFFEXlN" "QR6lFEhFRK2Auuo7h8tfXX49Tdw/FhO23NqeK4wAAAAASUVORK5CYII=") index.append('drive_cd') catalog['drive_cd'] = drive_cd #---------------------------------------------------------------------- drive_cd_empty = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXFJ" "REFUOI3dU71qAkEQ/o69w5P1BxQbDyzO0oeIaJMHsfYFAnktg6AGC30I0UIsrBQsPL2d2UkR" "djkjqdJlYODbYeabb3ZngT9a4MB6vZ5ZawdEBGYGET24MaaI56PRaOgJVqvVi9b6M01T5Hn+" "1EVEPI6iCIvFAvv9fjgej+chADDze6PRwPF4RKlU8kXFQhHB4XBArVZDt9vFdrt9AzAPlsvl" "S6VS+ex0OrhcLsjz3DsRQUQQBAGUUoiiCNVqFVprzGYz7Ha7YcjM761WC8YYKKUQxzHiOPbd" "i0pEBNZa3G439Ho9bDabt5CIkGUZTqcT7ve7T2JmWGv92cVEBGEYol6vg4gQEtFAKYXz+Yzr" "9fpQ8BuB1hpJksAYMwjd80yn0weCouQiFhEkSYI0Tb0CMDP6/T6yLHvq7kYB4GPlchnW2m8C" "YwyazaaX59wlu8LihYoI2u22J/iYTCavbpQfG/e0kW5LmRnM/PHXr/Af7AunwXT+IlQl1wAA" "AABJRU5ErkJggg==") index.append('drive_cd_empty') catalog['drive_cd_empty'] = drive_cd_empty #---------------------------------------------------------------------- drive_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAh9J" "REFUOI3Fkk1LlFEYhq/3Y5rXGR2LQVGssWmRQrhsZSBoC+sHFK2aVu4sWgWCtIgW/YH+QvsK" "p1AZylWLFiPOCIORpsOEaTQyjue7RczbSBDteuDhPOdw7o/DueF/l9cZqtXqirV22hiD1hql" "VNxSyriFEEgpVwuFwkxMUKlUpqIoKg0MDCCl/EPFORfPiUSCUqnE9vb2zPz8/GoIYIxZTKVS" "NBoNkslkDOoGOufY3d0lk8mQz+fZ3NxcAFa9crk8lUwmS9lslmazecqu1hrnHJ7nEQQBiUSC" "vr4+0uk0xWKRWq02E2qtFwcHB1FKEQQBURQRRVGs3u3EOYe1lpOTEyYmJtjY2FgIlVK0Wi32" "9/cRQsSXjDFYa+N958w5RxiG9Pb2IoQglFJOA0gpMcawvr6O53n4vn/KQYcol8thjGFkZASl" "1HQohEBrjdYaYwzGGDzPw1p76geG9j6Q/byG/7KBypzjaPIWSilCIUQMtNYyPj4eW3bOYYyh" "p7LMMDuM3XtAMn+FdvktlbUVLn3v+UWQzWbj93Xb7agfvnjF5bv3ibZK8O4Jqf6zXMyNMlb7" "SNhut4tLS0uzXSmL107PfqsTDeXh5sM4F+HjYfrV8e8o/63eXA++TN4pnE/vvEa0GxwDR82A" "6hZ7wb8QzF0d6j/8Wr/mnwl8FbT4ceD4VPeN0e7ZPzkAeH/7wqPjg/qcb71R67s9i3t+Y9k+" "/QmZLHUjjvoOfgAAAABJRU5ErkJggg==") index.append('drive_delete') catalog['drive_delete'] = drive_delete #---------------------------------------------------------------------- drive_disk = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlBJ" "REFUOI3Fk71rk2EUxX/P+9G85otKbBSKYheNk1C0g4OFBkRBEOcsXaR06T8g1sVFUPEvcHAR" "dyFBsQZEcBChpSSRgtg2SG1QS9IkfZ73+XCoja0fsxcO3OWce7j3HvjfJfaaer3+0lo7ZYxB" "a00cxwMopQaQUqKUWpieni4OBGq12mQURdWRkRGUUn9Mcc4N+jAMqVarrK6uFufm5hYCAGPM" "fDKZZGNjg0QiMSDtJzrnaDabZLNZxsbGaDQaN4EFsbS0NJlIJKq5XI52u33ArtYa5xxCCHzf" "JwxDMpkMqVSKSqXCyspKMdBaz+fzeeI4xvd9oigiiiIelLfJJKCnNIfTQ3ze7CM8QzrZwbpt" "vrcL6M763SCOY7rdLq1WCyklzjmstfR7WaYmTnNtPM2zt01ulc4c2MvjaotX9tI5Tyk1BaCU" "whjD4uIiy8vL9GTMt44G4MW7LwPijoa2hNaWQghLIKVEa43WGmMMxhiEEHiewHcQG8v92XGs" "dTjAx5EMQEpJu6t2BfaI1loKhQLWWmofPHZkzJ2nn/AEaGOxxuL2zuogGf50kMvlMMYMTuec" "Q9cl0mh8LwQcgl1nzjqcs2gdo5Qm6Pf7lXK5fHnflyGlpBNfJBQBs1czaKsADxw4YYmCIe49" "WeNru0tQKpWu/O3Hr99+7XxCLH0evZ/hSPIEAo9Wb50b5x/iEdGTiuBfIQkCn5PH4Gi6Q/Hs" "BMNDo+DB1s4o+ZQmOQSBEL/C9HuNzzx/c+r4oQvDiWGiIIu2McJahDNY0aOx9pHNdswPOolk" "g+Z5nTYAAAAASUVORK5CYII=") index.append('drive_disk') catalog['drive_disk'] = drive_disk #---------------------------------------------------------------------- drive_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm5J" "REFUOI3Fk8tLVHEUxz/33rnecdJRGx81vZwoMKQXkQUVggbZc9febRtp0aqiRTv/ghY9VknS" "P5AQyvSGSKvxMVPYY8imwVc1Nej93d+jRXgxdd+BL+dwON/vORzOgf9t1lKQzWYHtdYdSimk" "lARBEEIIEcL3fYQQQ93d3Z2hwMTERHs0Gk03NDQghFjVxRgTxq7rkk6nyefznT09PUMRAKXU" "tVgsRrFYxPO8kLScaIxhamqKeDxOKpUil8tdAYasTCbT7nleOpFIUCqV/hlXSokxBsuycByH" "WJDB+fQQp2o35dlHfPuueq2RkZHBZDLZYYxBCBF2Xe6NMdi/hojOT1JZf4ya1H5+fHpBZuCO" "iARBQLlcZmZmBt/3McagtUYphdYaYwzVepiWrYKqnUeY/5ClwhJUxzdQU78pEhFCdAAIIVBK" "MTo6imVZ2LYNQGPlZw62Rand3oX/rZ+KmEX+TY5A2tx7i237vo+UEiklSqkQUkrWu5Mcb3Op" "3XGaxcJNLPc7blU1zkIBv/kMc2VDxPf9kKS1pqWlBa01zL/kwC6Pmh3nWPx6A9uViFKK4uNX" "5NadpKmyiSAI/gokEgmUUuHCFgpPiDct0Nh6FlG8hVNhWPy5jemnw5RaL9Lk1ZFMJpFSYvX1" "9T0IgqBr6cqYfU3HoQ1Iq5HE+mfUNVaw+HMLX9LD3H2fZG7BDic2xgyEp7xk93s7zfkLt3nX" "f4nC5+d4W/cSTM8Uah1O7LvyamxlvbMysae58urhzTV23cYtzE/N8mU8+9txnc6j19+OrvVM" "qwQSseBy/uM48vec9j311EZ3neody61FBvgDkTtp1juligQAAAAASUVORK5CYII=") index.append('drive_edit') catalog['drive_edit'] = drive_edit #---------------------------------------------------------------------- drive_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmRJ" "REFUOI3Fks9LVHEUxT9v3pvmOTqTMjqZU4sxLAsFxYWbwnIWtS0XEbVwH7hpKQj9CUGLqFaB" "LaKEBMlNMpsWakYo4w+GUGEWYy6iSRu/v1tULyP3XThwL5dzzoV74H+X97tZW1t7a60dNsag" "tUYpFUFKGUEIgZRybnR0tBAJrK6uDoVhWGxra0NK+Y+Lcy7q4/E4xWKR7e3twtjY2FwAYIyZ" "SCaTVKtVEolERDpMdM5RqVRIp9Pk83nW19fHgTlveXl5KJFIFDOZDLVa7a9ztdY45/A8D9/3" "icfjpFIpGhsbmZ2dpVwuFwKt9UQ2m0Uphe/7hGFIGIaRu3MO9kvw9R02fQtrLQcHB/T29lIq" "lcYDpRT7+/vs7u4ihMA5h7UWYwzWWjwnOe3NkO0sUN6Yoqr7CYKApqYmhBAEUsphACklxhhW" "VlbwPI9YLAbAmeZtWgcukj7ZT3L5BcfooG5ayeVyKKWGY0IItNZorTHGRNBaE3o1cg1bpFqb" "MbVpTvWN0iKXMFpGL44JISKStZbu7m66urro7MzT075LR89NOPjAwrNJmprrhPVPJOUm1lqU" "UgRCCDKZDMaY6HXOOdy3dZplklTLd0xtE5zF7C2Sv3wPNfeEE9kRtNZ4k5OTb5RS1w6lDCXr" "DLYs0le4Qxifx8rKr9zG8RsH2CnHmHo9w2I1MxtF+XC9f3TpbtuF6w/bzzZg9hZwTrL0ao2B" "kfN4/nFouMri0/HPnrZXjhSYfzBY6b39POfHtnD6C+AObWP4DefYKX1kY/r+y+AoASVkuPT4" "Rt1Zh7P2J5zjz+zAWrCu/Qe62HrCDMEMyQAAAABJRU5ErkJggg==") index.append('drive_error') catalog['drive_error'] = drive_error #---------------------------------------------------------------------- drive_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkRJ" "REFUOI3Fk81qU2EQhp/TJOSYpkGNqUK0kEqlVQJuREGkkKB0qXgB9gqK4M6qCP7dgSsvwJ8L" "aBAtcWEXVVy0NG2tIrG1RoKK1Zjz/cz3uRAPrSIufWFgZpj3nXcxA/8bwa9kcXHxsXOuIiJY" "azHGxKG1jkMphdZ6enx8vBoLNBqN0TAM64VCAa31H1u893GeSqWo1+s0m83qxMTEdBJARK5k" "MhlarRbpdDombSZ671lbWyOXy1EqlVhaWpoEpoO5ubnRdDpdz+fzbGxsbLFrrcV7TxAEJBIJ" "UqkUfX199Pb2UqvVWFlZqSattVf6+/sxxpBIJAjDkDAM4+2bnXjvcc4RRRHlcpmFhYXJpDGG" "TqdDu91GKRUPiQjOubiufbpJ13QY236RdGob2WwWpRRJrXUFQGuNiDA/P08QBPT09Gxx0M0q" "9hZGuP/uMmd3XaVYLGKMqSSVUlhrsdYiIogIQRDwOv8A5wzaWbS1FHcMMbLnKF+jDndWz3O5" "eA9jDEmlVEx0zjE8PIxzjlefNScPnUO8Q5zg8Kx/WaW89zjfdJcLT8Y4IKd/CuTzeUQktuu9" "J2prxDuaH1cwzmKdwYhhQ33l8L4TfDPfme3eJdntdmtTU1Njm64MpRRRIcKKZXduAOsE8Y73" "X96yM7uHF6tPmX35jKFWdSY+5d9x5nbJRVqjnSaymv2FQ8GxwVM8fzvDo+WHLS1UW7do/FXg" "dxy8FnSODFQy9ZeP35mA6vp1lrc8079QukRHfCKjkMEPN3jzq/8D8mmDC9o8s5AAAAAASUVO" "RK5CYII=") index.append('drive_go') catalog['drive_go'] = drive_go #---------------------------------------------------------------------- drive_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk9J" "REFUOI3FUktrU0EU/uY+vNeU3ErzqnXTgmCoBISCG5VCCyoobty56kIRBLt0U+i/EHeCqBvT" "nWCC2JCudCGKKWmi6SuYltAbic2zM3ceLmqHWu3aAwfOGb7vO98cDvC/gxwUpVJpUUo5JYQA" "5xxBEOhkjOmklIIxlpuZmZnWAisrK5Ou6+ZjsRgYY39NUUrp2rZt5PN5VKvV6dnZ2ZwFAEKI" "+VAohHq9DsdxNOkwUSmFWq0Gz/MwNjaGcrk8ByBHCoXCpOM4+Ugkglar9YddzjmUUiCEwDRN" "2LaNcDiMgYEBZLNZVCqVaYtzPh+PxxEEAUzThOu6cF1XT9dOlIJcfQFzq4aedxGp1ASKxeKc" "FQQBut0ufN8HpRRKKUgpIYSAlFL3XnMJybN7GBy/h/r7x+g39hdqMcamAIAxBiEElpeXQQiB" "YRjawRlSwkSqjcFzV9GtZnAyPIphfwlxEUwZlFJwzsE5hxBC58Eb5xwJx8ep1E2IXgVudARW" "CBi5ch63xndhUUo1SUqJZDIJKaW2L4SA6qwjaG7CMBsgRhcnvAaw10OvTvcFIpHIPvD3wg7+" "TTrr8JpvYA9LSF6EIX8CRhgqYPia3sDC2hCsfr+fzWQy1w9dGSilGDHXMO59x+kbt6HYWxDR" "RuF1G6LlwyQEC5UotjGU1ad8NKrpa58Tl+5cYI0nsKxBlBY7vY8fth8m2q10NApcfvqjDQDW" "cQKGQRgxt2A6MRSzjc6XTzsP7r/ceH4Ud6zA9qb/rrWbG+02e/3VbzuP7j5be/Uv3C9Ub3vA" "PdoSQgAAAABJRU5ErkJggg==") index.append('drive_key') catalog['drive_key'] = drive_key #---------------------------------------------------------------------- drive_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAodJ" "REFUOI3Fk89KI1kUxn+VqqJKS03biRoUIprVoPENhtARhhlwMytFN256MRtfoKGXAy7ciM8x" "vVQG2okL3enCwj/oxoimDJEGkxR6b91bdxaNRcs8wBw48J3D+b7zLc6B/zusV3BxcfE1TdO6" "1hqlFEmSZCmlzFIIgZRyf319fTETOD8/r/m+3xgbG0NK+Z8txpgMu65Lo9Gg2Wwubmxs7DsA" "WuvPg4ODPDw84HleRvqRaIzh7u6OkZERZmZmuLy8/ATsW6enpzXP8xqFQoFut/vGrlIKYwyW" "ZWHbNq7rMjw8TBAE7O3tcX19vegopT6Pj4+TJAm2beP7Pr7vZ9t/dGKMIU1TXl5eqFarnJ2d" "fXKSJCGOYzqdDkKIbEhrTZqmWf3aM8bgOA5DQ0MIIXCklHUAKSVaa8IwxLIscrncGwevQuVy" "Ga01U1NTJElSd4QQKKVQSqG1RkpJr9fD931KpRI3NzcMDAxg2zb9fp98Pk+73ebp6em7AyEE" "Wmu01iRJQrfbpVgssry8TBzHVCoVjo6OUEqxurqK67pEUcTx8TG9Xu+7QKFQQGvNyckJSil+" "rtfZ3t4mDENKpRLVapUoitja2iKKIubn51laWqLZbOI8Pz/v7e7u/iql5PDwkEqlAoDjOMRx" "zMrKCqOjo/T7fTqdDjs7O9zf3wOQz+dTZ21t7bfXY1lYWPjD9/0/gXdhGP5tjPmwubnpBkEA" "QBzHAEm/3/8H+KXVanWzXwCYm5v7aXZ29q9arVYql8up4zjv2+02V1dXeJ7H9PQ0ExMTKKW+" "3d7e5g4ODh7eCAB2rVarBkHwZXJycszzPNsYk3t8fPxoWdZ9sVj8ArhCCN1qtTpxHP/+LwIR" "hH+tWgupAAAAAElFTkSuQmCC") index.append('drive_link') catalog['drive_link'] = drive_link #---------------------------------------------------------------------- drive_magnify = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAilJ" "REFUOI3Fkr1PU2EUxn+3997e21sKmIYCJSaUwbA06uCoRFg0/g+GRUf+ARLi5ODo7ODo6CR1" "kJTVRAYItAZMbEKkEZXY0o/32wWvGImJk0/y5D3DeZ7z8R743/B+Bo1G4421dtEYg9YapVRK" "KWVKIQRSyo3l5eWl1GBvb28hjuP6xMQEUso/qjjn0jgMQ+r1Oq1Wa2llZWUjADDGrCVJQrvd" "JoqiVHRe6Jzj8PCQ0dFRKpUKzWZzFdjwtre3F6IoqheLRTqdzm/taq1xzuF5Hr7vE4YhhUKB" "fD5PrVZjf39/KdBar5VKJZRS+L5PHMfEcZxWP9+Jcw5rLcPhkGq1yu7u7mqglKLX63F8fIwQ" "Ik0yxuCcZZhMIzMxpyIiCgPGchb36R35wjhCCAIp5SKAlBJjDDs7O3ieRyaToXTlBklukqvl" "EYLQ5/N3yUlX0M3NUh5zKKUWM0IItNZorTHGpNRaw8hl5iYTToTHUcegPZ+ZUgGTHU+/OBBC" "pCJrLfPz81hrsdbyZSDJZkO00FgHQjviwEe7AGvtL4NisXg2s0tpraXfD5HKoAxoe7ZID/q9" "HuVKGa01wWAwqK2vr985d2XpO1O9TXfqOoVcFmEcQcbj6JvCfX3Ps8fPcS6upad8EZ6+/liJ" "Pe5fGsk+sg46vaFV7YZ3s3Tk9Q42ux8aWw//anARXq7dfTA1Pf2kNHdtvPn2Vd//V4MXmwdb" "t2ZPW0oM72V8P/kBnatu3Fd1F8EAAAAASUVORK5CYII=") index.append('drive_magnify') catalog['drive_magnify'] = drive_magnify #---------------------------------------------------------------------- drive_network = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAfxJ" "REFUOI11kr1qG1EQhb/du8uKyFKIjC0wyMWqCiZP4MIgNXmFlAFVErhIa+JHSOc6ZR5BhiDJ" "uJD6YEhhVoVQYaWLC8nauT8p7L3YljIwMHDOnHvuzAQ8xWQyGVhrW1prjDForV+kiDyvh51O" "pw0QAIzH45NyuXyVpil5nvM6nHO+juOY0WjEbDZrn56eDiMAY8x5rVbj7u6OJEl80/NG5xzz" "+ZxqtUqz2STLsjNgGFxfX5/s7OxcHR4ecn9/T57nPrXWOOcIggClFHEcU6lUKJfLDAYDptNp" "OzLGnO/t7SEiKKUolUqUSiX/+nMnzjmstTw8PHB0dMTt7e1ZpLVmtVqxWCxYLpe+wTnnHVhr" "ARARnHNEUcT+/j5aayKtdUspxc3NDUEQ+OY8zwnD0AuIiMcB0jRFRFpRsZ5Go8F6vcZai7UW" "pRQigjHGz0FEsNbinPNrjYq9T6dTwjD0AsVMCgER8Y4ArLWPAiLC7u4ux8fHnlyQjDGeHIbh" "C/zg4MALXPb7/Y+FpVcXt3GRxZUaYzDGXAYbZwf0er0PSZL8qtfrAMxmM3txcaG2cYNut+u2" "Aahkmat3CUCs/y4Du6pso0UAzWZzA8iy7E3a6gEw//m18h/Oo0CWZRvgH9eQt0sTFzVZFm/9" "wlb7QP3T7284Pj+xvi9+vP+yjfcPcs6PXwngtjsAAAAASUVORK5CYII=") index.append('drive_network') catalog['drive_network'] = drive_network #---------------------------------------------------------------------- drive_rename = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAZtJ" "REFUOI3NUruKIlEQPXe7m24U2+AiDSbiBxgZTTSgyf6DifmyjpgOzCcMyuIXSH/DmIw0GExu" "YAsmCgbGguJ91gaz3nF2d2CznQOHKgrq3Lp1CvjfYJckz/Nna23LGAOtNZRSjlJKRyEEpJSz" "brfbdgLL5fI2iqKsUqlASvnHK0Tk8iAIkGUZttttu9frzXwAMMY8FAoF7Pd7hGHomq4biQi7" "3Q5xHKNer2O1Wt0DmLHFYnEbhmHGOcfhcHg3rtYaRATGGDzPQxAEKJVKKBaLmE6nWK/X7S9a" "64dyuQylFDzPQxRFiOMYnHMkSYIkSTCZTDCfz5GmKay1OJ/PaDQakFLe+0opHI9H1Gq1Dzc9" "Go3Q7/cxHA5dbbPZQAgBX0rZuhTvfryAMQYQgbHXFTMAj99ucDqd3on+mrrlCyGgtXaeMvba" "7CIIf8PFYl8IAWMMAGD4/ebDb/wOa+2bAOcceZ4764gI1lpn43g8RrPZxGAwQKfTARGhWq1C" "aw2WpumTUurr1ZW5eOH1VWqtYYyBMQZENP3nkT8vfgL/UgnFeOFrowAAAABJRU5ErkJggg==") index.append('drive_rename') catalog['drive_rename'] = drive_rename #---------------------------------------------------------------------- drive_user = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn9J" "REFUOI3FkstLVHEUxz/Xmdu9zUuYy0xTbVKw7OGmSCJ6gG6CNtU6SKpluGoXtKho26JFf4EV" "BEEtykXKEFGJkI9JRx2sNKsZJ4lMnX7392pTtxetO/CFs/l+zuGcL/zvcn405XJ5wBjTpbVG" "KYWUMlIYhpGEEIRhONjT09MdASYnJw/7vl/M5XKEYfjXFGtt1LuuS7FYZG5urru3t3cwDqC1" "vphIJKhWq3ieF5l+NVprWVhYIJPJ0NLSwtTU1AVg0BkfHz/seV4xCAKWl5d/W1cphbUWx3GI" "xWK4rks6nSaZTNLf30+lUumOK6Uu5vN5pJTEYjF838f3/Wh6o9Hg0a0bfB29y1cDjexOjp27" "REdHBxMTExfiUkpWV1ep1+sIIbDWYoxBa40xhsnnAzTG76GtxDoxVuaH6bt+hRNnzyOEIB6G" "YRdAGIZorSmVSjiOQ1NTEwDV0QHyG1oJmtNMT0/TXNjIUn2G5kwGKWVXXAiBUgqlFFprtNY4" "joMxBoBUYQsnTx0nud7ny9IH4qmAB/fvI7+/Oi6EiIzGGNrb2zHGYIzBWsvTD4uUR4bY3dlJ" "JpvnzasZRus+24z5CQiCAK119LofdxgbG+PV61kG1+9g6M4TEi7MfkmwYj2Gh4dRSuH09fU9" "lFIe+SVlCCGoLy6STCap1mqsra2xb/8BNhQK3Ll9k3Q6jeu61OuLU1GU/6zS5T2vq5uPbnk8" "v46Vz0vUajWUUnieh+slObQrx175TDX9C5AKNg19elNifuE92WyW1tZWPM+jra0NqQ3z5Rck" "MqnR+L8AfmrrGcd7d3W2Ujm98ql20FqbEkIwMjKi31Y/vtzeWbjm5vIz3wCbGX6/Q+pxhQAA" "AABJRU5ErkJggg==") index.append('drive_user') catalog['drive_user'] = drive_user #---------------------------------------------------------------------- drive_web = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlZJ" "REFUOI2FUM9LVFEYPW/uHX363jTjDGM2TjI2JIYGgSTlRjAjCVrVoiA3bWrRrqUg9B9EmzZu" "hLaVQTW2mJKRUag2aUQ2OTMqTcNgI2k589791SLe4/kKunDhft8953zfORr+cW7lJy8cix2+" "393Wl/7FNFT2P258qWzceTjxeM6PJf7GzcXr5yd6h59dSlzt7Gg5GWByMBCSpzrCZv1K6xm1" "uvak9MmLD/gFUrHYg+PR4eCGFFj5Abys1ZEj75Hs7KIRw7znx1N/o+9QKvXOKiAiTuP1VgMi" "+Rkfgk9BvhvojXQn/ysgpIV9C3hTkSjVKfT9JNr2bkALL8Dihb/yci0sLy9n8/m82tzeIZ2s" "gZ+NArSAjtq3COTOFtI6UNzcJrOzs2pmZiZ7IMSlpaVRwzDu9vf3w5BRvK0+x1D8BFpkF44Y" "TQwffYG1r6u4Nngb42fHUavVekdGRhYzmUyJAoAQYjoajaJaraKrtRtDrZcxt/IIXCyCBm2s" "Viq4mJpE+147yuUy0uk01tfXpwC80nK53Khpmgs9PT3Y3d2Fbdvu5ZxDKQVN00AIQTAYRCgU" "gmEYyGazKBaL56gQYjoej4MxBkIIdF2HrutQSgEAlFIH3lJKNJtNDAwMoFAoTFHOORqNBur1" "OizLckFCCEgp3drpKaVAKUU4HAbnHJRzPkYIgW3bLsBP8NdCCJimCcbYGGWMgXMOzrk71TvZ" "L+L8OTzqEB2yX8RvxclESvlHgDGGWCzmTvICnPCklAcCVUohkUi4AvOZTGbCWclryfv22vRs" "Pf8bqgrLGitO17MAAAAASUVORK5CYII=") index.append('drive_web') catalog['drive_web'] = drive_web #---------------------------------------------------------------------- dvd = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAu1J" "REFUOI2Nk89rXFUUxz/3vjcvYZJMpliToelAmISIUJtxIYzJdBMUXbhSGPwVEXQThDTMpmuX" "s3mLELtSFxJLnaoVkUKJKZ0mmcwyf8Grtk4wE3Smk/S9ee/eO8+FBGJQ8LM6i+85nO/3cARn" "qNfr82EYvqOUmlNKZZVSdhRFrTAM78HxN4uLS/dP68VJsb29PSKEqERR9PHU1FRieHgY27ax" "LAutNfv7Te7fu62l6N/sKf3J1aufdgGsk2Yp5a1MJvN2Pp+3BgYG6HQ6BEGAEIJUKsWzz4zw" "4uWL0vd7lx89bl6Zm3/lu1qtFkoAIURlfHz8tWw2ixAC27ZRSqGUwrZtpJSoqIPpG64UXyL/" "wvNFGf/5GYC1tbVVUEpdn5mZEc1mE8dxGBwcJAgCer0e6XQay5Ko3u9Y8m+7k5NZfrqzfalY" "fHlTGmM+mJ6elu12G2MMzWaTbrdLKpVidHQUYwxG+4BGyCH68jwiMcmbb70vj47Ue/bKysrS" "2Uv8F7u7u2il0YHPxMQEYRjO2QDr6+s4jkOr1cLzPFzXpVwus7CwgO/7NBoNXNfl8PAQYwxC" "CJLJJFEUXZQAjuNQKpXwPI9cLsfa2hqFQgHf9ymVShQKBQB+OzK0nhoOjjWdsI/f00KeXdPz" "PMbGxv7VgooloXBQ1iC/HnYJtDmQAFEUUa1WyeVyuK5Lo9GgVCqRTCapVqs0Gg0AjNZorbBs" "m8cPPYRROyKfz8f/N8Qbt25zEMSkRs9R/ujdvm31i/be3p5YXV29Pjs7u/TcbI4nT9sYbTDG" "oLWh3zfEcUzKOU9CQm4sxY1vv8eW4svNu3d3JUAQBNce7NQ2aw9qJBIJLNsCICYGIRBC0JeK" "dDrN5p0f+fmHmxvBcacMp56pUqmMtLt/uJ1u+8PX33jVzlzIMDSUJI5juk+6/PLwEV9/UVUq" "Up/7vn+tXq8f/WPACcvLy8VA+YtBL5jvBcEFHSl03+zHOt6JQv3VxsbGzmn9X+ita3L3FA1i" "AAAAAElFTkSuQmCC") index.append('dvd') catalog['dvd'] = dvd #---------------------------------------------------------------------- dvd_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAw9J" "REFUOI2FkUtMXGUcxX/fd+88MtJhDG0g0omTATEkFQaNZoRhg0ariZr4mNQoJo3GBImU4EJ3" "6q5dOIkEWbhxIQucqo2PuLCAHaAwcYWvuPJqaoe0QyPDDNzXd78ZF6amITH+VmfxP8k5/yM4" "xMbGxojnec8rpYaVUkmllOn7ftXzvBXY/2R8fOLSrffiplhfXz8ihDjn+/4rPT09oba2NkzT" "xDAMgiBge7vCpZULgRTNRVcFk2fOvFsHMG6apZTnu7q6TmUyGSMSiVCr1XAcByEE8XicYx1H" "GBo4Lm3bHbjyZ2V0eOThz0qlkicBhBDnOjs7H00mkwghME0TpRRKKUzTREqJ8mvopmY0dz+Z" "e/pzsvXXBwDG2tpaVik139fXJyqVCuFwmGg0iuM4uK5LIpHAMCTKvYYh/6mbSiX5+pv1E7nc" "g8tSa/1Sb2+v3N3dRWtNpVKhXq8Tj8dpb29Ha40ObCBAyNtoyqOIUIqnn3lRNhrqBXN6enri" "8BL/xebmJoEKCByb7u5uPM8bNgEWFhYIh8NUq1Usy6JQKDAzM8PY2Bi2bVMulykUCuzs7KC1" "RghBLBbD9/3jEiAcDpPP57Esi3Q6zdzcHNlsFtu2yefzZLNZAK42NNUDzfX9gJrXxHYDYR6O" "aVnWv4ZbuXPoKJ+uvsO+U8P1Pe7qHsUJ9HUJ4Ps+xWKRdDpNoVCgXC6Tz+eJxWIUi0XOr3zE" "vY8nGRt9gNdOTTJ0X5qfbyxy0PFrIDKZTOv/nnfi2Q6ee+oJMCRP9r/Oe8uvYiBZ/PwL39za" "2hKzs7Pzg4ODE3cPptk72EUHGq01QaBpNjVvfzxJSLTxWP/LALzx0Id89dM8iC/DEsBxnDdX" "L5eWS6slQqEQhmkA0KIFQlDf3+WX7Q3OXjwNwNlvT/Nb9UdatFwDYGlpyT/5yMkLv1t/HFu+" "+N1AItEuI9EI0WgEKSWNgwZbV9ZIdaa4YV9l76DK5R/WqNe898XhvlNTUzlH2eOO64y4jnNH" "4CuCpt7eu91SfqzeB61YCxq0WvPfz197629eZ2l166FgRAAAAABJRU5ErkJggg==") index.append('dvd_add') catalog['dvd_add'] = dvd_add #---------------------------------------------------------------------- dvd_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAw1J" "REFUOI2Fkd9rW2UYxz/ve06TmHVJZh3N7IJdWiqCthGZxrZDqbJVb4QNs4nWKxHqoCtF2K2C" "iNtFLmqd/0AFjcjAXyDrZmtjG7yQghfOC4/DLaFrnUnT9fx6z3uOF7IxCuLn6nvxfB+e7/cR" "7GJlZWXE87xXlFLDSqmcUsr0fX/D87wrcPuziYnJxXvnxR1RrVb3CiHO+b7/Rl9fX0dnZyem" "aWIYBkEQ0GjUWbxyMZAi/NRVwekzZ95tAxh3zFLKz7PZ7KlCoWDE43FarRaO4yCEIJVKsb9r" "L48PHpS27Q7+eb1+ZHjk+S+WlpY8CSCEONfd3X0sl8shhMA0TZRSKKUwTRMpJcpvoUPNkdHD" "FB57ZFRGf38EYCwvLxeVUhcGBgZEvV4nFouRSCRwHAfXdclkMhiGRLnrGPLfuL29Ob7+tvro" "6OjTl6XW+vX+/n7ZbDbRWlOv12m326RSKdLpNFprdGADAULuIZQPIDp6OX7iNbm9rV41p6en" "J3d/4r9YXV0lUAGBY9PT04PnecMmwPz8PLFYjI2NDSzLolwuMzMzw9jYGLZtU6vVKJfLbG5u" "orVGCEEymcT3/YMSIBaLUSqVsCyLfD7P3NwcxWIR27YplUoUi0UAbmxrNnY0N28HtLwQ2w2E" "uftMy7LuGu7laJeL/8E4QcMi7MrSevIkTqBvSgDf96lUKuTzecrlMrVajVKpRDKZpFKpcPWT" "85wczPDUqTcZ+/ArRo6/zL5rl3jW/aUlCoVC9H/lnd33Gy+9/R73/b4I9SqkM/xlPsRP31Ub" "5trampidnb0wNDQ0+fBQnq2dJjrQaK0JAk0YapqnnyGRPQQvztxdar5zgFjEARPAcZyzP/y4" "NLC+df25w8UnANBaExGBEET3d2GvfcOeL9/Cc9axge22gTZoGAALCwv++NHxi39Y1/ZfvvT9" "YCaTlvFEnEQijpQS7fnc+nkRo0OijB22bkVYDal1EJ0Xu/NOTU2NOsqecFxnxHWcBwNfEYS6" "cUze2DnU/jUXD6NsKKN6SPTxCwvh+/8AqExtAMnwTekAAAAASUVORK5CYII=") index.append('dvd_delete') catalog['dvd_delete'] = dvd_delete #---------------------------------------------------------------------- dvd_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA0ZJ" "REFUOI1tk01MXGUUhp/vu5cL2mH4HyBlDAw4hghlin9IQSNWJaZpYkyJmrQutAt0UTPRamJN" "auOGmMyCYE3UmqjEULQZNdomQBsozEjUKDWxWGOHWhiKUBmg7Z0797sXXBBMJX1WZ/Ge5Lzn" "nFewiXg8viOTyTyrlGpWSvmVUrpt2/OZTOYMXD++d2/n8M16sVGMjY3lCiG6bNt+sbq6Osvj" "8aDrOpqm4TgOs7NJhs9EHSlW+yzlvHzgwNsrANpGs5Tyi7KysmdCoZCWnZ3N0tIS6XQaIQRe" "r5eSoly2b6uQpmltuzydbG3esfPEyMhIRgIIIbpKS0uf8Pv9CCHQdR2lFEopdF1HSomyl3BX" "XVpb7iNUX9si1xbfA9BGR0eblFJHg8GgSCaTGIZBTk4O6XQay7LIz89H0yTKmkOT63YrK/18" "e3KsrqXlwdO667r7ampqZCqVwnVdkskk5eXleL1epJS4rovrmICDtfAbV+JRNE89z9dPyZ8u" "ySMiFAqtbb7ErXg4pHhj3y5uK24lr2o7S1Pf88upjx0doLe3F8MwmJ+fJ5FIEIlECIfDtLW1" "YZomF38+xj21WeQV3s/ixUkMYZPrLaOgqGLdlWEYdHR0kEgkCAQC9PT00NTUhGmadB16mgfq" "DIrubMe1BzBuv8xfE99xfvgzekZSK3LzqIlEAp/Pt/4k13/k3bd2kVf9JNbsh4isFFmeXAzn" "KguVe5hZXp2VALZt09/fTyAQIBKJMD4+zjvh3XjcX8mr2Y2VfB+ZpbBXKpk7O8Fi3WtMLdgI" "V8VuucS6rRkOvtTO3Y88hf33JwjNxlquYGFsgiuNh9lSFiT8wnOrurbaIgC6u7uPNjQ0dN7V" "EOBC7DjFYhFH+CgqjFHgM7CW/fzzw3n05jfRiqv5/MuvGfrmxEenB07u1wHS6fTrZ2Mjwbnl" "6UfF5Cke6jzGhb5X+WM0TvYdDbjX5ih57CAlW4NEo1GGvuobTJs3wv9lYWhoyG5/vD06lbhU" "sjI90dhU4aWg3M/izFWSf06xZecr/D67zOFDR9S5iXMfpE1zfzwev/a/NG6wp7Uw01jl0++t" "rRJztusOTMobKUvOrDlrMTvjfDo4OBi7Wf8vAh1ozvty7/AAAAAASUVORK5CYII=") index.append('dvd_edit') catalog['dvd_edit'] = dvd_edit #---------------------------------------------------------------------- dvd_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAyhJ" "REFUOI1dk19InXUYxz+/3/ueoznP0ZX/hrPp0VyNTc/YAnPKQqJBUBcJWkxHF91I5MSbLmOX" "3hxCbFEXQWHgXDWQiCC2dpyKq4y6CMrgdbWOzdPsnJ3Zef/83t/v7WItlp+r54Hnge+X7/MI" "drGysnLC9/2XlVK9SqkWpZQdBEHe9/0rsHNhdHTs6oPz4n6xtLSUEEJMBUHwant7e6y6uhrb" "trEsizAM2dzMcfXKpVAKM+ep8LWzZ8+VAKz7y1LKi01NTS+l02mroqKCYrGI67oIIUgmk9Q/" "kuBo135ZLntdv93M9feeeOaTbDbrSwAhxFRjY+OplpYWhBDYto1SCqUUtm0jpUQFRbTR9Pc9" "SfrIE30y+uttAOvatWs9SqnznZ2dIpfLEY/HqaysxHVdPM+jtrYWy5Io7xaWvGe3tbWFzz5f" "OtzX99RlqbU+09HRIQuFAlprcrkcpVKJZDJJTU0NWmt0WAZChNyDkXWIWCsvDo7Iu3fVaXti" "YmJsdxK76U3X8MLJOvoH38GIOKFbprm5Gd/3e22A2dlZ4vE4+Xwex3HIZDJMTk4yMDBAeadA" "4Eyz77Fn2frpIqL+OYQQVFVVEQTBfgkQj8cZGhrCcRxSqRQzMzP09PRQLpeZf2+CxraTJPcd" "xftjme3tG2zthBR9Q9kLhdwt13EcGhoa7jV+nlPHq0nU1aJLCzQdPo289QVKxvj1zxJuqLck" "QBAEzM/Pk0qlyGQyrK6uMjw8BLe/ou3YKHjf8fWHH1Fd6yLya8SKP3Bzw0FotWwDjIyM/E9F" "JpOhq62CmPFI7C2jSxsQGfTON7Q9Pcn64gdcmLtjTBS9LwCmp6fPd3d3jx3sTnHn7wI6CAi+" "neZA+nkqY9cxwe//Hn4Ma88xtn6RLFyaW3v9rZXjEsB13TcWl7OXs4tZYrEYZnOVvY1pqhK3" "icJtEBZrn64DBuOtU995gCMPlx5dfPPQof+eaWpqKlEobWeKpcIrZx7fsNPD72LJG0RhAYge" "MCixHjrI1o/f8/PCuY8FuxgfH+8bbF7+MtImHulIGG0QmCjS2ggiHRljIhOBMWCitX8AKf1v" "ZAGH/HAAAAAASUVORK5CYII=") index.append('dvd_error') catalog['dvd_error'] = dvd_error #---------------------------------------------------------------------- dvd_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAyVJ" "REFUOI11k11IpGUYhq/3m29HGXWUshzWMWR0XWxbnViW/dRZA9utWIKgYOjPCrYTyVQGoqMO" "llhICA9E9zzwwIzoJLY/cleddVyExZMNYmFilbHdgW1+1O/vfd9vOgijpK6j++B+4Hmem1tw" "hPX19SHP896QUg5KKTuklKbv+0XP85Zh/8vR0bGb//SLQ5HNZpuEENO+77/f1dV1rLGxEdM0" "CYVCKKXY3S1wc/kbZYhg0ZXqg8nJK1WA0OGwYRhfxWKx15PJZKiuro5yuYzjOAghiEajPPF4" "E8/2xQ3bdvu2dwrnB4cufL2ysuIZAEKI6ba2thc7OjoQQmCaJlJKpJSYpolhGEi/jA4051Nn" "SZ7uTRm1P+YBQmtra5aU8lpPT48oFAqEw2Hq6+txHAfXdWlpaSEUMpDuA0LGX+d2dnbw7fXs" "M6nUwM+G1vqd7u5uo1QqobWmUChQrVaJRqM0NzejtUYrG1AIo4HAaEUc6+TV19429vbkW+bU" "1NTY0ST+j1wuh5IK5di0t7fjed6gCbCwsEA4HKZYLJLP55mZmSGTyTAyMoJt22xsbJBT80ws" "DvLR8CLhUB2RSATf9+MGQDgcJp1Ok8/nSSQSzM3NYVkWtm2TTqexLAtX+8Rbe/nkp1coVA8o" "ewG2q4R5dM18Po9lWcxvXqYWSM5NhfhsLU176wl6Y+fYcw+4snyBDweu4yj90ATwfZ+lpSWK" "xSLj4+NkMhmU8Ll46l10LUAHmoAau5UdTseH2PcdPl0eoNl4blMkk8nafz3szKTgUt9l7j+6" "hwwUKpBILTGMME82xcnmf+B2PhuYW1tbYnZ29lp/f//Yyf4ElYMSWmmu/vgmSivaok+hAo2u" "Bfxe2eaxxhh3dm6R+3XDdQQDJoDjOB+v3lrpeVDZef6sdQYAR3l8kfscP/BxlU+i9WmsxAts" "3s9y4+4NHzsyvDtb3fq7TNPT002l6qOZcrX03ksvXzRjx2M0NESo1WpUK1XGv7tEfzzF6i+r" "B3o/Mrw9X7nzrzYeMjExkXKkPeq4zpDrOMeVL1GB3r176vuTGmF66MTDq/x26P8TChuCk/SN" "0coAAAAASUVORK5CYII=") index.append('dvd_go') catalog['dvd_go'] = dvd_go #---------------------------------------------------------------------- dvd_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAyJJ" "REFUOI11k11om2UUx3/P875JQ9amtfZL24ySlg7FtdFNzNr0plT0ojdVCBNXGagXVWhLb3ap" "XhYhYK3DC0GQKjMiQ5Dq1rU2axvjx7yQjW5+hH2Y4sJcYtK9yfs875t4IYW16O/qcPifw/mf" "wxHsI5VKDdm2/YLWelBrHdRam0qpnG3bq7Dz6cTE5Nr9erEbbGxsNAgh5pRSr/T09Hjq6+sx" "TRPDMHAch+3tLGurZx0pqmcq2nl9evqtIoCxWyyl/Kyjo+N4OBw26urqKBQKlMtlhBAEAgFa" "H2zg8f4uaVmV/pu3ssODQ6OfJ5NJWwIIIeba29ufCQaDCCEwTROtNVprTNNESolWBdyqy3D0" "ScKHH4nK2t33AIz19fWI1vp0X1+fyGazeL1efD4f5XKZSqVCU1MThiHRlT8x5L92u7uDfLm0" "8Vg0emxFuq77Um9vr8zn87iuSzabpVgsEggEaGxsxHVdXMcCHIQ8QFW2IDzdPPf8CVkq6RfN" "mZmZyf2X+C+EgKV3J6havyGbB+nsHMK27UETYHFxEa/XSy6XI5PJEI/HmZ2dZWRkBMuySKfT" "XD33Nh7PTRqPneTO9+8jCaCU6pIAXq+XWCxGJpMhFAqxsLBAJBLBsixisRiRYInpV8M0HjrK" "vRtf4fEHca99TKdxu07uHzWTydDW1rYnJ3eu0tQ/hmv9iq/lYUw/PDT8KCeecvwSQClFIpEg" "FAoRj8dJp9PEYjH8fj+JRIJbOY3OX6eq7lBT1/AGbkDlCuWcckU4HK793+JCrTVeG2umufUA" "vUeaMWUBIRuoasXlT37hwmX9hgCYn58/PTAwMHloIMTf9/K4jgt/bGJmk3RFRqmp8wi3xNb5" "CqbtQ9k2iz9WVt45+92oBCiXy6cubiZXkheTeDweDNPAV7jEwegYTuFDhNpha1Ujel7mp8A4" "b66Z3/xw2xjf80xzc3MN+eJf8UIxf/LZsafNw+7XdB3pxSl8y9aFElecJzhzbktrpT+wLOtU" "KpUq7Wmwy9TUVLSsrYmjD1wfDx+ULTt3rdoXP7P9+07DkrKdj5aXlzfv1/8D4P5jGQo6NQQA" "AAAASUVORK5CYII=") index.append('dvd_key') catalog['dvd_key'] = dvd_key #---------------------------------------------------------------------- dvd_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAzBJ" "REFUOI11k09MI3UcxT+/6TDlbykitgIVQgmJRpYq0VSWhSxoPHhxIWkwynrhQkxcwkXDAbPH" "xqSJBPfAwXggUVHx4MbbrtstS/FAwrnRHtBpC+0uCJ1pZ34zrYfNmpXEz+l7eC9537w8wQV2" "d3cvW5b1npRyTEoZklKqtm0fW5Z1F8rfzc8v3ntaL54cOzs7bUKIuG3bC+FwuKG1tRVVVfF4" "PDiOQy6nc+/uT44iat9WpfPRjRs3zwA8T8yKonwfDAbnIpGIx+v1cnp6SqVSQQiBz+ejq7ON" "Vy71KqZZvXT4p35l7PKbPyaTSUsBEELEA4HA26FQCCEEqqoipURKiaqqKIqCtE9xay5Xxl8j" "MvziuFJ/9CWAJ5VKRaWUt4aGhoSu62iaRmNjI5VKhWq1it/vx+NRkNUCHuXxu/39IW7/svPy" "+PgbdxTXda8PDg4qJycnuK6LruucnZ3h8/lob2/HdV1cxwQchNJCTXkW0dDPzOwHyvm5fF9d" "WlpavNjE/5FOp3Gkg1Mx6enpwbKsMRVgc3MTTdM4Pj4mm82SSCRYXl5mamoK0zTZ29sjkUhQ" "LBZxXRchBM3Nzdi23asAaJpGLBYjm80yMDDA+vo60WgU0zSJxWJEo1EA/jp3OTZcjsoOp1YN" "s+oI9WLMTCZDU1MT6XSazs5OpqenKRQKaJrGrz9v8fxzXRRLD2nt6sGUTlEFsG2bra0t8vk8" "q6urzMzMMD8/j2EYhMNhUqkUo6OjzF57lwZVJZ/Ps7+/j1qzLRGJROpPJ5icnOTDhQU+W1mh" "VqvR3d3N8PAw+XyeUqlEvlBg+NXXeeetq2xvb5fVg4MDsba2dmtkZGTxwd596s7jsm9+vsKn" "H68yNzdHR0cH5XKZYrHIxsYGrc8EAPD7/aoKUKlUPrn/IDl0bvw9XS1LAL75+gdqtTrxeJyW" "lhYADMPAdV1+u3P74eToS526rlf/HVM8Hm/7/Y/MV6XSo9mJiQkRCoVQhMLR0RGZTAav10tf" "Xx+BQADHcU4ODw9FMpksCP6LJxaLXTcM44tgMNjibfQK6ohcIafXa+5Bb88LVwHFsiw3l8sV" "DcO49g88M3TlyhDM9AAAAABJRU5ErkJggg==") index.append('dvd_link') catalog['dvd_link'] = dvd_link #---------------------------------------------------------------------- email = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhFJ" "REFUOI3Nk7tuE1EQhr85e7xeb7y+5GaI4yCMFGregZoH4AWo6XkAajpaJArSIYHEpQgSKRCC" "PkWECLZisr7Eji9Zn70cChsiaCngb2amGc3/6xv415IHjz/s5/3ird4kWZlEscosZFjSzJJZ" "S2otWbaY08ySplhRaWxmw17r8OhIr6+WGvfu7JZMgnh55/ftf/ayqBfzxJlFydbdhyZS3VHS" "jFMrT/c7tHqG6dxy3M9oDTLaw4zOKCMcW3pTS5xCu2949KLDcGZUsLF9Q01NJvmcon61xJvP" "IcNJTK0k5BxwHcHVgquhUhD654a9g1MqqyXWKnkQETWLEgCaV4ps10q8+hRyNo5ZLypcDa4D" "ZU8YjA17ByHrayWa9SJiF9bUNEoB0A40t4psVH2evWsxGBvKnhB4Qn9sePK2Rbns09wqUtCX" "2ajpxeICEUjiBE9n7NQrvPwY0u5FtHsRzz+ENOoVAjdF2QRXXyarZ/MUCxiTcDoY06gFuG6O" "zsDj/eE5CthtVKmtFZhGhk5vzHo1wFrACno2j22aWQn7YxobAQUvBxaub/rsbPoIIEs2tO+i" "NwNOuudcVAqQpVZPBydfo3l87Wbdk8BXIipFLS2JyC8GfnIAmp1KMTv+PjGjbvtEzyfh8e37" "r6v5wF9xXEdyWqMcwXFAKUHp5YIlVWKtTZPYzEZn/e6X1re//IT/QT8AiN/zcibBciIAAAAA" "SUVORK5CYII=") index.append('email') catalog['email'] = email #---------------------------------------------------------------------- email_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAphJ" "REFUOI3Fks9rFGccxj/vO7Ozk83sZBPzw+xmRbdU7aGkoi0ipaW0Qnuol956kx4K4qX04qF/" "QK71ENGLYCmiF6tRMekhgrZIaCmhLYQitLKLWye7m81OZjM7M+/79pCDVij15nN5vt/D9+F5" "Hr7wsiG+Ov9gOV/wDrW2suGtOJXagMagtEEbgzIGrXd2pQ1KYYRUadLvtuprDx/a42N+9fMT" "+/0kQ7h569/qz89ih7cHmdWPs/Knc0ks1zezWqqM+Ha5Sb2VEA0Mj9qaekfT6Gqam5ogNLQi" "Q6qg0U44e7NJt5/I4sTMKzJKtMjnJJVpn6WfA7pbKVO+IGeBYwkcW+DYUBoStHsJV+8/oTTm" "s6uUByGE7McZALXdHjNTPnd+CtgIU8Y9iWODY8GIK+iECVfvB4zv8qlVPITZiSajWAFgW1Ar" "e0yMFrhyt04nTBhxBUVX0A4TLn1fZ2SkQK3sMWQ/7UZG2zsOhIAszXBtzZ5KiVsrAY1WTKMV" "c/1BQLVSougopMlw7KfN2v2BwgBJkvGkE1KdKuI4OZodl3trPSSwvzrK4/VFVv5YIOxvECcJ" "785+DOYwdn+QGqWNCNoh1YkiQ24ODOybLLBnsoAAfly9wp8bS7z39pvMjL3K8u/fsfTbOXrt" "Y8io8/iveJDqAxXXlEclY8OKcU8xWVSUfc20r7n7yze8cXAWJRWz08dRIuXo68eIereNPdgK" "Hn3wxeJovlgYthxL5GwbaQksC6QUSBusqGnnhMdHr30GwJfvX2Dh13nghnj22f4TR0+Xtz85" "8aGboTlz/CJzSydxrTyXr12Prf8/h/IRbyhM1t/ZO7WXVr/BZhTww+o9et3B1y/kAOCtU7vn" "EOKUgKKBEGPmV+b/PvMPjWweOQoIgjwAAAAASUVORK5CYII=") index.append('email_add') catalog['email_add'] = email_add #---------------------------------------------------------------------- email_attach = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqxJ" "REFUOI3Fkk1oXGUUhp/vu9/cmdzcmdy0SSdmOhWnpbpSQiykmo2QImrHBHUlCAEhQooQpSiI" "24JrXYi0dNEi0mQjqGDsooJZDGpKRcFCoiSd6rTXmTHtnd/7831dpOBfEXc+m3MOB17Oe3jh" "/0a8/UHlUtpxJ+qteLDVi6Q2oDEk2qCNITEGrXfnRBuSBCNkEoWdnXr16uamGtmTK77y7OFc" "GCMyaeuv6n/vxW7t9mOr04vHX3wn7MnfbsWlKDHiw0s1qvWQdt+w3dBUm5rrO5raLY0fGOpt" "Q5TA9UbIu5/W2OmEMju6/6Bsh1qkU5LCfTm+WPfZaUXkc4KUBbYlsJXAVuANCBq3Q5bXbuLt" "ybHXS4MQQnZ6MQClMZf9+Ryff+vzexAx4kpsBbYFQxlBMwhZXvMZ2ZujVHARZteabPcSAJQF" "pXGX0WGHC19WaQYhQxlBNiNoBCHnLlYZGnIojbsMqD9+o9rd3QuEgDiKySjNgYLHZ1/7HJsY" "QQhYvVynWPDo1jc4feY9XNflfByjCjOoTj/BAGEYc7MZUMxnse0UtWaGr67eRgKHi8MkQZXV" "tRUmjjzG1DMv81Ae3jj5OqrTj0yijfAbAcXRLAOZFBh4YJ/DgX0OAqj+9COfLJ/mkUeneXj6" "OG+eeInZ8pPcqP2Cajd/3er1o/sfLGRE1pFCyAR515IQgu+/u8LHH51nauooc8/P8cJzc8w+" "9bRZr6yJ7sHZa6rf8rdnXlsdTmedQcu2REoppCWwLMjrbSm3LsoffMzmWCE59fgT1vTMcS6v" "fyO2vGNVf/vGz/+a84WFBWPb9vvlcrnleV6wtLR0dn5+3kxOTqbuldZ/oJRaj+N4cnFxccwY" "82qr1XprY2PDqVQq3f8kcJcrjuMMlsvlQ1prtbKykvx5eQdzICBGYEsCuAAAAABJRU5ErkJg" "gg==") index.append('email_attach') catalog['email_attach'] = email_attach #---------------------------------------------------------------------- email_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoNJ" "REFUOI3Fkj1oU2EYhZ/vu19ubtP89c/WprE2gg7SwUEXHbuo4Co6OYjFUV0cHBxExEUQRNxE" "cLCboKhVsPgDIgqioA5VrGkTG5P0J73pzf35PoeIVUF08yzve4b35ZzDgf8NcerKs4fxRHJb" "dSXsXPECqQ1oDJE2aGOIjEHrNo+0IYowQkaB31ysFt9PT6ve7nR+fN/mtB8inLj16/ffd9Ge" "q63Qanrh4MFzvie/LoWFIDLi+sMyxaqP2zLM1DTFumZ2UVNe0lQahqprCCKYrflcvFVmsenL" "VN/QJun6WsRjktz6NJMvKyyuBPSnBTELbEtgK4GtINshqC37TDyZJ9udpicbByGEbHohAIWB" "JEP9ae6+qLDQCOhNSmwFtgUZR1Bv+Ew8qdDbk6aQSyJM25p0vQgAZUFhMElfV4IbU0XqDZ+M" "I0g5glrD59r9IplMgsJgkg61lo10V9sKhIAwCHGUZkMuy+3nFWarHrNVj5vPKuRzWVJ2hDQh" "tlpLVjVbEQbw/ZD5eoN8fwrbjlGuOzx+v4wENue7yLy6inv/Ev7cNF7PIOW9R8CMoZqtwETa" "iEqtQb4vRYcTAwMj6xJsWJdAAO7kZXhzgx37DxMf2crq60nePp1g1CwY5dZLn7xWMLwl54hU" "QgohI+R3S0K0m/DizgW2HziK82EKHp0hkcmyMT/M6NS1SLVWKjNjx+51xVOJTsu2REwppCWw" "LJBSIBWcKM0oZ2AE9hz/EZ46vZ4ub0H9XLY/4t6YVdx54NBQ5+fbtFa/0AQayxbvPjBn/fUa" "GN8+kKnPl3ZJ25KB5bJUM3wsySgKzfl/UgDweH/+ZLNWGpdaDGtp5jTm8u4H+uw3TScZlxCy" "dYUAAAAASUVORK5CYII=") index.append('email_delete') catalog['email_delete'] = email_delete #---------------------------------------------------------------------- email_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn5J" "REFUOI21k0tIVGEYhp//nP/MTHM1y0wnb6NkRWIZtSjbBVGUBC2CNi1bB+1qH1RQ0KI71CIq" "CFpUoG2shIjQECIyw+vkjM04o6Mz45lz+1soRbsietff8/J+L98H/yjxN8NjT3cet8vtT/Rw" "B6W512DOnNL/FJ7uTZwMhHoer205Sn3XIQLBWtIjY3vl+Zvv+v3B8M65ohMqmrbmKfBQuJ7C" "UwpXKTrC70QgXhCxqi7yY5/xCYtIdCOB6sYaub462nC6Z3PUchAB/++BBGDl3mBl88QSB6mk" "H+ELCqaGR3A9H5cmdie1bMFJ2K4SD/rTJOcsShXFVM4jmfdITvRjZXqJtR7GTN1GGPMY4QiY" "c+i7TrMc296olSxP+A2NeF2Ul0MZFoo2tVHB8uQzggt9xNp6MGeuoxk21mIzqVfDDNaeo6Z5" "CwghZNl0AEhsDCMU9A5m6F43hLH4lg3dR7Bm76D7FGahidmBDwy1XWV9QytCrXBayXQBkDok" "6sPEcn3o+fdYbj3pj9fwMCnl4yQHPjGYuEy8pZU18ldPsrS84iQEOLaDkX7ItmN3+fLoLKMD" "b/E3dmLOZ5nvuoARrkFTDtKQP1vWyhUXBViWw/f8EqPjWaxPz2np3E8o1M7M8Bhq30W2dOyg" "uS5CfmEJz3FQClACWa7YyvWUyOSWaKiJcO9rhiu3rrNnawu+pk46TtzHF92Eh0IGfcgNEVLZ" "RZar1oDnKlnKpybNit3UHg+ISFATN14k0VZXEkKsJvVWbl4ASBqrwt7UbNEqZL+lZKWYmTpw" "pm+tPxIM6T5dGFKi6QJdB00TaHKFW/VCKKVcx7bKhflcdjw5/ceP9N/0A/dWEq8cDbr2AAAA" "AElFTkSuQmCC") index.append('email_edit') catalog['email_edit'] = email_edit #---------------------------------------------------------------------- email_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArJJ" "REFUOI3Fks+LW1UUxz/3vpeXZJKXSWYSZybpWCbFlraMdejCjYUWCu7U6q7+AS6ELrptoXTX" "jQvFhRVxUZqCRRctLYhgR7GCnR9VBK1ji51hYsekSTrTJC/v1723i4hTpXu/cDjny4Ev5/vl" "wP8Ncfr8D/PJkexcqxdnen4ktQGNQWmDNgZlDFoPudIGpTBCqij0Nlvrv927ZxfHctPvvLY7" "F8aIVNL6t/p/ZzHsgyC2PD8uHz8X+vLhVlyNlBG1+Q3WWyH9wLDW1qx3NPVNzcaWptk1tPqG" "SEG9HfLBtQ02vVC6pR27ZD/UIpmQVKZyfLXcZLMXMZETJCxwLIFjCxwb8mlB+3HI5ZsN8mM5" "xvNJEEJIz48BqE5m2TGR48ulJo+6EcWsxLHBscDpLdJYPsOV7/+gOJ6jWskizNCa7PsKANuC" "ajlLqTDCZ9+s0+mGjKYEGdunc/cybnGW/envqJazpO3tbGR/MLxACIijmJSteb6S5/pCk3rL" "5887V3BLc+Sm5ih53+J4Kzj2drLSCxQGCMOYRqfL9ITLgWqBF3YWWPp1BW/tOm4xj3p8lfLs" "ceRqDR0FGAMYgfSCyChtaLa7TJdcRjMOaVsw81yaF+2vmdr7Bvi3WbhQI5sfkGwv4K/dYBBE" "oJWR/c6DVT+I9J5KypQLkrGMophVuN4SqbiDW/DQwX0wGtVbZObwScb/qtFodPyth/X7Yt+x" "9+aTY7teSrojGcuxRMK2SdiKE1OfWq8cfV2kErfQYf1vzwmszEEadyUXb/y+Vft55senn+0f" "LH106N3SvmMfTu5Oo3oLGBOy/MUdDr61F2GNQvpVFj851RSxPvJMgVvvv1yffftSxZKrmPgR" "YJ7aSqz0Hhq//MTK1bOf288SiIIwtfzxmwOjDUbrYRnDNjegNWgz+QSqqEY9rkkQ7wAAAABJ" "RU5ErkJggg==") index.append('email_error') catalog['email_error'] = email_error #---------------------------------------------------------------------- email_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn9J" "REFUOI3FkztoU2EUx3/fvTc3aZukD1P6bjUFRaugiwqii49FLLq6CC7OrlIQcXHWoTgKOugm" "qGjxNfgoUh0ctGJA25QW0yQ23iS997vfw6GIVkTc/C3nMRzO+fM/8L8RE1ennyRb07vKddVW" "D2PHWDBYtLEYa9HWYsxarY1Fa6xwdCybK+XibKHg5bqyQ2fGN2elQqSS7vrpv+diLa5Gym2G" "qv/kJRk6yzWVj7UVN54sUSxLGpFlrmIoVg0LK4almqEUWMoNS6xhoSK5fGeJlaZ0Mt2Do05D" "GpFMOAz0ZZl6XWKlHtOTFSRc8F2B7wl8DzpaBJVvklvPvtDRlWVDRxKEEE4zVADke9MM9mS5" "P1PiaxCTSzv4HvgutKcE1UBy61mJ3IYs+YE0wq6d5jRCDYDnQr4/TXdnKzefFqkGkvaUIJMS" "VALJpXtHmf06Tr4/TYv3Uxunsbq2gRCgYkXKMwwPdHD3VYmFcshCOeT2dInYKgZzW5l8tB3f" "+6ms14w0FpBS8aUaMNSTwfcTXH18gncPNdIopFb0d46ytXcPQdjgwu0Rrp8ugBV4zSi22lhR" "qgQMdWdoSSXAgjKSw2On0NagjcZgWawV2TG4j7pc5dhkjl4xZb1GdfFzGMUjWwZSItPqCOFo" "HCBUEm0Nc5WPxEahTEysY75FATuH9lOPm7z6dAAvqpfmDp190JnMtLa5visSnofjCvqGQ09p" "RU92GGU02hqWavN0pXt5U3zOdKEQ++8vvvzVbOs4PrlJh1IijSRSktHcmLM3f4SZ+Rc8/DD1" "1q+xu3CF6J+fZuyiWD517aAdOcfMtvP4f7L7X9k4wbKxbm7e0wkuoH70vwN63z54E/B7rAAA" "AABJRU5ErkJggg==") index.append('email_go') catalog['email_go'] = email_go #---------------------------------------------------------------------- email_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuhJ" "REFUOI3Fks1rXGUUxn/vve/MnWS+JxNmOtNOYIRKjQkoLdLVWFsEN0HRRRDRlYi7SreuxUBX" "SsEu/EBwYRYNBYtatW2gaqxNQS2iIdIkM53PO9NJ79zJzP16XQSp9R/w2ZzzbB7O+fHA/y3x" "9vm1q8Zk7Alz4EUHI1cLFAQo/EARKIWvFEGw7/1A4fsoofmuM+yb1T82N2U2kzj0xsLhhOMh" "Iob+cPp/d7E/98aePhx5hZffdUZaZ9cru74Sn11tUDUd7LFiuxtQ7QXU+gGN3YC2pTBthetD" "revw3hcN+kNHi08ffESznUAYIY3igQSX19v0By65hCCkQ1gXhKUgLCE1Iejed1i+3iKVSTCV" "MkAIoQ1HHgDlfIyDuQRf3Wxzz3LJxjTCEsI6JCOCnuWwfL1NdipBuRhDqP3XNHvkAyB1KBdi" "TKcn+fxalZ7lkIwI4hFB13L49JsqyeQk5UKMCfmAjWbv7V8gBHiuR0QGlIopLt1oUzNH1MwR" "F9faHCqmiId9NOURlg/IyuHYRwGO49HqWeRSIXZv32B381dWmxl26h0eP75AKR/j2wufYE9n" "6HTv0T7yGMqLIYdjV/mBEu2uxYF0hO8uLaN5Fq+9+gq2bVOr1bh56zL1Pyd48fkFpNRpNBqs" "r6+jtiyk3atvjcbuzKPFiPjt1k+iU/+LlxYX+fCjj1n78Qfy+Txzc3M0qnc4e/Znms0mR489" "pU4+87S4s30xkONBe/vUW1+njfhkVG19qT/35JQGcG3vmOfYV+TpxUXS6TSDwYBOp8P75z5g" "LTg6PAnRVDKO/H3lzIl/iM7Pz7/ZyB1/B0jFbp+70lfeiaWlpVA0GgXAtm2E8tzIL+e/59SZ" "Zxv1u/f/3VZmZ2ePlMvlC5VKJV8qlQIpZabVarGxsYFhGMzMzJDL5fA8r7ezs6Otrq42HwoA" "9EqlMheNRlcKhcK0YRi6UkozTfN1IcTdbDa7AoTG47Ffr9c7tm2/8DevH1u2uHLVtgAAAABJ" "RU5ErkJggg==") index.append('email_link') catalog['email_link'] = email_link #---------------------------------------------------------------------- email_open = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqNJ" "REFUOI2Nkk2IFFcUhb9b9aq6p+1OOspodP5n4QRcmKwiCKKY7ARBCYFsdeVGJYskS02UCC5c" "iLMJZhGIGIkK/mBCSFy4kUEMAVHjz/w1k8x0psfp6e7qrnr1bhbT0zgEMWd1eZxz3uXcI7wC" "39ya3mUy4a++CK0kPnDww97zr+L+B1//8PTEpTuzOjHb1JlKS2+M/aOnLj278L/Ex79/cvvm" "2JxWI6ctq5pY1Wbi9M6Dih777sn4qauTm17my8pw9nrpXRG9u22kGG7uWQMiLDVTAN7s8jAe" "TJab/PL7AotRvO+L/UNXOgZnrox/uq6YPf1gvLzspopTcKpY64itY20hoBZZFHh/Sy8PS9Ho" "l58MHuLc9an0xti8/vXC6ufn/9DX4cjoPa1GTn++v6BfXZxITdyoT+/e2jPQShTnFIDRh6tz" "eVROKFVTftyTxSmIpkSNGr/dG5sy5WrSH1vHiQuPO4KPe2NEQBVs6ojWWmqRBbJMz9b57NtH" "HN7bT6G7d8Crx04ygcf29/oQWd5AZDkc34PA98iGPtnQRxXyuZAtI32sK2ZARLxG0wIw/Hae" "7VuHOHft2XKyAiKC7wth4JPLGE5e/JNd295huCdP+y9MvX0q48PwpjwZP+H05ecEvvAyYqvs" "3TFIlAar3k09sp21bWKJE+WjnUOYYDXRJgmPS1U2dr+BCUynRV6jlaJAHFtmK0v0bSgQhqvF" "ACYIGNxYoPJiCWctqoAKptFKNHUqc/NL9HUX6MoGoKBA2m6aKDgUkwsx6wvMlKtExS5wqZp6" "ZWai2UoGRnqyUsh5Il6Kt3IJkU7fV4IFQ38x7yb/rsWL5dKMadXmJj84+tNbmUJujR/6EhiD" "5wu+D54neKZt0M5UVDW1SdxYXJgvP5+e+hcNv1PsdCC6wAAAAABJRU5ErkJggg==") index.append('email_open') catalog['email_open'] = email_open #---------------------------------------------------------------------- email_open_image = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAr5J" "REFUOI2Nk01oXFUUx3/3vvvmI5lnRtppTdIkNVCzEOsHtFgVoUZdCVLduSloRXQj4qK0u1or" "Fl24kIogdiEYtIu6qKIi1kI3GhWhlFr6lUnCYDJ20pnJfLz37r3HRSbVUQoeOIfD4X8O538+" "FLeQj75e2G2yme8DpYjT5IV9T2z5+FbY/8jbn18+cuLskswtdaVSi+XL2T/l6IkrM/8r+Y1P" "L/3w1eyyNDpeYiuSWpFu6uXs+Zoc+uTStaNflEf+iVfrzvunFu9TSn58cKqYuWt0EJSi2XUA" "DOU1RkO52uW731aod5JnDjx758mbBd47ee31DcXcu5fLZUQE5wXnHNY6UmtJrUMhJNbivTD9" "0E4uLHY+OPzc1lfMsVPzbmLzoH5g2xAXrlzl+ceG2VQqoZRBgNQrPACCswkHPzzDUztKbIzq" "L7/52dxLJmm3FqbvHZ2IUyFNLaWNJarvHCOXy/3NMzBYE5DbtxcElDg67VVO/zI7b6qNdDyx" "niMzF7HOorVBFSJG7tkOmQBMAEZT+elXvIeVuMj+47/z6tPjRKUtE7qVeJUNNQ/fP8aNRhMP" "ZEMDQ4OQz0JoQOkeCWHAtLh7aowNxSwopXS7awGYvKPAnid3c/j46X8taV1h5ttzTD+6i8nR" "AkrWEKbVW5UJYHKkQPaRnbx1Jk/wc73vPizb2LtjOx0X9sVNq7PWgVJgU0uSCi/u2YUJ+4E2" "Tbm42GC4dBsmNDcb1O3YIUCSWJZqTcY2R2Qy/ckAJgzZOhxRu9HEW4sIIArTjlNxXtTy9SZj" "pYh8LgQBAdz6BAQ8ghnIYDZFVKoNOsU8eCemVavMdeN0Ymo0p6IBrZR26B4lpVTfKNeMYbxY" "8OU/VpN6dbFi4tXl8uOvfXN7NhoYDDKBCo1BB4ogAK0V2vQK9L5GiYizadKur1yvXl2Y/wt9" "jTElxd2CPgAAAABJRU5ErkJggg==") index.append('email_open_image') catalog['email_open_image'] = email_open_image #---------------------------------------------------------------------- emoticon_evilgrin = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmZJ" "REFUOI2lk01IVGEUhp977/yY3tFxrFSqGUejhfYjCrowkhaSIARJuWlVu1oKrqSgtdCqTbQI" "ahGo1CZliDLGwIUR9kNkok4WKeboDOM4d+7c+31fi2DMhla+ywPnOS/vOQf2Ke3fgnqN6QgG" "paRXKjqUAiWYlYqYleNu7QDZ/wIKU3QjeaiFh6JasAPlC4ESKCuJSM1hL4wkpOJaqJ94CcB5" "ySVV3f1Ur7uKpfv5HJ/mcL1Bhemy/MWlLhqhvr4W+/sY1q94f90Az4oAFSNkG6x4Tj8xpZ5B" "5BOk1lK8n0mjFByLSKJNEs0fxvCfIj1zPet4iYQH2NIBCgaDRsOwqXwg7QRT4wmqqmy6e/10" "nVM0RLaZfqXhZj4h7CUqmodNLccggA4gBX1adScyn0C5FucvVv8JVDoYHgeArrNJlJPFTb/D" "EzyBFPQBeACEotnrr0RaaRY/VoMWKN2PUih3i6OhF4CNlESLAASWcvM+hEso0k55TROabuzt" "l4Kd9Q+ozAQohZQYuw4ECRyrFXxUmBaB2uPoHu8egHBsxOYkml6OFB4KNou7GUgmnOQcmi+M" "bsdxcquA+ns+TmYJNkfxVJ7BSq7g2EwU15gZ5VBBY9nsfGxK5yvuzgpGsA9vsA2UwN54Q+HH" "A4wDR9AqL/Dt+Y2scGhsG2ajGNX6KJe9B3vGysL9YGzjpt4irFWUm0fzBDACrQgaSc1Pkp6P" "XWm7zXjJKf98RI+U3DdbhqK+mhZ0rw7SxbUFO2sLrM2MJKTLzfZbxEpOuejkHmaujCEl6BWS" "DrcAToFZ4RDz2oycvLP3mfat39KhHxfGgLt2AAAAAElFTkSuQmCC") index.append('emoticon_evilgrin') catalog['emoticon_evilgrin'] = emoticon_evilgrin #---------------------------------------------------------------------- emoticon_grin = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlZJ" "REFUOI2lk01IVGEUhp9778w46dV0KgyKKSta9I+CrsI2kuQqKTetaldLwZUUtBZatYkWQS0C" "iyJIGSoMC1wYEdXGQpssUqwxZZyZO/d+9zunRWCZtepdHjjPObzvOfCfcv4s6FN8Y+kXoVuU" "dlVQy6QouaDCleY+Sv8ERGN0ItxwsgMtTmM7msqAWjQoYJdeEb4fyotyNtPL+DqAecJJbeq8" "5249g9ZuxFamkHARjavgpHHTe3CMS/jpDsHX8d6tfdxfBWiOTOgxmzh02xe3iK3mwawgcYja" "6k+IKE5NFq/mIMsT50omyY5sH99dgMij39s56GsKJMxDXGbsQQEkAhvx7DGIKREX32LDGer2" "DfpOhX4AF0AsPU5TB1LNo3GAiuHYiQ2oGNQajnaWUAlRUyJefkmicS9i6QFIAFhlX7KmAQmW" "mX7TBE79+nxU0fg72zOPgBARWlYBWAKNqylsTGZHG7WbduO43tp+sZQXXqPFEVBFBO/XBpY8" "JjgCKer8gPrmPbiJ5BqANSF2cRTHrUVsgihk+pcHwogpvMJJZXHDcUxlDtDf52OKM7A4TKLh" "MEFhFhMyshpjcZgtkcMHv+OWL+YdcXkWr7GHZGMrqCX89pzo83W8DdtwGo7z8eH5kjXsah3k" "26pVC8OcSm7uupPO9oK3Qrz0AhvMoXEVJ1GPV38Eyy6WpkZZnsqdbr3E3XWn/OUmXSJc8/cP" "tKQ27cdNuiAxcWgpz79nfmIoLzEX2i6S++svACxcxa+kGVBLtxXa4whMxKQ15JIhQwcur32m" "/9YPOOkxhznht2MAAAAASUVORK5CYII=") index.append('emoticon_grin') catalog['emoticon_grin'] = emoticon_grin #---------------------------------------------------------------------- emoticon_happy = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmhJ" "REFUOI2lk01IVGEUhp9778xoev0bFYVC04RAzUzDQAI3SkarpIRoEdWqloIrKWgttGoTLYJa" "FBoFkTJEKBK4sIWlLVQ0s0ix8a9J586d737faREMmbXybA4cOM85vOe8sM+w/i7IKK7S9BhD" "pxFaREA0E0aIeUnulnWz/V9AeoQ2DA+tit4qq7AFiURBNOKtoTcn8ef6F41wNdrF2B6AesN5" "KWp7bpdfRnIK0MkZjL+OBCmwsrGza7CUjf9lEO/7WFd5Ny8yAIkR9R2WQg1PXGMnGH06RHzF" "42hDAYgwO52gpBROn63HyTrG1vi1bRWmsqKbDRsg7dDjHO5zJQLGXyS+4tHaXs7s1A9mpxO0" "tpexFocgMY32F8it7XOtJD2ZDbwYk+GTLxu1+ojxVxHtI0Hqd1YpJPAwOoWoFJZTSKTsEvGR" "K+8rr3MiBKCF2nBWPsbbYn6qCKy8vfcRQYINDkVfAz7GUAUQAkDjSZCKoAOilc3kFB/Bsp3d" "/Uazs/oBSQyBCMbgZABas4jyGiFCruuRV1aDHQrvAmjlo9eHsewcjA6R9pkHsAGMYUitTWJF" "KrD9MVRyGZA/56MSC7A+QCj/ON7aEspnKCNiYoDStMUn99Rj16hZgp0lnMJzhAubQDR+/C3p" "rw9wDhzEyj/D51c3trWiuqmPeEaq1QEuhEs6BrMrusD5SbD5Du0tI0EKK5SHk9eIpprNmWG2" "ZmIXm27zbM8rf3tEhzHcd+t6qyLFddhhG0xA4Gt2VuZYGe9fNAE3m28R+6cXAFbv4Saz6RVN" "pza0BGlQaSa0Ihb26a+/s9tM+45fQ4Euif3E9BcAAAAASUVORK5CYII=") index.append('emoticon_happy') catalog['emoticon_happy'] = emoticon_happy #---------------------------------------------------------------------- emoticon_smile = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmBJ" "REFUOI2lk01IVGEUhp977zjazDCpJQmBZURB/xiMbsKIIslVLty0sl0tBVfSorXQqk2rwBZB" "QSIkGIVhCxdFSFSYpo1/YeWYYtPMfPe73zkttImSVr6bczjwPhx4z4Ftyvt3oM9JWUe3CG2i" "ZFRBHS9FGS4WuLWnk/x/AeEIrQh3vYaeRq86g8ZrQR1azOFWxzFTfVlRumo7GN0CsM+4rDWt" "j/z6K2hiJ67wATEraFQCrwq/6iCe9THzDyl+G+2o72SgDNBhak3AXOzE/ZT467hSFuwPJDKo" "K21ARPEqGwgqj7M2djVvK9jX0Ml3HyAM6A7296Y0DmKyEP1kZDAHEoILefEUxOaJ1t/izAzJ" "I70pr0A3gA8gjnavphkpZdGoiIrl7KUdqFjUWc605lExqM0Trb0mVn0IcbSXAU45QmUaidbK" "JhWLRiHqws3eoi5ETA4wiNBYBuAoalQCF/FsYIzZqcUNo7Ob1TA3s8LIk0VULKgiQvBnA0cW" "WwTitLQe5uP7BRZmvqDOoGKZz64yPblKpjmN5ycQFyM0TAPEAEQYsrnxU351A4nkEi1nGnn7" "apaJNwvgLMkdHpnMTpKJgFj6JMXcHNYwVI5x/QF1ocenVPO9lNhJXH4CCdfQyCDR7xghSB7E" "S19k9vG1vLMcaOpl2QdId7LslK7CdD/oXoJ0M15Qi4qCKH58NxV159HEOVbeDeJKdDX1srzl" "lD/3c0GEO6mjPY3xXUfxK3yQiMg4fi5NsTTWl5WI66dvMPzfZ/p6m1Shih51tDkhE4VgQ146" "y3CFoe/Yzb+fadv6BZICYdMojMeqAAAAAElFTkSuQmCC") index.append('emoticon_smile') catalog['emoticon_smile'] = emoticon_smile #---------------------------------------------------------------------- emoticon_surprised = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnJJ" "REFUOI2lkz1oU2EYhZ9789Oa3sSk/rUo0Yo6+I9Ci4PURRSdLNrFSTcdC52KgnPByUUcBB0E" "FUVQCSiKDoIVcXCpWo0VbE1728Y05ube737v6yBEVJx6xjM88L7nHFiinL8NfYpnLEMiHBal" "VxXUMiZKKWhwcc0g9f8Coif0I1x1isM9Tr4XTXeCWjTwsQtvCN+PlkU51TnAs38A5jHHtNB/" "x+06iWaWYxvjSDiHxk1w2nHbN+EYl/DLLYKZZwNdg9xtAbREZ5hgMrnzhiduDdssg1lE4hC1" "zV8QUZy2Iom2HVRfnK6bFOuLg8y7AFGCocSGEU/TIGEZ4h88ueeDRGAjnj8CMXXi2lts+JGO" "rSOe02AIwAUQy1Gn0Ic0y2gcoGI4cGQZKga1hv39dVRC1NSJq69J5rcglqMASQCrbE215ZCg" "ioqhsWiZ/ZamOt+BouSz3ylkK7S5ERr7QIgIPS0AlkDjZhobg42oTCXx1h2nuG8HAP7kW/yJ" "K6wtVFBcUEWEROsEayljAiCNimF+LkX35j4yudVkcqvp3tzHwuIKVCIcN4PYJFHIxO8fCA+M" "/wYnXUQFCoUG0x9e0qjN0KjNMP3hJflMBdQlmdtF4E9iQh60YqzdZFXk8Mnru+6JeUfdn8Cf" "SVCtZUGFXGaWQmaKjnw3Tu4Qn++fqVvDxj0jzLaKVLnJ8dTKg7faiwOQWCReeIUNptC4iZPM" "ksjuxrKRhfGHVMdLJ/ac5/Y/Vf56jYMiXPa2DfekV2zDTbkgMXFo+TH9nukXo2WJObv3HKX/" "jqlyCa/RzrBaDluhN47ARIxZQykVMrr9wp9jWrJ+AozrRzh66ZC8AAAAAElFTkSuQmCC") index.append('emoticon_surprised') catalog['emoticon_surprised'] = emoticon_surprised #---------------------------------------------------------------------- emoticon_tongue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmNJ" "REFUOI2l00+ITWEYx/HvOffcc+9wBzOU2biMpIw/IzI2NDZKZGFiNmxYWk7NaqLYTqkpGytl" "oxBZ0C0ilAXJQmoSbpfQcLnXzJl7znve930eCzVCVn7LZ/Hp6en5wX8m+HOg96lYz5gI+0QZ" "UgX1PBGllnY4t3KU5J9Afo9hhItBdbw/WDaExr2gHk2b+NZzzKvJuijHe0d48Bdg73JIe4av" "h31H0UVL8Z1pxHxFXQZBmbC8jsCGmHdXST8/GOkb5cYCoDV6TYFGtOVyRcJZfFYHO4c4g/rs" "JyJKUKpSKG2m/fhEYousro7yLQTIC4wV1kxUNAYxdXDz3LvZBMnB5zy8A2IT3OwLvHnD4oGJ" "StBhDCAEEM+BoGcnktVRl6Ji2bO/CxWLesvu4QQVg9oE135GtGw94jkAEAF4ZaBYWoKkbWYa" "3+jqgmLsiMhRl2ONJZv3pPOwvLcJGEToXwDwpOqyGO/48v47nbmcPPNYK9iGUIlC8CFJquw6" "ZkEVEQq/NvDUselWiBnY0YM6g7qUz/WE9tsSK4IAmwa8b6UE4SLER+SG179uINyyzecEcRUV" "UJ+jzhKXPaaToWmOm0uRqEO0ZJC02cAabi0ABctU5+XZBNdNGK8CDVAxdC91FDfM8uZLi8bs" "d1Yd7ENLg3x8dDZxOVO/PdLMFQ4XV+y9Wq6OQGEO13qKTz+iLiOIuil0b8Wzltb0bdrTtSPb" "TnPtr1f+cIm9IlyobBzvj5dvJCyGIA5nPPOfXvHp8WRdHCe3n6L2zzLNnKfSKTOunn1eGHI5" "2Jwn3lIrGiY3nfm9TP+dH9w9VvwS8QG+AAAAAElFTkSuQmCC") index.append('emoticon_tongue') catalog['emoticon_tongue'] = emoticon_tongue #---------------------------------------------------------------------- emoticon_unhappy = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmBJ" "REFUOI2lk01IVGEUhp977/w4422yqag0NCMCtTIKdBVG/+SqFm5a2bKl4Epa1FYIhDatgjYt" "gsKFIBRGP1QU0aKCKGMwSKmmNL3NnXu/7zunRTFR0ap3dThwHl4O7wv/Ke/Phd4mNI4REY6J" "0qcK6ngsynRc48KGIaJ/AtIZBhAue+2jnV5LH5orgzo0ruIWn5G8Hq+IMlw+yZ2/AOYWJ3TN" "wHV/4ym0uBpXe4Ukn1FbB68Jv2kbnvFJ3l0j/njn5MYhbjQAOk05CZjL7Loair+Mq1fArCA2" "QV39B0QUL99OkN/J0oPTkcnS0T7EFx8gDRgJtoyFmgNJKmC/MTNZBUnBpdy9CWIi7PJzXPKW" "5u6x0KsxAuADiGPQW9OP1CuojVEx7D9eQMWgzrBvIEIlQU2EXXpKpmU74hhsAJzSTb6E2KXG" "kYpBbYq69OdsUJciSRVIEKETIAOAI1Zbz+EsuJTo6zLPn8yyvBiBWJqLHj09JYp5h+KDKiIE" "vxw4KpgYyBF9XeHhzEta20IOHt3KgSMdbGot8Oj+AtFKjOcXEZchTZhtOBBhylSf7fZb2ilk" "39A/0EVzNkZcHXUJm1tzlDf1UnDzZEq9xNU5TMJUw0FgmKi9PB9hVxGEXYQFUEnApY1/FNw8" "QfM2NN/L/L3zkU2ZaABKQ3xyynBt9gpoG0GpHy8oo6Igip9bR3b9IbR4gM8vJnF1hveM8emv" "KL+/wmERLoU9o525tT34WR/EYhPHt4XXLDwYr4jlzN6zTP+zTB8uEtaaGFXHMSf02RRMymNn" "mM4mjO8493uZ/lvfAcIIUE4SmPhNAAAAAElFTkSuQmCC") index.append('emoticon_unhappy') catalog['emoticon_unhappy'] = emoticon_unhappy #---------------------------------------------------------------------- emoticon_waii = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmtJ" "REFUOI2l001IVGEUxvH/vXc+1CY/xikNyzKkQM0sYdwEUZQotqmFm1a2bCm4kha5FYKgTavA" "TUFQtBAkIrHAQAgXFpQo4keONqaDztx37sf7njYxYOLKZ3kWPzic88ARY/0/kEkSgWbQGHqM" "kBYB0cwYYUK5PKnrJ38o4H/kOoYXVuNQk1WdRmJJEI2oLfTOLN786JIRBpL3mDoABB+4KzXX" "39j195GKKrT7A+P9QcIiWGXYZc1YgY238hr1e+pefT9vS4BMkPQcliPtLxPG3mXy1TjZjOJi" "exWI8HNul9QJuNbbhhO/RG76QT6Icraxn20bwHcYdM4NJ5S7SW7pPVFb0X2nnLWFHdYWc3Tf" "KScWA733DbU9y7GW4YTlMghgAxhNn1XThdn7StzapTMN8ajiRk85N3tjxKOKzvS/Xb0fRKov" "YDR9JUALLcQr2fy5su8iuY08Oxtq3yy7qgAPY2gqAWiUhEU8/xhbqx5GC37RUCgIawuKzKIi" "9IXMosLNuSCCMTgAEQCtWSJQHanzjSx++c7cpyyRmE3qdJxUncP2eoH5mV1qT2kamhMYHcH3" "WCgBxjAebM121Jxtp6NaIcEeEhQxuoiEipOnQC6HIEK09gpqa5nAY7y0ghPw1P0+kic8jh07" "A2IhxgPtIzpATADYOImLSPwy659H8qHP0xJQ2U9WCwPuwhhIA05lF5aTRIyAEexYiuiJW0jF" "Tf58e4cuMnB1mOyBV/41xm1jeJ5oHWqK1bZiR20wIaGnKWTmyUyPLpmQh52PmDi0TJvPSLhl" "DImmRxvSoQ+Bz4wOmIh6jLY93l+mI+cvGYE2OypTjxEAAAAASUVORK5CYII=") index.append('emoticon_waii') catalog['emoticon_waii'] = emoticon_waii #---------------------------------------------------------------------- emoticon_wink = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlRJ" "REFUOI2lk01IVGEUhp97Z+Y66GijSRrklNVKI8VMl64EwVVSQrWqdi0FV1aQWyEQggiCoo2Q" "mVAos4hCCkHDXKQg089gkKJpmk5z/77vO21iwKZWvsuzeM6B87ywz1h/D+Q1iVDTZwxdRmgT" "AdHMGiHt5rlT00vuv4DgFR0YHlqp/nor2YY4VSAacTfQW/P4maGsEa5U9TBVBAhfck4qO57Z" "tZeR0gPo/BLG30SUB1YcO34SK7Txv47irk/11PYyXgBImio/wnL09EjC2DtoLwvhLkb5iPbY" "2czz4b3L6fZ6koda2Z6+mgtjHE318sMGCCL0RY4NJMQB42cZuzfH2IMM44+WQQdkFvPESzQL" "Mx/R/mfKGgYSVp4+gCiA0XRHKtvR3gKiXHqunUCUh2gfCT1aWsHoAAk91PYcTs1FjKYbuBEF" "0EJDrKQC424jJuTLYjVWtBwLARFAAFBKcST5HPAxhvrCBWhcUZ6DVqAD6s5eAsvZ+16jKU0e" "ZndmDEQwhkgBoDVZQrcZHMSEJJJl2PFUkTSiPSy7FKOjBD6fAGwAY5gIN+axnBRiQP18C6KK" "AOHmFNGKJtyNZUKfiQIgEjKcXxzMocqxnTqC9Rf4qyOY4PufzS7B2iT+yjhS0sTKm8GcChje" "I9LaE87HqjtH46keiOyitt6h3RVEeVjRciLlzWiOs7U0yfZS+kLLLZ4WqfztMZ3GcD/R2F/v" "HGzEjtlgFMrX/FrNsDo9lDWK62dukv5nFwDW7pLIx+kXTZc2tKkAwoBZHZKO+Qydur23TPvO" "b60jN27zp9/ZAAAAAElFTkSuQmCC") index.append('emoticon_wink') catalog['emoticon_wink'] = emoticon_wink #---------------------------------------------------------------------- error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAi9J" "REFUOI2lkk9IVHEQxz/v7bO1dTdzS7E/GImgKKRgh9WSPGdQlyy0rgVdwujWKeggQRBqZAQS" "JREGkZBkEljSIToVbIViGBq6uprpKvr2vd9MF40oLaM5zMD8+c73Owz8p1nrFbTreCCZM/EO" "MbO5c7trrfqHZq0+Zz2AZHS8JZh/uEyNYcL0nAFubpjWt95YNNFXNW/Sc5qefa/j3ftnRrti" "0bV67bWSy5Z9N1TQGLFsGycrSqiwMWpZ7pUNbZ98Vl0x8TRm1LjqTrZpOtmhkp7Wzw/2+SOd" "pRV/ZaBGOiMlTbb4C3zq62K49w7iJcgpvxhQtVr/CJDoiTVkRKvKsvYcY2msCVVQheUvzUSK" "6gjm1xwcul3UsCbAZP+hsKi0hApPIP4MyMq0KiIesjxEdslJRPRqvK00/BuAn1rqCBXUbwvm" "FOJNPwKUzK2hVWG4iRtszi0gu7hhl7rzl1bnLIDR7liRrd7HnXUvHLP0Fm/qFiJgZ2SyOJ0i" "mCUEAkpgSy2ByFHirZVpWdayysvJYRvAFu9+pPico7KASb0GFUAZGRhk6sM4oKCCP/scy14k" "L3Zhk++61wGssceVdRnZ5U/yalrwUy/xkvcAEFFULVCwA4qlaVQNdmA7mXubibc3MDs4cMRR" "X9ojRacAcMLVOOGqFXHWqvwVpz/ugbWJHQfO8jXef81BpD/56vxpNYIY4edoPINxPXzXw7ge" "xvUxaR/jGcQ3iDFvfv2Lf7bvSM4aer9Gl2cAAAAASUVORK5CYII=") index.append('error') catalog['error'] = error #---------------------------------------------------------------------- error_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAntJ" "REFUOI2Nkl1Ik3EUxp//67tmcy9zbwgzP4IxaSk5I5U5DKPworzpJg2tiwi6MCKsLgRvvRhB" "BGb2BRYhFQahhWTeWCYiQR+WI7NiqTGnU2wffrx79/+fLlKInOVzc+DwnN85DxyGDUSdR1NC" "1ukRCL6QEc7ez6of8WQ+eSNASA20GG2HC4hzTPOe0wCub+Rdp5+9bjXYVxbh8TDFF3wU6C6e" "n+x0q8m8UrLmCpPumXLrFCZJkNNUmOx1KmNa86a2zzz3FE0/c3PiGmkzrRQPtZOIz9H3h4UJ" "f0d+0X8vIC46FGeDJBIxfOvrxNfeuxB6EFbXxRQidvWfgGCPu9aglhWk7TiC5akGEAFEwMoP" "LxRHFYy2feXjtx21SQEz/RVmQaLFZK+BSMwDYnWaCELoECvjsDiPQQi6NNqab14HSESX2025" "1duMVjv0uccACKnpprVg0ILXsDUjF5adtVmkRZrW5hgATHa7HRLpn7ZXvZD58nvoszchBCAZ" "UrE4F4UxTWBgguHlhAHhpRi0pQXEY/NXHnh952UAkIR+X3HWyyRi4NFhgAQABv/AZwDAmDUD" "o5oFFeXFyFbz0O/rwvDoq4bSM5lCmuraWyWnu0qUvBrwpbfgi29AJEAigZzSLOSUZKFnLIoi" "pwtc4nBlVoIzHe7dHkhEZ2VKiBuK4zgAQDZ7IJvLVsOxtfiYDR+AgZlxaNcpAMCFg7fw9GMb" "iD3ZIkOI/tDguRPEBQQX+LNynYNrOiIRwBcYwkhgEI2Vd+DtO4nUFCMkgLO/HyOZSuszm3Ps" "liZPYTnybHvwJfgOQx8GMeUPX94U4DfE5gVj9QxQCIiCqO11W7DxFxUDJjtpXW+fAAAAAElF" "TkSuQmCC") index.append('error_add') catalog['error_add'] = error_add #---------------------------------------------------------------------- error_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm5J" "REFUOI2NkltIlFEUhdf557e5MzqlaaWiDDQopFDBKElB9JC+9JKG5muBL2IXCISSiIigFzMs" "AomSCIPIyjIVtEail8gikSRRvMylGTEdndv/n717SCNyLNfLgcNa39lrcwQ2EHcdN4Qy/J9A" "ciFzcdchUf1YpvKpGwFCTl+rMbuymKWEX/acAtC+kXedfvR6nIG+siWZXOTkwij7uvfNT3d5" "nKm8SqrLuFDuW/Lq7EJRoFqdsBTWOYVIXNnU68HX5aX+Vx7JMsGJYBsnQx1MyTBPPdqjT3YW" "lf53ApbUaXc3KaQvY6KvC99674G0ADJKzhmYxc1/AgI9nto0Z1mxNf8YYjNNYAaYgfjsNdhd" "VTBmVxwYv+uqTQkIDh60EVOrpbAGpM8DtJpmBpEGio/D4T4BIr7+pa3Itg6gR2IdlrzqrcaM" "QmjhJwAYpnTLWjEkArdgzsyDY3ftTk4sNa/lBABMd3tcCmtjO6qGVBkbgfb9DogAJc2ElXAE" "Rish/M6HoHcGK7N+sBkMgRtHnmvnVQBQSHtodzeoTMuQkfcAEwCBybdfAQCmJGFlnFBa3Qhj" "QTFin/vEqLf/bP/hsWkx83RvVZqj5EVWRSv0yBtooQcAACIGswAY+Hj5JfbXX4J5YgiYGwYc" "6Qir+fgw4A2qrNNtu+skAEC1lUO1la2WE2v1oYWyYMouACrP/N6+2pIDVRfbVRANhoYb61kS" "SBL+PKUmIRMa2AxER3pgfdaARCyAKIDIkgFSRVT8/TFSyVuT07LFZm3O3SZVVZlFJKRjKmCQ" "yThd3BTgFyT3QnTed1ohkU8KzxG4/egAXf0JYe4suBG61DUAAAAASUVORK5CYII=") index.append('error_delete') catalog['error_delete'] = error_delete #---------------------------------------------------------------------- error_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm9J" "REFUOI2Nkl1Ik3EUxp/33WvG3KotI6ulMWaYIxUq2PygIOoib7rRQAvvuugqoQv7oBl1EV2a" "UBFImUQskLyQzKASKjQsigopK3Uzp86P9lHb3vf/P6eL2kW5lc/NgcNzfucczlGQReyvM4Vt" "oTcgubgu4tij1N+VmXxaNkDYPtWWW3DAzVIiJHuPAriSzbtE3/o89ul+b1TqEdYX3/NUz875" "gN9jz+RVMyWTitppLmy0KqoKLc8Os7PRriipC8vqPvOgsiJ03yNZpjg10856uINJn+PxO2Vi" "rKu04r8TsKQua0mzSiKOz/1+fOq7ATKmYSs/YWJWLv8TMN3racixe915RQeRCDaDGWAGkpMX" "YXXVIregpvrjdVdDRsDM490WYmozOw+BxDxAv6uZQWSgpbsOrZNDIOJL79pLLUsAIpboMBfW" "r821OWHMdQNgrFxjTi+GpBGFI38bfJyziVPR0+k6BQACPR6XysbIxtonmky8hjF7DSeHJgA2" "oJOALgQ22IpR5qjGi/FHeDs5iNaY3Oo9OzeqAYBKxm1ryTGNKQ4ZGwSYIEjHPncTJBMkSRAY" "U5EgtjuqENcTOJ4Y+ACGSQve21GrrS7fZS0+BBEbgPz+EgCQFDokEybmR2GQgCADhjQQTcVQ" "sbkGceOHsuB7qmss6KrVdRgAoFkqoVm8vwADVRBSYP2qQgiSkEwIRQKwWwrwKvgMX2fH0D5r" "+qIE/OWdJOkISwJJQjq2CIGkrkMnHUmhw5nvhse5H8OB5xgdeQjfggpVyFtZP/Jvuc8r4aab" "e7noFIZLfVjxxxWWoy1nECY25Qc0mYNzEOn8Txg1QQ+znYn7AAAAAElFTkSuQmCC") index.append('error_go') catalog['error_go'] = error_go #---------------------------------------------------------------------- exclamation = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlZJ" "REFUOI2l0stL1FEUB/Dv/HxMqEw/LdAZ8TWmScyqFkEghFFQtJBmlfgAV7aQ/oJwkZsiaDGb" "FkH4wCAQahFRIAlZEFGJjQ3mjKLpaDWNj3Qe995zTgvzN6i08ru7l3s+5x44wCHj2n8ht3vr" "tUu3CXMnMVcwMYR5lUQGoWTEvjcY+y+Q6e8JugihbavQW1h/AvkeDwBAb24gFYnASq2vMHNv" "+f0noweATH9PUAwPqPLq4qLGBlB8ARxfAABY3mpYvhpsfo0gPTO1DeKuqgfPRh0g3XfDL2Le" "KG+1r7ixEertKwBA0a2HAICtvm6ABYXNl7ARnsafyKe4Iav55KPncxYAEKv2VJ47VywCYXFG" "Y8MgI0iNvYCn6RRQctxHJt0OADsAmQ53QwNoaR7CAiaBGN4DsCaQYmTnYjjaFIDWusMBjDGV" "BbYN830eYtjpuBtSDNI795loDAV2GUhRZQ5QBkLiFO521N/CuRH0P4QYIIYxCjmA1HI2kYTl" "rXG+SpqRnhjD1tPHTnfWjPyqWqQSCWhjlh1AKxpaD08hz1frPCbN8HTfREnrdbBmkGEQMdy1" "fvyc/AAyZsgBsoqGVSIeX5sOo6jlsoMkQ3fxO3QHRDtn+8pV/ApPIrk4G89SdnjPIn1pPx+E" "4QE7cLa4tCmAzPwcMtEYRATuOj/cdX4kwpNYfPdyW1i6WsZnRvcAAPDx2rmggENHynzeY4HT" "cNulEAEya0n8+PweyaXZFRHqvTgePbjKu5loPVPv0tTGxJ3CXMFMIOZVJhm0LB658Doa219z" "qPwFxTSLV+ldGkIAAAAASUVORK5CYII=") index.append('exclamation') catalog['exclamation'] = exclamation #---------------------------------------------------------------------- eye = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn9J" "REFUOI3Fk0trVGcAhp/vmzMnk5mjjEnGXCZJk3qhYJoQuxBLUSLYhaDortLfIFJKqC77B4RS" "SBddue6mYtsg6CJglahNCvGuaS5jMsbGZJxkZs53vlsXYlBcttB3926ed/O88H9HvF0WFhY+" "S9n6edFYG0E3moUzYA04i0AqorY7Lt97rlgsXn8PsLi4eDGIX3wh1VoYygCdxFTW1zFJQlMK" "CttyWK3Q1nm6h39p3z14YgtQKpWupCqzn4doni0vUyqvEYsI3dSBtoLEOHJmhS6WGehpRTqL" "7fp4pjB4ZFDMz89fCOtLX4W6yszjecIPDvMs6UQbUNoTa4/SjkbiGOgO+WjjV3LVOaJ0imr/" "yEVRejLzXFYet7/yefYMH2J8qk6l7lDaM/rlEN47RsemibUjkxZ8c6qF1QeTuLvjrG5qE+i1" "2Z3ZziH6C0Xg9WpdWZQB7xzeO+qJRSmH8BKA/J5PqGW3oy+PBUF654ALo5aUtRYpJa3boPTS" "EieOs9/fQiWeesMQa8e+3izOOay1yJZu8v37vGRjqaqrKxhj0FrT2yqJQketrqk1DLVYsxlr" "2iLBcF+A1hpjDKo8S6qypKXLtP3kn98nKf2Jqq7SmrMc2CXZ2+EJvCJNwnCP4Pj+kP6CIKlV" "UY9+R0/8SDnJ/CEAHk7fvJF7ee9gcyBw+b51kSvEPtqRiCDj3njivce9+Cvj5yY7k9I9HjWi" "8tGvLxS3RLo9ceVSUn5yrEO+CqJsBpq249JZvAfhDGZzHVaeMvf3pt/Y8eGd7Mq1T0e+nTDv" "qPzbd2eaTE2dVEqdSgtGQuEj6Z1w1rhGQ03FKv5ZGj1++oerD/67N/3b/AOWglVDnpaoLgAA" "AABJRU5ErkJggg==") index.append('eye') catalog['eye'] = eye #---------------------------------------------------------------------- feed = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlJJ" "REFUOI1V092LVVUYx/HPftOxOTZncJxzMkwmMjCUxomhEYOwq4KghOjGwLu6y0MIIgST+A8M" "QhDeRNF9IL0ipNnLReGEGkJkhxoZFSdSTD1ve5/dxdoT44KHZz0L9u/5re+zdlQeVDdlXqZl" "dcVVrK3XrhzLFlx1LDVl3pP7WhrPkGTEKVFEHBHFIccREiIhyoJrP7d8cUoqEz7uJTRnSXDz" "Mn8vEscklZ1EECxLahNMzjB5qpWi6jzC7v2Vx/0M7vH7aa58TnE3tC7LkG/dYGQTQ2JDRCn3" "r3PpU9rfc2+FbJSnXuWlE2yZq4QjBgO6A/I+fdIALAoCv34S9mnMxDTTbzD2GM8eYvEkV07T" "y+n3GBR0if8n3pzltY954ThPvMKdNt8cYelcaD7zJo1pej26OYOc/uoVVglno2zewdMHePEE" "9SnOf8CfZ4PInkOU68MVHnAQ4Z8LfPk2509WDB7iuXepPcq5Be7eYF2NnS9XDoaVg1gYVxnT" "ucnSGc4c5a+zQWTPYWR8935wsft1Ojn9ooI4rOgmJXOHyWosfcvih0zsoNagOcPFr9n3LyMb" "Gd9KXlQOIC7ZvJMts4HB1r3cuR3GCo/vpVPQ/inU23aRl2sERHRWGNwP5cofgfbyb6GuNQO4" "q5dDvW4DRUFOqo8yR8FX75CNsXQhzLv9Cx+9FUbWKfjhMy7+GOxvHA0v/L3t6pob5oxvD5Tj" "kocnGWtQbwTAccJkk7Fx1mckKe1L3Lq+EJXPq9tm3iNahtWv2kW/im511l+TU2QWbi879h/L" "jtG0Z7ykQwAAAABJRU5ErkJggg==") index.append('feed') catalog['feed'] = feed #---------------------------------------------------------------------- feed_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAp9J" "REFUOI1V001oXGUUBuDn3plJY2bSRE0zaf1pg0aMNCZWQ6MV4g8BBVELbooFcaMbtUGFuhCi" "dKO7UhAkm6K4VKv1l1b8SVM3mmgwVcQ2lGhjm4TWxGScmTuT6+LeSD1wON/54HvPe95zviB+" "QqtOI3KGrVuY+uX55VbDOQf97tWsTiNuundY8XYyOcIsQUAYEIRJDANkCCQe15n7btinR2Xl" "JI8rGTr6yWD+ZxYnCUMyKZ2MBDCOKbTRvoP2o8NZpJUbuW13ynE30Sq/Hef0J9RXktJxnMRL" "52m8mjVCawiylP7kpyPMjLO6QC7PLY/y4CG2DKTAAVFEOaJWpUo2ESxIAKbfSc7ZkLY++vbS" "cj079zE5yunjVGpUK0R1yoT/Kd7Rz2Nvc98BbnyE5Rm+3M/sWFJ8x1MU+6hUKNeIalTXW1hX" "OJdnUze9j/PAIVo7mXiTs18nIHfuI96QtPA/BgEuTvHZc0yMpho0cffLFK5h7CAr52kosP2h" "lMEaVYL4dbHBA8xOp6MKEiY9e9l6DysXeP8Zx7JFX6yULK1eFJWWDOWb7Rn/SDZpISATM/Ai" "uQKz3zB5mLZuCkUfZ4omG0oGd93h2qu6fHXqAx9On7DQtDFd0jBm03a29CcaXLeL5b+SseLI" "3Bl9N/eqh3W9m4fUg8hAz13ebW5a3/KAfxaISkm6cCZR+9yvYH7pglxQ8HD3s+CF+0fd0H6r" "ahDIqiKuoc7nz5NrYXYqmffMD7z1tL+XF52a+9bU3LiXhg577diTGjMbNMSxzCtdWnVcMeDK" "rkTlMGZjOy1FWouEoXIUGVv8xbbiNoulPyytzjs5dULP3NJEEA9qtdWIzYatpV+1jGrq5eTu" "jXyz95rzSmGgaS22s1T5fv+Pl4b+BTWH7yK0JQYwAAAAAElFTkSuQmCC") index.append('feed_add') catalog['feed_add'] = feed_add #---------------------------------------------------------------------- feed_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAo1J" "REFUOI1V081rXVUUBfDfPfde+2xCk9o0L62k4UErVCvGSjBFQevIL9CiDsSCA0FRxIZScCKk" "4j9QOlE6kYpjC4GqWNFaSgUl0WrRatskxtQ8X9RqzNf7yLsO7kuIBzb7nANn7bXWPjvKntep" "ZFhqyOoKrVh/Xr8auO6YX72ZKBl22/4hxXuIU0JCFBEiopDnECEmkke2wm9fD/lwRCKVP67G" "9AwQo/IDf4wRAnGLTiwHzDLau+jeS/fIUIJW5QJ3H2hxPEB9gStnuHqalfm8dJbl+UaZwhaa" "BE1ECYszfH+K8fMszJK2cfuTPHKc7YMt4Ih6neU6jRo1ktywKAe49H6+TwJd/fQfpGMH9x5i" "7ARXz1BtUKtSX2GZsOZ4zwBPv8dDb7HzCebG+ex1ps7lxfe+SLGfapXlBvUGtVUJqw6nbWzd" "zV3P8fBxOkuMvsPk2Rxk3yGyDbmE/zGI8NdFPnqN0RMtDzZy/xu038q5Y8yXuamdPY+3GDTX" "exDIAksVpj5n5ivuPEjfg+w7wgevmn77ZdOXf7bwyxVpIdE731SqkeQSIuKMwSOk7Ux9wdi7" "dO2mvWi6ErlRKet/6gUbSndY+u4TP57/VLIYWp80ZGzdw/aB3IPe+5j7O28rJka/tHP/MwrX" "zopOPmvj+Cl9O24xWY8ka/1dqlBfzLXPXsvdvv4TqM3+rtBT4tHDa+OQHN2m1owkasgaWOHj" "w6QdTF3M+z3+DSdfkrYVLH57WtvIK6pLZYv4dy6WxMRHd+nUc/Ogzbtyl0PGpm46inQWCUEU" "UpOXLwlpUI8X/PNnZmImtqXZvBBlD+jUZ9g2Q5qtUV1GrRXL+d20TSbmF9RWImmc2RyyC73l" "5mP/ATKN6mYTpdRFAAAAAElFTkSuQmCC") index.append('feed_delete') catalog['feed_delete'] = feed_delete #---------------------------------------------------------------------- feed_disk = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAotJ" "REFUOI1V001oXFUUB/Dffe9NHJLURkzS2mJtN0pEaEyb2pWirgRBu1YQhCLdtIO4VILgUiG4" "7MKFFMSNQvELgqgg+NlAUES0FklrqoltQ2JmMvPe3OviTWo9cDj3Ls7/45x7Q3rOmEPmNLTs" "RDbIW++3RoU/zLvs1cIhc+59tGXPEfIGWUEIZIGQ1TULyAnqTH1Wvmv56LxCQ93czdk7S47V" "n/h7kSwjH8jJ1YApMTrO5AyT51sFBsxNHjwx0HiCcotfF7j4If1/auqU6nrjT5p3EslEhIL2" "VX54n0tfsrVGY4T7n+aJN9l3fAAcKEu2S6oePYp6YKEG+PFcfS4yxqeZfpbdB3joDItnubhA" "t6LXpeyzfRNA7f/hFuvLrCw689W0XZc2tXtL7hgdsrJ6VMiOGh3OxRTcWOo43XlPIfpvwo0R" "JqaYmNL59ILHjt3nqZlRH3x9xSvPTP1vk29/vmY+npPJBqu5vsTHp7lwlq017W7p+mYFFr7/" "62bjdsVGl7X1nhDijoWMlNFZZfkzrn4ry07KE2U/euPUjBiThFwyXNDtdm1s9XYsBPLE8Zdo" "jLL8heYvme1u6bV3f5cFqn4U+1FCSonEcCOq30GWmHiAfbO1zlSpYke3X8mzBpKgL4QgxSSl" "qKpKvV41ABBq+WWbxjBrv9lsT2iEwqknd6lir15VIoWoWQx5/Z1l1za2FHo1I30+eZHGbpaX" "9OPLcg1Rx1uLLxgfPiDIrLUvOzk7L9PU7vYUrpi38k3L5CxN9EsOHlas5g7uZc/opscPHzM2" "tJ+M9e39Jkcqw0MUIQjpEWPuMecuLXHwVbd5Ps7r3H3E2G1jmsXtqlgKMQqpL4a2n5cvWd0o" "/Qu1JAns7Um8HgAAAABJRU5ErkJggg==") index.append('feed_disk') catalog['feed_disk'] = feed_disk #---------------------------------------------------------------------- feed_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArtJ" "REFUOI1N0ktsVHUUBvDfvTO3jJ3CNNo3ZMqE8CitUiBEEgXiTsOGLgwLSdzKRhtD4sakITFx" "2+hCQnTnois1xFdiIhAQI2q1gPJsjbWlhdI6FDp0Hu11cdvYk3w5///ifOf7Tr4gfl2jggGR" "fqsVrmDtf23VMGnQP06mFQzY9lK/1r2kIsI0QUAYEIRJDwOkCCSIl7j7c7+vz0iLJMPlFG37" "SOH+nzwYJgxJrchJSQjjmIYmWvbQcqY/jZXNGXb3rWjso7rA7e+48xVLj5PVcZz0f6fJPMMy" "oWUEaUpTXP2csYsszBBl2XmEVz6gY/8KcUC1ymKVWoUK6eRgQUJw7dPknQ5p6qX3GLk8z7/F" "8GkLY1+YqOakcr0Wxs7Lr2tcJZD4P9hPcZy7w4yf5ft32Huc/EGl9jaPHj6nremAXGG34l/b" "jT6oSVv2/4WjLM1dCXb2cfE9fj2lVLysHJU8vfUFc6PX1QUV6ze0yTQVVhQEmBvhmzdp6WFH" "H9lmXnzX4tk3lFMP5Ta/rDw1pK4+8PfvNyyXq7b88NmqhZA45Mn9RPrUZZ49ppSh3LFJbsth" "i5OnhHU1UUOn7KMrmuq3ysw/XrUQkIrZf4KogfHzps+9T/duLT1HLE5+JIxqKvMFs5dGtJca" "ZbJpKqshDWOae+jYR3OX6Vqs2NqjpfuwyvTHUnWx8nynmQu/2HT0tEznXmrxGgIBT2aolty6" "NGRubkJF3tTVDy1btDC30ezZH+U3HhJtaKfuKZaWqJFWQVzDEt++beT6Ha8e/8TNoRNuXbhk" "XX6XcHZMb7EmmjnHjSvUllifJSQ0YdDdn5J851rdHr2n8seXCrsOyGa3u/fbdd2t22S697C5" "QGNDMjx2lchgEB/SqNOAdv2Wee1yo12bW+3bUbChcl/XzWvqnySxVZP0NCKDxUkn/wMZSPeN" "olecpQAAAABJRU5ErkJggg==") index.append('feed_edit') catalog['feed_edit'] = feed_edit #---------------------------------------------------------------------- feed_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAppJ" "REFUOI1N08trnGUUBvDf981MM2mSOtVcmkpSoqRtJGhiLAYaL92puGhxJQqu3ehQF0EQo/+B" "dKN0oxTdKgTUQsG4ELGtHdBKF0mxF+1UkjRJSzIzmcv3uvgmJQcO55zF+5zneQ5vFN5RMGJO" "TtFOxO3cPe+OJu74zD8+zRox5/CJooEpMjniLFFEHBHFaY0jZIikGVqULxf9MC8rJ328neHA" "MTJYvsZqiTgm06aTkQKGQHcv/c/SP1/Mor05z+SpNsdTNLZYusD172ltpqtDSOv6f+QfIyGW" "IMpSucvV7/j7F7ZWyHXx1ElePcPB6TZwRKNBrUGzTp1saliUAvz1ddpnY3onmHibR4Z5/n1K" "Z7l+ge0m9W0aLWoPAaT6XyyycZtyidsL/DTL1Lu2OvPuJ2UDA+MySxdTkEaT+o6EHYdzXfSN" "8cxbvHKGwoik9IW1a1/JF8at9w4ROlIJbQaxuH2atT/48T2unG17sJeZj2x0duscOG7f4KT1" "mwuqR2aoNWkkbQax9FwhprqcUl/4kFs/q9fW3GtW9fQWtB7M6x1703JrQ6g1qbd2S4jIBKY/" "YOZjBp+j9KWVq+c8OnqSWsmlc9/oLlSt3/zN/b5+mjsAEAf6xjl4LPVg6LjNzXWNWkXP/opk" "+wYh0dq8bOTl0/7tqGk1dgOIqK7QqICwvKTcqCoMT0gqfwpJ1dQbRyT1snx+0b6x15UrZZrE" "6ghNtDh/mvOzVn/9XH70NXt7VoXmPaKMK98uIpHUFvUdPuTOg7JKd4fMJ6MKDnRO2z/Knm7i" "YGn5luETs+JsRpQbEuePenzyBXH+qGjPk7JdozI9T7hRvrgUhZcUHDJnUFGSftVLA09rJYQk" "CK1ESJK0T8LDPklazRD8/j9JfxgTZ9hUEQAAAABJRU5ErkJggg==") index.append('feed_error') catalog['feed_error'] = feed_error #---------------------------------------------------------------------- feed_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApZJ" "REFUOI1d00toXVUYBeDvnHuvpDbYh2kSY422SiAPNVZDAypSQbED0YJDsTOHeimCEyEWnTkJ" "4kDiqCLiQLEUfEBFMUaM1kRqi1bTVntjE2l9tGke556ng3O1wR8W+wF7rfWvvXdQ7LfZDmNq" "6v6tsIX16/WV4rxx8w5W7TCmb09d191UaoRVgoAwIAjLMQxQIVCiyFg4VvfhEVU15eFmhe4R" "KrjwA3/MEoZUWnYqSsKioL2Dzl10HqlX0VJu4659LY/7SFaYO8rpD8iWS+miKMe/f6ftenJC" "OYIqq4uceJ+zU6xcpLaRgcfZ+yo9oy3igCQhSkhjYqplYEFJcPKtcl4N6Rhm+Ek29bL7WWYn" "OH2UZkrcJMmICP9LvHuEJ97kwZe47TGWzvLp8zQmS/FdT9M1TLNJlJKkLQe5qwnXNrKtv8TA" "PqZeZuZ18tyB6RctR0teK3pdE639z0GAv47z0TPMTLQyuJb7XqD9RibHRUnT9o5+T+U/iZsJ" "Sb4+g5AiZO0Cjc9Y/EZ96WdFkYrzRJwmerb26e/e7Uq04tG1aYebQzZcbSGgUjD6HLV2Gp9L" "L5300OB+WZHL8kyusHB53u3b77Ucr9nTOOSTjPIdhAXbhugZKQMrUtGJCVmRO/fnnCRPpXki" "yRJLzSuGb7rfcrJq5I6pFoGgtJ+slr1fPCNKI2mW6rquV5pnsiK3eLlha3u32fkv/fjLt979" "jqq4VCTj4wPUNtE4bi2PHPrqFXEei9LYzo5BozsfduzclO/nJr295RF90WFVvxm38HVd5wht" "yBJuudN7yVB5VXFGkrnn1zcE4Qanzkx7Z8tetzYa1IwHxQM2u9mYG9Tlra8aIW4hKvcGB1hW" "8cVMpjdDzfil8w7+A+GYI3dex4ktAAAAAElFTkSuQmCC") index.append('feed_go') catalog['feed_go'] = feed_go #---------------------------------------------------------------------- feed_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqZJ" "REFUOI1N00tonGUUBuDn/+efmOY62kkyppgaepEEpa02GEGodScuNKAbEdy41lAKIgix1KWL" "4EbtRhA3roSCRqxtvWQj0tDaKsbUYGNrYnPtJDOZ++/in9QeOJzz8fG973tezhfEr8kYNCFt" "3E6Ezbz3fG/UcMukv52KDJpw8Pi4vidIpQkjgoAwIAiTGgZIEUgyrvPPz+O+OiuSljwup8iN" "kMLt31iZIQxJNeWkJIBxTEeW3sfpPTseocncypGxpsYxqgXmznH9S+pbCXUcJ3V9idbdNAg1" "EEQUF7n6BfPTFJZJtzP8Is99QP9oEzigWqVUpVahQpQYFiQA1z5L+igke5jDr9I9wJNvMnOG" "6+co16iUqdYpEd51PDfCS5/y7Gn2v0B+ngtvsfBDQn7kdSthylLLtnw5T7XWVNDwv8PpdnqG" "khweY/o9Ln1Eo2F9Y0EwkJMdPmFt+n1Wl3TdVRBg7QpTb3DpTNODNp5+h4497lw4rZY/r/uR" "owo3pqQyQ1bjosWgY2eEkDhk+zYLF7n4Nje+S0CeOqkUBbofe169OKc12y9qI3fskMLRQzsj" "BKRiRk+S7mDhe2Y+ITtER5/ovpzq+l/C1IogLGjpWqFUtPVvRbIHYUzPo/SPJIbFNa5NKf30" "sY14WdATadR+FTY2CDvF1Yo/Pp+TuTzXBBAk8qvFRPbynzbLd+Rv/uiB4y+LK98I6pt+nypI" "18pSlW270wMeKl4WqTQZ1fn6BOluFq4odLbKPvOKysqHoqjb7PmCtvmGfX1dgnq7VHdXsuHv" "HpCR2zXq/gO0dCTjdPUq2rRrbye1NbPf5nUWsw4O7hO2tgijNPNXWV+cDOJjMvaa8KBxjeZX" "LXEzs0fx4f1Kq1syv8wa2NxK7iqIkDa5ccup/wBSMffA4EVY+AAAAABJRU5ErkJggg==") index.append('feed_key') catalog['feed_key'] = feed_key #---------------------------------------------------------------------- feed_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsNJ" "REFUOI1V0l9o1XUYx/HX73fOdP+onc25LVkybAPD1TSlyRbV7KLAMFFosCIvorvy3HUTWETB" "8EbsJrQLiaDLYFIGhohMC20jsxWkbtGcZ3rU6dppO//26+J3JuuBh+f7vfi+P5/nwzeI3tKg" "wyFV0lYqrPTq++oqYcYR0z5K6nBI14tpLc+QqCJMEgSEAUEYzzBAgkDcUZmbl9K+G5FUJX6c" "T9C6gwRu/86dccKQRMVOQgyMIurXsX4b60fSSVSUq9m6t+JxL8UcV09z7VvKC7F0FMVzbpbq" "JpYJLSNI8m+GK98wOUouS1UdT77GK0d5rLcCDigWWSpSKlAgGQcWxIDfvorPyZB1PfS8waOP" "8+xBxo9x7TT5EoU8xTJLhA8Tb93B/i8Z+Jgn9jA/yZn3+ftcLL7tHVp6yOdZKlEsUVhZYSXh" "qjqaN/P0EC8fpaGDsc/562wM2XmQaG28wv8cBLh3mVPvMXaskkEt/R9Qv4FzR1iYZU09W3ZX" "HCyvziAkClm8ben6GaMXxvya3yTV1OzunWb762c0/vCZLyabpFIpc17y1FRWfz4hGa8QkIgU" "t6d9ffK8f6I1ht58XS6Xc+PGDSM/5tXeynp16IBEIiGTyRgbGzNd6BL/gzCieYsLUwXXM/ft" "Gxx04pN3nZ9a1NrWpru72+SDRRcPHzY7O6tvU4v+/QecmtpVAQhYvO2XiUvq6upAevO8s38U" "DA4OSqVSFhYWZLNZx48fl36u08+oa2iUVEBUQlnb3VE/PWgDw+NrlZcLhoeHH0JzuZyoVDR8" "8qJdb/fJzkxLfNipQWtNr1Snmppa5yZm5RfzurbutL23T3t7u3K5rKWlRW9vrxcGBrR1dPpz" "4oqrE5fvBdHzGmx0SJt0uczUQr1Pb+5Qu36jqrXVliP23fpeY3HRiQ17lINQMb8km5mef+T+" "3O7/AIzLDZub0MSmAAAAAElFTkSuQmCC") index.append('feed_link') catalog['feed_link'] = feed_link #---------------------------------------------------------------------- feed_magnify = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoNJ" "REFUOI1N001oHVUUB/DfzJtJ0nz4qiYvbQpKRIrWojESrCBIFZG6qQGXluLCLvUhirgKfuwV" "Fy7cCOJeKNQqBdvabkQIFKsYmpQ20qS+1Ibm882bmTcuZtL2wJ9zz73c8/+fc+8JiuN2Gzcj" "1rRjYYX74/stww1f+scnkXEz9h9uGn2OWkwYEQSEAUFY+jBAjUCJImfp96YfT4rEystJjT1T" "1ND6i1uzhCG1Sk5NmbAoGBymMUnjZDNCxdzHs9OVxmnSTa6cYf4U+UZJXRSlX71J38N0CXUR" "RGwt88cPXL3I5grxAAfe4MhXjB2qEgekKe2UrEOHqGxYUCa4/H25jkKGJ5h4i/ojPP8es98w" "f4Yko5OQ5rQJ73Z8zxRvfsfLn/H4Udau8stHLP5akk+eYHSCJKGdkWaVgq57HY4HGHmyxIFp" "Ln7uwrVU68YVG0mv3vht9cnjXjt3TFgpKEsIcPsSp9+lcZAnphkYcWH4hLW03zNjg6K4pnWn" "Y3U9cX7/hw63f6Zzt4SQImS7xeJZzn7M9XNubvR6bLTfahJYXstlQc2+xpBW/Sk6+f0lBNQK" "Dn1APMjieWa/tVH/VE9PLEsy3YIkK/RFNVkRke0kgLBg5CBjU2XDiozLp/U3Yp00l+Zk3aI8" "Ctja3CQrqhJ23nd7hXSrDFcWSBL7tuesb+eGdkX6+yIP9MeWb6eK/+Ysrd8hI9KpGOX89D5x" "ncVLJJmn//za/NpRC3tf0S1Y32xL//3biyMtS2s90npdULzjC68faWpMlVOWp+Un2UGn8llO" "zvW1dbd29XlofMLcb6eyoHjJbo+asVdTtxrVNjoV2tVe556/9uCQhRdezbpFN/oflQkMAcdI" "A5QAAAAASUVORK5CYII=") index.append('feed_magnify') catalog['feed_magnify'] = feed_magnify #---------------------------------------------------------------------- female = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgxJ" "REFUOI2FUTtvE0EYnPVdfHYeKA0ClBQIKcqPCP8hDR2uKB2gp8CyaFLRBiFBx6NAQkpBRYcU" "iTyIo9giiR0LP5KAlXBn+3LnPZ93h8KxZDtxGGml/T59MzvzrcAQSIryx8JDa9JajMTNBWpC" "eeGadILVe4/m3wshOMwZIFc/FdPO9hlbVY9BTTL4I+kdNvn3W43F13tpkmKkQOlDPuFsnzGo" "SbbtgO2zgO3T7pHHPmtfjri/nEn0cyL9hTVpLcZuxiEMgdBuo5Gx4Xw/hTzxIUyB2J1xGMpY" "7OeY/YWwjIVI1AAIeEUX51XnLiTQqYcl69ZtjE1HoQO9MFJABxq4WBGlAiSAFqDHOhdNgFIP" "xB6I0PE6a2EjALVGbHYC0Yl4aWwqWhqfvwFqQp74UB29NtJBaLdW/fL5g6nYNGIzccRm4qDu" "WlK+gpurQ6lw9dL2eyApCi+z6d+fK3Rzdcpjn/LIp7vjsPIqz+yT9TRxzTf2RPIvdhOF59lf" "3kGTrZLH/aUf7u7jjcRV5MhwYy+VeUvJlG6pkIqgIrSiNrVI5Z6uL1/7OgAcPNtpu7k6z382" "KCs+W2WPftFlM2Mzu7SRH543hxtKqm4UzYEFQgBXhb8soDvvyiuF+waB2eTcHAAcrRQKSgA0" "dOW/EXrIJTfzjYzNZsZmLrl5yfpIBz1oQ32tvjns3k1ujZr7B+okSSnzRZWNAAAAAElFTkSu" "QmCC") index.append('female') catalog['female'] = female #---------------------------------------------------------------------- film = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjFJ" "REFUOI2lkj1oU2EUht/c9t7kJrUZmjZFWmposFVpAv5AtzqpIFiMQ0AQRMWhWwYHJ0cnOwXE" "H1TQpTgVh1DcdClYsBWRWmozOdSW0lgTyHnPudfFuOQ6+U2Hc8738J3vOcB/nlgnqFQqn4Mg" "GDOzH9VqdTyquVQqfRGRcTPbqtVqxwCgt1MMgiBvZi/N7Fa5XA6jAK1WC6o6T/JCJ/cXYGZx" "MyuRZObGvPpOHG0LIQFwe7CK0RRwrbLcS3KG5PHOPacTkPxE8qGZbXzwHvvNZMPvSWZ8+Bm/" "jqKfTm77IrLZbrdfiMha1wtUtV9VZ1RV0+4q3jdXcLrnARybwNLeZaztT0HkuopIWVXTUQCq" "al1Vp7Jx4MxAH/ZlDr9aBew1zmHjYBAiEpCsq2o2CiB/iifOZ8fhxZJQ5NBM7wCHXyGIEU9F" "oKp1kie7ACLST3J2eHi4uHTne4QDBySPisgsyf4uAMmfJBfr9bpO3Fs85Ttx0AAJgZuZRxjp" "i2F6ZmVdVd+QvNJlQUQ8EcmJSM9y+z5+2hYCA0jg28EQ+vUjSDokc6rqRY3gqmpORGL/skAu" "OiRzZuZG7UGD5AJJNxsHLo32IZmZgx6qYCes4d3BPlTVVdUFVW1E/UFRRK6SPHJ2YCz0Yj6Y" "GEEztQMMPUcAYlVk1MymzawYNQJJPvE879nbu9tdBoA4UqlUand393UYhhe7JBUKhfXJyUnJ" "5/MrEQ4BAIlE4qvruqHjOJud3G+WuW39/MXaIgAAAABJRU5ErkJggg==") index.append('film') catalog['film'] = film #---------------------------------------------------------------------- film_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApNJ" "REFUOI2lk0tIVGEUx//3jjPjHU0Jp5wie2ikFs5E2QMJjMRqVeRGCIJetDCKhggKgjYtisiV" "FT2ooDa1iwKxVpFEVIvUioqhCUPLFF81Q/f8z3dvixqxnF3f6vCd8/04nN/5gP88Vi5IJpOv" "Pc9bZIz51tHRUZWvuKWl5a2IVBljPnZ2dtYCQEEu6XneUmPMLWPM/tbWVj8fIJvNQlXbSW7N" "3U0BjDFhY0wLSUb3tqtjh+EaH+IBB+Z0oKII2JV8VkCykeTy3Ds7F5DsJXnJGPPhReiKk4lM" "OIFI1IETddJIOKWRIUdEUq7r3hSRnhkdqGqJqjaqqpYGX+FJ5iXqA+dhm2p0je5Az3gdRHar" "iLSqamk+AFU1rap15WFgTVkxxqUNP7JxjE5sxofvcyAiHsm0qpbnA8if5Iot5VUIWREoliBT" "OgzMvw3PIq6JQFXTJFfNAIhICcntsVgs0XVsII8DGySXich2kiUzACQnSd5Lp9NafereascO" "gwYQH9gXvYxPA/0o6/XC6ktibHzMq3FLTnad7TsdyAEqKyuPkMyQjKU3fI6V2QsRMLPhKjDW" "/wAD2QE0rmuwmtZshXFGrZFs/6aipYFZUxpFJEhyieu61m8LhzHO9yCBvtQLrKxJwNgGiXnN" "MBaxvq4BgH9w+h5MkLxDMlgeBrZVFCMSbYPOSmJs8guCVjG21R4CABxtuoKquXFYsAqnzyAh" "IjtJLt5YtsgPWQ5YuACZomHczYxYbwafomewG8ebb+DMwz0oDIThw/853QJJXg2FQtcfnRj6" "a/6RyHw8632KhvgG3O+7iJBVgO5XjwFYF6Z+Yzwefycilaram0ql6v+VuLYtdsZXHLODlu2J" "71lBnHt+8evxX5Qkdg4IU4MqAAAAAElFTkSuQmCC") index.append('film_add') catalog['film_add'] = film_add #---------------------------------------------------------------------- film_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAodJ" "REFUOI2lk0tIVGEUx/937jjjHWOsHHGKzFclPVQoaxVYm7I2kYRDRRAVQS7CCQJbFS2iTa2k" "6EEYtWkVBSGWUODCsBYlEmbWBNLDDJ/NyD3/893bokZMZ9e3OpzznR/nOz8+4D+PlQ2SyeSA" "53llxpgf7e3tVbkuNzU1vRORKmPMp87OzvUAEMwWPc9bY4y5Z4w5kUgk/FyATCYDVb1KsjGb" "mwMYY8LGmCaSjB27qk4gDNf4EA84WdyO0gLgSPJlkGQDyQ3ZvkA2INlP8roxZuhV6KaTjkw5" "diTmwIk5KdQ5hZFRR0SGXdftEJG3iyZQ1aiqNqiqFua9QU/6NertKwiYanSN78fbyRqIHFUR" "SahqYS4AVTWlqjUlYWBr0RJMSgt+ZWoxPrULQzPFEBGPZEpVS3IB5G9x4+6SKoSsCBQVSBeO" "ASvvw7OI2yJQ1RTJzYsAIhIluS8ej9d1nf2Sw0EAJNeJyD6S0UUAktMkH6VSKa0+/2iLEwiD" "BhAfOB67gUhfLwanvtoR+VU34VuMrg20NXZ7l+0soLKyspVkmmQ8tX0kXhRYDdssg6vAqr4O" "RD4MYFvzKXvt4VZUlMbsdHp6Z3N0fGJOo4jkkaxwXdf6Y+E0JvkeJDD7/CnWNBxA/scXsO4e" "ROTTQ5SXxWwDPzn/CVOq+oDkqYUWouOfkR+vAPaemdtI8MIK2L5VPh9QJyKHSJbvKCrzQ5YD" "5q9CumAMbixsZd48QcHjFriz35EBMDNtw9j4Ot8CSd4KhUJ3np0b/Wf/tDZheW8PyoocBO08" "zIwpPn+3jO971+Z+Y21t7aCIVKpq//DwcP1CiT2J0raRb98uFgeR91N9XRryz+/p9i79Bov/" "eORaAsmXAAAAAElFTkSuQmCC") index.append('film_delete') catalog['film_delete'] = film_delete #---------------------------------------------------------------------- film_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwZJ" "REFUOI1tkktoVHcUxr87M/dO7mSSSZoxGYUYpxMIiSZBfIEPdFEfaIgYxEgl2NriotDClLbQ" "VRdd9AFmoQFRsxBa0KxsRAiDD/BJIArRVI2p5kYl0ck040ySO5l7zvnfcVEqbZyzPB/8OJzv" "p8Xj8T9d161TSk339PTEUGQ6OjoeEVFMKTU+MDDQ+N/M57puvVLqN6XU552dnYVigFwuBxHp" "ZuZdizOfUsqvlOpgZg4f6RbT44ejCiAXOLqkB7WlQFd80MfMW5m5aTHAw8wPmPmkUmpsyDht" "2oGs6Q2ETZhh00KrGQokTSJ66jjOWSK6/94FIlIuIltFREL6MG7ad7HWewwe1YBEeh/uZ5pB" "9IkQUaeIhIoBWEQsEWmu8QPrqoLI0BeYz7Ugnd2BsbklICKXma1Nq1Ts3DcHC95gM+y/rwP5" "ycM+ESFmtkRk5c6aGAwtAEEUdigFLPsdrsboJcKh7QulXbv3LTXDWxCKrkbGasDjRO+vPiIq" "Z+a9kUikNfHtZJEOPNjYtNB4uOtAS8UH65F+9hiGRigrjyBYtTzkY+ZZZu63LEsafuhfY3r8" "YAVQAfgsfArLChPwSr1RGdsF59V5GAENz4dHQQvOTN6Z3+ghIoOIokTkHXR+wqwah6sAZiCV" "SkMXDZX1bchPnYGmv4EeLEOJ/TTp2smPNnz5x5iHiHRmjjqOo/3TwlfI8BNEkhfRXJJFqL4d" "+cmT8OgMml2B6WuDc/lcrm11/PLwvx5kmbmPmfUaP9BeG0SMu7C/4gaqV+4Bve6F1yjAma3D" "y6t3XGa7pfHrobvvamTmViL6mJlXbKuqK3hHprBe366JVo1XIydQWW0gn67Fi6u38ge6H5T8" "NZmd+N+LiYiZ+YxhGIHL3ye10tE3WtPmo/C/vIWx/tsYTqRx81wCv1ywvpuYzmXeE4mIxono" "lG3b9/r6+tauKmtienjJF23dgmxqBs+HRuZ/vDI3MzqVO66UerYYoC1e7N9csbAmVuNb1/gh" "Crpzx0mlPm37eWS8iCAAgLcLMrN1Hf2rhgAAAABJRU5ErkJggg==") index.append('film_edit') catalog['film_edit'] = film_edit #---------------------------------------------------------------------- film_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtJJ" "REFUOI1t01tIlEEYBuD333V3/f/c1XJt7aSZ1ZblqmkE3XSgrIsoMsoOBGFRURAtEdRFRHQR" "BQWBFNVNdIKggqKQ6K68sKwoO1CbtEIWWWpquvp/3zczXXQSdWAuhhceZni/seLx+Gutdb5S" "6lttbW0hRlhVVVVviahQKfWxrq5u5uAsTWs9VSl1WSm1rbq62owEpFIpiMgpZl4+NEtTSgWU" "UlXMzOGaU2J7AnCVAWlge04tJo0CNscb0ph5ATMXDQU8zNzEzGeVUolG/3m7z+m2vU7Yhh22" "kyixM502m4iaXde9SEQvh91AREIiskBEJNP3Ao/6nqLCexIeFcX9ztV42VUMoi1CRNUikjkS" "wCKSFJHiSACYm52BLtqF3lQMnd2VSPzMARFpZk6KSGQkgP6Es5ZFCuG3HAgK0Jf5HRh/Bdpi" "JMtGZa1bOnbx3hOve4cBRBRi5lW5ubkl9/d/HtZAwOdBTeWYvGmla621i9t+NjQOAZi5h5lv" "J5NJiR6+XW57AmAFkAG2hs8h3NeCdGe2FRpXhoUlIefVzRVzi9fc/cd4iMhPRAVE5G1wj6FH" "fYRWADPQ+iOA1OcPCIazoHruoGDeTq9x1aGn58p9gwEfMxe4rmv9bmEPuvg9hA3oayeyoxuA" "ged4cukqMrL6If20wkJw5eA56Gbm68zsiwSAlZMy4IR3YWLaDswJdSI4OgXtJgGjoXobMWXR" "PksRHa0/Pj/4FyhxXXcjEU1emJ1vZqRPNhUZpWZJxydk5ZVCp5pgdD/K10Sh6QvS0xOIxNbP" "BAbif5/AzHzB7/c7Dw62WfcOtFjfz3yw8iKVcILtMNIBWF48u5UAoKEHEsiZng9FtPvh4aIi" "KxaLvSOiKSLS1NzcXAEAj0/Pay3edG2C19MCIz8ADP5jHnjtKNrevMD7O0duWMOKB1B/oqzd" "iHaMNjBa/97G4P/ZAFoD2jz7BU6hpg46SHrFAAAAAElFTkSuQmCC") index.append('film_error') catalog['film_error'] = film_error #---------------------------------------------------------------------- film_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtRJ" "REFUOI1tkUtoVHcYxc+dmdzJnUycks6Ywag1M7VW0zyqIwpiIgZjt01JAoK0iCgp3QRRKBRX" "ioWiq4GiiAi6UVe6iRYFxdSmNoqaIiZNejVRq4Y8Jpnn9/jfbqyUOGf5/eDH4TtWX1/fn8aY" "j1T1TTqdTqJMOjs7HxNRUlX/7u/vX/t/FjDGfKyq51R1b09Pj1dOkM/nISInmPmLxSygqkFV" "7WRmju45IY4viJJ6IAPsi6WxogrY3TcYYOY2Zl63WOBj5kfM/LOqjv5hn3JyoYzjD0UdOFHH" "RbMTCb12iGisVCqdJaKH7zUQkSUi0iYiEql4gNu5IaT8x+HTNbg28yUezjWC6Bshoh4RiZQT" "sIi4ItJYGwQ2fhjGHH2LbL4JM5kOjC7EQESGmV0RqS0noLewYWdtErYVgqAeucgUsOw8jMU4" "TQQRcZl5/WKB1dXVNcHMM/F4vHl2drbcCBgeHi60HgwHFeybqwqGLnUPFt41YOZ5Zr7suq58" "evjKBsdvgxRgA3THrqIu7MeOtt4nJWN/tmrpOt/8i/v5ruPLQ5cOPC8AQICIbGauFxH/3dxJ" "tDhfIegtg2+yFRefMtgTbP0+/HldzWqsjW/CQjGHB4XBbFs6Frn13VQ2QEQVIlJPRFZ1YBy/" "zfyE5qoDCBvCjoavoZ6BGoWBh5eZSTQu34IsFXz3Jm5lNvyImgAzZ0TkAjP3RoM2Wmo+wGzx" "FIpCUM/g2fRfYCMQw2BlzJcW0LJiK7Kc9/3uDkwHmLmZiHYx86rWWJ1XgWqw48dtKVqigtol" "KyFGoZ7BP5kJ1ITjuD/5KwbGB6ZI0WGlUili5v22bZ9JJBLvPk/b7qJIBDKEohCS0QZsTnRg" "aOIOro/88ooU7a+O4bHV1NT0hIgSIvJobGwsVW7GysrKkcSh0icbk9txc/TGC7bQ/vIIRgDA" "Kjt8mdT/gJx6/lAJmnh9FO5/938B5iav0GsqKwUAAAAASUVORK5CYII=") index.append('film_go') catalog['film_go'] = film_go #---------------------------------------------------------------------- film_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAt1J" "REFUOI11kktIVHEUxr975zp2x5rbY0oRI0VrRiMNMmpRGBE96AENiGAE0UPoATUtggpqV4vI" "lWBvilpUINFqekgbg4ykUnvo9BgrsszJmdFm8p5z/ve2iQibzvY7/Dic36dFIpEXjuPMUUp9" "a2lpKUeOCYfDr4ioXCn1PhqNVv6dGY7jVCilriqldjY0NLi5ANlsFiLSzMxrJ2aGUipfKRVm" "Zg5sbxZTz4etXJADNM1swewCYGuk02DmOmaumgjQmbmHmVuVUrEn3nNmxpc2Pb6ACTNgxlFj" "Wr4hk4je2rZ9mYi6/7lARPwiUiciYuU9R0emC7We09BVEHdHNqM7tQBE24SIGkTEygVgEYmL" "yILCfGDxjMlI0R78yFZjJL0asbGZICKHmeMiUpgLQL/D+WsKy+HVfBCUIWMNA8XX4GiMC0Rw" "HBnYsVxbt/nY6ic0/PnMvL0vLwKAVl9f/5GZR4qKimqSyWQuCejt7f0ZXijJA/vXFVtVjUg8" "ah4Z7OrasujIuzsGM48y8+14PC7B47cXmXo+WAHkAjsCZ1EyWcOpg92JfbuWlFjBWmQ+RJE3" "JTjdmm23Rfe5O3Ui8hJRGRF5Ou2TGFXv4SiAGXg3Ngt+eYbaUIF/Ws0GTWXfYFKgGIYPKK5b" "6CubX9JqEFGeiJQRkfY/CwWfNxEnB6B7EtD0DLz+BDCexY8vtsdg5rSI3GDm3RMt+L5VYSV1" "wr+ydKojL6E7KUCfApcJfdf7x1/H0k0GM9cQUSMzl66YMcf1aiZ4Ugms0RjK7WdacGkjXLqX" "p6mveHorCd/44JBH09AXT+3dev1jm0FEzMznvV7vpfuHh/58/sAqB5Xrt4MSrTAMCy/ax+yj" "F96oSMgzNxAAtlz5PgYAqK6u7guFQlRRUdH1t7pPbWsf20Mn3Ez/Rrfj9FK1LDjV1XX97T9F" "6unpCeVyPzgw3D6aflCaSWZ/fooNH3rYn7qZa+8Xt8euVdBzLUwAAAAASUVORK5CYII=") index.append('film_key') catalog['film_key'] = film_key #---------------------------------------------------------------------- film_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvZJ" "REFUOI1t0UtoXHUYBfBzH3OvdyaZyeiN86Bm2sS0tGUm+Ci4UC4UWnVVJhUmVlrER4klC1Mo" "rsRlycJiQlB8IIJu3BiKQmgRIWih0II2FCkzxUlS79V0Yto0c8fM933/O25clGTO9sCPA0eb" "nJy8GUVRQSl1d3Z2dghdMjo6+jsRDSml/pifn9//cGdGUfSkUuprpdRblUql0w1otVoQkQvM" "/NL2zlRK2UqpUWZm940L4ug22qoDioDT/bN4IgGcnLxqMrPHzAe2AzozLzLzJ0qp6jXrMyeM" "bzhG3HXguE4dI04qvuoQ0e12u/0VEd3YsUBEkiLiiYikYr/h5/A6njU+hK724dJ6GTfuF0H0" "uhBRRURS3QAWkbqIFDM2cOixHtynM2i2SljfOIrqZj+IKGLmuohkugH0f3nwxcwQLC0OwR6E" "qQaQ/waRxviCCCJSZ+andwBElGTmY9lsduTSOb/LBzqYeS8RHWPm5A6AmR8w88V6vS77Prj4" "jKPbYAVQB3jT/RS7ejQ8512/JSLfM/PxbgssZt4jIsbV9nk8hQqsmo/MvUX82p/Gj3dvI5VK" "9Wxubh4ol8t7S6VSJwiCe0EQnK/Vah8bhULhrIgYRGT3HnmQ/euny3g+lsSp115FPp9Hb+px" "iEhvLpcrjI+PO8PDw5rrug4RHVlaWoqZzLwhIt8y8zvx2hZKfBAvHD6Msx+9h42b/yCfy6FY" "LFqmaVozMzPwfV8lk8nLExMTLy8vL582mXmEiE4w827XfwR9PWkAwKFTUeeHd5va2NgY0uk0" "ms0mGo0Gpqen/9V1/RUAYV9fn20SETPz55ZlfXnnyhaM3X8CAH55v6VFrGFqagqJRAIAEIYh" "DMOwY7HYHAD4vr+llUqlW0Q0KCKLtm2fHBwc/M7zvOzAwEBkmuajq6urqFarsG0bhUIBmUwG" "IrK+srKiLyws/K1te8XwPK+YSCTm8vl8v23bRqfT0dfW1t7WNM13XXcOQKzdbqsgCBphGJb/" "A+taora2TLgoAAAAAElFTkSuQmCC") index.append('film_link') catalog['film_link'] = film_link #---------------------------------------------------------------------- film_save = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAspJ" "REFUOI1tk01oXGUUhp/vzp07c6cxiXTqBNrYhojxhzoQ2yhuKgr+QLEYkIA/IKKWdlOycOFC" "XCi4scVFQFQo/ixklgUh1C5URIlYgxURKZKRqoUkGJOJM8k953zf50Ittc7ZPvDw8r4cNzs7" "+30IYa/3fmVubm6cPjc9Pf2DiIx775fm5+dvvZqlIYSbvPcfeO+fnZmZif0EvV4PMzulqg9d" "y1LvfcV7P62qWn/mlOVJhcJHJMDzu+YY3QFPzS6kqnpIVW+7VpCo6neq+qb3/uLX2dt5t7aR" "l2r1nLyet2nmQ7XlXER+KoriXRG58L8EZjZoZofMzIbK3/J59zwHSidJ/ARn1x7lwvp+RJ42" "EZkxs6F+AjWztpntb1Tg4M4B1uU4f/buYG3jAS5u7kJEgqq2zazRTyD/wNsfbIyTuRrGGItf" "PsloBXpiXH/iveblla2mS+DhWimG6Pijs8Uni5fvSkVkUFWPjIyMNM++8NsV8+DUNvdNTXBk" "coCPFn7lpSf+sx7vf7pKCO6rVFU7qnqm3W7bxMtn7syTCuph+bMF1jYNgHPnlzl89x4Atg3E" "w+q64FwgEZFMRMZEpLRQvEbHLxE8JImjFEF94OSxSUKI+BApEailgaIo6HSFVETKZjYmIu7q" "FarlhO1CebX1M4kD84HgAxGIMUKEWjmQqOqGqrZUtdyowCOjA9Tqx7EQKbxRSso4l+Io4VwJ" "YkKMDjVDxEhVtSkij6vqvnt37o2Zy9HqHuZ76sou5djh67AgQAIRogtU04zXP7zE750uqYio" "qr6TZdnpcy8uX2nZ3xIpUSawxenFo9RrN+JIWO39wnMH3yChSq/4u4MlEXmr2+1+02q1Dvwr" "eOyVE3HfCDQGNrm/OcVwthsSWN/ezQ07jFoGqXO4ft8HMHn04y9uHs3vGa4MU00HsaC4EHDR" "E1yPHy8tsdJR/gIAP6Jg4l1lcgAAAABJRU5ErkJggg==") index.append('film_save') catalog['film_save'] = film_save #---------------------------------------------------------------------- find = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAltJ" "REFUOI3FUk9IU3Ec/7w/e5tvuixKmNbCuXTEBimDGJV0qIueCiIJT1mH6OChbh6UoK4dugQF" "Fl2MoHOhIKlgohOVElMzF2tqmW9v23t7v397HUpF6e7n9OXD9/vhw/fzAQ4a0n7iweNn38P1" "9SfS6TR6urukJy/eunnTwMzU+NKbV88b9+/L+wmrUIDu82Jm6iMA4PPcNCp0P+ItZ/X/OVC3" "h5t377vR2BkU8iYWFpfxbfkLAGDh0wxkWYameesSyVZX82gDuc3s7fn5eRtAWenvH/aFY02X" "gnWhTtctI7f1G6mJMWiahrYrHX1enw+WW4lgqAHHT4Zhbv2MzU5PWYzRUQCQenuH1WP1xtdA" "oDI0OfHXdqA2imBNNYjgrFigHm4bWFnNgNtbaGyM4FFPd1pw3gBAqLW1i9KmqYZkRUG5LCCE" "wMZyCqtzFibHRzzhU1FEmk6jysPBdQ3plSUIzkP//ifUVCqFNcOmv9az2pGjNdhY+wGnZMM0" "jSyxCu2zeePh9MRYm677YVlFOCUbkiTlXNcVOzG2X70xeu7i5fOJ5jhyZhHpTBYDL5++To2P" "dESisYFrnbeuJxItELyMzNo6+u7dGcvnjQs7KVDiJDeyGaA5jqGh9yCOA0pJHAA4IfGSbQEA" "BgffQZYVUEaSe3rAOVO2Cdd14avQQR0nAkAqkVKw6lD1bvMkCYJzZY8ApQSSLKNolaAoKlRV" "heb1aofD4YDu92cBwLIdKIoKRVHAOdsVBIBEstXljIExCkoJOGOghMCxC3WUlz9wRiNCcAgh" "IDjfc3vw+AP3HR74kwWfiwAAAABJRU5ErkJggg==") index.append('find') catalog['find'] = find #---------------------------------------------------------------------- flag_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkFJ" "REFUOI2lkstLVHEcxT/3d+88rledSZ2xGjUqI5CyJHIh2CpcSRHSE4ISXLkOso0ESUlRG2v+" "gKAkBanEIjchSIgIYYigiD1Mx8fMqDOjzsP7bSGKRS6sszwHPhwOB/5T2k5BVWPr/oR5ILjq" "KTopaVucidDI9aXWkMTn6kG6RZPgnZc/e3YkWw9D9oV3KRmctaVzwpaKjoyUt41KejUqvfcq" "5f6VorcABs3NyuW81Wnb1IrSHCgQBQ9qXJwt0fG6QOnw7IxOcnCAmf5pZiNrAF0ARvlEtjl+" "Qve11bodhoKMQLEFXidMxiBgw3AYVjKgPjyltO4a8+EYCu39RgOPJ6BbmgfgzTcQoCIfSnLg" "SC7E02ALjM0tpqotnKuRSdaSGZraf0wDqISxtywrS3mVAl2By9hY1qnA1GE5DesCh5lZLcjP" "wXB7fttKJczA6dsVuudrDNwKXNoGyKFBnnsDFLBgPTTq8fsLCI0PICIjmwAjllV83HIoq28W" "kjacKoDSXPCb8PF7xu6eXEmmcDluWLbBIswuxAGta6sBZk5h2ha97iBcPQSVPuHRUIraFwvS" "0fflc1WRVZ+XCj9vaWzEzqwzt7CEJtK71aBkunv4bnvZsYTpNxEbt0TTvujwUPzxpaoeoAdo" "uVwyX33Of1MZOuHIMk2vpvq2AKNPLjYADZvGChD541QKqfH5vH89nNrxitskGuf3Fe75d4AG" "R7Mtk9BcFJDuXQM2FYnG0ETr3zVAkODrnk+MTUwFsR3B7dkvdzbgRU++X48AAAAASUVORK5C" "YII=") index.append('flag_blue') catalog['flag_blue'] = flag_blue #---------------------------------------------------------------------- flag_green = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk5J" "REFUOI2lkk1I03EYxz+/3/+/7f93c/Nlm+nEt6xUSAUZgSgoCYpQHSKK6miX6NghKxAhii7d" "Yvc6KEGIJNIL4kFENMKCvFRL0fk2bWrONue2X5e0giSs7/XzPB8eHr7wnxH7gbYbV/yGXH2h" "5cSccbtGct2+0RQMThINnwQ1oIQK3OyZH9T2E1R3aPMVVT7zcts1WVteKWXhivk2ESt70D1E" "Ith/dDEcdQ29/9qj09UlWw1jylL0tAKR+nGSoqXwFLWVzViklRQJGrztNJXUsTgaYDkSB+gD" "0KuDDlOveVNwveU+yfQOoLDpGViEhaXYLE5LDguxGRIpJ9svH1J+9iIrXzaRiOcAOi6Xz2as" "mcuxEJNrIwAUmCVkW3NxG/lsp+MoFPHNRbx2iEWmiW8n6eydWwCQxWak3bCmNSkEEomODoAU" "Opqwsp36RlqlcCRcuHMz0Q3Xb7+SEduhmjP1l+R6IoImdKTUkUIihUamxYWpOfAaPiKz63i9" "bpY+jqOUmtoV6FFTHLdlmXxaGSGlkhSYpfgySsnQMwlFPzMxP8qOcKkGwy+IjbO8GgVE357A" "njVVtLVzhLqcJgBsmsFEeJh3C6/Ji/rj/trTj6dDyYq7VzsaH3U3El7dQCj1aq9IzXcuBPXi" "UJl0xUABUQvJGc/W0K1njt2he+eLznnczif1J6roHxyjs3dur4D68O3ew/uV6WfSDR5P1h+J" "/PsyKCFa8/Oy/10g4JjDbrIUXgPUwIEFu4msbSKUGD2wQKEC/YNjfAiGAqQtgV/ZdwB70X9C" "8C3xAAAAAElFTkSuQmCC") index.append('flag_green') catalog['flag_green'] = flag_green #---------------------------------------------------------------------- flag_orange = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAj9J" "REFUOI2l0ktIVAEUxvH/fc3Dq46pM5ajtmgiMBMlcuGiTY+VGCE9dw24aR+oGwmKClpVNKso" "alGUINU0RG5EkIgIQpMhxZSymvExU87TedzTQrSEXFjf9nB+HD4O/GeUzQbX/O21Ox2pQJ0z" "02JpIpG0beJT1hGR5LwfJCiKBPoefg1tKkf6TCt3/7hYc2/F+jAghZutEu5vlnwmLkOX2uTK" "6brnAHp/P+qFEvsAYnUoiEERsAT7oatovsPgqABUtM7bRMc/Yo4GiMayAIMAeul0s1NrnHI7" "jtwyUHUoFqCifnUxPgPlXoiOQT5N+NU9fF1nWVhKoKK8BNBdDrxKTnMBEH4GIlDbCq4GqN4N" "uSSIxY/Pkzm3iS0TmyG7UqD30ZdvAOp2M9WoGiUVoIKigWYHRQHNBoYTsstgFflu25WpripD" "d7g2dKV6zdQB7WCPi/gsGA4w7KuQboCzchUq95JWTZfHU01k6g0iMrEG6PWliX2q3TSZHYH8" "Cnj3Q5UPTA+F6WErPR5csSs5Q7c16QDRxSSgDK5fUKZTI8W8xt4uaDmD1LWRG7nO4t0OGR9+" "8t70tfuX1MoH/p47WIUi84s/UUSG1i8IzjWMNb642OQxUk5LIJ525McS7ncnA8l2CAEhLp9q" "WDjf6Tmn6hpLsWV6H8+NrAMnboS7ge7ftaSB2MaikKNud8VfH07d9BX/iCgc21Gz7d8BBfaU" "mk4i83FAglsG1hKLJ1BEGd0yIEjgaeg1k9NzASwj8OfsF1af3QqjhoJMAAAAAElFTkSuQmCC") index.append('flag_orange') catalog['flag_orange'] = flag_orange #---------------------------------------------------------------------- flag_pink = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAi9J" "REFUOI2lkk9I03EYxj/f3z83t7G5nKZToZKUskjCDh06iAhB2cFDf25JEnjqqh28FJ46Razo" "2CGpQCqRQCjIrCQDM1QoIy0T3dzmdDrn5u/tYIpCHqwH3tMDH5734YH/lNrJuF3dXnwwXBLa" "lwgeE0nLtCsyMtBwb0aS4SaQblESanv4q2dHcoI+W05PirxdEumMi1SNy7z/g2RScem9cUI6" "LpQ8BzDaadeuc+rJGvYZ0EzQEBTOWxVQ7wGfAboGoSKGEm/Y39/LbGwFoAvAOHDU7dSHHQHz" "bqWJoSALlBrg1WEiA8XA5xQs24yN36G88RKR6CIa6gWA4Z5TQU13eQF4lgQBqnOgzIJyC5I2" "2AKDmdVAECsV+85KOktr589pAKNwwXcIj+VDU6D/OSVgKXAqiGRhDSYrY6l8y2MZDu+2rrTS" "pL+GtnwvExlwADms/2wCfmMdFDQZ0se9BQX5zHwdQERGNgCGH88R3JqLvmVICxx3rEcPGPAy" "YfN4KQ1i7s1TBmdhdi4JqK7NBC7lKGQVnUYPXPRAjRM6wizXfZIf98eGqMttShurD1reX8HO" "rhGeS6BEejcTvPKPDh++Nl+VS67TxiaFZEb3TH6spfkkg8Ag3DxfFmlpKLisGTrR2AKtj6Ze" "bwJqo1ebgeZtzUS3j0pD6gMB318Hp+04xS0Sxbmiwrx/ByiocLuczITjgHTvGrChWHwRJap/" "1wBBQk973vHl21QI2wxt9X4DSNjRL/0OS8MAAAAASUVORK5CYII=") index.append('flag_pink') catalog['flag_pink'] = flag_pink #---------------------------------------------------------------------- flag_purple = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjtJ" "REFUOI2lkktIlGEUhp/vv8z4O+PcnFEnJ110MS2hjd0WuQgKQpBwEbQQEhS6bAI31sJVixYt" "Y6CNQWIXAglkiBK0QCMoKSm7ilAzjo7OiM7Nccb/azEotTCy3s2B857z8HI48J8SWxk3Lg3s" "cKb9QWuu4mBNVSAwK5cLkdSZfpmKdYAckkIGr96LhLStALWfTocDh8pEQ7ugsCoofeCw6Om+" "jra+nYzePNXy+v0sQEjr7e1Vjjy/9siUsgUpdBMwJdRf0KhqEuh2yKehvgtyUxNEx4aYT6wC" "DAJo9uldxrpQfPu7VR0VzHWwVYBuh3QUDC9kYrCeg49Pb7G77RwL8SQK4gmAViLKq9dUnADR" "MZAS3HvAqAR7AArZYi8ZMfHZIJuYYTVXoOf+j1kAxSi4GtQS1SUFCAUUS/G0igaqBfIZwAS9" "Kou33IFW4vztVkpp2tdU144zM1dcUHVAKQIsjmK1uiCZj1PuPszc11dIKT9sADRb2t+oG9ji" "76CQB89esFeD1Q2xCdP8Pp7LiTVdN8scmsdbz/ziKCAGNxNoGJVyDbW6GWpPgGcffB4wGelO" "ycmRmbf+RksHzpW7l28fRShTxBaXEVI+20wQ8Y9Ppu7UHtAzHkNikrWk8iueb28uDjcfY7g4" "dP1szcKVVsd5rXSaeGKFnofhF5uArv7jnUDnn95VQZ70+VxbeH8hKWj1V7r/HSCgzm4zmIst" "AXJo24ANJZaSCCnGtg2QyODj0Eu+TIeDmHrwV+8nBHDPGPqq448AAAAASUVORK5CYII=") index.append('flag_purple') catalog['flag_purple'] = flag_purple #---------------------------------------------------------------------- flag_red = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkVJ" "REFUOI2lkktIlAEUhb//MS9Hm3Fyxmx8QE5IoZJIhga1yFoZEWJZuBJctYkgqKDaFBa4rGZR" "i6hFkZJkooKbCDSkRWH4SCkLe8yMjzF1HOf13xaiKeTCOst74OOew4H/lLKZcbu6amdBJOLP" "jUf3GapIQDMPfS62BmQx1AjSKYr4rzz53rUpOZBvN+INJ8V491aMjjZJHiqTkcpSSUTD0nuj" "Qprrc18C6NdBvVhkacMwahQREykgJViu3kI7XA3bnICK1nKPYOgj9j4/wdllgHYAPf1oqU2b" "GHdbr90xoemQSEJuHjid8HUCcrwwPAjRJUYGH+KrPcvUzAIqSg+A7pjDqyQ0BwDdHSACpWXg" "zYfC3RBZBMNgbnQs7rZjjs5OsBxLcvnp5A8AdYcS2ata0pyggqqByQKKAmYz2GwwPw+pFD8L" "CqNZ2zPQrY4NXaneWGS/dv6Sg8kvYLOC1bICMpvA6VoB5XhJmMwOjyeLwPgAIjK0CtDz4gsl" "qs1up+81LMdgXzns8kGWh2T/K2OpuzNmScRNYUem7jkIwelFQGlf+yBDyJZkQuN4LdSdQcor" "iN9tYbqhRj48b31vr6xqnHG5Hl/o6sFIpghN/0IR6V3L0Hpgz/2hEndkypdmBH1pxqjPFXtW" "XtS/PufN0/lHHpwrluFHp6S5Pk/We3rdwEgT0PTntATMbiwKOeZ2O/86OHWTIW6QKJzIyc78" "d4ACRel2G4FQGJDOLQNWNRteQBGlb8sAQfwvut4w9umbH8PkX+/9Bnjf3vQJuD8BAAAAAElF" "TkSuQmCC") index.append('flag_red') catalog['flag_red'] = flag_red #---------------------------------------------------------------------- flag_yellow = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkBJ" "REFUOI2l0stLVGEcxvHv+54zxzMzlg3jmOEoVF4WFUSg3YQWhRAtDFoY4aqF0J+gi9oUQas2" "MUhBuyyLJDQVbCEOUhGtVEKjErw049zQGZ2LM+fXSlHIhfVsH/gsHh74z6i9irf991rtzanB" "g6Xpg07JYb5wLrb85dt7yazcBhkSJaGevqXhPeWvT7REw6cklxiX9YWnsjhiyXivSzazKRm7" "3yIPbwYHAcze3l5X0BeO+iOvfdrJozQoBfVXerBrrqNNP2I6+M4OoCXG78kQ0WQOYADA9Pli" "VZaK2yeu3UVpC2QTw12PtvzkN6aw7AayaxNIKc3M6ATHbtwilkijUaMAJjjnPeaaCZBdeg6A" "y9eK6WnAqGiiVEwBDunVWQJeyCZ/kcsX6X65sAygcQptXiNhKGWCcqEMN6BQugylvZSKCRzy" "FHWLVPoPYNoVu7bSplq9UNfYoYrrsyjDA8pmCzOsarR2Y9mNZDJlqqqqksj3z4jIzBZgWhIN" "usxqlYt/AieHy3cJs/wkhh0kE3tDIvIKbSSQOQ+oZqLxDKAGtgGPjtsiOTzBLkQctBUgNd1F" "5GeeYl1H3qx99GxmZeN0xXznxeO1Z1iJr6JExraBdKE6PjXyuMYl64iAaIuU3Zy7eifshj6g" "jwcddZcLlY0fGo4aJJJrdPcvTmwD7Z0vgrsvlAPCu4dC2gKBQ389nN7zijsiivYjh33/Diho" "Kve6iaykABnaN7CVZCqNEjW5b0CQ0Lvhj8z9WAzhuEI7uz/p7OelYkBTlgAAAABJRU5ErkJg" "gg==") index.append('flag_yellow') catalog['flag_yellow'] = flag_yellow #---------------------------------------------------------------------- folder = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAa1J" "REFUOI3Vkj9rFFEUxX93dnbdqBMiipigCFabtIJikSLoF/AT2PgVxEIQ63wBLQU7S7EUVLBX" "rCSFQoKQxODuzP6befPeOxaz7iZNSsHbvMd955x7zuXBf18G8O3tzS9L2caGWXLsSVSj73s2" "Le5YaFcnWBdgNz0/3tr66FMAi63etc2XbTMDNWTM8OXRjYPPz/ZkTReg1VlW9PXh6v77R8Dr" "FICgkujOVPvPCa4FyTJmGd21u6zd3u4gAREUAWF27srOm82ncwFzJIqO4DooijjdpR4fMDr8" "QLu7CqohOiQPeLLe444RrwM0DhK60U9xE5AbUw8Lst4DuhfXZ2v660CNg3QFBUsXAnVCunSZ" "lfWHc6CIRPcTP3iHQo58jnyBwoju1SdQNWtpBJykUBInXxtwGCI/INZ9FHLwg1m/QGEMqsCx" "EJBDip5Y/2omhRz5wezen00u5gKSh+qYAFWUEZD/PSMOFrZDjvxwQY5lE9NzIkK/nhyddcNO" "ZsoSqQ0xA11CoQIcSprTkoCfTqVa1SJCVW7/eHH/lsQ9zLJT/64A++QsxFen4v5Z/QFgBRmd" "QQ2DBwAAAABJRU5ErkJggg==") index.append('folder') catalog['folder'] = folder #---------------------------------------------------------------------- folder_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAixJ" "REFUOI3VkstLVVEUh7997sMjecyKxCtKoAhXI00KK0lCzGnQXxBBIyUIQhKEaNBApKYWTWrc" "KMJJEZlgDppYliEJGUpyNe2+9D7O2XuvBse0GjltT9Zm77W+9VsP+O+PAliYOPW+0mtrU8r5" "40sob31dUcXcOWVi5b+iDsFytGq7t3dKRwGUjSQbe57ElFIgYTBKoUsbTWuzd1ZEha8AkXi1" "WB2sJ1KTQ8DTKABGSli/opx6gPEj4FSjlIdb30f9mbE4IoAFsYCg1IG6L897bu8ClI8j1sf4" "ccQKtrhMsL3G1vobYm4CJADrI6IBjZe8FVfYYwChAgfX6iJ+AcTfJsjn8JJXcI+07rTptwIJ" "FURrEKOie4DAIVpZS03rtV1HwWL97+jMK8RkEZ1FdA4xW7gNI1AO2xICfBExJWxhLnQ2eURn" "sEEaMVnQGV4vppn6ZsgWiwT6Bp2O2VMgPiJWY4MfYSaTRXRm557mxUKajyWPCz2naTjcwuT8" "M95+Wo12DSbuhYMvW1EYRP9E9CYSbIRWbyI6zcTnDCeTHRjH0JHox6iAsye6ARl0dkpIB4WN" "rJ+PW13w0OWjGL8Ba5qx5jjruU1iqopLrdcBuNn3iObadhTKDUsol8aWHl7uEuEiSnn/rmsu" "l3bnV2f4sDrNcP9jRl9exY1UIEhJ7WffuwYSdxubDo50t5+npa6TxdQsM3PTrCxl7+8LEELq" "RlFqQIEnkEdk/N14avgXQ10qhTEgEGMAAAAASUVORK5CYII=") index.append('folder_add') catalog['folder_add'] = folder_add #---------------------------------------------------------------------- folder_bell = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApJJ" "REFUOI2dk0+IjGEYwH/vN9/MziyftXZQa1etPZBI/iQHQqk9+BdFHLhRCkW5OHBykYPaiwvJ" "yoFy0CpyUfa2q1CyrLVrZneYwezOfDsz3/vN976Pw/iTFPLU01NP/X49Tz0P/EdcPcmp3G2q" "d45zz/1X6MoxjnYuYmPCJdmdpsfPkiqXmPVX8PRm0k966devj4hkLoh9slaK11zp3cfNXUtp" "j/0JvnSIHQcPL76xauuZjXH1ASavQXGcRKuHntHJkdfc+m2F8+C4B9iyu4dLS9ZsXzGrc2+c" "XB86N4CeinAFkok6iRhevImEO9y/9lnKW75cKQeA0lRFRcXHsZXbd6ugMEE0cg5TLlPOR3zJ" "QHsHYOKMT5ItzFBzlY0t69x0Pa6UAoG5U3mG+0+gP43x8c0E75/nmdMS0d0BbXPBBOBX4MUb" "7mZayDsYCbAhevIy1fFeYv4DFq/qYfBRgXjKpbV9Hav3HuPVqEslgNY2yL6fkXc57j99St1V" "IY7YEBMmECvYWgY1PcbCdAfV0S+kMIz0DzHPW00dGPkITc2oWn1QAFwckjaqUflQQOdHsWGV" "WFML3fv7EGPIDQ9hpl/RutASBZrZXhuZh9fRgm4I6g5uagHzN5wFLIgg1icqD2CDMRakNTPx" "IoXsJCooUJmzEwAnSbYhCEXEBNjqC8SUEONjg3EQi9gAbI3mVECqqwkxbaS69jP68iYP3n6b" "QEJEbIStf0KiUkNiNUgEohFbRUwFG/mI8UGpX+7GRVtRGCQqItF0I03ppyzyEVNGTAWxAVZn" "EJHgpyCUqXr1c3PoJzwlniMSB+uBpBGjgRBxGlU5hqhWE6mL/iEQHVwcu7JnvQjbUMr742cJ" "oAZCZWzf99ZXrWZtz3fR84IAAAAASUVORK5CYII=") index.append('folder_bell') catalog['folder_bell'] = folder_bell #---------------------------------------------------------------------- folder_brick = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnRJ" "REFUOI11ks1rE2EQh593d5MmbdeWkhSxJiIUkd5awQ9EEPHYi2f/BfFo0ZtHvYsePAge/AMq" "9NiLiqUoraWtRUqlkGhtmzTZZLO72XfGQ+onZGAYGJhn5jczhj62uLjo1Wq1Yq1WG52cnHzf" "bDZPAPi+39za2royPj5eHxsb2zf9AAsLC/fK5fKjKIoIw5BSqYSIUKlUGBoaIpfLsb29Pef0" "A7Tb7bujo6PMzMyQyWRYW1tjfX2dTCbD9PQ0IyMjHB4eznn9AGmaToRhyOrqKiLC7OwsAEtL" "SywvL9NutxkeHh7rC3Ach4mJCY6OjqhWq2xubiIitFotXNfF87xe/Pz6wkren5oy5m81ytKe" "+Q0qFouEYcjBwQGu6+K6LgDWWjwj7vnStRcZYwxorxhjWJmfZ2Njg1KphKoiIlhryWazqCr1" "ep1Go1HzsBohyUD8/Sk2ccE5gTE+N65f5ePKJu/evaVcPkOhUCCfzxMEAXvfK9oMwldpmt73" "TIKjkmCTLCqKdHbp7O8QfXjJyWqVkwAViIHCsZ8Fc+7O8m0AD4ecpB3a334Q720jSYg7MMLp" "2ecYDNKNwYCKYIzBHTzFlyeXfm/Lo+vg5ccpXn4ACKiiEpA23yDRDmiM2hC1bVRCcuWH/1zL" "I1FVGyHhJ9Q2UBsg0VdQQSUC6aDSQm0LtSGo/AvQBFVJke4+mjZ6EIlB01536XWXNEBtAMb8" "N0EsarBoWkPTo57bxh9YGqC2eSwhQuJdVDX6W0K9Gx4MJkHWN+o7qhkQH7SA2hhIUKcXjWNJ" "Ox3VrsZ/JMTR451nty6qchNj/H6vffygYN4kxsrLX6mfOll2h17qxIsAAAAASUVORK5CYII=") index.append('folder_brick') catalog['folder_brick'] = folder_brick #---------------------------------------------------------------------- folder_bug = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAs1J" "REFUOI2Nkl9olXUYxz+/d+/+vLMzEf/QwbawIc05N2XaWW2lYmSaqUPYhV54KQpCVnrhjUJB" "0NUulLwwKkZEXkhmUGisTC+cWeqcMKdu083jdnZ2jtvr+/e87+/p4jBW4KAHHh54/nyf75fn" "gf9h6y+8fmr9z28MADR0N8qmb9YtnKkZcw29dbFl1cYLbd0AgROezDjZ5Qc/2LzDe2Sz8IyX" "mulTc279sXmRLimbMDJlVr4s7yVfWMr02CSdu48zeLaXz66deNdfVuU8l0HbuVTjpe1/ZV3b" "2Xs3HPCOrNjHR8t3s6G6hdQnW5GGeRQs9UtFufnVcxm0nU2J5/of6oJ5+FDT3uST8b8ZfjZB" "by5DR937nDj/JfPvFWqun0uPqP6fmm9aifp6pWbJ3AocdaC/x9y/cg9WIccDO0PPeJqOV1op" "NTXfXb/Kw9wIVW7FIVPpkrrqN78uVUqBAAjVSnGsv5maxBJuPB7kTjbHntpN3EhfpunlVpyc" "S2VgrBKR2yax+OiwPBj7gjgsAaMKpRLsenUbP9z8DVdFbEk2cT/zJ2tr3uPYt50cqF8w9unH" "o32AUgPfr5uubf814Y92IVrQQQ5vYgg/lydIp+c6Eu/0jP0+3DWy0cSgQkcezpMMwfgDdOhS" "Uj6fl7adRqHovnWRzNNJ3NCjLllL65qd3DuZwgjkIIBJwcC0lrC45SigQQTRNtH0FbQ/RNuL" "AbLY5XE+yx/9l2lYthqAwTOjfUWAUERiH+32IvEUEttofxhEI9oH7SH6Gcl5Ph2rLSzLIvMv" "KaaEiOgIXZhAoqkiiA5AIpAA0S4SO+jIRmIb1H9fxyTQooiRKIdET4seT82CRTYSTyOxg2gf" "HTxCRPxZgFDyBTdbGdplCSUJQ6QUdAJkERIHQIgYxaiMmMjzRAoSzEoI/M+HTrW/JsLbKJWY" "827FHwN1JVSx7ppJ/QN6Hno3ssN1kwAAAABJRU5ErkJggg==") index.append('folder_bug') catalog['folder_bug'] = folder_bug #---------------------------------------------------------------------- folder_camera = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnJJ" "REFUOI2lk0FoVFcYhb97581MXsLEtNVGaBRcCOIiBEuLmTarhIqFErrorlt32boxG9cKQ+lG" "hSwK7TaL0oGWQBcpXWSRgikSTIvaNoiSmtbMZN67775373GhWExBEA8cDvz8fIvD/8Nryhwc" "LC4uXgEuSgJA0nOXZUmn0zELCwtyzrG0tGRqBwHtdntlfn4eay1pmrK6usqNy3N88FaXa98+" "ZnZ29vLY2BjWWsbHxz9PDgJGRkbY2NhgamqK0dFR2u02P27eZ21thgsXphgMBmxvb9NsNtnf" "3z+e3O6+ezNtnT5tjAVg+ZcWk5OTfPfnm/zwhwUazByd4MzJk6ysrDA9Pc3W1hYTExNUVdVI" "TKydOjbzVd0YA4Lmreukacr3dyw90wQLPz2C947W6PV6OOfI85yiKKiqioQgR/TN4uE1gq+R" "ZSX9fh9pBFkwNYOsYWdnhyzL/g8wHqvoCb6Botjd3eXh72tcPXSTY/rthX4+ngP4hvPnoHPr" "HSSRYBmKVc7gwQ6Du+vMHso5URum8ckXJLU6pS9wzuG9p16v0xwew3c/I8syyrIkobQk6dsc" "OXuJI2cj43nOUKOku9xBoQDAuQGhcoTgqL8xzxlgfX0dSd0ELyk4YvYrCnvY7DZeJR99eBhF" "hzEilhGFgEJJemKOO0tfsrm5aQASeaRYEcu/UbUHJkFhH1SBCiSLwoBY9VHog3nxeBOKKENA" "1T+oevzUYQ9Ve8+yj0IPhQGKjlj8hST3H8Dr3zJ7NOz7jZZRy0p1iC3Q4WcdeGSfprGBKs+l" "UsVzgAp35d71T9+XmMOY1ktfT4D52ZsQv37p3qvoCVFTZf8KhHwkAAAAAElFTkSuQmCC") index.append('folder_camera') catalog['folder_camera'] = folder_camera #---------------------------------------------------------------------- folder_database = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkZJ" "REFUOI190j1rVEEUxvH/zO69u3Gz0UINSALBxkQLC0FsBEEbQQQh2OjnsJC0NtaCohaCX8FC" "BUmjpSABUQwxorJrzItJNrt7Z+6ccyw2L9rswDBwOPPjmRfHkDE/P3+kLMvbqjprZmdEpC4i" "S6r6WkSezM7OLlaHAWVZPpiYmLg1Pj7O6Ogo3nu63e7ZlZWVswsLC9eBaT8MEJGrU1NT1Gq1" "/Vqe50xOTiIipwCGJlDVlFKi3W7TaDRQVVqtFjMzM4gIAEMTmJnleY73nkajwcbGBvV6nbGx" "sX2g+vnFuQ8jzdOnnfvXMsLO1x8fY/IAMca9O9nvSCkNAKeV6cmLzzLnHNhgM86RirWTn16+" "sb1mESHGiHPufwCxAo218OshEivgx3CuSf3EZcyPOO89eZ7T6/XIsowsywAIIewmiHjTiMQc" "U0P73+mvLrP6/jkzrRbfHt+jAhTAkd34i++gKG5+GSTw1DX16bZ/E1aW0NijUjvMxLWnYLC5" "vs7WdoeUBFWlMnIUe3WLEMKlAVB6qiPHOXbhLqBghmmHtP0WLZY5ZIEsKyitIFmf5vgdfgJz" "c3PtARDNTAq0t4DJFiYdtPgGppgWoH2q7FCp7GD0qOWV/566ahEzTWi5iqWtAaIBLIEFTHuY" "dNHUwaQDu6+wDxDUHIKlDSxtDqZsHWCpg8k2Jl1MCzR8x8yKAyDan7K3dih28qazpjfLQJtg" "RzEJQMT8YHVeSP2+WWnh4AihuL/86MZ5M67gXHPY18YA9zY60ed7pb80KGtkHD8+CgAAAABJ" "RU5ErkJggg==") index.append('folder_database') catalog['folder_database'] = folder_database #---------------------------------------------------------------------- folder_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAixJ" "REFUOI3Vks9LVFEUxz/3vTfjjPrEUMSRTI0WaqsIihZCYpvatYhq1SYIghYFYRCIqxb+A7as" "bZtCapNSI7VPDDKELDRt1NH5pTPz3rv3nhbPH9Wmtt3Nvdx7zud8z7lf+O+XAvj88vRc2h8c" "VMr55UkIdpZWVK18TplE8FvWEVj2mneHh2e1B6Cs29899CShlAKJk1EKXc8fX/8wviIqvgVw" "ky1idbSRyb29DzzzADBSx4YNQW4SE7rgtKCUT6prhK6zE0lEAAtiAUGpps7FqaGxA4AKccSG" "mDCJWMHWlol219nZyJJIZUAisCEiGtD4/aNJhe0BiBU4pKyuEVZBwl2iShm//waptoG9Me0r" "kFiB14oY5R0CIgcv3UHrwM2DQMFiw1V0cQYxJUSXEF1GzA6pow8hiMcSA0IRMXVsdT4ONhVE" "F7FRATEl0EVy2Y/kZheorm2T6HhDuss9VCAhIlZjo824kikhurh3LrCeXWBnUXPq2igNfSep" "zb/m0/tpb3rkx5344wMrCoPobURvIVE+3vUWoguszMxx4vwVUl+yqKfXaVx6Tu+xNgxyd7+F" "QlTNN4aVpK/Ed0QSYH2QdsQERPkXpDr74NK9Ay954xlcUb1xC0F94uvjy2dEuIBS/p92lbTb" "UJ17pZqmbhPUclSBStnFuKypv3kd4N3VzHiyuelhd7vxPOc7lU3Nt5xrwrod+ydADOl+UN1a" "u+VY1WMdWbXI5MUZ++gnjv4sCD3ATiIAAAAASUVORK5CYII=") index.append('folder_delete') catalog['folder_delete'] = folder_delete #---------------------------------------------------------------------- folder_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnJJ" "REFUOI3Vk7lrVGEUxX/fm5k3Y5xFzeKaxA3UBI1BUAQtRItgQLCwExS0UbBTCyvByrQisYgg" "WBitLGwUwS24IRg3HBNNjDFkkolRs7zle9/7rsWgqPgPeMpzOYdzuPfCfw8FULyxqXdOrqlJ" "Kee3kRDODAwrf2qrilPhH6r58CmZnd2x455JAiibWFu//VJKKQVSEaMUJphYOfb89LCoCguQ" "cPNiTTS+uHTnBHAtCUAsAVanw1InsU6Ak0epHJklO1mypcNFBLB4o3f5fP8Kiez6hmCi5mrv" "+eZMJYHGEauJtYtYwfqfiGbHmBm/SyqzGCTCzPZj/GUsWr+fwopWvg2u4e3Nro5KAoeMNT7a" "A9GzRNNT5NYeIFO9DlD4pVtIUpFf1srkh7e4SpPLLyJb3VCoGEQOyTl1zFt3GLAggmCxegRv" "uAsTZSisbCMc7catUgz1FokCX/zAa6kYaBGJA6z3Eom/I/E0Yr7hTbxAJEthdTvByAUc15DK" "NjLXfsSjHG049rjPARCNiDXYqIzVZaweo9TXQ+BXUVi9h2CkEycVoaeWU77/iAXbDqKMsZX2" "AKEVRYyYScR8Yfz9Uzy/mrrmdnSpi4QrhFONlB88Yl7zKOnaejCVtf6s8DXyJqr0tJsbfNXv" "JNJLMaqO0VfnmF/nEkzW8/XJMxZsXEUiswbj+yKRhL8MJAw6Bi/s3SzCrqKzsHbfkYu86z5O" "34OHpBtaiMeLUpMyeuxeSRBA9WgV28u/Tvl3nDncFJ08dDSJE9N7+zpDA/0z+ZrCtrazb178" "6xcSfxPVVdGpoYE3mJkvNkzHPQ62bffZ18V/iQF+AG92Nauar+3yAAAAAElFTkSuQmCC") index.append('folder_edit') catalog['folder_edit'] = folder_edit #---------------------------------------------------------------------- folder_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmlJ" "REFUOI3FkjtoVGEQhb//7s26a3LjLjEhiUrQwjzQQgKKRcCoYGGl6bSwsdNOxEIRbdMJgkFE" "RNBCtIk2YqGWPhJF1KhgInlvsjHJvu9/752x2JBESe+BKWaG83EYBv63DMC3Z90fk15XlzHO" "upXiF0YnTDl30EQ1/l+uNIy7dcXe3tehC2Ak1rGj516NMQa0asYYwkp2V+bDtQk11SlALF6v" "EgZzLbMvLwKPXAAirSB2kz97i8jGwKnHGI9E6xFaD/THUQUEVADFmNrmH4M9V1cBxuKoWCIb" "R0WR8jhBMUNh7hU1iRbQAMSiGgIhXseluEHaAKoJHBISlrElUFskyOfwOs6QaOgEDKXsMMsT" "L2jqOk8sXodxU2hk3DVA4OAmm0h1nl2JqiiC2CmC389Z+PmButbjZD9dwUsLie2Xwa+epQqw" "qhpVkNInNFpGozwaLiHBIrnZUTY3HaW+ZR+jXx8Sd4sk1AfLSnhALaoSIsE8YucRm0FsBluY" "Ymkmg7c1RZQbpHHPWRZnAiTywV8HwBc1RGj4Gw0X0CCLhgssTU7R0H4KKsO8vf+AulSZfNYh" "N/0ZwvUAq4tBKbts83EJSx6h30ghm0Sc3XjpEuKPgQpR4R07D11g6v1TxIpdvYH6lf6xgRP7" "VTmKMR7G4KfT8bbe846U3qBSpruvHbHTJGp/kGo7zPz03ZHVV/5X7wd6zjV2nbjZvDtJVHiL" "qmXoyQjdfZ2Y2BZIHuPdnctzJpTeDQFvbhyY3Hv64baY8wsNF2HtkwGHWLKdzJePfB+8/tjd" "CBD4NjF0+2RZRVGRaqmy1iuIgGjzH7M6TzACduvDAAAAAElFTkSuQmCC") index.append('folder_error') catalog['folder_error'] = folder_error #---------------------------------------------------------------------- folder_explore = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkFJ" "REFUOI2lkk1LVVEUhp91vryapxTD7i3CdJJKgyAoCozCIKJRf6AaVP8gmok0dNikhjWLRhER" "GEg5bVDRRAnLUkKvilfv99lnn70aXPKDwoge2JPFfh/evVnwn8jsy1Mf2+PhYRFvx1hJql8X" "pVE+K1mY7Ep0w0LQWbt4cdoCBOL8waMjj0MRAW2FEcE21waKH8YXVVpTAD/ar86mK4XlN3eB" "ZwABmTZxpi1ZfkhmfPD2IxKTOzzK4TMTEaqAA3WAIrIv//nFyNiWQAyeOkNmItQprrFAWitS" "XXlLmCuApuAMqhawxIP3IsH1/WoV4JFztoGpg5oaaaVMPHiDXM8QIK0n4Wg1USToQjMJtgWp" "R9DeS9fQra2LisOZH9iNKebWDzJf7mO1kae9LaRnX5VC2i3bAqOqWRNX/4Rmm2hWQe0GLi0x" "V8rzPb3AYH8nJ0KflU1DqZIwH98M4DUAnhpUncWlqzizijNFnCmi6Soz1VEGDnVQSoSlcoYV" "nyO9MfUD5/ztBolTIUPtOmo3WifbRO0m1YYhikJsYnEKiVVygY/VrS8gwGgpra91mEoUi8ae" "agguBj1IR1uISTPSDKxrrYMK1Gu1bYEmzYn5R9dOq3IJkXjn0sXH+8NK/qoft0ckmRJ4wtJ6" "ilub1cmx0RuX7089EfbgweS3/pxwvbszGncK5VrTpcszMtK7JLW56cqXmfd39hT8iedjV27n" "C4WJ3oGTXbPvXtX9v0d283R67v35Y9XvadK86vl+x7/mf+MnCsAq1Rx26uEAAAAASUVORK5C" "YII=") index.append('folder_explore') catalog['folder_explore'] = folder_explore #---------------------------------------------------------------------- folder_feed = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAklJ" "REFUOI2lkjloVFEUhr/73puJM5kZTDQu0YRYBGICaeICogTEyqVQEEQbBStbOyGi2KUSLBQr" "F9BCLOIGEkWUYGsIZBEMGgxkcZnlZV7m3ffuPRbzEkgxlbc5l3PP//2Hew7851GNHuJrXHSb" "uIWlGQVkAA9QKXAsGFM10ww1BMgNFhm8vp2uoxAsgf8V4hXw0uC4EJbhw+0lr2FvQpZCO+Ta" "Ydc+CAdh9i3MjQICW7ogItsYkCJGF2HmDeg/sHs/9F+AbAt8eQxBAD6xN/NqYDyT7+1Vytlg" "bz4/cd1CF3SfgsoCTD8D/ycMXIHlOViehAp4yro9HUcepJRSIHUxSsH4C6hMwtgEdJ+AQ1fh" "/U2YGoH+s/BuFkrgYaSG1U3h4l2MdsEpoFSeDEBTC7T1wdwnsBb6zsPHO9BzHHI7kw40jliN" "0WnECro4SbDwjSjViR0fQZzXSLQKUyO4uVakVsZ7eY7OHWdgFc/DYZONV9EBiK4SrQhth4dJ" "RyEUOsEaMBqMgXQOUPx4ehLmR8El8IgcvMw2Nu+9DFgQQbAEE5dQ1XnEcet/YwUsZPfch3IZ" "nj+cNy5DHlpETA0bTCCmjBgfiUs4bQeR1h5UXEryFcRUkfYOdHNa1BgdAJ5oRGyMjX4hcble" "HJeSexGJK4k4AdgayiFeG7hHaEVhkPhvIkwc12H+BjFSg6g+8DpASzEKfme1n84ryTsiKbB5" "kK2ICQGNOPWoHENc80UiE64DJKwNf793+oAIx1Aq33C1kx1DjWll7KO11D9RTEKWshouXAAA" "AABJRU5ErkJggg==") index.append('folder_feed') catalog['folder_feed'] = folder_feed #---------------------------------------------------------------------- folder_find = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqxJ" "REFUOI2Fkl+IVHUUxz+/O3d3dtbuzLDuLrSW/bFSDCrMVEKhsAhC1H1I6qG32JceCwQfFJ+K" "yMelHoIEIYjeTKHIF0WEHjLbSPdfM9uOze7sjHd25u7c+7t37u93fBhDDZoOHA4cOJ/z/R6O" "4n/i1JkzI5XSanUjCNZf2LX7w1u///pNeXHuxrXLl/YCZPoNT00dL+Q3j50aGR3ff/3nK0nU" "6Xzf9Bvv7d53wIt0lBspeNecfoCx57bmb85c/6BRq2ElU9jy1LPTsXFgIJcvFEdP1oJgtK+C" "MAiO53LDB3e9+hp3fN9xs94jadxh+/MvUV0uUVmc16of4Nj7U03HzRTX/TtUlhZKK39Xzk5s" "efKj4uaRQhRG/PHbL4vu7IWXb+S8nTuVetCNEG+UKp9ezA8fOnyU0l8Vzn/39a1idu2nR595" "8eOj77zLSq3O9Oenm66ymR2PHzg7oJQC6Q2jFKluPJ2e/4TUGOZuzjBWcN+ePPL6mz/MbBpU" "jkN5cZau1k+4GNHYJBuvfoFJMuDkUcpjaOIgnaDN8u0qOopYaSQqO/7WYKv5I/NzczTWVtE6" "LKr5b19pb5u85Onb5xAr2NgnqpfRfpO4Wv3P++w5uTTfbvkNF4chm0Z0VtaIa39ik5BMtsBj" "h75CobDdGBQgAkBmeIKF6b2s+/XtAC5dBzc3zti+E4AFEcQGpO2rWF0GiRETIqaD2JChracf" "UuKSiIjR2HAGMS3EBFi9BGIRq8FGiN1AzAZiQhD7MEASRGyK7daRtNWD2Bgk7W23ve02DRAT" "gFL/UhBbURgk9ZF0vZemdR+WBohp37OgsfEyIqIftNDsho3hJBj0lHiOyABYD2QUMTGQIE6v" "KseQRpFIV+L7FmL9WfnLyT0ivIFSXr/XRgB1NVHGnvundRf/hoeGWHBfrgAAAABJRU5ErkJg" "gg==") index.append('folder_find') catalog['folder_find'] = folder_find #---------------------------------------------------------------------- folder_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkpJ" "REFUOI3FkstLlFEYxn9nbo3liKaUmnYxAschCAJNwoVYLaJFrVsY1L8QQkUW7dwUtLBV1CKI" "lhEEIWiR0UIq3HTFaIbKW82Mc/u+851z3hbTqBWue5bPeZ+H3/ty4H9LAbx7dPBNXaKnR6nQ" "uifBL85lVGWlX9mo/0eqCdKR+tLg4FMTAVAu3N05cCeqlAKphlEK4y13Lby+khFVdQHCsQZx" "Jlhsm588DzyIAGDFw+lN/vw4Voch1IBSCeLtQ7T3jcUQARyIAwSltrR+eDhwebVAaULiNFbH" "ECe4SpqgtEBxcYpovA0kAKcRMYAh0T0SU7hdAFWCEHFnKugyiC4RFFZIdA8Tb07+PlONQKoE" "kUbEqshaQRAiUreNxuS51UHB4fRXTG4CsXlGpx+TrZS43p8i3nER/OpZqgVaRKyHK88iNo/Y" "AmJyuCCL2DyYHJ7x6GhJcnZqhnunfdCsFYhGxBlcsISYPGLzjEzeBwnQzqCNoa1pH8nWPgpe" "iRO3j3Mj1r6OwHeisIj5iZgcYnIYpzmaGsaKwzqLQ/iWz7C/4zBFXeFM+lkcQdVWyAbl5c26" "EEsoSYREonhGY8Xx5cdHAmcwLiCwASt+gQOdAxSDMsujz73qCr439vnWqV4RjqBUAsBrNnFj" "DdsbdmKcxYrjez7N1vpWXmWmeTv3MusV2KE2+uMnx/dYT2u00/hGs7clFTrUdYyZ9Asm3j+Z" "jeXp/XQTf6P8P0pdU0vDd4dk1wVmekaJ1fwNCf7W7kssOQm3pCM2ylVMzf8F+ShD6iYvLYgA" "AAAASUVORK5CYII=") index.append('folder_go') catalog['folder_go'] = folder_go #---------------------------------------------------------------------- folder_heart = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoRJ" "REFUOI1lkc9rFHcYxj/fmdnd7G6MSURESWOFVko0UhEpIoLgQbFCDy0KaoWe/C/MoRB6U8Gg" "CGoRPHiRtnjy5EVES9EgaGsai5Sgppsf62Rndr4z7/v2MLVo9j29vLzv53l5HseqsomJQPqa" "JyW0o6Y2WLTmp7PW4g/SbhcSuYnK6Mcn8n/ml5ann1ym2z0frQZIpXLKNgxdqozvqIERthb2" "pj//srPwfdnQkS/3923ZjIn21x88/H72yrV6L6DZOF0d31YjjqGTEDUaDB/9eg95TuAVnv6B" "A9aOb8dVq9/2ANS5EXKFhSUwheW3BFEIKtBugyp0EuhvYiK13g86cUbuIelAISACWQZFAaLg" "M0gTQCmksOj327se19eMjTkXABDfmw0rc5upDjTh5RxIAWogOaQZZF0Y2cTio8cstd/ejpyG" "n32078eKcw4M5NPXLJw7y5qRjdRHR2D2BSzFJaBWgbGtLD6Z5rebP/26kueTEWJd1Ney1xcR" "H0IwQOPkOO07c8xfvcbGwwepBg6SFN9f59n5C3Q+WZE4Sb76ptV6FTlPAKBFAzBWXtyn/fQR" "1IBD8FJvlH2t9KjxXUSDwXDvzZlXAJFpGBKExH89xy/+jWYJ63YfY/Dz4zgcWuT4VgqqVIar" "RANbmJn64n/TIwQcIev3nQGTMjoE37oF0gEEh8dI8a2UsDn5QWqR82Zmgn9zHVAwA0qQWQ6W" "Y5qWME1Xp06EVwUDrFQ3wcyDFWAe0y5IgkqMyUop8j7AMhTn/lMswHLQDNMMrItpF9NOeawp" "lJ6/ByikJp1lcBtwzgEhFgY4QgAcAeDAXGlZGq8CdP3dP6cO7EF74L31bkfs/rvRv+SNWoJL" "97oOAAAAAElFTkSuQmCC") index.append('folder_heart') catalog['folder_heart'] = folder_heart #---------------------------------------------------------------------- folder_image = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjxJ" "REFUOI19kj1oVEEUhb+ZN/sXshJDNv6gIGggBhsV/CmstLNSBCsJEpu0VopFOgvRwkJiGUwf" "EbQJamVjI6JGUgRdEpSYBDebTbK7783ca/Ge+UHWW8wdzsw5M+dwDR1qZGzqqrE8MbBfMaCQ" "LdulOu46CRirk3dunOzqr1QwxqFAIgZJmQQfc+/xm9GOAqjpqvRVGH30jGMDA1twZA3zs5+5" "f3sUUaWzAGCtY+DoEU6cPUdkI2yUw1pLLrKIgMh/BEQVAQqFIsVSN+hu/4oSRHGzL09/LJWH" "hoyxu47HXoMX+PBlkWWtpmhIE1j4+pPhi+BFcEaiwcMXJnLG7EjaGML0FKpgozw2KmQBZC1X" "RAHvBUfQFhIX2ovjhDgCuwdjyvggoLBUnfnH3lJ1BvQySRCcibEqMSHOo6JIc55k4xd3Ty3R" "fD/NxHUBqlkGgsSB9vl8E0zJB8FhKYpvEm+CxhskjTXKg8PkKwfYd7AHY0xqSzXtUZmFtyOR" "M+0QvNYdicWV+uk5fgsQUEURupNvzM28IvgNJKyjfh2VJvn+m/yYW+Hh8xc1gWuOWFVDC9n8" "hIY6GhqoX6VXa+ztrYNfzfA1NGxQOuRwxUWZHh+uADiNURWPJMuor6eX/Wq2r6F+LSOnAqoe" "2tuBOtqihoD63xkxe3FLrLFNllZq0+8UiLWWbK50xY182WjZquZAyqB9aGgDMWrTbmzAN5uq" "iW79wWm79eD70ytnVLmEMeVOo50NKJh3sQky+Rf6A/2ZWDwCKjJ5AAAAAElFTkSuQmCC") index.append('folder_image') catalog['folder_image'] = folder_image #---------------------------------------------------------------------- folder_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmFJ" "REFUOI2Nkj1oVEEQx3/73stdEriYb9FooxBi1BCRBEFUFBEtFBTBQtRCCQQL7RXtFCwEG5NC" "QbDRwk5QRFTERkGQSPQUNJoYk5Azd5f7fPt2dywuerGR22aWYX//2f/MKGo8chnv86r+q/HW" "zj16fnq0++z47VpZAJI3es6nXp+TKPdaZp4c+/X2yvr9AH4t8PubA9fbN/ddatm0UxWm3qBo" "a8By5ECXnghqEQjiscHmvoOeLY5T376Gsv3B6l39jSa/MFKTgNPme5T+tt3zUyivQKwpBeUi" "+ZnQD5IPt75rSPT2KuUtQ4Qw/3VKfqaH402rr/pNjW3OjOO5DHgJJNIk730qf/ycHQqU83vW" "7rhTp5QCqcAoRebD/XUL6VuPO7YdVaKfoOwsHx/nCQrzVhmbT05kTp+4N/kgwEoZp+Ph7AhW" "++A1oVSC0vQLunafVDo1QhCs4NNLQ+PGIdYPHLJfHu37efzi5AMAT2k8cRqrY4jzsIVJSnPP" "cHoO5U/jxztIPi+iVnSysmUMFUQxP2Dt3wbjUe9MCV0E0QWi3CKJnlO0bOkGoK51mP6ham9U" "0IxYFVQFIo+goZPmDWcAByIIDqenMZmniM0iJouYRcTmqV9zAUKpjhgtIraMK45VHtscYjK4" "KI3YLJjMUn4RsQWQEPSyHRGNiDO4aL5SyWYRk1m6p5cqL/4VEDEQLhMgdKKwiFlYAjPVb9ss" "YnJV2JUrNg3/WEhHxVSjzsUSShKeSB24BEg7YkNAI14lKs9iSiWRSMKqhbB8bWL08KAIe1Eq" "8d+dFkC90sq6u39SvwHJw2QArdqv4AAAAABJRU5ErkJggg==") index.append('folder_key') catalog['folder_key'] = folder_key #---------------------------------------------------------------------- folder_lightbulb = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn5J" "REFUOI110slrVFkUx/Hvefe9qnpVpVGSdsAKURSHEIfuRsGFbuJWF4IIbgQXus/GTdNu/BdE" "3ElQECNCQ69EaKEFhW66m0aNQxyiEZxTZdWb697joqJEE8/ycO/nHH73Ct+pv88dD9aMrDse" "VkvHSmW33mmnaqNZazvNVtxMrmVtfll/dOK5LHb5zuVTpdVrwwv1wZFDptZAgiri+ajr4pKP" "ZM9vEj2+Pt1JBvb7iwEDqzldbwwfCgZ+7DXUgABS4NWhtvUAlPqH7D8X9y0KVML4mN+3CSiA" "GvgVBAM4KKCb3Ccc2kw2tfzEooDnkj4Jyrh0Bgnq2NkIVNEixuvzcckdvPo6pNS/yb//+8//" "hUuGh0W8L0DaapowiUGfkTy4gYvLiAlwaRuvVOA3fEy4C9t6gy/ObB7ccz4QEVAApfPkD5IH" "E9R2HKSYvkRl1za8IENKg3z87QrhlpO0707Sev32to/VFJeXs1dnsbkBbykmWEKUBcjdPwmW" "bcdzitgKUijlVT8RP0yYvT3+csPYzd2+5HgArludm36L1r1/vw5l8tuUJtk49lcDwFdnDJ6h" "/fQh+YcXuCymf+dhlu04giC02orD4FyKcwFhtc6r8dEvlI8FwfDDnl9BLagDLPm7q2Aj4qbF" "VFYRlJbzoZnxqLWCFfN28SVXVbXkr8d776wK9CDVgmoZHk3P0IpmePc+Yu/oUaL/5wHkzvXi" "1950tajmoF3QnLKfMjIU42wbtR1qaxpMzd9AMxwicxO7oAW4DHUZaIq6FHURajvgEsCDr4Cu" "LduoCbISEQEMary5rwuCBwio9CJL2t8AaX5j6szobtwCfGF9PmP11ufWJ+zvLcLhacf9AAAA" "AElFTkSuQmCC") index.append('folder_lightbulb') catalog['folder_lightbulb'] = folder_lightbulb #---------------------------------------------------------------------- folder_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArpJ" "REFUOI3Fks1rVGcUxn/v3DtzZzJNnGg0k8EmkCBNHJJNEQnEDlFSEqQB7aKhRUSwgutSBAXj" "qpDYhV0UXbhw5ULwgyKiotikUCmpVQRLySJtxkxmxozJZJKbmfv1ni7Gz7/AszzneX4853Dg" "Q5cC+Ofmp09ijTt3KhV6ZyQ463PPVbXSr4Kw856rGbLmR/bg4JRvAihtdH+851JYKQVSN6MU" "fq3UWXx85rmoehfAiDSJ9r0XbYUH3wNXTAACqaFdyymcJ3ANCDWhVCPR1D5SuycjiAAaRAOC" "UvHk7C97Tr8BKJeQaJfAjSBa0NUsnl1k/cWvhKNtIB5oFxEf8GnsPhFR6A6AeoIQUe1XcTdA" "XBtvrUJj92GiW3penel1AqknMBNIoMy3AC+EGdtGoufoG6Gg0W4Ov3wPCVYRfxXxK0iwTnT7" "KXDqZ6kDXBEJauiNp3VxsIb4ZbS3ggSr4Jdf9StIYIM44PIWIC4i2kd7S1Ttl/w+M8/fcybN" "W9ooFZf5or/MpoYyl+9/wubWNCt37pKspsyhoaF4PYGjRRHg1pa4cuMvNmQH3xz6Ctu2WVjo" "4s7MbSxjE6MHj2CYMfL5PI8eWWYkcnf89Qor3kap4bfphab/8g3qy6/3cvHncf54kiOZbKO3" "t5dsHs7++BOFwiL9u9J8tneU+fn5YyEAcWqT/144cGv6xtVqQywGwGjsYc2xK4yNjTEwMMDI" "yAjDw8M49hr7jdtrAIlEwjIBuk8+OwfQ19d3vD9R+AFIjM90TXtSHpyYmAjH43EAbNvGE8M7" "82fXw+8yfJ7L5Wrq3RdPp9M9nZ2d1zKZTLK9vV2bprm5WCwyOzuLZVl0dHTQ2tqK7/vL2Ww2" "NDU1VXgPABiZTKY3Ho9fT6VSWy3LMkQkVCqVvlVK5VpaWq4DYcdxgsXFxSXbtg/8D3+zTWr1" "xW4AAAAAAElFTkSuQmCC") index.append('folder_link') catalog['folder_link'] = folder_link #---------------------------------------------------------------------- folder_magnify = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAj5J" "REFUOI3Fkj1PVEEUhp+5d3ZZFi/BgKjBD4QG0EhBNCZIZ2NjQmFDQ6GJv8AKE2NrYUxobEyM" "dhQWRhtiAQkhGmNi1PjRiGGDwErYvbuwez9m5ljsslDROs1Mzrzvc96TGfjfSx12OTd30y/U" "pxbzQdd4ZPNktcY3Ierr3Y47Dz7WAPRhgEJtavHM4MXx0cHjZLKaYpiwuRXys3J/Hm5cBfAO" "A+Q6+8ZH+o9RTjzWKxajfPpP9dAedI/vafSP12Of2oOREaUOsoR451fhVdXR1pYlrBqcQGyE" "nPYRv62l1Mr5Q6cnnmWUUiANM0phoq2BtjcrRHFKahXGSQOtIKpHLYCHlQiXEK89pvZ7ltrq" "c+qrL/F1ht4jlo1iiY6sIp/TdOYzrG+n6N0Cj25dmm4kSPDEJdgkizjB1VdJdzfZKS4w1tXH" "97WjvFsZxfOz1OMUFRaYOFFic+Ds7L3JYqzxyDlTJ6mBJLuk1QrB0DS57mF6UJxDAAcigPBl" "eYO19wvSf+FKsF4sPtWkHrq9l67h2y2h4HDJGqb8FrEhYkLEVBC7w/mxGf4sfTMflssmxc9r" "EhGxEa72uSG2VcSUcWkJsSGYcrNeQewuSMzAyZy9PjOfB9CSIOIMLv3b6GRDxJSb51Kzc6UF" "EDEQ7z+4JnaisIjZbhrL+7FtiJjqvtlFjTHNQUAipbS2lU+q2UBJ4IlkwAUgPYiNgQTxGrvy" "LKZeF0mllUFLHD1ceTJ5WYRrKBUc9rURQC0lyroXe6V/evBY1T0UoYkAAAAASUVORK5CYII=") index.append('folder_magnify') catalog['folder_magnify'] = folder_magnify #---------------------------------------------------------------------- folder_page = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk1J" "REFUOI19kb2L1FcUhp9z753fzGRxsjaJGGKpYVsRiyjBJlWaNIJgIakS8k+ki6BgZ2wUBfs0" "WpkEQj4NBJImiKybZndxV/zYcXfm93HveS1mFC3GF05z4DznPe8xFujqL9tqciZnB+D+xuMJ" "RTauu/X19ebmpN688Oel01NbBLj804a+PHWQR7uOAS7RFSdFuHH3GX/fXb+1vbl6Ji0ClCKe" "TsTqIxGC6LIznmY+OTzkxJFllqrw2e07u9+GRQAB0WCQoIpGFY1BFdh+NuXIfjh3/F2Wqv7X" "CwEAZtCLkAxSNAYpsPbE+HWtYWcqeimQ7t06+s9w38qK2ess8X0DhhHDvG/CXdCPWDBijAhI" "5vGjD09e75nZzDearb6zySx/w3CiQZUCJuFumBkSJIpqvO03D7+jtBHCCLN9/PzXIc6d/IAU" "IFjANcskOFDBMIEkkrUEeUtpK+Rib+03du79y/ll2LoKNg/UgDivAeBf/A5uJAIDz1PGa6t0" "Tzbwrmb/sbOkla8YLUWk8CoXCUKAB5eP0+RdTNESXSAN3+PAqfOAg4RwJg+v0z4HYXOIIYw0" "+hiAKowo6tpEK6nUtFvX5mYBnL1poM3QdNDlQt1mpk3L8vtPScDpb/7YGr1TDZNaJM/zYzVz" "4R2jfgdVg0oNvoeXMco7DA5+yv/ADxdPHABINC6jzIZVQC3yBrxGmqIyQWUX5TEqz2cLXlOi" "85Qnj/HcAwVQROqB95EvgTqkFqyFkCl1/SbA6+a/B1c+P/zqV2+TAPsR3O+/bL0A35s1RfVC" "hO4AAAAASUVORK5CYII=") index.append('folder_page') catalog['folder_page'] = folder_page #---------------------------------------------------------------------- folder_page_white = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgtJ" "REFUOI2FkztrlFEQhp/5vm/dS1xNxAvihRQWmlaMjYKFhW3+g7U/JF1IEQsL0c7ayjqFFqII" "ghDBCxJlDbtZN9n9LnPOa7GXJIVxYDgzh5nnvDNwjH/bVeACYJPcAE3iDvAdiMf0c6soisLd" "ddjzPNf6+voasAgkxwGW3V2j0UiDwUC9Xk+dTkfuruFwqI2NjTVg0f4DeOPuxBhxd4qiYGFh" "YVaQZdntYyUApGlKkiSkaUq9Xqff79Ptdg8gn17efN9sLy2ZHWaJzdfvOgBmRpqmTGMzw90P" "ABbT61fuPq2Z2WTHAjMW7dWladEUYmazfAYgKCeW9eLXBqFMITmFWZsknT8yyvT1w6CxgpIk" "hgIvaiiKqveR4c/PtLc7fNuaQwrISyCStOZBgfT0GS4/eD5RkNBQyKlGhsp9qj1x7s4qC9lF" "WnMnkXREBcDXFyuHRqgSsuZ55m88BCJIiEix9YhhVgOFI8ttXnuCJNx9DwgZpaSQE4cfUOij" "MEC+S+EtqlFOgo/BBGIMlN1tBjs/1Gg07gGdTCVSdGL1G3l/DPFdWk2Duo0VyUEVihWtdo1m" "I3Hg7XiEIsoIyLvId8ce+hBHE9gAhT8o7KOYg3KoZp+KjFK9arjTKgcn2qZ2ItUgtkFnUSiA" "EiXj05KA5wOpCsUMoCJf/fJ4ZVniPmZtjjMBtllaiM+mV38BrDc9yBrlFo4AAAAASUVORK5C" "YII=") index.append('folder_page_white') catalog['folder_page_white'] = folder_page_white #---------------------------------------------------------------------- folder_palette = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAshJ" "REFUOI2Fkk1oXGUUhp/vu/dOZpzMT7VJ06ptY2kJE7XQQEcoriq6cFO7qBUES3EnuCqIghTc" "6c6NCuIPulRqFyoIKqhBW3+bFJxMZawZpzRJJ03u3Pm595v7fcdF1CgEfeFw4MB54OV9Ff+j" "p49X909OjD01Vh49KqT2Rtj9dPHa2hsvn79YA1D/9fzCqaOn992+4/kDU/v27tglIEXaywOa" "vy5cn28uv9j6MXxlS8DZs+jxzrF3pneXT1Z2Z7xb77J4t9VxJkvYehyXCWjUvrfnv/jupLcV" "4Pi9D79+5FD1iUOTWufkZ9Kwgypn6Rl4a22eK7bO4WJV95OwqLcC7CqNPjZ1+XfSD66RuhJu" "ZC+d1gma9Wk8LWAGBHHEeClb8Rc+nLmUK1QqSm2y5r70AhmCy/j0Cg+xULvQKeXmAtlZyb2/" "WCVvDY+W62go+Mp5U3fe/3aglAIBEC599STtB6uMBo5o/SbLq1dGQ3yV3z7NgCJauqAcIL6P" "lRhnRpKlV7HGA13E35bnpx8uELiYew7OcPeBIzrwNNmowTOrF9mz8w6iIEejvfaRrwxanMGa" "DOIEN2gyU+nSW1klXVkibtQI/rQWAwfzQGeer1uT3372Te1ZH03WpQN611dIlhs408cbKbHn" "2JsoFK1f5sjaPrkgS2qHJDpP5/MzvDd7+cS5T+qLPkONnxtn7L7nAAciiItIO7O4+CqlbI/V" "pXW6doioPtv2nwHg3Me1RQAfIyI2xvXnERsiNsLFv4E4xMVk9ICJCYPYLmL75Mol2v+I3BeD" "iEtxwxtIGm5AXAKSgiSI6yO2h0sjxEag/l1en8SJwiLpTSRd3xgbbsLSCLEdxPYQF+OSJiIS" "bwKMrA377VtMlCkoKWiRAFwBZDtiE8AgemMrbUkHA5GhJJsWkvilq689cliEB1CqsFW1/5YA" "atYo69796/QH5od9LaYWM+AAAAAASUVORK5CYII=") index.append('folder_palette') catalog['folder_palette'] = folder_palette #---------------------------------------------------------------------- folder_picture = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmFJ" "REFUOI19kj9oXXUUxz/n5iYvLy/vRdS0qKiTErqICBIUddCxi5MUHcRF0MnBoW6ik+iiguKi" "pZtdHZylTnUIJYUgaEiQqmnN+3/fvb8/5+vwGpsOzwOHczh/PnD+GAvk4uc/ftbrrL1+XLFa" "mGEFG8oMT/JmTl1X35aLAN31tTfeOr+12el07VR448SZNJEvv995cyFgVFmr0+na3s0RVw/e" "Z6N3mypEDo8e4LmHP2Z76xGKorCFADP1EpDcWV8/or18P06Drxzwd7/C5RjqLQRINpLYGFeB" "fl2TNWUSG46rmj4NyBCMyr0fntlpd8+dMytOt/PNjWZJgnHtHNx8Am/tMokVg/7jPHm29V9l" "ab609egL3y2bGWjejBl592fcYTDLPHX2Ik8fvMeNXw8ZvPQpKSYEGNYryarx0Gr++ooclqDo" "YdYFncEQ1/94lxgj10IgPLRM2H2NGCMXnr+GBKUFCnkghxXkwmeHzG7tc94q/rm8zzunF7ME" "tEtol5QWkRiWFKx6mjH984jp77+gFLGyxdaFS6QkmiaCgTsUBVjZYXblZb64sjOcTKtLJbGg" "bJ9hc/sDNrd9vsI8Io1+wpt9IKI4QXmKvGL1sQ/5Dfjo7RfvAygJknKNV9dRHpKrPVAEOfIa" "M6E8QHmCcgXye85dKiB5wuMtlIZgJcoTUAI1SAXKUzyNUR6D2b0AGpeRUTpGaTDXPERpeMeO" "UR7dGaHGm0Mk1XcBQf1Y3V4L45WuqVtIy+Bd0IMoN0BAxdxakUmzmRTV3B2hqT/Z//rVZyVe" "mT/A/4gAuxos++WT0L+pTW5TrdE9fAAAAABJRU5ErkJggg==") index.append('folder_picture') catalog['folder_picture'] = folder_picture #---------------------------------------------------------------------- folder_star = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoFJ" "REFUOI2V0s1LVFEcxvHvuffOqDm30Xwvi7JXXEVFFGgtiiKiRZug2rTqD4hW0aad9A9YroKI" "IAh6sUVQi0AqekcrzF4sFzPqqKMzzcu995zzazGpFS7swOHAOfw+nAceWMYavpvc8O3hFnne" "V9P+75uzHEBZeZFoOYEKeP9fwI/+ZP3nB/45v+1kY137fpo3HU6+6V1xfvBGsn4BX2pw5F4y" "whHX8epUovE4fms3rmSJQofsj8cUMo/RpbwtjltxlwJOd7tlr7brUGPHGerbu0CPE80M4MYS" "JFp2YGllOl1SU+n0RW+4f+e7Gr+zU6k/0wi51IuJqU/3W/ymTejcEKKL6NmnOA3HSH14wsy3" "t6eO9kQ3PWXdbWu7r8WUUiCVYZRCl6dahm/vs7mxZ05t/Trc2k5M4Qu51BD59MfBIz3RTQAP" "I2VsWBWM92JCF5yVKOVTvfoAtQ3rHSfmo91msiOPaOjYSzw+iouzef6vngpxxIaYMI5YwZbG" "KGVGyby+jk5NM/311kKw1KePALSt2loDLysADtVWlyikJwkmvmLDIm5VkvajV5kcukU8uZHk" "mu0gAkAhm2HiztkF1CNy8GqaadpzAbAggtg80dwAfl0Or2qQaPI5YgqILZJYd4kJ4NVZYrv6" "iDxCETFlbHEQMXOIyWPL30EsbswiuoDYn4j5iZgiiAVgVx8RgCchIlZjowyi5yqIDUA0SIDY" "ImIKWJ1HTB7U393zCKwoDKJnED1b2WZuEdN5xOR+RyhjgzFEpLwIhJKNilMrwnzcV+I7IjGw" "PkgjYgIgRJzKqRyDLpVEIgkWAAnKl0evHN8twkGU8peq9h8FBTUQKmOvz1/9AoJdXFtUqnkU" "AAAAAElFTkSuQmCC") index.append('folder_star') catalog['folder_star'] = folder_star #---------------------------------------------------------------------- folder_table = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjhJ" "REFUOI11kk1IlGEQx3/P67vpGtvBrw7VITpUEl4yMcibh06GVIeiW3TsHhLRpUt0r2NmEB0U" "+qBLlwghQ4LQDoGZ4sFcFdNdd/d9n/eZmQ5bmrAODDPMwG/+zIyjgY193Lin5m6p6VFVpZoG" "0kwIon9dkGCI6HTcCCBmt6/0FToa9f63+y/nehoCVK0D4NXPUYIGSkmZalYjk0DQQJDAnfMP" "yDJtbqxADYDr3Tf3nV5JAlkQGgNEAXgxubovYKi3DR+E+Pvbs1/zhe5u56Kd5uuK7uTXLnQx" "PlXkcv/hPYD1UlJX4LTp1LGBpznnHBiAkb1bQc2Im2D80yo4GJ8qEkcOzMjFcPpIKz4TYsQS" "1DenK48R3wTRIUQGMSBucgz3dTZU8GO5RAhK7DyRqUf8AUwNrS1xMJmnPD3BmdnnzE1DDzD3" "Ze8OdOg9hhIT0aKhRuXXKmlxHvVVLuYWaT/3iLbeG4j3ZKJY/TBELe2sjQ4A0BKjMVlEnO+i" "s38EUDBjZqHI8rcPZFmKqJJ6j0iKaUau/RIngJFns2yWam9ivJlJglZnMNnCpMzJ/CK0KKYJ" "aA3TbUy2MamSP36V+c8wcXfAAcTmMdOAZmtY2KpDNAULYCmmVUwqaChjUgbn9uwiJlVzCBY2" "sLBZd9nahYUyJiVMKpgmaLqEmSW7AG+/s+p6qy8fKDgrRGY50AJYByYp4LGoHl0khFrNLLN0" "B2Bp8nDhyXCfGYM4V9j3d+s/Bm7SO9Gxf6U/djFz3o9mgMYAAAAASUVORK5CYII=") index.append('folder_table') catalog['folder_table'] = folder_table #---------------------------------------------------------------------- folder_user = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn9J" "REFUOI19kUtIVGEYhp//zDnjnBmZzPKaBo1pkGSgTUibaBFFN4KCoE2bCIKgti2iXUS7FmE3" "ahHYIoqi6IJEoFaUUUkQlVZg2UVSScczcy7//7WwqRCmd/nx3ng/xX9waENHXWOle6M84Wa1" "NhiQmBu/vf/MnS1FTqyU+OhRrAUzmbvphNupRdAiaCMq9MOWbFP1p943oy8ArFIGVa+XJyvc" "1Bo3PY/MsiXUN9RgjGCMoSLpni/y7FIGejoIa1tSpn3rLqvKyQGQlwTT2qGv+6xf5JVscPDu" "UDC/KjWdxCNQZSgnCUBhZECamuuDPw3e3Orw3HSrq9S/XsLY2Ppo36kVLy+m+lc1Ls6QVw6O" "Cvg8+kO637d1F5nq3c3VsnTzY5RSILNiz9ccOPGETNMyslmfgXuXUSqBE0/TsGoPl073RD2D" "I7v1071X1NtrWdO8rVcF37rQQQysNMe6Q/KVm6hYvYjhHGj9t5stsBDh+eUH/quhwR02oUJM" "gA7iiBFmPjxkT3oQonPwqNRCcG7n9bKTz45ctZUlykR5pj4ME06MYsIC81u387P98ByJAFDu" "wNSFTr7G62hcuTZuE1rYbjW1644DBkTQUUBs8g7fvAJaNHkdw4sg0iGNNR0oIBp4kZ+M90c2" "oSC6QPD9wp8UMJQZTZJypk0cZRSOGLQJsfHRgG5rb8hs7Juw8UFMBAoQmW1hQiwJqbF/Uq08" "ROUQK4cwTsJt5yNwZaOaALAJBIWeFYsGCRDjgykgkke0h+gcEk0h2psN+Ae2BIbIG8dEDogF" "EkPEAVOGmBRIiEgAKgArQhcKcwzy/pf3XdtrEGUpC1X6cb8nUvdBy3jx9As0kzdT8NGq/QAA" "AABJRU5ErkJggg==") index.append('folder_user') catalog['folder_user'] = folder_user #---------------------------------------------------------------------- folder_wrench = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAntJ" "REFUOI2Nks1rVGcUh5/35s41d+JkDDGWcdCC1o9aF4WgnS7cha6soH9CN1kpBXcGGlpQ0EV2" "YtNFCC12K4grdwahRFOI7aI10agNZtRRcyfzed/7nvd0ESXaRc3ZHDiH33M+DZu0qampb1T1" "gogMqOrk6OjoGYBgM+Lp6emyiPwwMjLyUaVSiUSk9DYXbgZgrf2yXC6Xc7kcMzMziYiEExMT" "v6rqi00BVNWICEmSICI159xXw8PD+dnZWf9BwPj4eGCt/bZUKuGco1Kp7IvjmGazSZZltfDv" "G8PzceHQIWPeXYeSNpeWb9rJa92s9/S2sBrl83lWVlao1WpYa1leXn6qqt+Fxvcc3HVsOmeM" "AV0XYwx3/nq+Z+3P9Oynu/uYW4C1+UcUO7/JzoE0qa5Wfw6CvRfHxsaem/vXjiT7vp4p2mdX" "ENsDQT+/V/dza2knn+/tJ5eDWt1xa/4lP50uYUyfXbh+bPHAqTuHAUJjCdRbxEaoV+4+KXDv" "cYfjwXn65u4BsAf4IoIHkwBEBj7bOGNAr3cdWtUXtJbm6Glu58TWVYonrqLe0Ghb4giG+kNA" "CaIii5ePsgHIAsJ4B0OVcwxVPIMdz9aoycLD27xKmnw88Ixib410rYX6Nr27v3/vSiFWVaWL" "b/+BSh1JFrG5LlmnwGDcZTCuoy5BpYlKG9S/D1CLqnf4rIa6OvEWg7qUTwZboClogEoL7xqo" "NMCY/3SQejUI6l6vV3IJKnXU1d/4BiprqLRQ38Wn/6Cq3XdHWM3aL/O2ERWMFgLVHPgC6HZU" "UsCiwbo3geA6HdVM040R0u6lRz+ePKrKCMYU/vevFTC3rRH/y9vQvyU0YeaYnRUgAAAAAElF" "TkSuQmCC") index.append('folder_wrench') catalog['folder_wrench'] = folder_wrench #---------------------------------------------------------------------- font = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeBJ" "REFUOI3VkMtrE1EYxc+9czMzTicZ2jRBC5LaWluDQnwWEalSBBcuusmiSBfFooibLt25EKwr" "/wAFoVAQdOXGTQRxoxRrtDZY8EHR0hppkoY4ifO4D1cRrY5b8WzP+X6c8wH/WiTKGJlZPsk0" "cjqmUSfkKuShIgTK8mthndQb157eOe4CRLEogBRIDmWs8T1pY5eUElwAa5WALwbNQsM1BUAU" "AEQC/DCY39iMvTcouqGkJgWhxVJjlpQr0y9mT3ntHI0C6L52bkenfqK04hVevWne77I0kzdD" "8uSn48gGh6df9w32WZdrm365uurepYrsC0IJgNpbs781yOfvaQmH3TAYUsuLjRlw+VB4whRC" "wYqz/dl8Sf8rYKV7YHxgp3n2c5W/FZ4oiybvjelkOwHg2KxX+HUjckJuspjam7VvdnWwbZ/W" "A2rabEpJpdmdRr9BKTRCDOl6CQBf/wBQJJFcup5JG6nCoy+35m8fudh2jp5feNDyOgaZRnQE" "6pcGFAAOXViwchPPR4dzztS7Va/aqvlz7cDQaCFZX2sV3ZaArhNwjRwErv6YzgCAUTqXPRAf" "26gE8L4JIrkay4w8XooJ0UMt40rP7viZ9XIALhWctHUpc2z4w8dneLn1f/+pvgO2br65Mjwr" "NwAAAABJRU5ErkJggg==") index.append('font') catalog['font'] = font #---------------------------------------------------------------------- font_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlJJ" "REFUOI3Fkk9IFGEYxp9vZnZndth1/bemYrhpmyZtbmWblGWxCB5CAvEg0UGIAi0QunjpZKR1" "iS4eDApBEOpQXYJcQUKKLBPNNSMjDxZt7a6O6846szPffJ2Erdjw1nt9nufHw/u+wP8ekkto" "Hlg6LfCkxcZzbsNkhmkwQsBkfc1QiJLsf3X/RAogTMgFsCiKaivlzn0l4h7LsmBS4Fs8Y85n" "1HAyJVGAMADICdCNzHRs3fZZ5FAMZvEWJdxsJDlCovHedyNntG0flwtg1/nzZQX2k5EVLTz3" "QX1UKPOSqRrkRVY4Z4OG3vdVNVVyz9q6Hk2spsY4Rg5kDAsA5/zT+1eDjo6HfJ5bGBQFeJbm" "kwMwrWdUoxKlDLJL8Nd1ROz/BKwU+zp9u6Wz3xPmJ6rRKFVNr81OSgkAt1PwUl0Rs/2/nTHQ" "NevxH3YtVhSLnrnldESJpleYxXhngVjd4JupUdVJ6IaCpLqxuZ5K3H5+a+FG1g4YyStauFlZ" "InrCEz+Gp+8dvbyttF/v/+hwfUFTMIiKQh8mF5+4Xkem+oM9ZfkcABy5NCMHLrwNHQu4Ly6v" "aon0mj66Ha4NhYscjqnqQG09KEdRX9YCSgw0+o8DYD0cAAgcN+o/5B6PxTPQtiixTHausnky" "f2/TRB0nS3cUNSbYiBNt+68CAK6FhlFdchAERMr5ytnTeKV8q72tVTJhoa/lAQbHuyDxIsYe" "P9X4nQDKG5yOzUzslHeXF/H0V2yoP/FyfgpJRb+7owYAEOwuHQQh3QRwMWATjA29GYr2/QK6" "3e/L1gvQ8QAAAABJRU5ErkJggg==") index.append('font_add') catalog['font_add'] = font_add #---------------------------------------------------------------------- font_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk1J" "REFUOI3FkttLVFEYxdfe+8yc00mdvIyNocxomINl2EWCLCwqqOjBF4uhgorIqBfryYcegkSl" "P6CgoBCEoN6CghyhixBIKV7GC5kNZOqIzjhNcztzzt67J2kqJnxrvX7r+7H41gf8b5Fcg6au" "qUMKI8dsjDpMS5qWKQmB1I2IGSXR2J33jxrjAJFKLoDgKPa6dd+2UrVSCAGLA/MrGWs0k/DH" "4hoHiASAnADDzAwur9o+qxQlkIIJTuhwINZDQittQz2H02s+mgtgN9jZskL7wUAw7R+ZTDwr" "0plmJUzyNms5Z4K9bWNVNVX69ciqEQrPxZ9QSXZkTAGA5v3p/StBS8tTVuBQulUFzqnRWBcs" "8ZKnuca5hJ6v1NW2BOz/BARLqn3VFdqpxbD1iad5iCcsj81OXASAI0/xcCOqZvt/q7H+4rCz" "bnf+RHmJ6hyZSQaioWRQCsnyCtWt5zc8rykafSy11SAEld8k5L3j/aI76waSFBSPd7pLVae/" "f+nB4MOG1rVJ57lrEztdY/BeukrUyu1IjfVVTA70dfjldEIBgD1XPuo89WH/vvrNl2fm0uFk" "xOhdW/Ye8Rd7F0+X1fhuQZt9A7zrgO7YBI/bzYam5Q0FABRKe2t35Tcvr2SQTnEiLNnsbno9" "buN8C9XV9oJEvFBzVQInb/6q73YZmCSenK+crVdH2Vyj70L5xq8vYKRCSAL4EWOYmsU8Ww+g" "tcHliCwtHKB2Rk2WwPewxJcFyrkl764rAQAMnKloT4YXWqkgbkHlvIC8f6JfdP4E3IP5xdFz" "96UAAAAASUVORK5CYII=") index.append('font_delete') catalog['font_delete'] = font_delete #---------------------------------------------------------------------- font_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlFJ" "REFUOI3FkktIVHEUxr//vXfuTEPOmM74qLHREc3SEc3KyMQibNXCjYW0kCBr0ca2EUgI6b5F" "UVBIQlD7Fo4UgkrWJGqWlQOW00MZx8c4o/fe/6tNRuZYy77l4Xy/czjfAf63SLpiQ9fUCU0l" "jTZVcVMmKaOSEEinuUiXyXKic/h+XRIgEgC0dADBkV3md7aU5tiLhBBgHPi6YLFxKxVKJB18" "w7wtwKTWSGzJFrEr8EAKVXCijE4mesjcQvvrnpPG771KOoBuqufzd+n1kzNGaOxd6kmWU3Ww" "FCUDf5jTbnCofSKwL+C8srhkzsWjyUeKJBUWFQCUnemGbdqgufmx6nJr3XYN3qnxRBeYeMoN" "7uBcorLm6tm2B9Xyr4AZT0lLSYHjzPc4+8gNPsdTrNCmkzwCwOJM9Xn249ydsk2QXzFWXRj1" "Bg9mvPV57N6x6bXJ0uK2Cs6YpJKBck52ZxWj0nccLz89w/iXFyzUPq+DQP68gSSu7Dc3/Tl2" "b6h//u7IvcOXAw9rZWOwlXApwAWHgMS3lSiCvjokrXVtqXvACktT12ouhZ18/dWx2qrci9NR" "I762aPYCgMEscCnwOT4NKhiYoKCcImGuoqqgHkm6pi13DBqKpii9wWp3X2zBgrHOiWCyyd/w" "PNNgBhhnyHXtRZ7Lj3x3ADZ1B7wZezAaHcJQZPC9sYrMtK8MAE23i7hhWbCEBZNZKPaUK0cD" "pxGeHUb/h74JfQVHIrdgbuffovJOEmvtOSX91xA+0AF9Swr/UuF1xIRUPbMat+EG2Eb9ByEe" "FvL3EUo2AAAAAElFTkSuQmCC") index.append('font_go') catalog['font_go'] = font_go #---------------------------------------------------------------------- group = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArdJ" "REFUOI2NkktME2EUhc//z/Q9HbVgAxW0FAygPMUgkLpo0KjRBI08Fi6AxGBgoQt15VJ3xsjC" "DXGFSDAhGmOUGCQYJdFEAsTSoJVaCyLU8izQznQ6nXFhQEWC3vU5X8499xL8Y65V2xrrKk2t" "Fj7KS5JGfjVC7/X06Zu7x8YkAGC2Ml88bqtsqdF1mw1RPSEqWDZBM9Pk4jil/NPBxecAQLcC" "FFqlKp0piRLLKexwXAHROQDCwpmP+jXNloBYRIpTxw2YzMXQ6JNhTj0HNacNoTl+6b8AfeIx" "78Jor0o4K6jODMrbwIR9GBjnh9c07O+GJldWY6E9vTUhg2cplUfFj+/7PFa51vhWE2Z5sETG" "5+lFPNTOGQouF5jct9wRsmaudzoqS7MyeuNx5Y9U/MECRIw7EY3HEBVFHDhRCE/Ij67+++06" "utKyfoWGcnuHnrfuSd29C4fK92F5RYAYFYHwLIynU8CkxcHY4/guB7HXkgmNlisKusOW9RVY" "NTzjqq2DVbsIo8mEdLsNYYMdA903EVRkSKoCSVEhIobh8BDC01F05tua1+O+jJS8kKYG/yps" "0pAEDSHQEAqO0cLKcIjPEsRiEvQa5VeJj2ecSa4xn1y9obAOtx1lGV/BsgmoKpCQE/AGvgXK" "Jo+0CxWfxn+WWPHg/JnyrNuXrpZwb14/grAqQVyNIbusDt5387jTOdAuSMstGLoQ3XhqJuNk" "W83R/OS2+qbDpkGBIGDMxTyXh3lTEfxBFnk5PHiFKRJDQ5aFL/3PNgKI+3qJLOU2MF1MNeYM" "KYCoQhYAKaZCFCggK6jheuAU7sLR8oRsBFCO50IBrx/TIxPQUYDqCBgDgd5CsS0dMEYm4PN4" "oNcom34rm9iefdawFHD5P4yXJpaZKjOvA0AARYGiyJga9gWc+33tAmse3wzwAyU+FElkqAp6" "AAAAAElFTkSuQmCC") index.append('group') catalog['group'] = group #---------------------------------------------------------------------- group_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxNJ" "REFUOI2Nkl1sU3UYh5///5z29PMMCgxX2Og+iKihYwzQYQnOJgLRyCICMUZxgWjgwqh4YeKt" "Go0xwQuX4B1+RMxiIg4WMxfIGCq6OKQlY5NtbGRfltr2rGt31q/jhdnUm+l7/XuevG/en+A/" "5s2n/a2Hw+5TPj2r53K2Qs81+Ulnt+N4+8BADkBZDn55rz984qDW7nVmHUJYqGpR1q4vNOSl" "1M/3Jb8FkMsJ6stz+zX3Kil8T7Cy5nWEVgNCJbSZI4uZZQULmVxe1ryF29uAzbEab8WzWJtO" "E4vrqf8l6Db3DCWiXZbwlCM1L1L3oxjD9N7S+xcz6j+BF5vrWusDlaeKBXRVykLUHLzefaO8" "cMj1o81QdVRRYGQqyVf2uDN4MuiOfBDJiEX4SKgmvKOuuiufL/1rK31bkIxrDdn8AlnTZOu+" "em7ERvni4mdnNJk+sfSFF5oCnzr08g0VVet4sOl+ZtPzmFkTjLu4Wu5BWZ9HCeT5vTDDRl8t" "Nrtny0zE8C2doFrGdPOhw5Tbk7jcbioDfgxngN7295kpFchZJXIlC5MF+o1fMKayfL7Zf3xJ" "cCnT+N2jE30HRHCnkHaJVMtQ4sPcca7CLQSpiTTG5CzZ+QxzZhqzpOBYq/1dpCHvS49tKovv" "3uiYVoykQT41ycjtSd65uhq7NkaZXRJqfIjw9r3kbHGmUwNcHL/b+Zdg59ljLbu2vP3ka0ed" "HWNz/GSsoDemw/ZXWWmrJ5E4WwyHdklLgd3Vz/D97XNUra2iJ3K9Uq1+/PTBbXWeD5871uC6" "koDxwFMsZMGcgzsj8HDDOm52xhWb8LDvvqMAnAx/TEe0DcE3DuXy89ORpsaAdj6xgYmsh2LS" "opiEYtpifk4wOlkiNf0evgqVy6NfE6pt4d2uVtLzfxAdHDSlR/fExoZGmbo2jiZBagLFKXD4" "JGWV4MqMUymCXI38gB2VjmgbdqFy5dceQHykFlfce8CZGmsevXlrR3FW2e/VNUBAqUSpVGCi" "f3jslQfWnOmL/bb1y3MXHhFc8FqQxrLafm6beeNPtq4yC+MkvkEAAAAASUVORK5CYII=") index.append('group_add') catalog['group_add'] = group_add #---------------------------------------------------------------------- group_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxNJ" "REFUOI2Nkl1MW3UYxn/nf07px2lPtxYbKGOUrmT4MbBCtoEkBknUqcvUuZFozLaEaMaFmqlX" "xsQLsxtjnDeaeTenwYQ4o1EzN+IXy0QXmMJEyCgDwte62nIobU+/zvHCgHqDvtfP88v7vs8j" "8R/z6pPBY91d6imfltUKBVvp+6vig68GHMf7x8cLAPJm5ucfCnb1HrL3e5xZhyRZKEpZ7NhW" "ihaF0L64kjoPIDYDNAcKB+yqX0i+R9kafhnJHgZJoWMXR9Y1mwLymUJRhN9A9USxOSrxVD+N" "1XiaeEJb+V+AAePByeTYBUtyBxB2D0ILIutTDF7XRtY1yj8Nz3ZGjjWHak+VS2iKEKUxY+LX" "gWuB0mHXjzZd0VCkErHFFJ9UJJxNLzWpo2+NZqR185GOcNfuSP2FYtH811ZaaxMZ121ki3my" "hsE9+5q5Fp+m75sPz9hFuncjhaNtobMOLVBXvb2GPW13sJrOYWQN0G/heqwKeVsROVTkZmmZ" "Bt8ObBXuu5dHdd/GCYqlL3Ue7iZQkcKlqtSGgujOEIP9b7JslihYJgXTwiDPiD6Mvpjlo13B" "4xuAbzMtF++fv3JQamqXRIVAKF7kxBRzTj+qJFE1NIH/8jBiKU7GqzIeDONorvm7SJOe5x5o" "9Cbua3AsyXpKp7iyQOzGAieHKokmf6LlZpqW/T00PPUi2yu9qLMxKxmbO/vXE9s/7nm8LfL2" "C6+0uC//cI7cWgFjLc/Ovd1M/vwHrZ/eld5/4jWPM/YdLFwC7xYSSh3DXw/eUOofOX2oNeJ+" "55meqOtSEmZDT5DPgrEGczG4N1qD/1zG46iqh4dPbKSjvF6NbEkh5bO97/cVbj8q903ESTir" "wLAo58DKW+RygosJk4hnK9lfvkT9vJd8bpkskF6VKcssCrfmjs9MTrN4dRa7AGGXkJ0SDp/A" "WwuuzCy3Au38NjTIkuFkVbaRSkpMzUtly7LeVcpbdh50rsx0Tv9+fXd5VT7g0eyABKaJaZaY" "H5ma6bjTf0YY9sax4dgeYUp1phALJuZ7+wbMk38ChvAxzDaOo/MAAAAASUVORK5CYII=") index.append('group_delete') catalog['group_delete'] = group_delete #---------------------------------------------------------------------- group_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuNJ" "REFUOI2NkltIUwEcxr9zmTvb2Y7z0syltk1JJ5mYaHmrREvD0iIvDz6oEIIRRWFPPdpbRL6Z" "hg8VlGBEDyJRgmhgl5lmljnnFS/Lac7j5nY8O/P0EIqCWP/n7/v9/3z/j8A/5m6poaYij20M" "5bycKCqknkHyaWcXU9c+MiICALWf+UahIe9ambJdq/IyBCGDpgNkbJSU4idJrsPqegMA5H6A" "ZL1YomTDSCL0AkLM9SCUZoCgkZ2Eqi3NvoCNddFPmu+B1aZAwYRDG1kJOaEZzmVu9b8AXUKB" "bWX4rUxo9CCVWpCcARQ/jvd2bmBLQ+w01ObG1SQboxsDEjiaJKVhwTmUYDx1rDydUUg0BwJz" "8HjcoDRJWF/uAYT5qu0Qq7LNealmY7vfLzOyDAQ2ZTKcVBu4I5HUkD8MK347THo9QkwXYTh+" "How6Ag7bRNY2oDrD+Izh9IcjYw7hREYi1tw+CF4B4JdgLBCRYzZBZzgJ98IoKNELNRcBl2OK" "obcAtMw7cssroA9yQc2yiDYawKuM+N7VgDRtDHSmc9hwtCFITWDm6yjcgogQkae2Q+xeT30n" "zll3BYblLqQXnoEutgjCwmMQChcUGi02hRk892yADdrE9gWvHdlhuSPjUqn6g4KnOXj4Megs" "UQiOK4Yw3wRSIUFcM2G+9yPur3odB6ayWnyZY/a/X8hsu3o5I+7hzTupmr7eV1Av9SPf7Ifl" "dDHExScgKBECHwVn72dfQPQkWm59mt5aTJmKmsvOJoU3V9XmsFYfgfW5IVwyOBEgIhFwvwTD" "yvCtRmG2u99HS/zRhNvWqZ2vJ741pEqipZp6QZViWXUQRUP5KKtrha2tHgvTfVDGJGPjt4CY" "YBXirnfu6g0AkBpO45y2TWJhcAZKEhidWIL4owOm5BywbDxmBsZhdaVDrdy7tHRAF39FtTqd" "O/nTnh5Yo0pWbIt48KgJaRYjZqlYtPwqm6vUfmn10Vr7XoA/KwYW4QUt5wwAAAAASUVORK5C" "YII=") index.append('group_edit') catalog['group_edit'] = group_edit #---------------------------------------------------------------------- group_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxdJ" "REFUOI2NkV1oU2ccxp/zno+c5OQcYz3LmpPWxLSxtRrbUHR0tJuhyMSNKfiFOOysIjqGDN3Y" "xa4G26XgjRdlsAuHUCiT4cQNLUrdhdTauCUu1dmGMkIiWWyauHz05Jz33YVY9abzf/08P3h+" "fw7/c1/tNY4cGFTONWlVzTRFa+IeuXB1XD45lkqZAMCvVD61wxj8ZJ9jTHVWZY5jEASbtLVY" "0QYh2pWp4q8AQFYCdHvNXQ5lDeGaPsDq0OfgHCGAE9AfwdDzzIqApYrZIKFvoKhRiLIO1XcI" "rHME+YK2+FqA8fp7DxeS1xjn9oI4VBDNAF+axW+PtPjzjPBy4Xis/Uh3sPWcbUETCLGS9Qd/" "jN/3Wvtdt8WSoEHgLMxli/hRKjg3n9msJM4mKssSh/pDg72h4FijwWTGAJsyohOXoa338XlZ" "gujM4dIcD3dsC7xt/nAyE/e3xqRry4CP+4I/yJo34Fvrx1t9XSg/raFerUOoFtC9hcPa0E5Q" "JYn7fBHhpjaIkrvncaLUtDxBYKVcbP8BeKUiXIqC1qCBkjOIucnzaPZth+aLwkiNIiUSxK1p" "lLJVXIwYJ5cl3qz0XjczU68I44oJeHQJqu6BXb6Mlk3DiD55CvsfYGnJhCzSF1/4Kde/5kaq" "YVVmbyP7VxLl9DTy2d/hjxwC6nHcuXARbk8NnkIB5oNk3p8Kf10T1I+eOXh79NjugZ5vPzx9" "1Pnz/L+YLHmQXqygJ+CGHlgFWr2H7J85+DqcUAMHYaQn/g6r6eGeT3+5y697f2Tf9og+MnR8" "QJmqcZh3bcCi0ol3a6No39QHnsbBrAUYXToYrUJyOQAx8kY5c7f+/Xhugr91OJfo6w06riwE" "kKm6YRcZNuYvY9s6HquNBmh9FgDD9KWHMLp0gFagNPciM3V94/A7+lX+i93rT8zkZPVOpgWu" "QAsY4bDj8ZfoiH0GIvDgxFYQuRP+6ACI3AlOaoOghCGp7Up+5sabgu3p2ONcnI+lZx5ttcv8" "LlVzwFZKmPzuIBhloA2LCZxpM5tSxpjNKAWjDKAUoKz5Pw4FMaMVIkTlAAAAAElFTkSuQmCC") index.append('group_error') catalog['group_error'] = group_error #---------------------------------------------------------------------- group_gear = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxZJ" "REFUOI2Nkk1MHHUYxp/57+zO7g4z27JkKLNL3Q4sUJEihVpbSWRDYmtqwqFfGmOg0Yj1oCYa" "D3rw4s2YND2VJo1YidhMeihpjPKRxvTQmiZIodnuit3ls8B26TL7MZ2dnf+OF8H2gr7n5/kl" "7+99GfzHfHlCPnO6mz9XKeqiaTqt3/4gl38ed59Vo1ETABzblT86Knd/eJJTBY/uZhgbLEtJ" "XdBqKxEiXr+T+QUAyHaAVsns4Xg/YSrfwE7lMzCcAjAsOlvQu5nZFlAsmCWifA1eaIPTXQWh" "5m3YTQNIpcWN/wUYN47EH8+M2kyFBMIJIKIMh/YXbs6Kk5sZ9unC+5H6M62h2nPUgsgSYs0Y" "sbvj9yTrlPeWU2NFsIyFBw8zuOpKe/Z9uo+f/na6sCWxt1PpbldCaqlku20boGWbVBGvLDbU" "OO6W/LAqO7CMAAqtVZDqAuGZpclAbcQ1ugXoOxT6wS1Kz9XsDuDgoeeRzT2BGG5HdXMXynWP" "4Lf3gGVZ/FmaQjAdRtjf+GI8Ol+5tQJrayuRU6chuTLw8jxqQzJu5esRCoXgXPZAqpZACIE5" "dxDBxiDmry/g8gvBs1sSbxTax8ylO88I8+MRDMNAOp2GqqoYGRmBZVnQdR0FTwG8y/r3keJC" "/2tNvvSrYfeKQ8touJ0NwuvfDVmWMTExgeVwFI/FVXApAe37O8BRDr8mXf+c8fBP7/VEXvmi" "5ePzzu/oYVxcb4CmaVhfX0exWIQkSbjwTRc/8NYwA8pouVwOi4uLSCQSYPYcGzjZUR8YfOeD" "173TNsF8HijqQDlnQtm4h2MNFvL5PGLxWatMSwVFUXyCIEBV1Uu6rn/OXnv54rC5t88xHEsh" "7dkFGDboE8AsslAwA2AvVldXcaBjP2sYhi+ZTMLn8wHAu9lstp+tECtSk/FEzcPiPITOXShx" "DBwA3DyD6IqE3wcHUVUhg1KKtbU1xGKxN8fGxn6klI6rqkpZuqPxuGdjLpK4P/sSzTp6BJED" "wADlMhbK1VhKds190jz6/dRU5qtUKoWhoaErAK5syv8bPP87hP6uga4AAAAASUVORK5CYII=") index.append('group_gear') catalog['group_gear'] = group_gear #---------------------------------------------------------------------- group_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwlJ" "REFUOI2NkVtsUwUcxn/n9LSn1yO72GwdxdLVAMOtoAQdlphlgBKIM3HAgzFjiRHhAR80MWp8" "koQHY8KbIT4oXoJm0ewBzbKMixLxQdm0LIWuuzDQrmzT7axde3quPuimvkz/z9/3y/f/PoH/" "uDe7I71HOgNnapWyoutu85sR8aOvh7zH+zIZHcC1lvnkU5HOE4fkvpCv7BUEB0myxOb15nZD" "FJULPywMAIhrAZJhvUsO1IlC7UFq4q8iyHEQJFKt9Kxo1gRUl3VDjJ8iENqO21tPqPE5nM1n" "mZ1XFv8XYEh7Mvv7jUFHCIYR5RCiEsGljnM1pwyvaKR/Gl7sSPQmY9EzlokiiaJ5Q7v189Bo" "2Dzs/96tSgqSYDKRX+ALz7yv7ZW2QPrd9LKwYu5JxTt3JjYOGob9r1TKjjaW/fdTNqqUNY2H" "9ycZnZ3k/KVPzsli8cTqCkfbYx97lfADjRuaeLS9haViBa2sgTqH/5kGssVLLMhjmDUeHqxL" "4PYEtxXSau3qC5KjznQcPkLYs4A/ECAai6D6Ylzte4eCbVIxdaL1W/jp+gBqsoKar/Jpa+T4" "agJfbE/NExtKB++LbhZk2ctrN9/nu3uXmairkM/niKxr5qHILkp6kZHMRTxWEwd8+t8l9s+k" "6joy42b3X4WZts7erT1Yjo1lW9g45NW7tK5/nJJe4fp0vzMZ2HPsT8Cuz17oak+80frySfcH" "335JRdXRhH4sx2b6txyGbWLaBoZlsFQtsi26m5JRFnqnvnpP2Hjg7KEdiaYPn39pvz/tiEyX" "oFoGK9fC08ljmLaFaVtYjs2MeofaYAMjd68xeGtgTrfYJ6TffsTUtxx1nXd1M+9rAM3BrEB5" "MYGm6+i2jmbqNNe38Fh8Hz/eucZQdrCgW3QWTpORgkpwdjg72ZivThNKNWDIAi4gGJggIIIx" "OsWmuc+5UH0LQfRxZezir6ZAZ+E0WQDJWrfpWd/i7Y7Jm7md1pKrK6TIgAC2jW2b/DI8fju1" "dfycWrVevzx2xVOF3fdOMbVS/h/reUzNKSf+zwAAAABJRU5ErkJggg==") index.append('group_go') catalog['group_go'] = group_go #---------------------------------------------------------------------- group_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuJJ" "REFUOI2NU1tIFGEYPf8/485eR/OyuWvmukpW5JqsF5QV2oQuJFmk9RDR/WJJPVRPPRa9RORb" "+CKZRIEVPlSKSVGBBgtKq9mKZhllZWs67s7u7Mys04NoZWF9z+cczne+8xH8Yy7U2A/uqTQ1" "JPMRXpYT1Gd99OajLn1d6+CgDADMUuTTW+yVJ2u5VoshoidEA8vGac4KtVChlH/gm+oAALqU" "QIFVruZMKZQkV2GZ8xwI5wQIC08+9s9jlhSIibJCnZdgshQiQZ8Ki20vtNWNmAjy0/8l0CVt" "Hvre36kRsxWUs4DydjDCCF4M873zGPZXwjFv7sECR2ZDXAXPUqr2S4FXXQNWdbexJ0FgebBE" "xdvxKdzTBQ2usy6T/6pfJPPk/R5nZUludqeizP7mii9yQTSmIapIWKUNIC/bgD6Fw+Xe7maO" "hk4uXOFAmaNFz1uzbCszUFq2FjOhKKSIBAjfYNyRDgcZQvmqTNiLjyLl20sw+vT1wwEleWEF" "VhM+e3fvgVU3BaPJhEyHHYLBgRetV6D7MopiXo/EvCKIY+0wmJzYPtuPTVnGugW7T0X3Y/mj" "74/APhhSYIuGkZRfhXhkGPpUO1gjsHJDAYxJ9GeIbZ89Kd7BEbVmUWAtfgdsGf1wTb0HZYIg" "VISODwJSBKEvkjQXYvmdIzvLcq+dOe82dz+/j2hYhhSOwZ3vQs54I3R6IZy9Tmdm6TQItWBW" "kRG4MyQNBoRDJHtbY21RbsaNfSe2Gv0axVgYiEWA1RMPURG5C/fGMmhyJ0g8hNftgsjMxMMM" "IRgY+Xpqb/OHe8R/0a3Kaw4wt5kaBA3pgKRBjQL1tB6FFaWQg9fBsokIPBHh6/l0eHlopjU1" "FfA0TYYAgDXz5oneoVHbeGwMFk86FI7MfZiWAMJ8AsOlwd8hgBEJjt9617S4rWw8KW+XYfq9" "d/TNcEl8hqm28BwAgmdcEsikD9MTMfXjuK7N605r+1vdfwDl/Rj9aQM+NgAAAABJRU5ErkJg" "gg==") index.append('group_key') catalog['group_key'] = group_key #---------------------------------------------------------------------- group_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxpJ" "REFUOI2NkltMEwkYhc/cmLbTmdRuaW29UArsrpstiMELpkYJRmh04+qCsl4WSYxGQ3zRN199" "IcZ4eTDRN2/BhIgxUTSkEW9RdCOrWK66LMR0KG2z7cBMnU6nHR8MqC/o/3y+k/P/5yfwjTne" "4GnZWcudsQtpQdMY/eE/5OWukOlQx+CgBgDUfPCRek/t4Ua2gzenTQRhgKZzZMlivTJLksLt" "v5P3AICcz6DCqW1luR9Iwr4FC3zHQLA+gKAR8KN5VjOvQUbRsqTvBDi+EozJAd69G8bPFxBL" "CKnvMgipdSP/v+k2CKsTJMuDFDygpHd4/Fbom9XQXwIHakpbKrxLzuR0CDRJ6m/U4dehsFPf" "YXnGSLQAmtDxr5jEjYKEufxoOdd/ql8hZuHmgK92VWlxdzab/yqVUFUOxVKIdDaDtKpiRbAC" "4dgY2u9fvcSSM4fnWthX7b1iEpxF7qWLsLr6F0zPfICaVgEpDsvvC0EtzoLyZjGlR1FmLwFT" "YF0e7ZfscyvQhjRZs2MnnAVJWDgOS7weSGYvHnecRDSvQzPy0PIGVGTQJ72EJKZxze85NJfA" "7N24YP1SeQvrKiF6h+PoGkhDnDbwTjKBKTRAkATUHhOKlV+RGTCQTKawgZc/P9IIf3DTj3x8" "/eDwABUnF2HX7j3weDxwOFwYej6B6QkNe7b/hRJfKRx2B4yUga4XE3c+HXHt9f3bqktP166T" "reNPu7Br716cO38RiffjcLsXwu/3Y3JyEolEApFIJCcIQndra2uws7NTIos3X2hsXGk927K/" "0vrk5Svwgg0AkK47CVnNoqmpCYFAAMFgEPX19ZBl+YMsyw0AYLPZWPrWmovt2rJ9VPtwDNOk" "G5HoMwBA7m4bCCOHtrY2cBwHAFAUBRRFsQzD3ASASCSi0lbBGusbGXOLmQnYy6oQ++8BQqGH" "2L6xAuY6P6ampjA6OgqWZVFUVASXy8Xoul7V29ubEkUxSudsP/1hTo3XjA29XZWTiK284zf0" "PLoGt0OAqYABjLxh1qRbPos29Do80xoOh5lMJsOKohhXFOXPjz/OPOYYI4REAAAAAElFTkSu" "QmCC") index.append('group_link') catalog['group_link'] = group_link #---------------------------------------------------------------------- heart = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoBJ" "REFUOI2lkz1oVHkUxX/vvYlmZsmYCevC+EmMorjqQAyrmBSKlYWI2gkW2qio2CjauiGF2y6k" "20YWYWHZzmQXFFRCDGsGFBUNxkTQjCFOwjAf773/u/8Pi4eiYBM8zTnFPefc4l74TnifhBsd" "3WqMOWi17nIir8NMZrRw9GgNoDY8XLAiJ1ySXNNKzVilfisODt7+HKBHRi46ra972ZUF/ADb" "bCC1+nMnctJEUcsa83dbV+fOlZt7MI0GrcdPaFXm/2xbXDwbyMjIYU8nN4OtW7J+oQs/lyMo" "FsHjp+T9/CEjcizb070jt307fhSSaW8nWyphF6u76h+qLuNELgTr1uCFIVTmwVjQmrbu9QR7" "eje4OCFoz8KjMlgLItCRI9+/j+rE/6cyTuufyedhZhZEg7NgDLx4hb8qD4EHU9OAhUSnXF3C" "67GYOM5nbJKswBiIFSiVBiSShsxVQOu02VpwBpSANSAJJklsxojUndarPS0QR6BNatY65S+1" "1mA0ZHzwfYxSvu+UuqunpmDdGmg1IYogjkFUykmcchSlBY0GbNlE9d4DXBzf8o3Ijeabt2/i" "d3NQ2gkrgnSoGaaGMAIVQ9iCNh8G9lBbWGLu9uiSs/ZXD2B+aGgXIn/kCh19P+zejb9Qgcmn" "4Hnp6mEIpW247s0s/PsflQfjz6zIub5yeezzJS5dvbqqpdRlmySXCr2ljo61RRh/CPUmDOyl" "vlhj9tZfiVVq2Go91FcuV7865U+YPn26z8Xx752bNu798eABMJrq2Djv7t6fcSJneicm7nzz" "F77E7JEjnaExg1bkfNf6orfwcvofieMrv0xOzizr0x7v33/8SX//pWWZlouPpaVvBRkdKI0A" "AAAASUVORK5CYII=") index.append('heart') catalog['heart'] = heart #---------------------------------------------------------------------- heart_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAspJ" "REFUOI2lkl9olXUcxj+/9z3z/IkdPQesHdlCtw6m6U66kTUNhFoQKEuFLgZdKATh6n6xbmIJ" "InjpuVIEEYMIrKgzGBPFosT+aGsrxtbOhbUO7Wxtez3n/fP718WLMjC86bl5npvv5/lePPA/" "JR4EOza2XWv9ilEqb6X8vZlIjOWOHFkBWCmXc0bKQRtFwyoM500YnimMjn71EKAqlfesUh+K" "dDKH42Lue8iVtWkr5Vva9xtG609b8pt2J5/pQnsejbs/01ioXW5ZWnrHlZXKYaGiS+72YtrJ" "5XEyGdxCAQRPRn/VXtdSHk13bduV2bkTx2+SSKVIl0qYpXr32mLdJqyU77rtWxDNJizUQBtQ" "ipZtHbj79j5tgwg3lYbvfwRjQEpozZDd30f91u3jCavUc2SzMF8FqcAa0Bp+m8XZmAVXwMwc" "YCBSsdeXEV0GHQTZhImiDWgNQQhhGAMiGUP+XACl4mZjwGoIJRgNMkJHkUloKdesUpuFkhD4" "oHR8rFTs67NSoBUkHHAcdBg6jg3Da2pmBtq3QOM++D4EAcgw9iiI3ffjAs+DYif1GzexQXBF" "rJTLndr3r2W2dmxNtT0F07/C4nI8DqMffjGeWmQi67EqG0i/wY6pf/z+aktRANROnepGyguZ" "XGvvEz09OH8vwA+/gBCgNV8ma/y0y6FnRy/t+SLXpz/j1tTXVOfqZx2AtpGRyQ2+/+pq9d5H" "f1z5xPOWPXj5JXAs+E2upms8/2wJ7WhKhX60kLy4uw+wQ49se+7Eid7ZwcHvFj9439rr49ZO" "VOyhkT22MnXertcXk+fsvqGCFY8QgOrAwKam1qNGyqF8R0G8mZzQbwy85ioMw/0XOT1+nJSb" "5OOrnwf/CXiguwcPHhNStr9dmt/c0blxpK/7AMW2PczW7vDt5Dfcq66efSxgvV442XYaIU4K" "aLXgYW35drk2/C+/T4u2uxWEOgAAAABJRU5ErkJggg==") index.append('heart_add') catalog['heart_add'] = heart_add #---------------------------------------------------------------------- heart_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAspJ" "REFUOI2lkktoVGcYhp9ziclMkkkmeOnYTGOSRsFbIAZa7EbrykUrqQtR2kXtooW22IWgUBAl" "6EKXQly5EVEobk3oJSCmtKVVjC1pCJpEbDIdnEkcZzJzzn/+WxfHDILFje/mfRff97zf4oPX" "lLMa7NjYFq31PqNUh5Vytub7Y+mhoRJAaWQkbaQ8YqPopBJizghxPjM8fLMOUKOjX1ulzjiJ" "xjSuh1mpIEvlKSvlJzoIqkbrGw0d7Tsa3+5FVypUJ+9TzeWvNiwtfeHJ0dEPHBVd8bb0Jdx0" "B24yiZfJgMP66N/8fi3lR4ne7u3JrVtxgxp+UxOJ/n7MUnFnuVC0vpXyK69zI06tBrk8aANK" "0dCdxXtn4C0bRnhNCfjjLhgDUkJrktR7uyn+9vunvlVqG6kUzM2DVGANaA3TD3DbUuA5MPMQ" "MBCp2IvLOL0GHYYp30TRGrSGUIAQMSCSMWQxB0rFzcaA1SAkGA0yQkeR8bWUZavUOkdJCANQ" "Ol5WKvYXs1KgFfguuC5aCNe1QoyrmRno3AjVFQgCCEOQIvYojD0I4oJKBfp6KN66jQ3Da05p" "ZKRHB8F4clN2U9MbG2Dqbygsx89hdP2KhcIkC4V7VJ8+wWtJ4T9rqbWIzGYHIH/27E6kvJxM" "tw4279qF+yQHd/4Cx3m+fJ+n6TJ9ew/S2L2N4M8fmLr9o3k2M/1N/ROXT5xoqwpx3ETRsfRA" "f2vrmxn45VcorzDxzw0GPztOYvYWLP4Mbe0U/S7ufj8xXwes6uHRo4M2DC+293S9u3bfXtCK" "8XMf8v6F73AGhupzpdMZ7kwU7UsAgPkDB9prWg8bKb/syGacqUfXg92HP040P76JCPLUgErZ" "Y3qWxf8FrGpyz56DjpSd5c659JqW5m+za7XvuwtUCopHeU9HoTn1SsCLmjiUPVlbyn3uGqfL" "uHbRYC/t/8mc+w+87YLt4Z8WzAAAAABJRU5ErkJggg==") index.append('heart_delete') catalog['heart_delete'] = heart_delete #---------------------------------------------------------------------- help = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqNJ" "REFUOI2l0ktoVHcUx/HvvZlJhAQTY2ommYJJraSYQq0oimiliyJ24yKliK9YcFVwI267KJRS" "SlcVN4L4RESJuNBaCGiLTWlLbbWOj9rG2Kh5ODaTJvcx997/OacLcUDFlb/lgd8HDvzgJeM9" "e/jhdrxI8Dab6nYxK6gaKjahKkfMcfz95S3DLwQu3Az7VNnb1Zbr8EwQEQB83ycVuH4vGhfR" "XZvWtA88Bwxem+lzxuE3CvnG/4KYm/dCRv8NETUWNNfTW5xLa8schm5VQhXt3/le10ANOPvH" "9Gvm7NKSYkPnZCVisFSmoznPhrc7MYxf/65weWSKdT1tFNsaGbz6cEwTXbv7g547PkA1Srd2" "v5LvnJ5N+PbKJFGQsGXtQlqb6pnf1MD6pe3Ue8b3NyaZmk1Y1t3cGWbJVgAfIE7ctrxvXB2Z" "Jq6mZCpMzaZcvDbBL3+V8YB3etuYDkJ+G3lES1OOIE621YAoTooext3yDE6E1KV8MXAF31Pe" "6prHTJQx+jBAnHJ3vELO9wnipAiQA4iqCWbgDFKXYGqYwZolBSpBwlenfqeaOgxwnmKeEUUp" "NSCI0gepyOvFljnMzEaoOlSVPfuHAJDMgSmG0VGYT5xkRNXkQe2FIE6PjpVDlnbPI+89Lpgo" "n3+0is92rMSpw5nimbCip53b/1QIq9nRGpAk8bEzQ3fGcj5sWP4q+ZyHcxknLt7i5Hd/Ph6T" "ZqxfuZh8nc+h86WxOEyPPTWk/i8v9GVODn+88c3GTJQfS/cZnaigTim2N7O6t0guV8enB38K" "1aT/0tebBp4CADZ+cq5PTfZ+uG5xR8/CVhrq6wCIq47ScJkD35TGFd31874tz0/5Sd7dc3oR" "KptFbLuoFFQNEZsw9IiqHL+8f8fws52Xyv8gtnY01523VQAAAABJRU5ErkJggg==") index.append('help') catalog['help'] = help #---------------------------------------------------------------------- hourglass = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtRJ" "REFUOI11k01oXFUcxX/3vjfJzCSTSRoxDalK0kXK+LFQ/KC6tB+0ouBCXNiNi+JC7MJtQVy5" "cOHGVUCKiBa7Me4aWhFSihFqsdJOQ2Kc1BDnw0ln3pv33n1f914XaQtac7b/c87//A/8BUDj" "3EfFGP802CMWURPWTllBKUsTqdSAKPJMEHoqCrx2pLx6FAWX/na6Cx9/SewCKOtfLk8/+vJQ" "dQy3VES6LtZYdJKh4wwdJzJT8Yjy/bn+Tmuu09p4LWv88haEr7gAtlCqcA/WGHSaYVKNTnNy" "laDjjFSlZHGKyfNdYqFSgRABsHxzszbibd6q+mskvS3C3l8Efpcw6BOGfZQKSPIMWRyjsn+e" "wcTzqOozT545daIu7m/+YS25OF7i2BPjkpFhByEgTA0tL0NllskRB2Ph9pbPZjNYev/k7HGA" "BwYAS/XoO2vNG4emCuKRURc/NnhKM+wKmr2EG3/0bK714gcn5968r/mXAcD317yXrLRfT1ed" "uemJYXJtWd0O2GwPfs+0PXXmxOzKfzX/i2+udq5cvxPYa42B/fzi5vJePLnXQAjrSrkb0eTm" "oaR7nnD+avtwscD5g/vLj8/sK5Fqy/X1u/zWuLuhtX3n7Nu1lT0NvrrSXCy64vXnDlbF9Pgw" "UkKSWfqR5taWx083tm2mzeIn7z77cInnlptLByaGjtYeqzBecig4Aikgzi3rnQRXCoyx/Fxv" "cruxs/TZey8cf9DBhcs3a0PCHi04koIUFByBI3e9c20pFyTGWLSFyWqJctE99uGnF2oALsBT" "f36xYGbm6btPsyHnOTBZZqzssuMnrKx2Wdv2CKIMrTUz+Tqz3R8ZrH67AOz+AsCo6bHP/ooT" "1iEURKlmKM05nCS8OJqROjFx4DMIO3STOwzu6VyAkhh7VbU6p1WrfSRJk5pS/pSK/FIY+jIM" "+0Shb1TsqzSJ2xbqQnKpXwwXAP4B5hJ7p7vb+DUAAAAASUVORK5CYII=") index.append('hourglass') catalog['hourglass'] = hourglass #---------------------------------------------------------------------- hourglass_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwBJ" "REFUOI2Nk01oHHUYxn///8zs7Gc2TUuTELF0K6RdbapIsK71YomWVix4EDz04MWLHz146U0E" "D9azBglIENGCCFYEabQ9mH4YpJY2bWNJjFkbmk3a3e7O7M7MzuffQwzkEMTn9L4Pvxee5/CK" "pcn3013sN0GNKURZKNWvBJkw8KXntXFdK+k4lud2rDXXs+Zct/PzA60+8cEXdAF0T9nns4M7" "n0sVe9AzaaSuoxJF7IfE3ZC468vQ6+Y82y61Gqul+6uLL4dLv78GziEAXRmZAv9KJQlxEJIE" "MXEQEXk+cTck8ALCbkASReugUSiAA4CYvlUt56zq7aI9j99cxmmu0LHrOJ0WjtPC8zr4UYhM" "91AYGKa9bRSvOPL4yRNH5wAEwIV5/1xvhpd29UpypoYQ4AQJq1aIFyq25zQSBX8s21Rrnam3" "j+0+spFabAxTc+53SiXH9/YbYkdex+4mWF6MqQtqTZ8bfzVVFMdn3z1WepVNEpuX769aB5VU" "Xw0WtdLgNpMoVty516G61v4zjNWJk0d3z/B/9PXl+xev/d1RV5fa6pNz1en/YuVWphBKl3I9" "XhIlYitmywpnLq9V0gZn9gxkHx3qyxDEimsLD5lderhYr392IYjWXvdDr2A7VrvZaXw8dfrm" "h9rG8ZcXa2dTGqefKhV7d+3IYBoCKQTFvMnC8o99pBeefn70WfPw6BFCs2HW3bsv5B7TChJg" "cro2NdCbOl7Z1yf6iyk0CZoAKaHhRswufMuTew8Qy5gDg2PEIuTg/gqg3pLfnL9VTgn1oqFJ" "DCkwNIEm15tFsSJrSB5YNQyR55V97wDw3uEJ9uwcQSDS+hN3P59IhoZp6ftZlMM8sj1LT1an" "YfvM3Kkzf8+iabe4vXKFGyuXODU2yUc/vUFaM1Gorg6QT5r0qetozhw4AjeISQURFd/nmXyI" "PlRmZvYKlZFD/HBznJTQuXT9F0B8Kja/sx/4Zc+z+z3XzjiOLR2nhevYide1vV8NwkUzlU8k" "uoI2So3/Nr566h8M1n0LlpqTNAAAAABJRU5ErkJggg==") index.append('hourglass_add') catalog['hourglass_add'] = hourglass_add #---------------------------------------------------------------------- hourglass_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwJJ" "REFUOI2Nj19oW2UYh5/vOydtTtI0aTdtw1Znu4uOTIdDRaneCG7OVhS98MrdDvyDQy+8VW/E" "W0F6MZAhogO9cBOEtUaQxkHBbcyxxdKuJnW2TbN0SU5yzpfz9/NibuyiiM/V+748vPx+onL6" "w2QP+wToIxpREFqPaIEV+J5UqoPrtuOu01Zut73lqnbZdbs/3TIapz7+kh6AqbRdTOUffKYv" "O4hpJZGmiY41kRcQ9QKinicD1Usr255obdcm6rXVl4LKpdfBeRbA1Akrw7/oOCbyA2I/IvJD" "QuUR9QJ85RP0fOIwvCMmMhlwABAL16qFdLt6PWsv4zVv4jQ36NoNnG4Lx2mhVBcvDJDJQTKj" "k3SGnkRlDx08eXy6DCAAfl72zucsXtiXk6T7DYQAx4+ptQNUoNmVNog1/HHTprrZnXtnZvzY" "3dTi7jBXdr/XOn7lwEhC7B4wsXsxbRXRbwo2mx6//9nUYRSdfXdm4jXuQ9y/nLvYflpL/XU+" "a0zkh/oJI83SepfqVudGEOnjJ6fHF/k/fHOhXrq81tUXKx39+fnqwn+5cqejENqU8k68OIzF" "Ts6OFc5c2JpKJjizfzT10J5hCz/SXF65zdXK7dXHim/PJzd+mwkdNRZL/bdGzx4rxp/ee/BV" "afNs0hQvP74/K/K5fqQEL9C03IiV7z5j+MY5Djz3Kv3jB1FX5ymX5qPW0tJ7AuD0wubc3qG+" "o4WxDDnLIGEIpIBeqFmpe2x/cIipN97EWv0F1n+FbI6GuY9Lc6WK+W3xWiEQ+mjCkCSkIGEI" "DCnQWhNGmlRCsl1fIzk6DtPv36trfpTH0OJh85G/vjgV75mkZT7Kqpxk764UgymTbdtjcanB" "8nqbw+nduFd+JP3DW3iqhgt0bIPIYMMEGIibDOsrGE4ZHIHrR/T5IVOex1MDAa3DT3B9scTY" "sIVpJOjcCqnWRKR1PGtaYvB5VaufULWtI57vFZSyR5RrW45jS8dp4Tp2rHq2esCXXmOtmewL" "sSJDbmgdz75YjD/5ByB3j2+JD2IaAAAAAElFTkSuQmCC") index.append('hourglass_delete') catalog['hourglass_delete'] = hourglass_delete #---------------------------------------------------------------------- hourglass_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAx5J" "REFUOI1tk81rXGUUxn/vnTvJzORj0jSYhE6/UiR1aqsgYrFRXJhYUlEs2IVQ3HVjsAv/AFGE" "KujGZaFULVrQhXVnaP1oM8H4Ua2Qjpo2Jk1MM0kaM3Nz733vx/vhogZC6W91zuE5Dw8Hjpg5" "+2YuwjsBdtAiysLabivIp0nsSLlOGDaMHzRk6DeWQtmohqF/cSVz5/RbHxMBuNJ6lwq9Dxxq" "Krbj5nM4ros1Fh2n6ChFR7GTyqhFel5ffbXWt1ybfj6duXoMggEA12bzbfyPNQadpJhEoxOF" "kjE6SklkQholGKXuCrNtbRAAIK5MzpZbGrPXi94U8do8wdptfO8OgV8nCOpI6ROrFCfXTltP" "P+tbHkcWD+w7eXy4CiAAvpmKv+7I89zODoeW5gxCQJAYao0UmVq2tmQwFv6Y95hd9EdHjuw+" "vJFabBSj1fBLa82Le7uzoqvVxYsMDalpdgWLazG//71mldYXXj/Sd5RNiM3NV780DlrHftpb" "zPT1bmlGacufCz6zS+s3U22PnxzePcE9iHsHAJ+NL4/tLRUGjLFM/LU6NnJ419OvnXsiSFRS" "qLc0F744NiE3tM79DISwruPcdTfKCACpYkpdD+H8Ww9f/qCUv2+C8+NLT+aynN/TU9hxZmwY" "axWJTomVYlvngxwoDfDT7Ldc+2fCpFlTvDyy4rsby+fGFi+4jn3hkV1F0dvRjDIJg/teRVuD" "NhqD5XZjnv2lQ/iJdK7OXW489i6dLsDZK4ujPR1NQ+XtbXTkM2QciFSCtoZbqzdIjUKZlFSn" "ePE6j25/Cj8NnR9nKqvu55cmy6mwQ9mMQ9YRZDOCjCOIVITSiu72HSij0daw2Jijs7WHX+fH" "qUxXVhLNkPvw3JnTZls/dXc/004/pa0F2gsuUsV89MP7JCYhUgl7usoc7Bvi51sVKtWLSQTP" "1E5RdQFazRqd9hqZoAqBIEw0H5bf2PQLEa9Mv4Nw8vw2VeGlhdzke5/IKoCbF+3PytryCVlb" "GoyTuCyl1y1DLx8EnhMEdcLAMzLypL8zLXw39b04utD0dk7IUxvH/w8F1rFQtwE5QQAAAABJ" "RU5ErkJggg==") index.append('hourglass_go') catalog['hourglass_go'] = hourglass_go #---------------------------------------------------------------------- hourglass_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxBJ" "REFUOI2Nk81rXGUUxn/vnZuZjDPJzCSxk0QlZGYRSY1YpEVstqlJK4gWZIx0q5vQ/AOCiEjJ" "VsRFRYqIH4ikFRQS+rFInZpFqwmNsSaNmTbMvZlkdD5y79zv+7qokSyC+Fud8/Ccw3MWR2xe" "erfdpvkWyDGJGBZSZqUg7rmOYll7tFqN0DAbVstoVFpWY7XVMq7uRqoX3/sMG0C1ZPPaY31H" "TkZTnajxdhRVRYaSwPEIbI/AdhTPshNWs5mr/7md29neeNnbvPM6mKMAqmyLd/APMgwJXI/Q" "DQhcH99yCGwP13LxbJfQ9x8Z2zo6wARALKyUhhON0q+p5hpObQuzpmE0q5hGHdOsY1kGju+h" "tHfS0TvEXuY4VurZo9PnTq8CCIDra85cOs5LA2mFRCyCEGC6IdsND8uTdCcihBJ+22pS0o35" "qTOD4/upxX4xv9q6LGX4ytPZNtGTVGnaIQ0rIKYK9JrD8h816QfBlfNncq9xAHGw+e524wWp" "yC/6UpFcXyaGH0julQ1Klb37XiDPTZ8eXOT/8GVx5+bPDwx5e3NPfjRXWvgvr3KYKIRUFeVR" "vNAPxWGeQ0/4qlh5UZX215Z+96mdB7/T1ZWhrO8SHDledt3W20L76cN8Pp/TNK2madqF9fX1" "jyP7w5/f1K9EpD+jLc+lnOYOk5Nv0N/fTybdyfbGUqdn1CbfLJxN5fM50dPTE3ddd6xUKrUJ" "gEsL+vyTmeipva0l7hRvcLZQYP77H7h1q0hvby8jIyPouk61WkXTddmRTM5NTU1NzM7ONpRv" "rq0MR4U81RZRuLeyTCKRAOD89DSu51EoFBgdHWViYoLx8XEs2xXdQyffAUin0zH1mYefXgyf" "GKKujqC0p9A3HgLw/gcX8D2fmZmZf5eapokIfcyVy9cZO0a5XLZVgGRYo0suER00+OSXCsUb" "Vzlx7Cgnnn+OSqXC2toasViMgYEBstksbquZXFxcrGuati0OvrPlWMObeq3v27tmvLM7SzQa" "QwKZ+o+O4pl/VbvHHkeJSMdxXU3Tdk3TfPVvu++WlhFH88gAAAAASUVORK5CYII=") index.append('hourglass_link') catalog['hourglass_link'] = hourglass_link #---------------------------------------------------------------------- house = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAr1J" "REFUOI2VkktPE1EYht9z5sxwa2daKNdpsbQgWgPGhYkLIKIuMCpKDLrzkrBy4V8ghJCQuNeF" "hsS4w+gKDYlEwqIJwQ1IIBihhHvbKe3cWmAKUxcG5LrwTb7V9z1P3uQcgjMy2B0ShMSeByiE" "5dlJPOqZtU67I2fBBRpdJJQWU0bAMS6p8ds1p0lOCAa7Q0KhwcXFSlkS5QAIx5COryCdXNdS" "tlF2XEKOw44MH3dWeCXJV/d3TTkQToAWnYceX9FMWzsiIYdhcUdQHBU+UZLPw4gtwkzFkKME" "Ba4qOMvrsbk2B3VjRbfz9NJ9Cd2HXVa+Ilb6Rcl3EUZ8CZl0CnLHG3jvv4aeVJBYmkORJwDB" "USEa0XxlsDMkAAAZ7A4JLrtAcZSdE51yPbTYPDLqJopv9aMmEASlFJuJOCbediG/0AWpqhpr" "v+cRjazrabpXSt25ojFHhV90ei9Ai0WQUZMoa3uFQLAWlFIAQImnDFe73iG2qmB59hek8lIU" "uiXRSuyOkW+919pyhHzJL66mamwj1/h0gDgl9wF8OKauYuBFOySPE9FFxQax73AfRlfnHzd7" "J9KG5l90dVS3XL9BbNtGX18fwuHwwTQ1NaHI4cR0wkLsx/gMwe6z/rGFYQoAd3vGhx/0jjdb" "u3Y6m80CADiOQzAYRF1dHRhjBy1iSgKr8pWH/WMLwwDADlfMZrPI5XIAAMYYeJ4Hx3Hgef7I" "jWX9+0vs5ciTRtPcbjC0redTykTB0JQPdy+3g+M4CIIASikYYyCEYGj5E7SWKEhq6/PtptaP" "RjI9yUzT+ioylyxXe6GWqPg+OYLW2ptHGjDGoOs6Ztdn0CBfglashiIrS93rkWiadL6/N2qq" "ZlBLGWu8mhcSdySryvbpfr8/QCkFpRSEEITD4Qj8e+K223Tqu+ZPQzcDGX1r+sRT/W/+AMQ9" "K+rq3YxEAAAAAElFTkSuQmCC") index.append('house') catalog['house'] = house #---------------------------------------------------------------------- house_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAu1J" "REFUOI11k0tIVGEUx//fN9dJ53FHp8nGeagzZtJYFrRI0KhFhQsriopWSREREa2DApOIohbt" "ahFEbSUowkIiCsF8EYIVIejkY/IxL2fu07mv77YIo4f9l+ec349zFofgP+ntTjidOSsAuKAH" "tNypnq/6enPkf3CFQGcIpX7KETg4x4pQVoqtJ/lH0NudcLokR4avCfv4cBzEwUHJpKCsLAoF" "JlX/LSF/wx61LOMNRny+aOPPNnWAOJwQlqchZlKCzIQ/JOR3mNecWU8wyvvCWyGlZyAX0rAp" "QUVlCN7NTcgvTKK4lBLZBnHTmoSuwZV6eZavqed90W2QMnNQlQLCxx4icvQBxJUscnOTcAfi" "cHqCvLRcnu09mXACAOntTjgrWUXWU13He8NNENLTUIt5+A/cQSzeAEop8rkMxh6dR7mrEr5Q" "LRamprH8bVFUqLWJq7LdA+5gLe8NNUFYTkItrqC64x5q62Ig5OeFGwPVGN0JqPp3tH5WEQjV" "QCwofCGZGeBQ5uiRC4uvTMLRYnrJbul6TLy+ql/wWjTLQCSwDW+2jmPPqIpMMsdAWA8BgL7u" "1g6T4dps1Ym2CxcvEU3TcOP1ETCmQ2cWdNNE2N+Ilkg7xmbfYSI1gu1v3Mfv9397zgFAZ89I" "P4D+u3ePS4ZheADAZDoONnfBshksZoHBxqKQwo5IG2R9FYP7Bp7t3g8/9/uahmHAtm0AQMnU" "YdkMc/kpGMyEyQwYlgFRk7AruheyodLRmcE8d+XtmRZZLu2QhNWzE9mxir6JKDp3HkHJLMG0" "TGzma2EyC5bNsCTMw+8JYjz1AcPJYdVl110n516c/s5zfNjr9qCoFKEkTdw8cRuXX7ajpBvQ" "mY6SqaEh0IzW+CF8nB/C0OwHNIfaMf1pXiEnnx5+LxflBqEgLZQVNyR4zaeHWFSsr6+PU0pB" "KQUhBE/kq/bu2D4yODVo+8mWL5pkh1Rx9fO637heYtehWLbDpcGKp29hZq3+AznZZLYkRZLD" "AAAAAElFTkSuQmCC") index.append('house_go') catalog['house_go'] = house_go #---------------------------------------------------------------------- house_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAzRJ" "REFUOI1tk29oG3UYx7+/311zSS65y9/mf9pk6pbWrIoIvqiNzikrglLwT2FYFSaIoL7xlW+G" "SGHFN3uziSgbRRDpi+6VIihIhBaZOCZiWbu49trLn8td0lxyF5sjufhibHRlX3hePc/nw/Pm" "S/CQrJyfcLh0uk0oDVCWgGGZpj5ykHnjsw3r6C15GOzuMHUhlhCFRBaEYWHW92A2K/q+3Rk9" "KiFHYU93pO6NJkUx9ejdNWVAGAf0Wgnt+p5u2PoDEnIYFnoO1RNNCWLiMXSUbRj7CoaUwOWL" "wxs5jkb5FlrVvbbNtcP3JPQe7LOcqhAbF8RUDp26hK65j8Tcl0i+ehntpgpNugU+lIXDExU6" "Nae68vqEAwDIyvkJh892qZ7RMcGbOA5dKaHbaiBw+gIy2WOglKKh1XH963Nwun0Q42mUb5dQ" "u1Npm3QQpv4hX/RExwVv8gR05Q66rSZGz3yB7LFHQCkFAARDo3j63DdQZBW7G5sQI2G4/aJg" "af0i+fnzZ84MCfnBGUjTllIdnnz7CvGK/vvw4RjtFq588ArEkBe1bdUGsV9mvv1VLr35bPK6" "2dHHt31z6ZnnThHbtrG4uIi1tbX7Mz09Dd7jxd+aBeWP3/8h6L9zofjvTwwAfFeUS9//Jl89" "9cLpT3K5nGN9fR26riOTyaDb7WIwGGBqagrLy8sIBIOwwuNOzRXZ9Pl8fzGHX5yZmflUkiRH" "o9HAwsIC4vE4gsEgZFlGuVzG7OwsMpkMQqEQZ1nWizs7OyPko18WThrGQb6j//eueePg+cdd" "T9L5s2/h0sWLUBQFsVgM+Xwe1WoVmqahUq3Ak3IbH5792LO6utplDcP6UWB9iUQ6iZt/boB3" "8wCAVCoFSZIwPz8Pv98PwzCgqiouf3UJT712wgMAXtHrZju6ebvaUmx9v1Pul/GE3JM5AESS" "JNi2jaWlJfD8XalpmrD7Q9y4uqm/9D5EuSz3H+jC5ORkLpvNrhYKhWg6nbZZlg0oioKtrS1w" "HIexsTFEIhH0+/3m7u4uLRaLtaNtZAqFQp7n+WvxeDzMcRwzHA6ppmnvEULKoVDoGoCRXq83" "qFQqqmmac/8DgNViSwxtrXYAAAAASUVORK5CYII=") index.append('house_link') catalog['house_link'] = house_link #---------------------------------------------------------------------- html = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAddJ" "REFUOI3Fk71qVVEQhb99cu49URMhPwqioCDRTkgVNIiIWImtIFqIYOszWNhaiI36ADaWghCE" "vIGVYGEjgkQNIpjcc8/Ze/4s7g0I2kVwmmGYWTPDWjMpVTPsx6p9of9Fg/Tg5Xb8LaHuiDhZ" "FRHoNOiykkXpStCK03VKDbC2cuA3aKAemE28WiAaiDsigagj5hR1nm9+mzQA2Bkr5kxBTrFp" "sQZFnaxGkSCrU8RZnKvpRjrhwCO4em6eLMa11XlunF/g9voidy4tsX52jmGduHlhmdlh4u7l" "o4yyMc6Gd0KVVRF1mjqRxWkGFU/fbJMSPHr1hRNLA84cazi+OOTQsOLUkYa2NzpxvFXqNiu9" "Os0gceviEnWVaLMSEYyy4Q5rK3ME0Isz6o1xMbJURGtUoy7IxemK8/j1V4o6494JoO0Ni+Dd" "pzEftsZkMSKgK0YvgedC9bMr9MWJYDoZRlPfZsM9eLKxxfddpRfn8MEZnt1bQcSJHKQrD9/H" "9dUFPv/IFHGyOln2mJ/ItaeGmCNTeU8uN2y++Ei9s6t0xZifnaEMErOSkCZQTYhWiAdigZmj" "DuaTbWN6fun0/bfRd0pI4NmJooQ4kQ2KE+aTWAPc/zzl//6NvwBETmzkmcw1jgAAAABJRU5E" "rkJggg==") index.append('html') catalog['html'] = html #---------------------------------------------------------------------- html_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAktJ" "REFUOI3Vkj1IlWEUx3/ve9/r1bw30Vt+UEGUFkIILkpWSIhQ9LEVRA3V0CDY4iLU0ODg4hCE" "hBAODQ0RBEFGUi0i0VD0YUMN0acfkPlxr+993ud5zmnwBg0Nrp3lP5zz/x34nwP/fQXX7i7o" "vxpOBGsF4xzWQuyU2DiMdcSJUrRCHDsigM6Wqr+sihPF+3V1XrFOsSJYq1gnWC8kThh7Or8O" "AFhZc3ihbBISXx52SuIE4zyJVYwTEivUZSPigiMEEFV623IY6znWnuP0/lrOHajjfHeeA3uz" "VEQBZ7q2UFkRcPFwPQXjWTMeiS2hcQ7rhEwUYKyQSYfcnFwgCGDkwSzb82n2NGXYVldBdUXI" "zq0ZiiVPbAUpOqKicZSckEkHnD2UJwoDisahqhSMRwQ6W7IoULJCoeRZSzzGhmjRExVixSRC" "nAjXH85z+WgDayVBgWLJ41V5+znmy+wj5mcnuHpriWpbYvFnN2LaiZbjhFJShSrlzVAoa9F4" "RJTxyds073hJb3cH2+taeDZzn+fv7pBv+EDQM/ReT7TX8m3RkFjBOMHYP8mvn6tGBjh1/Aik" "Qk629jPy5BIpQu7cmyBcWXXEiSdXmSK3KUVNVYrabIp8NsXWbET95jRLhXnSQZaTrf0ADPSM" "sbu+jSC0RIux5cbD76hVxAiaONQKajwkgnqhed8vZn5M8/rHFIO94ww/vkBlKoNKmmAj/97R" "1zS0Y1fNla62g7Q0tvNx7hXTb6b4+ml5ZEOAdUjjMEHQF0BOYRXV0Rejc4O/AY4yW7fUpTeP" "AAAAAElFTkSuQmCC") index.append('html_add') catalog['html_add'] = html_add #---------------------------------------------------------------------- html_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjlJ" "REFUOI3Vkk2ITmEUx3/3zp33nWlmYt4ZmolpSFgoxWZCkgw1PjYWJEQWyMLCSinNQnYKKbKy" "U+zINCGpmY2dj1goRc2M8Vlm3nvv+zzPec6xmCELC1tn81+c8/+dOucP/30lw3c/298aokoI" "ihMhBCjFKJ3gglB6Iw9KWQoZwMDK1j+shqgR45xKNIIYQZUQjCBKiIoX5eaTT3MAgJlCiMq8" "SfFxflgML4qTiA+GE8UHpdaeUdaFFEDN2L62Axciu9Z1sG9DJ4c21Ti6pYtNq9upZAkHNnbT" "Ukk4tnUxdRcpXETLQOpECKJUswQXlGpzyo1Hn0kSuHT/I0u7mlnVW2VJrUJbJWXZoip5I1IG" "RXMhy53QEKXanHBwcxdZmpA7wcyou4gqDKxsx4BGUOqNSOEjLqRYHknrpeG8Unrlysg0XpSi" "oRiQNyLRjFcfCl7fvsr6O4O83NvGkbEdrHhzE3We7EfpafhWzJjfDPV5zV1E1Xh26zJD6WO2" "HD5OdfkaypcPeT32iBdWkGy78Mb2rOtk4rvDB8WJ4sKvy8+96/D4TnafPE3ru6cwOQ4LFvI1" "62d09C3ZzKxQ+khHSxO+OaElJISqIZIQJCWoUcunaOlZDjvP/E5LNtxLD9/IvpeBayOTWDDU" "KeYFC4q5CF6xqAxWahTPH9B27xSunKYAZmea+Jp0kfxL3sf29w5X2tvO9XXHLEsnmP0ivJ9u" "ir6h5/8JMAfpO1t8mzqRatKvqU0qdn3osV78CRMGbjezW9NRAAAAAElFTkSuQmCC") index.append('html_delete') catalog['html_delete'] = html_delete #---------------------------------------------------------------------- html_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjdJ" "REFUOI3VkkuIjmEUx3/vN+/MN6YZ5ZvJdUy5hwilMSbJNZOyJFFkYWlpw0KYpWIjWSorsVGT" "cmlSlFxKSqFcxq2ZEjPzvd/zPs85z3ksjLKwsHU2p/7/8//9Nwf++8lOXRtLfzPUDBHDqyIC" "ThPOK14UFxKFGM4pOUDvkml/RBNqiRh/bY0J0YSYIZIQNSQaQY3L90Z/AQAmGko0pkJGiFPH" "mghqeI0ESXg1ghi19hxXVyoAlhI7VnfgJbJ7bQd7+2ZwsL/G4c2d9C9rpyXP2L+xi9aWjCNb" "ZlL3kYaPmBMqXhVRo5pneDGqzRUu3R4jy+Dcza90dzazdE6Vi8O7GJnYw7waFGXEiWGFUim8" "UqpRbc44sKmTvJJReCWlRN1HzKB3STteA91dyzl6ZR2N4PASSUUkr7uED4YLxoWhUY4NzKJR" "GidubMEQBociQZS5tcUsn93LZFnw3A3QkFuYD+TjLlCGaaTEVDPUvUJLYMfKQ8RkRIsYiS/j" "H1nV3U89OJ6O9JHZFfIfDcGFyOnrnwhiHL/6Hi+JpkogJuPDtzeIKWqCRGHCT7Jm/ibq0uDH" "9n3kE5OKC5GO1iZCc0arZEg1MRZKNCqzpvegFonJ+Do+Qq19Ns8+PuDR25d8v3+ebNGxp6l0" "SpKEeSMFJYnRP3CEMgSCBUoNLOpawYaFO3ky8pA7Lx5TPBok1XvI/vXnV5zJivU9W9uGX9/9" "LBnbvpzlFfDvgAUnKWJqavPEhaODvPut/wQWDXWDTmhGqAAAAABJRU5ErkJggg==") index.append('html_go') catalog['html_go'] = html_go #---------------------------------------------------------------------- html_valid = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk5J" "REFUOI2dk8uLznEUxj+/37zvvDMYGjNMk3EpxkbUSKbIwj0LCrFha+sPsLZRLLBBliKFTEqh" "WEmSlVJs0LzGNZd5L7/f93vO9xyLd8jO5WyenjrPOU/n6WT8Z22/uOWAqpzP/6b50O29Iwev" "7dv4k2+7uHmPSLyyaGi4P/uT+PDEgRUSZVWQcEPEdkooe2JKN4cXDnW9rk82/uggqvaHGK4v" "XjCSS4x3o9nEspHFXa/rkw3XfG127O4lBzA3LBnJjJQMSYrERBChrXW89yXz+vpotttMTn0k" "DxtQ6aXS/X0H46O9v+101JyUOqjJEXVeTT/mwZuTuGXsWnKG7myIC/c/UPkpm24ryZgRGTE5" "ooaoE9VwXc3Y3BPE5Hz62s/8OUbR1M4Ac2f7mj4mnnxjz7p51Ko5ODjO83rJwxcN9q0f5Ooj" "2D8+wMlbb+mpZlgh5EEVUaNWyQhi1Ko55+59JMvg1K13jAxUWTlcY9H8bmZ35yxbUKNVJgox" "rKVUWkEp1ahVMw5tGqCSZ7SC4u40Q8IMxkfn4EApRrNMtGMiSI63EnmzcEI0imicvv2eqEa7" "NBxolYnkzrM3bV5OtQmScIciJkpxLETy70WkjIY7M5uhOYOtkDBzzt6Z4nNDKcWYO6uL80dG" "ETE8ONnW489991g/9S+BKEZQI0jn8kGNqPYrDUmGzMS7dLDG/cuvqEw3lCIm+nq6iNWMHsmQ" "mqOaIZoj5khyUjLUIFnHrXsn/mz50adeFoqLY8HwqLgYHhJEw5N1uDqY/c3v/Vv9AHUFpJrz" "F9vTAAAAAElFTkSuQmCC") index.append('html_valid') catalog['html_valid'] = html_valid #---------------------------------------------------------------------- image = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAZ1J" "REFUOI2lkb1rVEEUxX/3znu+t6skafYFRUEQO22sFPwL0ln6UUQQFLu0YiXGLnbWIlZaWdr4" "V0ggZXBBzIosK4n79u3MXIu3eZvN1woeZmDuzL1nzrkX/hMCcO/Zx43g5X5/6PPd0TFZYTbM" "c1jIeftp4+5aAhCMBy8f3+gsF4WIJBhgQJz8YQZm+7ERfMXDF59XgZqgvxuyolPI09fvuXBp" "icxFgmWgi6hQbxWcCt+2vrK+9gQfVAASgL0RqCZcvXKZazdv49RhFkASEEFFEFFUldQpMU7t" "JPuHCGRZTt46V+s9BdaYPEQwrkrG5RBEMItEC8SoCGBmOAn46g9mUwkNgRn8HHznV2/AOHqi" "BX6PdqjCxXpUQJH1Ge4NwPR4gh87bdJuOb2wDmZlk9ynRbc7ay9h4sYM1J1BXXaqf5fmHKRo" "tMzp24moFYSIAL3tzbkFve1NsBVCPEBQN8l48+p5E52MO0A1q2ChpYPoy8XzbalHOCGcrEMQ" "vK/I0vopATibuw+P1r/cGnq7HuKRiiPIE2invJuf+Q/4C/jZpV3a164lAAAAAElFTkSuQmCC") index.append('image') catalog['image'] = image #---------------------------------------------------------------------- images = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlFJ" "REFUOI1tkk1IVFEYhp9zzr1zr1M5Lpoxf9AohwgqSKjIZeCmTQQi/SFJoREUuDEqV6a2qGnn" "MiIipCCQVlHkKog2QT9aQQsrrNB0bBp/5nrvOS3unWmk+TaHe84973m+h0+cuPIwE/jiZHbF" "d/MFwgooletCtcud8czxPiqUFRhODfW2JmtTKSGEhQHWtEADYAh8j+7BJ6eBygHZfOCkkilx" "5sYxmpuaSgf5hTSL80lWdZzcsk609YwtViKzlgogpUVzfTM797QglERakonxWoZ695FKJhHC" "EgYSlcgsAA3EnBh2PIYw4QvzOU1yc5K3VwdprG8oY7b5lJ1jb/8l/EAKC8DX8ObXJDMvtuDN" "NJLNQ25J0DHwFL3aivoiAYHrwJEdm2i3FFpHeQYwBoQt8X40cq27rYhdUeiF689obwCDAQyW" "CTQYWPicxVMh9vlb92hJp0vUSgq+fnzHcN851go++alX1OiukEBE6bcHXnJxZBwpLdLbt7Jr" "/wGUVEhlI6XEVjLEFgJXCiJVyOoq+Vv7q9TFPWQk1HFc3KqN2DEXpRRCFJ8xaB3w4c8yGAg0" "WBtc9eDs8PODK77ZvVIIqn2NeP3+J3NmOrwUhAa+TX2n6xDgVLEtcx/wwhYe3ezsL/ba1jO2" "aAwJqWJI5UQCosV2MWEH1MbX8H0Px8ZY5WNZFDo7PfnfyM5OT4I5TH7ZMx2XH+dcC+I2d9cF" "FDsdHRkoff2ro4CHQeQmRjtrSnNV/kskNFEXFyBC08YUfYsSdvmddQHlQiN366qIXb73Fzrt" "83P0KRZIAAAAAElFTkSuQmCC") index.append('images') catalog['images'] = images #---------------------------------------------------------------------- image_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiJJ" "REFUOI2lks1LVFEYxn/vuXe8V/MjC6cMg0BcBFmQJCbuxIV/Qh+LpKAYVxKBSKvIcJFtwllE" "4CJa9LGwhIiwQhCJVpUZLYIiQdSIaXJsPrznvi1mnMkc2/RwDpz38PKc38N74D8lACeH7o/a" "QE4l0oGfypbpsptL34dan/GJ0RMDLoBVTl89f7RhTzQqIi4KKBAW3lAF1Y1asUGOvitPzwB5" "g0TKetGGqMRu3GHf/p14TohVD0wdRshvIzhG+PpxjuGBCwTWCIALsJYFY1xamg9wqKMLxzio" "WhAXRDAiiBiMMUQcQxiW4rgbhxDwPB+/sjrP+w9pMeRfBuu5DOuZNIigGhKqJQwNAqgqjliC" "3C9USwhFA1X4llzk+0qS9TAgVMvP7DI525QfFRD1EqTXkqCmvMHSchWRhUzpQhtQzRSbE1Sy" "sLA5nkshjSoYpwLjeGVz29QUQeoF9fU/GLp9FxNp9rYQbKds8gm7a2Zpa2unaVcLL+cnSL+f" "9tv7G6/nCWyIACtf5ssaRCIP6T7WizWWI409TH14QEdrJ58/Pep3ofCfUcauXS5Wf+rSzWEi" "Uk3vwbMAXOy+xeRcHOGx7wLUVppkGGTqGqskP8KCYWGxupZkfnGWt4szDPaMM/KsD9/xUDTj" "AuzwnXvnhp8fTwfaasMtAFjt9F+9m/U6D3cxORenQlxm3kwDMraVdxu1x/aOIBITqFFYRTX+" "Or40+Bs+5NzaMfvfjQAAAABJRU5ErkJggg==") index.append('image_add') catalog['image_add'] = image_add #---------------------------------------------------------------------- image_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiFJ" "REFUOI2lks1LVFEYxn/n3DvdOxoqxEwZDaOFFFSbIEwIilrVPxD2AQWRJbSwNlEtItSdLYJq" "WeSqVhEIUQaVQRAEkQQDkUSD4gcyjB/zec95W9xxJnVs08M5cJ7Dy/M+z3kP/CcUwOmbz4dM" "oM5k8oG/VKxTZVZT34cmn8cvhrr7XAAjnO3vORDbGo8rpVwEEMBWeoiAyAoXTFDiwt1X54FQ" "ILNkvHgsrnrvDbM90YLnWIx4oJvRinBrhaMVv1PjDPRdJjBaAbgAy0XQ2qVjVxv7Dh3G0Q4i" "BpQLSqGVQimN1pqIo7G2FsddOVjA83z86ObQ7z8g1ZBrBMqlAuVCHpRCxGLFYK1GASKCowxB" "KYdIzUJVQATmslPMz2Yp2wArhoXiDCWzIxwVEPcy5JezILq+wPRMA5F0oXYhMUQK1eIMUdLp" "1fFcKmlEQDub0I5XN3dH6imJ8SdEZidI/bhFp+ry3qx1sBE6UsMczIyw59wlvPa95L+9pnFs" "1D9y3L0aOjAWBcz++l5XoPPzfXZfuY7/8x186KehuYWdySRfUhJ+pPCRhAeDt6vsb0y+78bf" "1g4nr9Wy32nFEdXmAjRFddYGhebWBhWOsCJYWUzHWsl9HaHxZS/F/DQ5YHHBwThMuQCNvvPs" "4sDbrnwg+41dZ4Bj/lHf//TRS26J4joRFucCJma0iJiH6/1ugLFTiRu5+akebVXSapm0yKMT" "o3bwD46k3lr9N0/HAAAAAElFTkSuQmCC") index.append('image_delete') catalog['image_delete'] = image_delete #---------------------------------------------------------------------- image_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAp1J" "REFUOI2lk1tIVFEUhr+9zzkz46SOYY4ZmrfEysTsQkb6GElF9FAPlURBVAQRvkZQREYk9hJR" "kBHRS/VUkJCEdqESupClokl38Y6X8YIzZ87Zu4fxCr71w4K9Fpt/f5u1FvynBMDBs49qXEcc" "GplyfBORRW65C1OfDxJ93H1cc6DSBHA1FZdObEhJDQaFECYa0ICafkNr0Hom17iOzdGLz44A" "MYORCdcbTAmKU9fusyIjCa+hcLUXZAApiIUUGFLwt6OFqsqTOK4UACbAZASkNMnLzWJdSSmG" "NNDaBWGCEEghEEIipcQyJErNfcecOSjA6/Xhi4uP8S6ihJFG9tp3GH/dRPX6VwFuFBxeYBC1" "w0TDUyAEWiuUdlFKIoDk8TryQp+JK6wgkF3M6K982utrr84aaA2DoR6GBkJElYPSLmORfmw3" "nWz1gnXpP0jM28bwj3Y8wiYhcTnxySsDCwz6+v1YXeG5gk4h03zDztWdJOXsINL7AI9f8Ke5" "g9EJraUzXCSZbpnWIA0P0vDGwvSR6WmmIv8LSbk7CffcRlgjWPEJxKkhbn3fNLnl9ONOOZ9g" "voJjz9mf8Z7Aqj2Eu28irSj2WBZdjZ8wSs7TYy9zAWIErkIAA7/b6GprQrbdpHx5K8GCXdh9" "tRgeTWQsk+6XH7nQUoxMzsdV89oopifsxuVz9H9+RIpWOKTT23KdpUEP4eEMhj50IMrvcHFf" "GmDPkkqAxDgZUk6YNL/NwNda1pYex9v1hs4nb2muH+ZbQzOB7VWkBpNJ9UexpI3XQs8SLPEZ" "D49VNWydcnRhWXggYLc9JbuojNDgEN8/ftN1/jOTfdWtLrTGlskEv8W9Ofp52leaNLUxN9Xc" "vCYHbUXeRQYHj+6+0vJz0dEE/gF9tg0XG0upSgAAAABJRU5ErkJggg==") index.append('image_edit') catalog['image_edit'] = image_edit #---------------------------------------------------------------------- image_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAppJ" "REFUOI2lkk9oXFUUxn/3vjd5k76YTHBm0kwsMQa7MggxYisJwdRoshIRMRqDLdQ/6MaAqyAK" "otgUky6zacmiuGkXzcJF6aIEA7pRqmQjIRpiMm8ybWSa2Gdm5r17TxeTP0SCGz84cM7h8J3v" "4xz4n1AAb01cmzKxGi3txMkHlSOmzOEymYTGJLNzU2+OuwBGePvL97szLdmsUspFAAHs7g4R" "ENmrBRNXOffFzbNAjaD0wHjZTFZ9OH2V3IkUnmMx4oFuQitqoRWOVvz52yJfjX9AbLQCcAHC" "Cmjt8mTn4zx1qhdHO4gYUC4ohVYKpTRaaxKOxtoDO+5eYgHPS5Ksb6jp/Q/Ivsl/EUTVMlF5" "B5RCxGLFYK1GASKCowxx9R9EDiTsE4jAva2Av+5uEdkYK4btSpGqeax2KiDrldgJt0D00QQb" "xWMk1soHDckgUt4fLlHP2tphey67bkRAO3VgwQR3SFf/IJd9lN/X71I+cQaVbMJbnmO4I823" "szM0i3iDg4P+IQViDZu/fkf3ceGNs2OEYUjn+jq3f1ggoo7R11/BS7gUCgXqEj8nb63UfV5T" "YCwKCBbn6el4hL6BMT7+9AJ/byyTa22lq6uLQiHPpalvCIICzz53mhcH+lldXX1Pw+4/I7zw" "zEnSzSkAJj77miiKGRkZobe3l+HhYYaGhojimHfOfwRAKpXyXIDGer1l43LTE20ZfrnzEwDX" "L1/AGsPk5CS+7wMQhiHWCldmphl6+SXy+XxZAbz2ybWLkVGnt+9vPO2XfvT7nu9RubY2GuoT" "qlgssrS0hOd5tLe309LSQrgTSSFYry58P7+yd+I9OP39/V2+79/I5XIZz/McEdGbm5vvKqXy" "6XT6BpCoVComCIJ7YRi++hAfxhYIqYlXBQAAAABJRU5ErkJggg==") index.append('image_link') catalog['image_link'] = image_link #---------------------------------------------------------------------- information = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAptJ" "REFUOI2lkk1PlFcUgJ93+NAwwIhgwry0DjgKNTZio9UuaNINK4ofoWkTg7p0xbapi676DzQh" "cWWqxiY2VNya1qTSQNNMWdSOBEZFEYaxinzzztxz7z1dEGcBceWzPMl5cnLywHsSbB2cvjqV" "ds6c9eLOGyPNVj2KFhR/XXC3Rr/tevJOwanBiT4j5kpbQpPHU7uor64AYDmyjORe8jC/Nq/o" "QOaH7qFtgi8HH/ZJJD92H4jHP26pY27BUFiOcF5J1FQQJnaSe73KnV8fr2tl7ELm8smhsqBn" "8J99tmhHuvfHw47mOv6aXsJaoTPVAKqMTy8SxAIOJWt5sbjK8L1cXiX4PHPtq6cxABHb31av" "4UfJesZybzCRQUqe3mNJej8NESuYkiE7u0RrU4L2/fUhJuoH2BQ4e+5EayPThTVEBPEO5y2/" "jM0wNDaDEYOxhrUo4tmrFbqOpAhEzgFUApgN09JQV0lufgnrHOIE9Z7+L/ahwNhEHvUeCCgs" "rNAefoC3UUv5gpIxqFesgrElvHN4r2SfL7JRtDhjceKwYrFG0ABwjrIgUDe3sF6kMV5FoDHU" "K945VBVQnFi8CF4MifgOXq6sEov5ubJAjbvxIDtLak8cvAernPmslYN7G6jZWcXAmU5EBCtC" "W3OCkZHHqOqN8g8ord2cmFi9mE7uCo+37+GP7Cy3f5/kp/uPULHoZo180vEhz5ZWeJqdyhPT" "mwAVAPk/by+Gh08/nxyf7WlMJaoPp5qISoaoWAKFpt21HOkImVvf4Lef769D1cXM8Hej21I+" "9vW1PtRcSR9KJrtOpGmsrQaU/5aLPBidZObf3DxBMJC5e2l7ym85+s3VNFbOBt6dx5eaUU8Q" "CwqoXveB3Pp7+PsnW3fei/8Bts1zS9BpGZEAAAAASUVORK5CYII=") index.append('information') catalog['information'] = information #---------------------------------------------------------------------- ipod = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXJJ" "REFUOI2Nk0FqG0EQRZ8dS4EBQdAgBoUh+yxyCa+91DFyh0CukANoqQOEHCCKTuATCO2GUWKw" "BoJmuupnMepGssdJCpoqaP6v/3/TV5xqs9l8cfePknB3Yjez1M/mT4vF4jPntV6v75um0b+q" "rmutVqsfEXcTBzMD4Ov9Iy4QQgIJHJALB27fiRACzwjcnc6FgLdvbkAgeoLYt79aJNF13TAB" "ApcSiNN2xCkTIb2gwMzgDHzR1Svz0zyoIITAq2swwe5n2/tWD4qqIsHxeBy24O7cvX+dNki9" "ZLgCYDwe8/Dwe9hC27YJ1LYtVVWx3++RRJ7nzGYzRqNRH/ZLIfbboKoqdrtdUnA4HDAzJpPJ" "sxCv43AuO24uy5KyLJFEXdfpftBCCCEpiHm4e3qhOEeLgxlEgul0StM0bLfbZCPP878r6Lou" "ERRFgZldhDifz/+PIMsysiyjKAqGSlL6NxcEZvZ9uVx+CCEQj5ml/uR8i7g/Fsym34bH9tQA" "AAAASUVORK5CYII=") index.append('ipod') catalog['ipod'] = ipod #---------------------------------------------------------------------- ipod_cast = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmdJ" "REFUOI2Nkk1IVGEUhp/v3mszTuJtyDQohCgJkiTpBywqSRQLwQhyIbWSonWLaFFBERQu2rUo" "oqWLWrUwgiwyoxZBRfQnWOoko43ONKN35v7M992vhUzomNBZHTjPeXgPHEFZ6Vf3tiPMs0h1" "GIq7kBJC+QEdDFPw74rjV0aX8mL58v3zKHWdWLySSBSECVqB60CQg7mEiy5eEif6by0T6E8P" "1pBdeES0qpOKCORmwZ0HoSDwIQzAjECsGpwMZBJPqFzoFj0PAwOATK6fyqpOAGbHFW62jRwx" "0XFBiK7LAs+JkZ5p4+cnhVIQqe4kJW8ACP3izk6Q74ltMJlPKDx3KwWZpkJeJCweIfBAB8/J" "GDeJZtcT+N+pazCZfKdQsslCeX1E4yb5FPhuB9qVWOojlfEtOBmwTBB2C5GJXorOQWTYQWrs" "GTX1JtNf+wyUv3i3Mwf5zBs87xwRO0/qxwC56VYyU63MjA4Qq8njFU+RLrwmOy2JVoFX6LTw" "3S2goViAz9X+l7a9s0YYTvyOt3ZprXuVUoRhSIWb/hXEO2pbj3b7XGt2wFxH6G+ykAWQPrh5" "aBy3nIr2nubd+w6U/wdQNzT0tImekwaN3wQiBKFNi7yTYHp0G67j4sQ1G/09AP2Pp5ZtXzi2" "GdNb2M+OlEDLeSbf2kDCEqduNywFR0ZOR0r9ocZaACbSAQCuEY2Jq8MSqC8xVnlOpdTffizl" "LZtJKVfctUJQgs60rAUWZVrrFfJSGaslMAyDZDJJMpnEMIxVBf9KkAXW2baNbdvl8uz/CAYH" "BwfblVK1pR9QSqGUcsIwfFnO/wGZGzZq50zlIgAAAABJRU5ErkJggg==") index.append('ipod_cast') catalog['ipod_cast'] = ipod_cast #---------------------------------------------------------------------- ipod_cast_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAt1J" "REFUOI11kk9oXGUUxX/fe28ykzFknFrTiiKUpmh5NP2rMYo6OEyItNgiGGhxI6WlUNwoSBa2" "CxEsAd0ZsIhupIt2k1AoovFPzZAWFzWNSWskJuk4NOMkM51J3sz7933vcxEqJtW7ulzuOffc" "wxFsKJ3//CmEeRKpXoZwD1JCJCfQwVWa/nlx5OzMv/fFevAX76DUhyTTrcQTIEzQClwHgjos" "F1x0+L54ffCTdQR66mILtdUREm19xOJQXwJ3BYSCwIcoADMOyXZwqlAtfE3r6mHRfykwAKjW" "B2lt6wNgaV7h1rLUSYre94Q4dEbgOUkqpSx/TimUgnh7H2X5EYDQP362C+QvJB81WSkoPHc7" "TVkhJgeIwlcIPNDB91SNcyRqjxD4f7Blh8mdGwoluyyUd5xE2qRRBt/tRbsSS03Smt6GUwXL" "BJHqIb5wjNB5ERn1Up79js1PmizePm6g/LW/nWVoVK/heaeIpxqU5y5QX8xQLWYozVwgubmB" "F75JpTlObVGSaAOv2Wfhu9tAQ9iE6Xb/VvaZJSOKFu6lM4e01seUUkRRRMyt/BWkezsyrx72" "+WCvA+bDRP7jFrIJ0ge3Afa85cRy/Xv3P/vCxnwAW0ZHv+2i/w0D+zeBiEBo06LhFFic6cR1" "XJy0Zqt/AGDwSnEdet/WG4zODWeHewIZNjbp3O08R6EgNp4ZGxvT3d3dDF4p8pLdsTabuITk" "J/bvPMATm3bww/Qw16fGmJ9d/tjYSKCU+qefLXvMlj1+n7vInqd3owzF7sdyKBHy3K7nAX36" "AQIpJQAneh7iYKfiYKeislIiJtp4befbALybPc/2ji4EImH9nwLDMCgW13xYbdSYvjvOzbt5" "BnJfcu6bt0iYcTTa+y8FNYBUKoVt29i2TX/mBNcnx2nB4vKvQ7QIi/zEVUB8+oCJIyMjX0VR" "lFNKddzPgFKK/MLlYLJ0zVA6tDSsovXQz0Olgb8BoxVjaeXZVo0AAAAASUVORK5CYII=") index.append('ipod_cast_add') catalog['ipod_cast_add'] = ipod_cast_add #---------------------------------------------------------------------- ipod_cast_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAthJ" "REFUOI1tkl+IVGUYxn/f+c40Z8Zlx6F1VyvMQaWLJUmsYJV0cXFZQ9ACFxL3SooICvIiukiR" "iJS98E5LCaEbLwyyogmxTayNgi5qUdtc2NVtdmq3GWea2T0z5898f7pYVtzN9+q5eJ4fz/vy" "ClaM/fGTpxDyNZTeBa1nUAqMGsPG39OMzosDxyce9Ivl4QtH0foD0tkUSQ+EBKsh8CGuw71C" "gG29J14ePr0MYG9deoTawpd4bQMkklAvQzAPQkMcgYlBJiHdDn4VqoUrpBb2i8HPYgeAan2Y" "VNsAAOW7mqDWR5206H9HiH3HBKGfpjLXx8wtjdaQbB+gpE4CCHv93NOgfiO9RjJf0ITBRpqq" "QkK9i2ntJg7BxteoOqfwao8SR1N0bZb8+atGqy0uOjyCl5U0ShAF/dhA4eobpLI5/Cq4EkSm" "h+T0IVr+CyjTT2nyOzrWS2b/OOKgo8W9/XvQqP5MGL5OMtOgdOci9dleqsVe5iYuku5oELYO" "U2n+RG1W4bVB2BxwiYIcWGg14ff2aLzvubJjzPS/2d591tpDWmuMMSSCyj9xtr+zd+/+iPe3" "+iBXY6LHXVQTVARBA7rvun5iz+DWbc/vWPkfQNfIyLdbGDzo0H1bIAwIK10afoHZiU0EfoCf" "tayNngUY/qa4LD1kvsa7dLpvpFJsJX6RZn3ZJ7fGK7ji8JnNDxpHR4eSS3pndycAtSvnqM98" "Qc/QmyKZ6ya4cVWOj17VU6O3P3ZW9tRa39eTpZDJUoj84Qybdh3Am7qO+PQV0ncus+HJDqmx" "b7srAUopAF7tWQUswm5WZ/DW5uDFo/d97ol1SCs2/A+w1MBxHIrFxTs4HV00x/Ks+uoNomCO" "JrAwL9GSvx/WoAaszmQyZDIZAIovvcX4tQs8kU3hygQLZcX0nNDWmrMPA+Tz+fwerXXn0g9o" "/RjtXdvjytjnym3YlHGcvwzmo70j5sP/AHbnXjE7/2EdAAAAAElFTkSuQmCC") index.append('ipod_cast_delete') catalog['ipod_cast_delete'] = ipod_cast_delete #---------------------------------------------------------------------- ipod_sound = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlFJ" "REFUOI2Fkr9rU1EUxz+vTROaEkpfCa1GqtCCOrioHRwERScRh4L/geBQf0A3cShIwbmUgpND" "py4OSnVwK+kklaJOai1NSa2kSUrNS/Ly3r3nOCTvkbaDXziccy+X7/l+zz3O2tragqo+UlVE" "hChHYa3FWhvVs1NTUy/oRj6f/+p5nv4P5XJZl5eX8xxDQkQAWPn2FwVU2yGq8VlUuTnWVnaC" "wFpL2Lk/PdjXJkA7GVAoVANEhCAIANiennngNFsfzr5e/N1RoIjCQc3n516ddH8y7nxqMIFo" "LwDGGAoPZ54P2GCuVvPWgcmEtRZUUVUGB1JcmUgdsaLAQaWtYGz3z6hTb7xthf5cpkeubt+4" "N50QEXodsAo7B+ER/9I1D/n8hcs7uxM1r35Xmv7TVErntdF4nDDGoKrcuZAiDMN4ONpRBZBM" "pqh+GsDUPJxG4+W5j2+crcnb8/j++baFDoIgoFQqUa1WERFc1yWbzZJMJtEwhIaP1hvtx40m" "2mqRMMbE31MqlSgWi/FCeZ6HiJDJZJDiHokwQOr+s62L155k+ns4PPS/90SyRYRKpYKIkMvl" "yOVyqCr7+/uoKs6t66y6Q7/U91f61M5r0MJpBgs9xpjYQtQ58m6tjWtVZWP8zJ7T9O+nepXD" "YnV9vPJj8YgF13XxPI9CoRATua4bExhjGC9szG4OTewZv/UOaM8gQjabxVpLuVxGVRkeHmZ0" "dDQmiOxOHGy+ilc5DENUlXQ6TTqdZmRk5MS+RwTdP9ZNsLq0tHTJGIO1lu4c1V3x/jjBP4TQ" "72wmHlPWAAAAAElFTkSuQmCC") index.append('ipod_sound') catalog['ipod_sound'] = ipod_sound #---------------------------------------------------------------------- joystick = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeZJ" "REFUOI2dks+LUlEUx7/X/JVuBDezcRAyUIkEiWKWIe1mH/0PLV24S0LaRW3atVEwqZXrwMUM" "uhEXIm5EM18FQgMiPn33x7mv2+q9BnsD0YHDvYvP+XDv4csQUM1m81RrfUFEWSKC4zjfbdt+" "0mg0ZsdsOEgghHiTyWSyiUQCRITVapWZz+evAZwfs6EgwX6/PxkOhxiPxyAixONx7Ha70yA2" "ULDdblGv19l6vQYRQQgBznkQGiyIxWIAAMYYiAhEBCnlvwuklKhWqyaVSkEpBaXUjYLAJdq2" "jVKphEgkgslkgnQ6feMXAgVSSiOlxHK5xH3ngLNfGs8fPbgXP3v4Gcx8Ym/fvfdY5l06nU7W" "dd2ZMSba7/dRLpfBGMP5t684efoMTAqolYXFh494dTv2ot1uvwSAW96w1npWKBSio9EIi8UC" "vV4Pg8EAd6JhRByOzdUVnC9LsJ9b/CjcfWyMMZZlXTAAaLVaslgsRvP5PHa7HaSU4Jz77TiO" "fyaTSYRCIdRqNUynUxYGACFE1HVddLtd2LYNIYQ/xDnH4XCA4zh+HiqVir9UTwApJTabjQ95" "g9df4nFEBKXUHwHnHFJK5HI5KKV84Pqptf6rfYFlWbi8vPRDc9xeGrXWcF0XxpjATPxX/QaM" "lGebIcK65gAAAABJRU5ErkJggg==") index.append('joystick') catalog['joystick'] = joystick #---------------------------------------------------------------------- joystick_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlVJ" "REFUOI2N0kFIk2Ecx/HvY3NbUiANwqDJIgNntYGapXQTT1mnIDp2tTrlwVsjJLxIXfQQRSjY" "qC6LDoJJoQ0RyWEzA3HoZqAVZdv7ur3v8z57fbvkIHml/vDn+R9+fOB5nr/ApUZGRurL5fKU" "UiqklKJUKn3Rdb2rv79/eW/W4waYpvkgGAyGampqUEqRzWaDKysrg0D33myVG7C9vV03NzfH" "wsICSin8fj+aptW7ZV2BfD5PLBYTm5ubKKUwTRPDMNyi7oDP5wNACIFSCqUUUsr/B6SU9Pb2" "OrW1tViWhWVZ+wKuj6jrOtFolOrqatLpNIFAYN8ruAJSSkdKyerqKpFSkfadMrfOt57xt7dN" "IJwX4uHQ492s2B3i8XjItu1lx3G8yWSS5uZmhBB0r69Rd+06QppY2RyZZ8+5f9B3d2xs7F4F" "iMfjoXK5vBwOh73j4+OkUilyuRxSSmKR00RazjFf85OUvY6mihRL23xbK7ydfPKhUwCMjo7K" "pqYmb2NjI5qmIaXEMIxKz2enyPsytIRbOX7kFO+WEsx+es9a5segB8A0Ta9t2yQSCXRdxzRN" "SqVSBfgeSHP18iXsKpvosS4mP7/kwtkO1jKvblb9AZBSsrW1ha7raJqGrusUCgUKhQK/ij+o" "Foe4Er4NwJ3OR5w8GkEg/B4AwzCQUtLQ0IBlWSil/jpHF9+wtDHDx40kfV1PGZi4gf+ADwfH" "9ADkcjmmp6crS7O3vSd2mE3P0BG5yOvFYbzCQ3JhChBDlW/8V7X11A0gRI+Aww7oOM7w3PDX" "vt9apVYoVpTgbAAAAABJRU5ErkJggg==") index.append('joystick_add') catalog['joystick_add'] = joystick_add #---------------------------------------------------------------------- joystick_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk9J" "REFUOI2N0s1LVFEYx/HvdV4dqUaMsMXoGEK+hIK9iLRq4aJw1Ub6C4KQoJhFm2iIwV3UptoE" "oWBDQSRBCCZSk0QMJMMQxWhNM0U6FZrMnbnnnnvuzG3lRHKlHng4Z/HjA+c5j4ZLTU1Nddi2" "/VIpFVVKYRjGV13XRxOJRG5n1usGmKZ5MxKJREOhEEopCoVCZHV19QYwtjPb5AZUKpX2dDpN" "JpNBKUUwGKRcLne4ZV2Bra0t4vG4tr6+jlIK0zQRQrhF3YFAIACApmkopVBKIaX8f0BKSSwW" "c8LhMJZlYVnWroDrEHVdZ3BwEJ/PRzabpa2tbdcnuAJSSkdKST6fZ8CoMlK3mRg+diQ4cmIe" "zXmk3bp9bzurbV+SyWS0VqvlHMfxLy0tMTQ0hKZpjH35TPv4OTRpYhWKfHzwkMnmwLWZmZnr" "DSCZTEZt28719vb65+bmWF5eplgsIqUkPtDPwNHjiI0slZVFzF/fMUJ7WDECC7HF0qgGMD09" "Lfv6+vw9PT2Uy2WklAghGq3ePKa1lObwqbMEuvoR2XnepZ5Tzn246AUwTdNfq9WYnZ1F13VM" "08QwjAZw8v19hieuEvz0AlIJQvvCHIp28jbnXNoGkFKyubnZWBohBNVqFSEEe2WFYHsXnLn8" "Z/rxg3gcLeoFEEIgpaS7uxvLslBK/XXKH08wMs9oeXoBKUoYgF72UPOw5gUoFoukUqnG0uzs" "sQMttL5OEd3fjNfjQ/9pky9pOE79TuMb/1WvxiNXjI218011rbPe5Hyr49w9vVCf/A0vvlkU" "8vPoNgAAAABJRU5ErkJggg==") index.append('joystick_delete') catalog['joystick_delete'] = joystick_delete #---------------------------------------------------------------------- joystick_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmhJ" "REFUOI2Vkk9IFGEUwH/jLuu2aCii6eL6J2XVNSwJTMqDYRJFt6CLHvVilyAv0SEVT0EEXTt5" "2DwkYUGHDh6MpcOmIQsd1pXaKUqkbbOddeeb+Wbm6xBpyR7swTs8+L0fj/eeRplYWFhocRxn" "VUrZJqWkVCp9NgxjdH5+Pn2Y9ZcTCCEeRiKRtlAohJSSbDYbyWQyD4Brh9mKcoJisdiYTCbZ" "2NhASkkwGKRQKLSUY8sKdnd3mZmZ0ba3t5FSIoTANM1yaHlBZWUlAJqmIaVESollWUcXWJbF" "9PS0qqmpwbZtbNv+P4FhGPT29tLc3EwqleJEVY6ZyYaOrVfjDUedQFmWRTqdpt8uMlCn03fu" "Rqhar0iqWzcn/mb3z7i4uNjmum5aKRVIJBJomkYkEmFQfSPUfZnjTf18qF9qze3tPR4bGwvH" "4/E5AN+fZsdx0j09PYG1tTW2trZYWVnhU2aN4SE/Tb3nUeYbAnUjFHNJdqpiFz1PKV3XV/0A" "Usp0LBYLdHd3Ew6HGR8fxzRLOPoTGk/2g3hHMv6cwck72LV7XGit5elSfhaY8wMIIQKu67K8" "vIxhGAghqFJfuHS6kuraEm7hIygPt/iW9uHbFF4+QrniYIlCCCzLIp/PYxgGReMnHcFNalrO" "4JVSKM/k7PUuPPsrweAmbX1XGY35DgSmaWJZFp2dnUSjUQbaPTpODROqzqGc76D5WH+2CXh4" "YpP6aCsjXX5e34vFNICpqSml6/r+09y9YjE0EcdXkUU5PwD1z+V9x7rYeb9B+sXsklbuDxL3" "+3PK8ULKUyjP+51KcVAr8Dzw1Pov8D9GD1oS6+oAAAAASUVORK5CYII=") index.append('joystick_error') catalog['joystick_error'] = joystick_error #---------------------------------------------------------------------- key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlRJ" "REFUOI2Vkl9IU2EYxn/n7Jz9VRSTuWFFFERBBEJaSFDCEhNToYsuIuiiKPMqSlCIhK4qkKKg" "QCQowTTNdtWNYbvIFiZSWFRYZsxIp25uc27unLOvC/9gxLTeq++F7/c87/N+n8QGFfB67gF1" "y+39LbUvLmzE/AEHvB6hJ8eEnhwTAa9HLAv+BxwfFovTD4QW7RdCpEXA6xFj3WVtK/ek9cZ2" "H7mJHn2JpOYTfNUOwOaaPsYflTI1j+9Avb8sk4BwV7Sih58hjAiS6gR2Me2/Dnqawtoevrd5" "mDYsPjlTBJEaRxiRpbM+C3zGVdZI7t6jJH6cZNvpW+RpicNKJgFJLUAyORBGHISB0ILoegih" "D6DNR7C4ZtFnFjH95dzcLEfdAacWCRSbcxVSs/1IEoCOER/FSEyRtb2G0ZbbTNjsX1Z3sPre" "soRlUxG5u0tITrZgUvORbS604CcMbYGsncf5eqeDgNn2sbxpaM/aCHWFVU8x4oNoMR8LE1dQ" "5RwktYSZgT7clWdAtjHaco1fdtu78oahIgBp7U9zlp4jFWpHj3xDyc5DcRxjpKszHEpKoa3a" "wg7ZamLKah86dGmweMVVWXLuQY/6SAXvos39xJzjxuSo4EPn49Bk2vK8+uqbU5mWrQhBTI+9" "zU4EbmDMh7EW7EQy72ekqyscxNpb3eg/mwkGUCSJbEl1gGrH4sxBqPt439EdCSu2J1UN/vPr" "wQByWjOG9UQa1XEQ2XGCkU7vXMxqf1h5eWMYQJmMGr1z3RddWiptFqm0nMqytZbXv276Fxjg" "N/KeEBUFVhBGAAAAAElFTkSuQmCC") index.append('key') catalog['key'] = key #---------------------------------------------------------------------- keyboard = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAd1J" "REFUOI3Fkk1L1GEUxX8jE0SQSCNIliFqFgkxGUEtQrAgItq0itq16StEOzdto2UfICjaRkGS" "4qpFUBKBiDEhDkq+hc7M/+V57kuLebE2kYvobs7Z3HvPuefC/65CmywuLt6PMT4OIeQhhCTL" "slqaphtJkswnSbKeZdlOmqZLW1tb01NTU9LuK7ZJkiRP8jwnz/MHExMTT/9WQWdAvV4/kOf5" "m1qt9mJfFuYqcQUKxxtLs2RZRs+Za6gaooaoEkWRqARRYlSiCDEqISpRYrUwVxHvK9Y6E90d" "dzAHM8fdUXPMHHNQM8wcNZhb2Kar3TjSf5jqeoOTx7pZ/l7j9EA3ldVdxgZ7WKruUB45wsLy" "Dy6c6mVssAdRIwShMPs1eF+xTnWjgZkjaqg5Yv6LFe9gebjE+GiJmU9rvPu8QZdIU9LkuaNc" "Pd9PEOPGxQHyoNy6PEgWjDtXhsmDce/6KOOjJQBEjShC4fWXhvcfTPm2touII7a3VdWIHTRU" "95SdHSoxPb9GMYoiYty8dILnMxVuTw79MbZHz+Z5eLfMq/criBqFlx+2feBQQFtXNzPU2ENv" "JWCOueOAWxPfflylmAXZXGh47+/5tnjrB6Iooto8sBqmhjcFbe7n6f5N/QSuUniP3hXjNwAA" "AABJRU5ErkJggg==") index.append('keyboard') catalog['keyboard'] = keyboard #---------------------------------------------------------------------- keyboard_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlNJ" "REFUOI3FkklIVXEYxX9Xn+QiTVRwSEscKpNKM8OkEDSLiApaRbuIDNxGILQSWkhQ0kYogpZN" "GynIqFQss2FjmUPyQhEf7znm8N677977n1o4VNjCVp3Ndzbf+c7hfPC/Ya2SkZGRy0KIFs/z" "XM/zbMdxwrFYbMa27c+2bU87jrMYi8X8c3Nzr5qamuTqnm+V2LZ923VdXNdtrK6uvrNRB2sC" "kUgkwXXd9nA4/OifInSPigmwcqL+LhzHIWX3cZTSSKWRSiGkQgqFJxVCKISUCKHwhEJIEbC6" "R6XJ8IXXFI0xGAPagNYGYwxKG7Q2aANKa7Q2KA3dwz+IW10szE4iMB2laGsy41NhduUmMxpc" "oiQvBX9gkdLCVIbH56nYmU5JXgpSaTxPYnV990yGL0JgJorWBqk0ShukNr9FMWuztCCN/TvS" "6OwL0dE/Q5yUy5ZqyrI4Wp6NJzUnK3NxPcXZI3k4nuZ8bQHB2Tf4gze496KeS7dO837oAUJK" "rOcDUZOdGGMstISUBql/XVVKI5QhNNdBfFIf5cUHyEktomuwjQ8Db3Hnq/AJqZBSc+rQNh52" "jnKuJn9dVfUtVzlTcQwVp9iXVcfroSdU7qnicVs7Pk9IZILm47dZtmcm8W5gCqVBa708jWF6" "IUSCtZkTxRcBuFJ7l2dfW9HmKT7Hk7PDUZP+Z78rfOUH5sMLDAZ7+RLsobHuPs0vL5AYvwnL" "SjDWOr9/wcGGrOu5+VuuVe09TFFmGf7JPnr7e5gYW7y5IYFlkcxmLKvBgiQDYYxp/dQ62fgT" "a3x88zF05/UAAAAASUVORK5CYII=") index.append('keyboard_add') catalog['keyboard_add'] = keyboard_add #---------------------------------------------------------------------- keyboard_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkxJ" "REFUOI3FUs1LVHEUPW98muJHgzPg56CmliSBfVGbkKyIalUEiYuglRS0aSUE4WzaRpui/8Da" "REEFlZo4Bq0ykUzGpqTxc5zEeTO/997v494WOlrYwlbdzTmbe+45nAv877HyZHp6ulcpdU9K" "6Usphed5juu6KSHEuBBi2fO8Ndd14+l0+k00GtX5PTtPhBD3fd+H7/t9nZ2dj3bqYFMgm80W" "+r7/ynGcx/8UYSShfgBWfS4+DM/zENx/FsYQtCFoY6C0gVYGUhsoZaC0hlIGUhkorZLWSEJz" "le1sKjIzmAFigIjBzDDEIGIQA4YIRAxDwMjUTwTyiy215Ugu59BaV4HZJQdtkQok5jNobwwi" "nlxDR0slpmZXcXRfGO2NQWhDkFLDGp6RXGVnkUzlQMTQhmCIoYl/i8Kb2NEcwqG9IQx9XMDg" "RAoBrdctdR2swenDtZCacOF4BL40uHSiEZ4k9JxqRsWnARx4ehmZm/UYu9oMM/wASmtYLydz" "XFvs4ttCBlozNG1dNYagDCM0+QStq4NoO3kRu5ra4U68xufYIEaLzsB6Np7humIPHS2VGBhK" "oLtrz7aq3l9rw5Hu6yj5+g6YiwG7g1ixGxCLzcCWSkMXEj58WUFDdTnGJpdgCCCidWRG4fws" "iqubgPO3th6ovwbl2TRsT+qVqRyH/+x3g2/8wLGyMMT4C5Q+vwHfXYQA4GQKkCsJkbXN719m" "9EpNf1FZ6e1I2Nh2IAknpfF9scBIj+7sSGBdJNIn0vO9AbIaKMBzBH547i3d/QVC43pWiPeW" "LQAAAABJRU5ErkJggg==") index.append('keyboard_delete') catalog['keyboard_delete'] = keyboard_delete #---------------------------------------------------------------------- keyboard_magnify = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAipJ" "REFUOI3FkU9LVFEYxn935s6Q4liLUkczS4rKVdGmIBIkiJD2fYHoK7QK3LaJln2CDFoEQS0i" "xUVYLSJCUPFPWJKM42h6Z+6955z3vKfFpNAuVz2rZ/P8eN7nhf+taN8sLi7ed849ttYaa22a" "53mSZVk9TdMvaZpu5nm+m2XZUqPReDsxMSH7uXjfpGn6xBiDMebB6Ojo039tcABoNpslY8yb" "JEmeH+qEmVX3A6KTraVp8jzn2MgtvFfEK+I9TjziPFY8znmcCM55rPM4cevRzKqE3jg5IIYQ" "CAE0gGoghIDXgGpAA3hVVANeYWZ+m8J+8Gx/hfXNFucGulmrJVwY7Obbz112s5TVrR3mNjJW" "Go6d3DEy2IF4xVohml62oTdusl5voRoQr3gNiAYKBaHUcZTz/V3EpSKbu5adxFAKGV4i3n2t" "UxBpVxq7XOXmlX6sKONXBzHW4wpdDPd2smMiNvY8EhUZ6KlQT9obORFiJx6JA69mvyMSEFWe" "Ta0gPpBnlnK5hBhBAxgJHImLSIjxXhDxfwCi3Ll2ismpVe6ODR8M+uJDrb22B9HQHjmCtNWi" "q1JGvBJbJ0hJ+biwxVBfhfdzNbyCqlLGk2SeSkcZ4wNxIWJj2xEaixSSBNUh4tzK1nwrHP/7" "v23vNbBcyzlT7UYD7LUMUpvn+olNfq3M0rt3MYk4pF4+vH2vr1p91DN86djCp9dp8bCAyZnl" "zzdON9ecyccLxWLnb75XgvgTdFBXAAAAAElFTkSuQmCC") index.append('keyboard_magnify') catalog['keyboard_magnify'] = keyboard_magnify #---------------------------------------------------------------------- key_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsdJ" "REFUOI2VkltoVHcQxn//s3v2kt20abusCUYIqUgEq7ZovCChMWtRCUnABwtF0AdBk/ZFpUQU" "fI1CsAhuJWqhLdhEo12oUmhKGiHJalpSMZHWW6I9tiR7y242m72cy9+HqLRKDJ2nGZjvm/m+" "GcECoYUCQWD/s/LLJU0/Ny+E+Q9YCwWkkRuTRm5MaqGAfEb4P8CZYZmPfiX16V4ppSW1UECO" "Xao997xPvG7tsi0nMKZ/Qag+Iv3fAlDe2MOjbzYyOUPf+pZw7XwEsmxrB8bU90gzhVD9QBXR" "cBsYFoubuhk/FyBqOvuU+STIwiOkmZrLjTjwJ6W1rZSs3Eb28SdU7D7J23r2Q/t8BEJdhLB5" "kGYGpInUIxhGAmkMoM+kcJbGMWJ5bK9MPnZMmS7T/HpKW+sosVOI9yIEgIGZuY+ZncRb2cj9" "9i944i66+8KDF/dWBM533qdkeTW5iXZsqg/FXYoe+QNTn8W7bAcPTl1Ac7jvfHT4txX/lrB/" "cf1lzMwQerqP2SdHUZU3EWo1sYEeRstr6R0dJzUwxKzNZ0WTiU4AmxYKBA98XHkVwO17i3z0" "LHo0jN3tw+ZtYvRi99SPSU9u3C7cGz5YR93areQdCRGb/WuzZ6mtWJmb3M2imk/RE2fQk/dQ" "3/Bj99Yz2vVdYsJyXPvdEu7VVaswFZNVZVswhc769zYCskWRkrSR/pWsdpxC/G9cvmXYPAFG" "urqmJnFdaWi9sSs5E3epwkvD8s8AOFjXwbv+lQiESxGCYqF6QC3C6a9Aqmu4deFSKiacF+s/" "D+8FiKUmc3f+GaStZw8AbT/t4WHkNhKZUyzdHDayFqpnE4pnJyOdoWTaVfT19kPhfc/dtSzZ" "fuP2IA7s/DASxCHs9N+6DojT4ub5miOufLZZL1gOWbCUrMfdUdMyePjl/6huLm1DiGYBxRLS" "SBkcCk60PgUVz0QHmlNb6wAAAABJRU5ErkJggg==") index.append('key_add') catalog['key_add'] = key_add #---------------------------------------------------------------------- key_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsVJ" "REFUOI2VkltoVHcQxn//s+fsNdFg0k2CilGoVpSiYG0RCY2sohIvUEWKL75INeqDRSGikD6U" "0hak0gctooK1qFFbl4IUEi8pXkK1iBrvxqicRGNidt3d7J7Nnsv0IRq8kIrzNAPzfTPfzKd4" "R5jx2E5g7Yty19ilJ+vehXkNbMZj4uQ7xMl3iBmPyQvC9wBnL8tA7z6x06dFxBMzHpOOozV7" "Xvap/1u7cu6POOkzKKOMnnMHABizpJmHv87iaT8tn61rrRmOQCrn78ZJHkfcFMqIAh/R2/o9" "OB6jlx7jwZ4YvW6gRRtOghQeIm5qMHf6gNtU1NRT8vECrEcrqVr1E6Ns63N9OAJllKN8EcTN" "griI3YPjJBDnPHZ/ikBFH86zAXxvTW5o0NKVZtROmZ/4S3QKfadRCsDBzd7DtZ5SNGEJ97bv" "oDMUvjN0g6F/a4pA6XRKJs8k370dn1GGFqrA7rmFa+comvgF7T8fxPSHbszb8u/UVyWsHV37" "O272InamhVznNgxtJMqYybPzzYiaRNdfp8g+asAN67bkC78B6K86zU40UUgcwEndRy/+AC2y" "iLbGw8l+M+uV+gul05ZtIDB+Cta1JuPm2aZvm+V2VhucfIzy6vXYiV+wn9/FGBFFL6rleuOh" "RLfnP1G41Z76cM5ygvdbUPu/JNxxnKpxZT4X2aiLkHEyl4ot8wfc/iTB8oko/6e0NTYmewj+" "sbi+dXXzHN0LVoyHhV8P6dW/qcQnqkpXimJlRMAIE4iORIwZXD14NJXUQ0dqN7euAfA06cpd" "OTEm8mcdA1Y3OSCT9uH6eKx5tnvZsTyMyGy0yAraDsefZ4Lh/Qs3DYIBwqXRvTcu/O08yYdI" "+wySCUV7p3JFZKf6Z2/11uCAVWcXPL8UPM2KhHZXr7uw5U1/nF0xtj7X9/grzVPjPE26PGTX" "gpPed/8BK2RUNBFRtm0AAAAASUVORK5CYII=") index.append('key_delete') catalog['key_delete'] = key_delete #---------------------------------------------------------------------- key_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArBJ" "REFUOI2Vkk1MVGcUhp87M3dwAGEiU5gJoAYTY+NP2kYNsTYpyUhqYqJ7F7pVF40rZYVNN2pj" "2oSkTYjRRBI3YGFNLYwGpAWd+BONSIvgLUbAofMDzp3v++49LoqEtqGmZ3XOyXnf8/Mei/eY" "05f8HjixHP7QeOTmyfdh/gZ2+pJi3Ekx7qQ4fUlZJvwf4KW0lOaviM4PiIgvTl9SJrtbLr+r" "s/5r7MSBi5j8IJYdY26oC4CGwz8xdW0fs4ukmk+NtKxFIIkvOjF/9iJeDsuuBbYxP3IejE/9" "kR6eX04y75WlAmutIGoK8XJ/+SYDPCXecpboroMUp4+y+fi3bNDFz0NrEVh2HVawAvGWQDxE" "z2HMAmKG0Ys5yuIZzOsSwX91bm8P5BNOrc45e8LRECozgGXBuV/T9I4/IlnjUtl0mIlL3/FH" "pHx85QYregcsymo+JvrhXtxXlwjaMQKROGcG71ET3caTmTTnZoM44cjj1ra7O1YTSP2hG3hL" "o+hCirZbt0EUyvdQWpPYsJVdDfsZnRrgofOL9J+eDWIhodWfphf6UQtdmNzvGL+SA9uP4YmP" "53v4CC9zDjsbPmVRFa3d52+pu1IKh4AT9Yd6MPkUaq4DnZ0hXJ3ANVk88ZnOTKB9g/E12tPk" "SwU+avyMRf0mlG0fcgMiFExhjKJzAZWZYV1sK8GKJK5xMZ6hrmoj8apNJKqbsIMRPlhfT9oZ" "Zvi3oadugWjIslhv2RVgl1NWW43Yu3lwvTv3psqtujryjShfUTKKLbHtgeamVsamh7g53v8w" "nGPv8w5KIV97aVP0P7Er9mPZm3nQ1ZEtrCu/1nvy/per5c1+PTJvBSKx1PjP9ypt9j3pQAGE" "XuW9H7Pdp+Na+WFRfkBVRjpbT91p++d/LJWEwWcpXtg08xXmXf4toHRhclV9rWsAAAAASUVO" "RK5CYII=") index.append('key_go') catalog['key_go'] = key_go #---------------------------------------------------------------------- layers = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhpJ" "REFUOI21kz9rVVEQxOfcc+97Ly8v5g+xkyA2FtZiZamN0cY0NjaCYKOIldj5FQQbi3wIRUSb" "gIKIjY2tWCWthuTec3Zmz7F4GiRWIk6xbDX8lp0B/lHhwfvbFwBAnA+SEAFK830gSIEi1BMv" "7+98+N2grQgnllJ6+xUAAoBRBHYBICJiDxHAXgNgF4gLuvgHwd2dW5fiaP9dg7WHAFDkkAok" "gVYgE2QGM6E/TBsN8MXM8OrezmMAaF2OtL8aZuv1tKw+YVKn4l0loxlbmlpTaZRy2+/3adR2" "n8y4dXSCstCPFcY2ChzyZLq8+KzWEKoURA9yBbEE2gKms+lEroGpW7769PJHGtHmJIxi33iz" "Cvc6DghnD74dPHL5ilRmxcuKu89omnLIJ0uph2lgRKi7Ml1rlTOqW4gdwaSR6KilnPFSl4qX" "JZdPSRvLvDPzqbsqjRFAY/kngYWh6TLDkDhZpOBeThX6VNSE1IjZo8wiEzu6OktCraXIHG3K" "Gcrx/NCm9f57Ose1GVLihkwtjVFUtESQCsqEszS0XGtFoQnt8zuv3wDA9e0rN9A2n5mJ4spF" "ckmNmYLojYygqVhmZbaKCkmO9tc7LBlo3LRkSD3XLTGQLMoETdWSVcnBrCpTAUDJEY4na2t7" "s1rmC5lVZtacVURWJjmNTsllxV2srnKzPW5wRJIJZoFzdNA4TyUdksNVUNz/snr/Qz8A53nu" "bSdnNGoAAAAASUVORK5CYII=") index.append('layers') catalog['layers'] = layers #---------------------------------------------------------------------- layout = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXFJ" "REFUOI2lkr9LHFEUhb83WVcQEtEiihDCFolYJxCCSZneIrba+A+kSJcikCqtlSD+A+lShFSW" "llaBiBKINoGIGGXBndmZd06KdWd2cP2FB1717j3vu+c+uKMCwNLq9rsAjwnhFfAMyxACMkkS" "SAJIIhY+aTb4NfvowXNk3r+dCwAsr26v+5b6/OWnARoADrwG2Ng6LtF8BfbK/CQ7BydZaUBk" "un/55OFob7YwvHn3bwZAmnabFYE91n917zC7UXiWQkUgNfpoN5WiGCDobWPx4yaphAzfPr3h" "95/Toc2tmXGsCEByjgPAUSfnxdwUx52iLL4/1qydcoSiZtDLvJ1GcpuzrDIAyKPJY30vUlEZ" "hHOCLMvp5JGY5tdm4KI7kMHA1j3kA4zcu7hTu6gM1OMLAN+39muF7bPucAKp+olR2gdaP9YW" "akWtmfHLR5D/lQZEf138sPlU+GWQJ6QCLKyIVYAjlrANyOC2Q7Jzqftt9B+LG+YMNDQOgQAA" "AABJRU5ErkJggg==") index.append('layout') catalog['layout'] = layout #---------------------------------------------------------------------- layout_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAetJ" "REFUOI2lkktIlFEYhp/z9zeKZJEL0yhCwnIWaVBZeYEgZhstclsErZQWEYGLFkEbg1ZCQxTR" "MmgRRYVgWAg6DMFAZtNFgmwzXZmcJGf++f/zfS3mjlMYvXBW57zveb4L/KcMwMnxxDkDOzBm" "ANiHioIxiOI4BseAiGADXQq5vN+9feN+RLlwImwAODWeuKn/qCt3XyuAC6CGQYBbs+kymv4F" "+0x/C28+LnnlACxtpcvO1oZCbaa++d0XD4BcLh+qEKg2lX5d+OqtqXkqYioEIm4Jba0SK1QR" "FKYxdGmKnAii8PhyhA+pTF1zx9ZNqFgAnCIOAN+zPgfDW0hng/Lj5qZQzSmXENgqAin0fDln" "8VVZ8SoBAL5VYslHxN9O8PPXD/zAJ69dlQBTJPA8n6xvsTm/JmB67h4L6acc6T/AtpZOniXv" "E3/1hN6R9quFEqqmrnUWYDJxh71dPVjH0tMewRqfQ3v6AB1xAMS3ZdvE7GKNeXklz7fMJ9ab" "DRwLnwXg/NEb7GztxmAaXQArsgh0zF8/vqrbhZAMyVSMudQMo5HbjE2epnFdA4rmipuoD4Yu" "Tu0S9LAR3SwSgAoqFpUA1w4Sfxmjr3uAh/NRQsZl5sU0YK79YWFXq3e4bQxjhg00KyyjGn0e" "/Tz6G7PBC7fB+1v+AAAAAElFTkSuQmCC") index.append('layout_add') catalog['layout_add'] = layout_add #---------------------------------------------------------------------- layout_content = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAZ1J" "REFUOI2lkrFrFEEYxX+zHBE0G9BCRBCVJIqdoI0YK5FUgkXSaor8AynSWQhWtqkEtbHTRiwO" "q5QprzHgoSSQFBaKJIGA2b2Z73sWu7e3ASMJPphi2J03v/fmg/9UAHi80lsKcJkQZoBbyAUh" "4CLLAlkAd8eS9sY6bFy/NHEbF8tzNwIAT1Z6r3RCvXj/RQAdAAXuAbxZ22nQ9A/sxbvn6G/v" "lY0BxoXhx+nzp6ps4e+Hv/4oASiKwdiIQDo9vPXbz/JY5ck9jAjcO0O048rNaRFUrzH/bJXC" "HRd0nz/g4etZ8jzH3ZtlZnxY6CK3loFXbr8OIvdvXqTb+w5Ano8zNXmFOiaS83m9X+1TZZBV" "BlXn+4URJX6XCQAzJ3C4zWRWp04jglATlGXkIBpWxPonRxIgkJCE1TcrDVoRWq+u1gCkZLis" "ieAS5sN9i8CjiXqsP61tNQb5+Bk2NreJMTKIEUtGFjLq3kaTaO5bwNX1l48O5X07946jJNdu" "Y4Dp4/zT1WuO7gTXWfcEcuSGPIEMNX24QPsKWf9I95PoDxEAIhVEfbTGAAAAAElFTkSuQmCC") index.append('layout_content') catalog['layout_content'] = layout_content #---------------------------------------------------------------------- layout_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAfNJ" "REFUOI2lkk1IlFEUhp/7zeeoIxUZqBkyzcJCWgQVhP1QIC1qVdAQbWojBEELA6FFCyEI2s6i" "H6xF2yiiYAgGhcCklSAFRWFmDQ1qZVMDM/P5ffecFvOPUxi9cDf33vPe55z7wn/KAJxLzIwY" "iGLMIWAvKgrGIIrjGBwDIoINNBt2mdvZt3EfooyeHjAAnE/MjOs/6saDNwrgAqjhMMC96ZUq" "mv4Fe/hgJ28/Zb2qAZaeymF/V2upN9O8+N2SB0CxuBquEahGKq++X/bWNTwVMTUCEbeCtl6J" "FeoISr8RH5ukKIIoJK8d42PmZ9PiWO8mVCwAThkHgG8Fn/0D3awUgurlDZFww6q2ENg6AinN" "PFe0+KrkvZoBgG+VbGqcH6k7FNJzpLu3sbvlKI8qBqZM4Hk+Bd9ii36DQTZ1F3/2IXviw7TG" "dlF4laJ9aoLBIfdSqYW6X9cmAVhOJug/coq2D88x988SmX9MLNqJRUdcAPGtUo71s+mFhuJc" "fpVg8TNtPTE4cbm6745tJaRmuwtgRRaA2OvbJ9dMGyDd1Ut+NknH04t4hUXyQO5XCBsiU06i" "Polfndwh6KAR3SwSgAoqFpWAAx1DhF++ILqlHTfUQu5rwPySo6r25h8Cu1ZTZ/qu5L9nLjhi" "ouLoF0FvHZ+Q678BXW4OP3EYoPMAAAAASUVORK5CYII=") index.append('layout_delete') catalog['layout_delete'] = layout_delete #---------------------------------------------------------------------- layout_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAl5J" "REFUOI2lk19Ik1EYh5+ztlnzz8pIZWGmpmYiFhYh6oVEf6ioIL0LI4jugroIvCgIQqgIL4wo" "0OhWukrJCwmL0mVgE01yNjQzU9emc87U79v8zulic3qRQfS7PZznfc77vgf+MwKgttF1XUAW" "QlQApSipQAikwmQSmARIKTFWVNBqZqQgM+UgUnGjulAAcLHR1aT+MfeeDykAM4ASVAI8dQbi" "auov2pfLU3GPB/U4AIOM1cO8tITo28SfL3/5qQOgaWHrmoFSttWqHp++YeU0vYtKbwsjs8XU" "Od6KukdFtVEDKc2rahtlabqN0HAPW4ovYM8+QHCsAHdH8/2YQXQaNbc70aREKmi/c5Sxqfno" "c4KvsDNEal45gVE3VhEmOSWDpO277FGAlADMLEc4st9Bu2syXjkx3ItFfcKecxx9ugWrTTDe" "P0xoUUBkpsQUBUR7vqAZRJRiSV8BQM07sfx6jT33JNpUE8IyhyUpmUQV4Nn3Mg5ffeExAYiY" "ga5HWI4YGFoEr7sN2+I77HvOoE0+xmSJEA7txtc1wI5j9Xg1OwBRg3VTVwqKbf0EfzhJKzpF" "2NvMJqtCD2Xh7+5DVDWwOb0QpVbWADJixAkTPS3cOmEQNhxMDz5EorEY2InvgxtR1YBITCfW" "NxUHGFJ+Axh8co7zuX3sq7hCwkQ3nlYn/R0BPG8GyDz7gJz8vWQ77DGAmosvEoZqrbnZmS9R" "Zft9vm3hzy/JLqlk3j/LqMtDZ/I1/PUfUaoXkArUghImN8R+4/pUV2xdLs1NNx8qzEFZ9Pe6" "33/p9N3Brxst2G+vDT2RcV/4pwAAAABJRU5ErkJggg==") index.append('layout_edit') catalog['layout_edit'] = layout_edit #---------------------------------------------------------------------- layout_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAilJ" "REFUOI2lkk1IVFEUx3/3zfhJTmP4UVKJCxVdRDJBZQVtWheVmxa2adMqEtwFFa2qReDKEDdB" "ECIthGwRfRBZqIyEfeEQOUM1aJlp6sx78947p8XTGQWJogMX7uVy/ud3zv/Af4YB6OyJXzRQ" "jzGHgRgqCsYgimUZLAMigu/pQnGYj827IvsQpft0iwHgbE+8T/8xrg+8V4AwgBqOAPSPzOfR" "9A/Y5w5t40NqwckL4LN97bOxpiTozWyePDXrAGDbueICgWr5WtXEN+evhqcipkAgEl5D2yxW" "vo+xmBqmdk8XoeJIkOIL6wgCNzquPMYWQRQeXDvGdHoRxEY/3SNa105ycgCrroOGuq2o+ABY" "qzgAzGVd9rfUMp/18tWLFp4SqYkR2dGGN/MMWZ4OWvA2CAQzX7J9XFUyTiCg2TQrqWEqqqL4" "v4aoaT1DLjmIioeIVxAwqwSO45J1fXzbBVXcz0NUNR4He4KxO3fZEs3ifB1lMfUS9XLrCNa5" "rqvX5ZkJSmSJisoM4kyDCv7yOA1Hu/jy6jZFJlMQENfPKzwcSRI2Qnq8n+juvUhmEpUssVPN" "SC5NaWmCyM4DxMrGNS/giyQB3vSe4G3fSR5dCFFa2Uh5xRzq/QATIn4/AQhiJ6huqqetaFSf" "X25tDey79OSWqjQJetCIVp6vvkl7Zy8hK4l6P9m42BahsmZm371maujq4KYL++JG25x6Uq6i" "qEhwVCm8FURANP4bKsBLLM3GZeoAAAAASUVORK5CYII=") index.append('layout_error') catalog['layout_error'] = layout_error #---------------------------------------------------------------------- layout_header = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYRJ" "REFUOI2lkrFrFEEYxX9znlcENFpFDkSuUVIriKClvYWxCmpraWFnIVjZphL8D9KIRRCL2Fmm" "EhIEwRwEGyVGDnJ7O/u9Z7HnbZYkavDBMM2b37z3zcB/KgHcX9l4nOASKd0ErmIZUkKm00l0" "EkgiKu/1uny+cvHsNWSe3F1MADxY2XjlE+rF6qYBugBO3AJYXr2HEZYJqb41gggRCiICSbx7" "9J6t4d5kBiC4AFDmkoX+uT92/rQ5BKAoyl6TwJ4DyDmzM/yGbWSwAslIQjae7gCWUpNA6gK8" "frj2z9NXiAMJ6tdYerZOISHD2vPbfPn688jDg/48VgDQmcYB4Ps4c31xgd1xNTOfmeu11m+5" "agHqXqMiyDb7kwYAkMPkcLuCqgaQpgkmk8w4B1Hkv87AVXlgBjR0+7D59Kl0GOCqAajOlwDe" "fthuGUf75dEJpOYnhrQNDD6+vNMyDfrzx1eQf8wAhN8sPV2/LHwjyeelCiyswKrAgSVsQ/3F" "Rk6drWPpJ9EvOoEbsHONUG8AAAAASUVORK5CYII=") index.append('layout_header') catalog['layout_header'] = layout_header #---------------------------------------------------------------------- layout_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkNJ" "REFUOI2lkj1oU1EYhp+TXHNrom3SRhNSJHSw0iGLCgpJLRiiLWhFUFoQ7KLOcXARQcHpUqnQ" "VYQOTjrUxUGxFpVAly4OFtOChuavNvQHvfTepPcch6RplSIVXzjT9/d833vgPyUAro/P3hYQ" "RYgEcAIlFQiBVLhcApcAKSXOplrzaCwcO9J6Eqm4c6VHADAyPvtE/aOM558VgAagBL0ATzMr" "TTT1F+wb8Xbmcmt2swEO4a3g0cN6fTexe/GXJRsAy6p6tgmU8m5NzX6393Q8JaXYJpBS20Lb" "q6Qj2UFQd+PqgyksKZEKXj1M8bW4vmtxV6QNJR0AXA0cACobNU71hFjZ2GwmH/R6fnvNFTad" "HQSyfvMfloNVs2m35hkbmyMQCLBcqZA8d5E2f4CXL57R0dHO5Ooq+y2NVCrl0wBEg8C2LPKf" "pjjf7WVo6BqmaZLP5/kw/Rpdb2Hw0iCa202pVELTZnkz77lfJ2i47lpbIOhfp/fsBSYmJshk" "MoTDYWKxGPnFHI9GRymXy8TjcRKJBLlc7pYLQNYcBSB+LnLA5wMgnU5jV6sMDw+TSCQYGBig" "v78fu1olnU4D4Pf7dQ3AkfIb0HV35AwzMzMAGIaBkhLDMPA1mpqmiVIKwzBIJpMUCgWrbt+9" "d4+Vkt3WejHhKr9tjZ8+TmekE2+Lm6WlJbLZLLquE41GCYVCmBs1VSoVnI/vpxf+/LDuvr6+" "mM/nm4xEIod0XXcrpVyVSuWmEKIQDAYngX22bTvFYnHZNM3LvwBkfSVXqaf1cQAAAABJRU5E" "rkJggg==") index.append('layout_link') catalog['layout_link'] = layout_link #---------------------------------------------------------------------- layout_sidebar = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXBJ" "REFUOI2lkjFrVEEUhb95rhsIaFCJLAGRLTRYayPqT7DT1jSbzsYiXf5A2lQBEXuxSZPO0nIb" "C2NESGyEWGhCQPLmzZxjsbvv5ZHEJHhgmGLuPfe79w78pwLAi9XhqwC3CeExcB/LEAIyRREo" "AkgiJ+91O3ybv3X1ATJLz+4FABZWh699Qa28+2yADoADTwDefPxVo/kf2INH19n8vlfWBmR6" "k8c7N6dGvYWTk7d2SwAOD2O3IbCnJ1W//izPNTxLoSGQOhO080pZHCEYbePlxiJSRjZrT9+y" "/WP/xOT+3AxWBqAY4wAQY2S2d4NYVnXwlelu69QtpJbBaOZVTACUZWxVrLKpcnsvUmoMQk1Q" "jY0qzpJTPDKD8dZTSuM7t4IvXzq+Uzs1BhrxhZwyn4ZfsFUHHvyJx5IBLDU/MUs7QP/9YL0V" "1J+bOb0F+XdtQPb68+UPd4UfBvmalMDCylgJnLGEbUAGHzgUm6e6X0R/AbWv6xQyJC4JAAAA" "AElFTkSuQmCC") index.append('layout_sidebar') catalog['layout_sidebar'] = layout_sidebar #---------------------------------------------------------------------- lightbulb = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArxJ" "REFUOI2lks1rVGcUh5/3zr25M5lMZuIwNolJrSnSkKrRNrEQqSHiorTQRYgtYgOh0A//ALuQ" "KAqFULoolELBhUKppUU0Uk1rIrYilFqxErBJEw0ZmyjNxMmHM3PvzP16XxfBaO3s/G3OWTzn" "4Sx+gqeSnz3znlZy9qrA2uyXCinlPhDKsSzp23eFHh1Mvv7ZkSd58Wgp3DldpwXquGZG3wiF" "EwgzgdArEUIgSzb+0jTW1BBe/n7aqHnx7WTXwF+rAvXvcLSQn/vVrGlqD1WvByRIC5SLki4g" "EUYcIVIURk+Sm/hxUa9/raV290BGBygspQ8bsYZ2Pd6EkjZCi4CxbmUCStood5bA+4PYq72U" "MrfXuAvpE8CbGkBgL+8LVT0PygahgwgDcuVQ2qB8RKga0PELF6l+pY/iXLoLQAcISrmUZsaQ" "fgaEAbKICgKQPkp5COWiNJvAmUZ5U1TEO/CLrrkqkI417+fnG/REFe789witkuL1W6CHQXkE" "uQzRnduRpb8x4ttwFzOIkHAANAChRU7a6SuIUC1Ij9z5HzC3pjA3VVHRYlC54yWWvhlAOgvo" "yW4Wr36LUV1/dVWQxOx3slOT1sQwZt0HiHAEUBCyQbdAKbRojMoXDpIfHWV57IJTkWz68PEH" "XUd9EUm8W5j4OWtNXsOIbV4pRxBByBSg0NdsJ3djintn+/1Yc+f7jT1f3v5PkQDujxxoy2Wz" "5yLFe7U1Gwwqmn1QLnI6wezwb+SMhnxNS1vP+j3HRv7XxEf55btP3xq/NT0YT9UalnWZguUx" "v/Qy/4z9qT7u697V1Xv0ctkqP5lDn3w0s7G1s5FAwy5a5O0iv18czJ756VLqaVYvJ3CKpbt1" "z61tbN3SyszMDDfHxgkJb7kcW1awu6Pl62Nffd66bAUR3/cIG5T2v9P5xamhK+XwZ8tDrVYu" "lLqJ1K0AAAAASUVORK5CYII=") index.append('lightbulb') catalog['lightbulb'] = lightbulb #---------------------------------------------------------------------- lightbulb_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvhJ" "REFUOI110ktsVHUUx/Hv/z7mzrMzZRic1sZHicE2CGgLJvWRICwaiF3oylciC4khwY0xEEOI" "C0xLDDusCQtNjPhYaFUgsTwsKmmqcTEpVBFqRwNopwzTMjP3zr137v3/WTQ0AvLbnLM457M4" "OYLbUrv01cua672gQvuRwK3nlH9dKM+2ZeBcFkZiJPvU/nf+Oy9uNvW/vmzTQvWhZiX69WgG" "YWUQRhwhBNJ1COZnsKeP0axdLZqtKweyGwfPLQHq39FEvTY7ZrV2rtdb7gckSBuUj5I+IBFm" "GiFy1AuHqZ7/tmK0P96d3zxYMgDq88W9ZqpjvZHuREkHocXAvHexAko6KP8SYfNnUj2v4JYu" "LvOvFT8CtmgAobPwkp68D5QDwgARBeTionRABQi9BTAI6idoeexVGrPFjQAGQOhWc5qVQgYl" "ECbIBioMQQYo1UQoH6U5hN4MqjlNJN1H0PCtJUB69lxQm+swMkn8uc8RWpzGrxfAiIJqElZL" "JJ7egHR/x0w/il8pIXThAWgAQosddoo/IvQ8yCbVo19grcthrU4S6TaJP7GK+Y8Hkd41jOxz" "VCY+wWxpn1gCslh7vPL0H/b5Uay21xDRGKBAd8CwQSm0RIr4A29TKxRYmPrOi2Q7t9/yB6VT" "u9bK+Ssnk6u2LA8vjhHpSS8iSgGK0ZN/M+7HuO7WsRtVt1wtvzu6/+y+JQDg6vG3eqvl8pFY" "40q+9UGTyMMBKJ+jZzIUtAw9Xb10LHuIsamvmTj3E8Xp8oFbAIDvP9239bcLMyPpXN607dPU" "7SaTVobnn90KusZA104OnNqOjsZnI9+42u3AMy/uOVZyzFmVWU08/wbJ9tep2GVMkWSgaycA" "b246xMoVaxCI6B0AgNdwL7fds4L+/k309qxjoVZh6p9xhk5sA2Do+Db+nJtEoVzj/4DNfd0f" "HDr43toFO4wFQROjLRFOTI4bfWue5MjZYSLC4EzhB0C8f8cN7pYNO/JDCLFDQEpBDaWGfxme" "3X0DyPBMKj6SCb8AAAAASUVORK5CYII=") index.append('lightbulb_add') catalog['lightbulb_add'] = lightbulb_add #---------------------------------------------------------------------- lightbulb_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAv1J" "REFUOI110ktoXHUUx/Hv/z7mziszk06nTmLbNFGsxGrUWoWKQkvRWsFFFxVf4MYHioIL8UEp" "LsRUdCkWXKiIFQW1EI2YGG0xKpVWCKJ1TGKmJJl2Jskk48zcO/feuff/dxEMNupvc87inM/i" "cATr0pj79EHN9e5ToX1t4DZzyv9TKM+2ZeDMCyNxInvbqy/9c1783TTPf9KlheptzUrs16MZ" "hJVBGHGEEEjXIViZwZ4ept1YLJqdV9yT3TP4yxqgLo4kmo3ySauzb5ee6gEkSBuUj5I+IBFm" "GiFyNCeOUy8MLRvdt/Tn9w1WDIDmSvGI2bF5l5HuQ0kHocXAvHy1Ako6KH+OsP0jHTsfwq1M" "bfCrxXeAAxpA6NQe0JNbQTkgDBBRQK4uSgdUgNBTgEHQ/IrUjQ/TKhf3ABgAoVvPaVYHMqiA" "MEG2UGEIMkCpNkL5KM0h9GZQ7Wki6d0ELd9aA6RnLwSNhc1GJom/8CFCi9M6OwlGFFSbsF4h" "cfvNSPc3zPQN+MsVhC48AA1AaLHjTvFbhJ4H2ab++UdY1+ewdiSJ9JvEb93OynuDSK+KkT3I" "8un3MVPdp9eALNZhb2n6d7swgtX1CCIaAxToDhg2KIWW6CC+7UUaExPUfv3Si2T7Hr3kDypf" "PzcgV0pjye0HNoZTJ4nsTK8iSgGKuXe/pzpVwblYQlpaVbaD1/ePyaNrAMDi6LM31ZeWPou1" "SvnOXpPI1QEon/mPXWqzkqv2HsLqvYbWz6OcGx8Na4XCM5cAAN988PLd5yZnTqRzedO2T9G0" "21x5ZpI7njxC7I9TUPoO0hmWjB5+GhkvauuBvfcfHq44ZllldhDPP02y+3GSrkM03wtPDcHR" "ZXhhBsMuoCuxzVgPAHgtd77rsk1bBq4bYHZ2loUvMjgTwySGnsBrlXGARl0n1Lnwn8C+3f3H" "3nrjtYGaHcaCoM2dqU3hhh/Gta0bY5qhmzQWA86XRaiUfPNfN/i/jN+75XmneuExTYoeqamS" "RB27a0y+8hfEz18CPibDsQAAAABJRU5ErkJggg==") index.append('lightbulb_delete') catalog['lightbulb_delete'] = lightbulb_delete #---------------------------------------------------------------------- lightbulb_off = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqtJ" "REFUOI2lkstrVGcYh59zP5PRyYy5mGhSMaYUB2MQTCSihEgWUqGlVARRiF1U8H+Q0r2CG0Fw" "oSvdRHEhuhDBC15BvEQNKFZjkprJZEYnM3PmzDnf+c7nojXEmJ2/1bt43ocX3p/GkoxNzR0U" "Qu4PY9UThFGLH0ZaEEVeKNW0pWuXfuv78e/FvPZlGJ/ItwdwxrGM3UnHwrUMbNNAA4JIUqzW" "eT5VoFoX79IN7i+/93e/WBA8nZlJ1qvcaG1M9GWSLnGsiOKYSMbIWKEA1zJIOhaP3s3ydCL/" "cX06nf11YMOsCeCV5V+ZFYm+5pUJQiGxLYMGw8Q2DQACISnVAiaLFfq72sjN11bla7WzwM86" "QDUUBxoTNqGQaJqGqeso9d9iICSxUiRsE0PXeJ37xEB3O4WKPwRgAgRh3OJaJl4g0HWNKP7/" "dKWQsSJWilDGFCo+xWqddc0pgihyFgT1KMpXA9HhmAZP3udxTAMrdxfdsFBK4nsV1Lph5so+" "HU0rKfshuq4HADqAbejnXuc+kUrYKKD8YpRSpp+PqS3kklvw1wwxc+8UXiDYtLaJ+29maGyw" "HywIGivTR+cq/quX/xbZ1tWGYZkACBkjZAyA7boMb/qBiUKZsfdzQXPKOfxVDy4+fts7X/Gu" "93S2NP+Tnydpm6hFhcmVPLJrm7j6bCL6qX3VyMjOjee/EgCMPnyzdb7uX/aDqC3pWOiahlQK" "xzQYmyrgmkalqy2999CO7LVvmvglZ2+N7/FuHL9kr++3CqVneL6g5nfy4c4FNXz0/K4/h3pu" "Lub1pYI/BrNXZmtWzjVTdGQG6cwMsCbdhHBai0uXF964NIFfn25f3drZu7mXyclJnr8cx9BE" "aTl2WcHw9uyp0yeP9ZY8mYgigWtRP7Jv8MToldvL4d+Xz4LoNqyX3hTIAAAAAElFTkSuQmCC") index.append('lightbulb_off') catalog['lightbulb_off'] = lightbulb_off #---------------------------------------------------------------------- lightning = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhNJ" "REFUOI2lUsFqE1EUPTOZTCxtQm0CXVRSbU0DVVFcWJBiBRcSRVARhdS66Q+4sT/g0pU/ICIo" "6EKxC9e6smKpEQyapLEiRW2bmNRkMsm8d+91kTbGmCLigQv3Pd45h3vPA/4TRvuhsHTynrDM" "iAiEGWCBULMX5lbPmj5HE6lhALDaBZhkun9kGsICEEOIfpUm1Aqv4ZZz1W3ybwIbiydu2sGY" "CQZU8QlEabBSEE/BH7mIevk93M0sRROpYLup2eY+t6v/MKj2AaIJoprlj5yHV12FW85BWMU7" "d2ACwNrC5CW7N2rDsEFOGqIJTBq+vqNg5aBezkLVK2eHz6TzXQXAfNcOxiDagWi9NbOGGYjC" "LWXQqK7e2Hcu9axrCl9fTk747fBCcE8CXmEe7CmIUuB6HfbgBRSy9wXEXisBYggxmHkzPpMf" "tAzN83Z4DEIKVug0hDREEyCAaMbA3suGaBVopsGobiyhVsrVDPKOA4DFwoHqlxeNVt5bDrtH" "rgTqKw9h2EPwDxxDrZiGW8pBe+6d+LX8bNePtI1PTw89Dw2dmrLsMEQrVL4twi1lfpgGj40m" "V9ba31rdBIR5ygpE4Ky/hVvMgDznduxq/nrXJXZefHx84E1PaP8RYYJTyHw3occ7XXcUePdo" "vK/X8lWEGKQat2LJ5bmdiF1H6DH5lfZovWH6Rg8ml6t/I/+BzIPYxL9yfgKK+0bGbsV1lgAA" "AABJRU5ErkJggg==") index.append('lightning') catalog['lightning'] = lightning #---------------------------------------------------------------------- lightning_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApFJ" "REFUOI2lkU1olFcUhp87znyT0IzYTGhSjIk1jmksGtESi4gKoUhaKm0RxYgLtymuROm+XQTE" "ZbPoqhQU2kWbprTgD7SixEkVO6QJmkzSFP+TTJzEfPOT+e49p4vEmNjZ9cCBcy+c5+W8L/zP" "MisfmTsHvlXRE6qKioAo6hZnFVmexbr7DR2pRoDwSoA4Pb5u03FUFJygzr1s68hnblGYTfsv" "llcBpm/v+8KLJUIIBDM/ooFFggAtBURqPqU4e5fC3Khr6EjFVoqGVqifrVjXisvfQ61Dg8WO" "1HxMyX9IYTaNStD8qgchgMnk3sPeaw0exsPlhlHrEGdZU7UTCXIUZ0cJivMfNn4wPF4WgMg3" "XiyB2hxq7dLNllC0gUJ2hAX/4Zm3Pkr9WjaFJzf37o548WSsvoNSpg8pBWgQIMUiXu0nZEYv" "KE5Kywk4QZ0gInPNJ8Zrw8ZKnxffgrqA8NqDqLOodaCgVqjeeMSoDaKLaQj+9B3y2XTeuNIe" "gLCoRP3H1xaW815SeH3T0Whx4juMt55IdRtX0yMknxmeL0R5ntvgsv7MMXjwpSl31z8/bft9" "7fr2/WEvjtqAX4ZSpCvj7Gp5l/rqBL8N95Icus7EWOZ8qBxARfaHozXkpgeZGevl0iPf7Xi7" "FRdytL75Ps4EvLdtD6Cf/Qfw9w/v/FkR24z/JIk/mXqmdr5uxs+uiZgqDrWcAuB0+9c0vbEd" "g6lYBRj6fmuVIbSjkB0jl7l3LtGZjjd1Tkxm5iaLw4/76b5yEoDuyycZnxpE0eIqQGVIBmyp" "NJVXjSU6x86++BfR88nBfjzC/PxXD54JcyN1DTBfrTJx5GJid3NneqCcL21ddd0Y02UgpjCP" "as8fPU8//xdo7nzCRXscIAAAAABJRU5ErkJggg==") index.append('lightning_add') catalog['lightning_add'] = lightning_add #---------------------------------------------------------------------- lightning_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn1J" "REFUOI2lkduLjWEUxn/fYX97HLYwk0OYg2yKRC4oyXFKQwoZQv4BdxTJlXKj3LtTKIoLhyk0" "DjkVI6chwxwRYzYze8yesc/f+67lYhgz2ndWrVpvred53mc98J/ljH4kX649p6L7VBUVAVHU" "Ds8qMjKLsZ8r65qrAPzRBGJ17+S5e1FRsIJa+7eNJZt8Ri7Vkf4DHkPQ93z18SAWdxEI+6+g" "oUHCEC2GRCq2k0+9JzfYbivrmmOjRd1R6ofLJi/BZltRY9FwuCMVWymmu8mlOlAJF/x7Axfg" "e9OqHcGEygAnwGZaUGMRa/AmLkPCDPlUO2H+5+aqTS1dJQkQORPE4qjJoMb89mxwo5XkBtoo" "pLsP1WxpvlEyhcSTVSsiQXlTbHYdxWQDUgzRMETyeYLp20i2n1esFEcSsIJaQUQGF+zrmu47" "RhqC8vmoDfEnbUStQY0FBTXC1OqdjpowOpyGkO57SXagI+vY4koAX1Si6Z4HhZG8fytMmbsr" "mv94ESeYRWTqcnru3aX/RRuF3iGsq/2K1gMnnFK+Pl1bfH/SrA1r/KAcNSHdd25iej3mr6sn" "WrOI3JtbvHt0y6ZaWw+4pQhUZI0frSDT94b+zqskHr4ejK+rp6zrPs7Z3Yz/cIXqqgrPogf8" "f8EfLi96VRabRzrRRCbZ9sPFLNSsJMpm1MCmgyN7/rGZeOpUjyF4e2nhRAd3aW6gExsWTsb3" "dB4GaKz1vmabr8+e0LCfQu4bWeDnkIf16BljYZwrT02x2JtVjf0BA4wvn3a65fEDk8iPY8iL" "MPDDobPbsap6asz32y7EV5S6CcCjXXOONNZ6H2+v96Wx1vtys9Y9CvALx619B4JO0ZcAAAAA" "SUVORK5CYII=") index.append('lightning_delete') catalog['lightning_delete'] = lightning_delete #---------------------------------------------------------------------- lightning_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnpJ" "REFUOI2lks1LlFEUxp8Z50MdR0ytkbAxNROTKNoYYRlIhkVQEW1EWrcKotoYEbhwEUF/QgS1" "aGEk1CIMFCyVzCSymhG1THPMEWecr/e9955zWpg25uw68MC593J/5z7nXOA/w5G9iI6ffCQs" "nSICYQZYILSeC/Nmzobmgu0TVQDgygYwSUdJTQeEBSCGEP2VIaSj75CJTSU3Lm8BLI+d6Pb4" "65xgQK88g2gD1hqiNNzlF2HFviATD1OwfcKfXdSZVf1WfskhUPorxBBEr8tdfh4qOY9MbArC" "uv7fHjgBYGmk+ZLHF/TA4QGlJiGGwGSQV3QErFOwYmFoK3G26szkdE4AmB96/HUQk4IY88ez" "gdMbRGY1BDs5f7P63MTLnFNYHG5ucnvKRvyV7VDRPrDSEK3BlgVP4AKi4ccCYvUg4fOmjML1" "grTtIgYzx+s7pwMuh+E+T9l+CGm4ik9DyEAMAQKIYZTuvewQo732xxeoLG/A3YVx7x0fp92k" "jgGAi4W9yZ+D9ua8aV33Y8VeYQXFBsoQdpfWoaGiCQkrhWvzI/nazUvbPtJGfHt+cODeWmHL" "qcYrIGEQExiCSHweO3y7MDzTj/dzg8wOu9SVCyDMLZZRIGF8X5mCZgPDGpo01uwEDu85jqRO" "O0dnh1a2AWZ6Gz/k+/fBioZhyCBQHIRhAgljMT6H0qIKjP94g6HpoWVFaNti4dPTA0U+V15C" "iHEjmkbGVqJYwTIKtTsbHUdr2jA29xb9oVcRRWiN9ODzlhcUOHnUKPplO/Nqe6/OJrPPVruH" "Uw5nQeFA+PWCcaA10oPQNu+hJ3VNuXoCANW3kQp25UmgC9XZ+78BUOyI/7ckM6oAAAAASUVO" "RK5CYII=") index.append('lightning_go') catalog['lightning_go'] = lightning_go #---------------------------------------------------------------------- link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAaNJ" "REFUOI3tkjGLGkEAhZ/OjsOxidnFFWEs5JRlicEuxObAIpqkk0AIWmiXK1LZhjQhTbAQYnN/" "ID9ASBkRTkggfTpFzggznoywILPkFCemuQv5A6mSVz148MHjPeC/YjemVqvZvu+/5Jy/4py7" "s9lsEYbhcwDfXdf9UigU8lLKUEr5bjqdng2HwwgACAAUi8WE53lvy+Xym3a7fcQ5RzqdvqOU" "ephIJB63Wq27+Xze8jzvaLfb1ebzOaWUjpVSxgIAxtiTIAhOq9Vq2Ol0vm42m0fZbJaUSqXj" "5XJ53Ov1IIQwyWTyU71evxcEwamU8jOAj9Z1gxPHcdhoNOporT9orVeNRuOW67rQWkMphX6/" "/yMejz9TSrUcx3kP4OQ3wBhzIYS4SqVStymlA0II63a7sG0bABBFEQgh7DobCiGujDEXAHAD" "OJdSXvq+/7rZbP60LIuuVitMJhMwxpDL5ZDJZOh+v7+/WCweSCkvjTHnf65AKpVKybbtAec8" "zRgjh8Mhvl6vX8RiMeF53gAA3W63Rkqpoih6Oh6PvwEwf+8g/5B+ASIAqzVg9YveAAAAAElF" "TkSuQmCC") index.append('link') catalog['link'] = link #---------------------------------------------------------------------- link_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjhJ" "REFUOI3t0bFPE2EYBvDn7uv1Kx5gD1okX02ANpdaTHWQyELsQIsOBBY1kNgmDDKQkDRx0bgY" "F8rQxC4Mrg6OqIMDTaMGMcQNIjEBG5B4H5SvWlquUpoc5wK4mf4BPtObvMkved8H+B/pdIjF" "Yqqu61OMsUeMMS2fz2+XSqW7AL5rmrYUCAT8nPMS53xmY2NjLpvNVgGAAEBvb6/T4/E87e/v" "f5JIJJoYY/B6veeFEINOp/NmPB4P+f1+h8fjaarX67GtrS1FUZQPQgjLAQCU0lvBYHAyGo2W" "ksnkcqVSGfL5fCQcDvfs7Oz0pNNpGIZhtba2LoyOjl4OBoOTnPOPAN44Ti4YcLvdNJfLJU3T" "fGGaZmFsbKxZ0zSYpgkhBDKZzKEsy7eFEHG32/0MwMAZYFnWpmEYtfb29hZFUeYJIXR2dhaq" "qgIAqtUqCCH0ZJc1DKNmWdYmAJwC7znnu7quPx4fHz92OBxKoVDA+vo6KKXo6upC7dwvZfvg" "a2zlaGGo7Csfd0TsS1j92wKJRCJhVVXnGWNeSimxbVsuFov3JUky2nT6tvMqcV4L9eFim453" "a6+w/GURm9+K6bMa/5V7M9HDO8PDLhAZI6FppHOTIJDxcv51TW4E2Dd/uhSpGSOhaQDAg8Hn" "CHRcgQTJ1RBQLBdqa/wTUtkJAEBqYQL5vVXYsGukEYD1NTcd1MWN7gvdKP7+gXJ1D0sri6js" "H2Ua+gEAXJ/qTEGSpiSgxQYOYNtzn+d2H/4B8Z/aXnPTd+4AAAAASUVORK5CYII=") index.append('link_add') catalog['link_add'] = link_add #---------------------------------------------------------------------- link_break = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAp9J" "REFUOI3FklFIE3Ecx3/t7nbObbLDifNGLZvrajZfWlJDCUpFCHSQIhssImjBXtpLgWkJES0E" "IfYQGFEPQpAVUdRLojNKsofhwt1mm8M2uL+buyHcdupst/UkRGg99NDn7ffjx4fvF34A/5t9" "vw79kxWsnEk+KmyU70mVSvpEkyLp66M1XSPfWq3N6rmv8c2Jd0PGS3sKAADO+ZbdRxurby0u" "iz2YDC5sb5THrS3qUPT75tvX143n/5hgh67bMafJUH0nGCo3N+hKE1iVrO7F1YOn96zQ2dmp" "NJlMHpqmB2maphKJRArx+fyTcf8xj8ejoyhqzmg0HkIIrSOEfPF4/MHU1JQIAICbzWa5XC4f" "YRjm2sDAAIiiCEaj8UAgEFgBAKAoatLlcukJgoDV1VUqGAyOJpPJOrPZPByJRLZxkiS7GYZx" "d3R0rHu93nlBELr0ej1msVjuAwAUCoX2sbEx4DhOqqmped/b29vMMIwbIfQJAN7IAKBNo9GQ" "09PTg2q1uk0URZXT6VRYLJaHAAB2u11hs9kUgiCYVSpVSzabvavRaEgAaAMAwCVJWuE4bqu2" "tlbN8/xnmUwm+Hw+QqlUAgDs8/v9jCiKIYIgfuRyuQCGYWqO47YkSVrZEcwihNImk2nI4XCU" "cRwnMpkMxGIxAABgGCZkMBigvr6eKJVK1lQq1YoQSkuSNAsAgLMsG9NqtY6ZmZlXNE3XkSS5" "ValUZDzPXwYASK+JS/l8WB8Oh4lisUgihLKiKDpYlo3t+QfdN6IfNvNStpgWXDqLlo0tCsOR" "59anu93Kfl+c8bIvG3TkSX6teLOIKXxLC0LfYbNq9Ih93v1Xge1K6PH+RkXPl4+5dvbZ8WiT" "pfriNg6J6IJwVlFFnIL+SWw3yT/xE4+BHceJSQc1AAAAAElFTkSuQmCC") index.append('link_break') catalog['link_break'] = link_break #---------------------------------------------------------------------- link_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjZJ" "REFUOI3tkU9rE1EUxc/Mm8kzjLYzJoE60cRMCLENWUoRigOa+G/TTdFsEle20FXale6KC6WF" "ggXRD+DeQqGgjYVKK7gRioKUhNgqvFfDpI2mk7amzoybNkvtB/CsLvdwf3DPAf5LOBqy2ayS" "SCRGdV1/oOu6Vq1WvzUajdsAvmqa9i4ejxuc8wbn/HGlUnlWKpVaAEAAoK+vzxcMBh/29/dP" "FAoFv67rCIVC3ZZlXfX5fNfz+XyvYRhSMBj0t9vt7MbGhizL8lvLshwJACilN5LJ5HAmk2kU" "i8X3zWbzWjgcJul0Ora5uRmbnp4GY8zp6upaGBwcTCWTyWHO+QqAOenwgwFVVeni4mLRtu0X" "tm3XcrncSU3TYNs2LMvCzMzMniiKQ5Zl5VVVfQJgoANwHGedMbYfCAROybI8Swihk5OTUBQF" "ANBqtUAIoYdeiTG27zjOeifEVCrVaxjGS9M0eyKRiCtJ0ularYZyuQxKKaLRKGKNT/Ctzrtu" "nYs7knzQbLtP7y7tjx+1QEzTTCuKMqvreohSSjzPE+v1+j1BEJjp356/FLDphStDoLEU9j4u" "4PPygvNjbW2sU+Pf9CpDqpfHpgx/dQlgK0C3iroUxYfXy+vSP68BEFeIneiJAbfGOztp4gyI" "J5w/FsAVPba7On9WmRvFr73v2AWw0yRwCDg5DmDkYk/3do0PiD4iHpAWfm55+MJFx/ntTR0r" "AwBYvnPu/u4WHxFdIeqKHnPhPb/5xn30B0qT3dcfFCXvAAAAAElFTkSuQmCC") index.append('link_delete') catalog['link_delete'] = link_delete #---------------------------------------------------------------------- link_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn9J" "REFUOI3tkd1LUwEYxp/t7Oyom7nDpujZJk4b5ti0kYnG0qycZhSClEuSgkGQEX1QUNZVCrJ/" "oKDsog/Ci8irghCxrPyqIEmZNuaytjPcprN51s42z9ZVEtM/oef69/x4Xl7gf0QA0NTUJNPr" "9d0Mw9xkGIZ2u90/wuHwSQBLNE1/KCsrK2VZNsyybL/L5bo7PDwc3RQYDAapTqfrs1qt1zs6" "OhCNRuH1ejE6OupJJpPerq6uGpIkKb/fD9b5ApU5LAi5CdHQW4D3nRGZzebjjY2Nj+12e6q3" "t3cyEolY1Wo1YTKZ4Pf7EQqF4PP5hNaa6Gx7fW1Vtmo/8nRmrHkm4Hw9sCwBYFEoFNTIyMhl" "juOecBy3bLPZ5DRNg+M4BINBTA33J0+dOFIh37EXq24npKIEcncUQq4szpMIguDx+Xy8UqnM" "JUlyiCAIyuFwQCaTAQBK84PoudiSpdA1I+4fhDRHhKUv80jE4it8nNtHqFSqqEQiOapWq1st" "FktRXV2dXKvVQhAEVJen0H3aCMXOY+DZ+xBLfwMoAO+aWYnH+MPVl17NiQAQDQ0NJplMNsQw" "TD5FUUQ6nRbrqYkHtk7rhQJjG3jfPYjJDSTWdQi8GY/GuchB443P05tvzMzLvsJ2XXXns/L6" "Nmli+RFERAL8Lw0CY9MxIcEZKq5Mff/LEpnlh+c1duOBs083wBDC+nNkydKIrWkQHJsMILG+" "Z9fVj55/eUmmILekfMBgOYeFwWv49m4cVHEVkoEFVkGgefetT4uZ/JYFlSXZt2s1eWK6SItV" "bwg/55wcQRKHLHdmvm537haBMifZs7Q4hw1uJRWnhPdipFpaHbPz25UB4A+w9f0Kpi+5PgAA" "AABJRU5ErkJggg==") index.append('link_edit') catalog['link_edit'] = link_edit #---------------------------------------------------------------------- link_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnxJ" "REFUOI3tkd9LUwEUx7/bvXdT5+xON3R3WLhxuzlYaFILFHxwM6uHflgyE30qIXtZTxE99AOh" "pJd6kei12IOLAsF6MGvZD7KSRBrVxJzL3e3upqM1dbt67+2htIj9CX3hwPlyOB/4ngP8l2aj" "8Xq9BpZl+xiGOc8wjGl2djaWTqc7AMybTKaXDofDzvN8muf5qzMzM4Ojo6PLAEAAgNPp1JnN" "5itut/tST09PMcMwsFgsW0RRbNHpdPu6u7tr7XY7aTabiyVJ8kajUYqiqGeiKMokAOj1+jaO" "43o9Hk/a7/e/zmQyrTabjXC5XDWJRKLmYfA66mqW1aEQnjS3HGI5juvlef4FgGHyd4Immqb1" "Y2Nj/mw2eyebzQo+n6/UZDJhObuE8pUgqhztmipjMPx4XgzSNH0DQNMmQJbluXg8nquoqDBS" "FPWAIAj9wMAADAYDPLu06Dh2BGXWeiy8D/QxpanBcFjMybI8BwAbgBDP80mWZS90dnYqJElS" "giBAjIfRuCMJo5mGnBlGdcNJcnE8cFpIfv8iy3Jo84iiKKatVuvzeDx+OJVKlcViMSWVEpT9" "tV8n2D1d1TrNNN7cDcLeuBeZTyGisiR/7Vbw7QgAdfON/+pD4ECbobL+EePiIGee4l1wCrtP" "tCIvNyMy0v9RWoG76dyrH9qCy0PHdWur+X56ax2UlWmoyioa2jkoEo+ioggqd/pqgdxZACgI" "yC0lT5WzBxtKjN+gri8CGgKT9yMAFCi5CCzbt0GWpDPjF53OghEmbroXXF0BG6GNQl1PA1D/" "mmpBFHMQwlP4PHz5HlkIsJaXiiZvH11VFRWqovwqVcUfrwKKAihq1U/LQRhVWZnvXwAAAABJ" "RU5ErkJggg==") index.append('link_error') catalog['link_error'] = link_error #---------------------------------------------------------------------- link_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAklJ" "REFUOI3tkktrE2EYhU8zN8u06Uw7qeWrqEmMoQkRdGG6KGTRpl42FRfSLtIuCkVcZekNvC2k" "SFEQqjsRf0DRnU0LBhPtIgi6UtJrdCYtHxobJ5hM5pu4MUUL9Rf4rF7O4nBezgH+09I84vG4" "HAgELhFCrhBC1JWVlUKpVLoAYENV1azf7/cZhlEyDONuPp+fTaVSFQDgACAUComapt2ORqM3" "x8fHWwkh8Hg8HZTSQVEUTyUSiT6fz8drmtZqWVZ8fX1dEAQhTSllPABIknQ6GAxODQ0NlZLJ" "5FK5XB7u7e3lIpGIt1gsemdmZqDrOnO73fMjIyPhYDA4ZRhGBsAL/vcHA4qiSIuLi0nTNJ+Z" "prk1OjrapqoqTNMEpRSpb/dcjC+eoZReVBTlAYCBHQPG2Jqu69Wurq52QRDmOI6TpqenIcsy" "AKBSqYCct1q8PX3I1mYfK3rsO2NsDQCaBq8Mw9gMBALXxsbGHJ7nhfTP+3BYGZZjo84YSOcR" "9PVE8aNawfujzzvs153pP1vgYrFYRJblOUKIR5IkDv25ffHwBFjDAXMYHDSwuf0FqtyNt6sL" "yBXSdu5yTdypcTeTT443zh6bxMbXPOqODdupo87qcLlEdLcfQGb1JZZWMxa/l0HVrsJmNva7" "D8J2GFjDQXG7gM62Hrz7nEV2OfOxXsGJPROce+RlVcuC5Vio2Rb8WtjV7xtGrvAGC5/mP4jb" "OLn8ELV/jPRvwnda6MTTwcahq8iFbkBs6nsm2M3h66BOg9MKPBNwC3ZT/wUCkvljD8e10AAA" "AABJRU5ErkJggg==") index.append('link_go') catalog['link_go'] = link_go #---------------------------------------------------------------------- lock = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAopJ" "REFUOI1lks9rk0kYxz/vJH3bxLYbfxaapZtq/IGCiLd6EAQ9LC572N2bJ9mDLORW7B/Qq3+F" "0IPk4Nm7YEEqFjRaqzXEoiCRTeyb5E1m5nlmD+/WzdaBh3kemPnw/X5nIg6ser0+PRwO76rq" "kogc8d4jIn+r6jpwr1ar9cbPR+PD2traJRF5WC6XF2dnZzHGoKoMh0Pa7TbNZrOpqr+trKxs" "fgeo1+vTg8HgebVarVpr2d3dpd/vIyLk83nm5uYAaDQa74rF4sXl5eUUwOwD0jT9a35+vuqc" "Y3t7+32SJJVcLhfHcRz3er3K1tbWJ2st5XK52ul0avv38vuNc26pWCyys7ODiPxSq9VaY+5a" "q6ur11ut1qtKpYKILH0HEJHjxhiSJKHdbjcPhisizV6vhzEG7/3x/2XQenw7rO+c5fPXAiLC" "rxc2yAVHEE/wWTkn3N+8jKoyN9XhZnmDc3eeR5mCEPjj92tEGKJcgYifQSPITwEBxCE+YfVG" "H9QB8O7Bk/8sBPFAwH+pk588RhRNg05AoQRBYfAV2XuLTT+ifkBhsUawozGA96ABxNJtPMOY" "Q5TOX2H30T2CnmDh6g26Ww1s2mGmcpgQhODsOMBBCARxlM6ewcTHIFJkJLz4UmABS+nUIsP+" "JMEPIOg3gAEIzhGCgDg6LzfpNp6C8ehQGaUjCJbum9d0tz9kdlUJzo0pcC6jiqV0ukKueBSM" "5eStO5x0HvY+88OpeeK9iUyBhoMAC6qot3QbDXLFGZiahnwM6mGvS9pp4/oJMwuzBDSzPQ4I" "QZj88U8KP+WI4snsCc0EqIBNmUkTxI0IKlle3o8B7Ij3D+9mWXhP8O7f8t92RLKPJZL1KgD8" "A3KBmp11082qAAAAAElFTkSuQmCC") index.append('lock') catalog['lock'] = lock #---------------------------------------------------------------------- lock_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtRJ" "REFUOI1lkVFom1UUx3/35muaxFji2FbWDM00dVWxHSrDFhmKVhBlD7qHgU/DhyGNT8Xic30R" "6qP6IIgIfZA8TEEEUUGHowWprLbL6OqyEIrVmWLaJk2+fPeee32IrXE7cLjnwLk/zv9/FHdE" "sVhMh2H4tnNuXEQOWWsRkb+dc4vAXKFQaPbOq95mfn7+lIhcymazJwYGBtBa45wjDENqtRqV" "SqXinHt1ZmZm+S5AsVhMt1qtq/l8Ph9FERsbG+zt7SEiBEHA4OAgAKVS6WYqlRqdnp5uA+h9" "QLvdfnNoaChvjGF9ff1Wo9HIxWKxeDwejzebzdza2tpmFEVks9l8vV4v7P8L9gtjzHgqlaJc" "LiMirxQKhWqPuurs7OwL1Wr1ei6XQ0TG7wKIyBGtNY1Gg1qtVrnTXBGpNJtNtNZYa4/8z4Pq" "Txf8Yvkkt3eSiAhnH1si5g1eLN520xjhs+UncM4xmKjzcnaJkYtXVXcD7zn32nMoNCqWRPES" "OAVBAvAgBrENZif3wBkAbn6+8J8ELxbw2K0iQf9hlEqD64NkBryD1g6y+xtR+3ecbZE8UcBH" "nR6AteA8SMR26Re0vofMoxNsfDOHd0e5/8wkXy+VWWj2sdsBc3mOsbbuBRjwHi+GzMmH0fHD" "oBzSEVa3kqxcL7OayvDsk09x/NAwP5S+ZPHaH5yeOva+BvDG4L2AGOrXltku/Qza4kJHp93h" "i5UbnBoZQ7QwdmwSUYanH58A/NQBAO/wEpEZzpEZGQYd8eDrFzk39SJ/7dToU2nOPvIWANPP" "f8xDR0dRqERXgonAOZyN2C6ViKXuhUQagjg4S6OxRWlzgV83r/DO5Ke89+0FErF+PD48AHgv" "9B9/g+QDMVS8v3tC3QdOOP/nfXy/8h0To8/w1epHxFXAleXLgPpQAdz45LT31nS9sBZvzb9p" "D95LrRg/RgGhVyTwnFEt3v1gV/0DWQ+Ehc6w7h4AAAAASUVORK5CYII=") index.append('lock_add') catalog['lock_add'] = lock_add #---------------------------------------------------------------------- lock_break = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqFJ" "REFUOI1lkk1oVFcUx3/vvUySmSbj2PpFItGY+EFLaXGnC1HRSlHc6K7diAsRRrrKqgahLgTT" "TaFroZBFScFFoWCFLoqgIIpCO6SJjaKiYKJkzOTNm7n3nnO6eBrH9MLh3gvn/M7//O+NWLWm" "pqb6Wq3WmKruEZEPQwh479cCn1Wr1eXV+VHnZXJy8nMRuTo4ODhcLpeJ4xhVZWZmhvn5+VRV" "Pz13fWzMInzxOt8AdHV2bjabv4yOjg4755ieniZNU0QEM2N7kl354vfzf1jEBiKOva1bAWRZ" "dnZgYGDUe8/s7OzDEMLBQqHwPEkSjl/79mxl+dWEwYNex6boT5b/B/De7ymVSszNzSEix6rV" "6mOA1hGOmnI5gis/Hvn+h1Kp9NvFQ69sfHx8/3sAEVkfxzGNRoOFhYVHKyYpz4CvL+298CuN" "RrtcLpOm6e33THx845TdmtvJi9dFRITjn9whMY9JwEIe3gs/3d+NqrKxd5Gjg3fYdeZelCsw" "4+SJA0TEREmRiC9BI+jqBQzEI6HBd4dTUA/Avz/ffOeBSQCM8HKKrp51RFEfaAGKFTCF5mtk" "6QEue4aGJsXhKubaHYAQQA3EUa/dJY4/oPLxXp5em8B0A0P7DlP/p4bLFunfuhYzwbzrBHgw" "w8RT2bmDuHsdRIq0hb9eFhnCURkZppX2YKEJpiuAGMC8x0xAPIt/36deuw1xQFtKO2uDOeoz" "09Rnn+TjqmLedyjwPqeKo7J9K0npI4gd2746wzYfYOkFa0YG6F4q5ArUVgMcqKLBUa/VSEr9" "0NsHXd2gAZbqZIsL+LRB/1AZQ/OxOwFmQs/m0xS3JETdPfkTxgVQAZfRnzUQ38ZUcr9C6AC4" "Ng+vjuVehIAF/ybCyo5I/rFE8rMKAP8BjA6X1u+crM8AAAAASUVORK5CYII=") index.append('lock_break') catalog['lock_break'] = lock_break #---------------------------------------------------------------------- lock_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAs9J" "REFUOI1lkU1oVFcUx3/vvpf5eKZhqkmjGamTMNaiIKVCIYWKYl30gy5UCkUolC6kMl3U0Cy6" "kmzdu3MhhFJmYUuhKLXiF2hbLAbbCTF1Mh1DpTJpJ/FN5s28e8+9XcTEqAcO5xw458c5/+Px" "jJXL5d5Op/OltXZURDYaYxCR/6y1N4FTpVKptb7fW19MTk6+JiLn8vn8cF9fH0oprLV0Oh0a" "jQa1Wq1mrT00Pj4+9RygXC73ttvt28VisZgkCfPz8ywvLyMiBEHA4OAgAJVK5V4YhrvHxsZi" "ALUKiOP4s6GhoaLWmtnZ2bkoigq+76dSqVSq1WoVZmZmHiRJQj6fLzabzdLqXLCaaK1HwzCk" "Wq0iIu+XSqX6uuvqExMTb9fr9elCoYCIjD4HEJEBpRRRFNFoNGrPiisitVarhVIKY8zAUxrU" "r3/iblZ38HApi4jwwa5b+E7jxODMimstnJ16HWstg5km7+Vv8eqx297KBs5x5PB+PBSen8Xj" "HbAeBBnAgWjEREwcXAarAbj3zY0nJzgxgMMslAnS/XheL9geyObAWWgvIY/+JIn/xpo22eES" "LumuAxgD1oEkLFZ+Q6kN5Ha+yfyFUzj7Ei/vPUjtu6ss3Jmjs7BEMPAL6dxTAA3O4UST2/EK" "KtUPnkW6wu8LWdTln0kWA/Z8/BXp4V3Ed35k+vpFLh6IPlcATmucExBN848pFiu/gjLYjqUb" "d6ld+IniviNkqlfwzn5EOPcthW2bENwXwSoAZ3GSkNtewA83gUoYOXqMEW249OF5MpuH4d0T" "a28NTm7Bd17hMSABa7EmYbFSwQ9fgEwvBCmwBr8vTXvqBzZ8f5xu/A9tIHrkIz4P1gDOCemt" "n5Ld5uOl0isvVD1ghZHD/UxfO8/WF7MEfg9Rw/DXQw/n7GkP4O6ZN5wzekULY3BGP3azFpN/" "A5buNyEGl3Fkco63vrbe/yofh0wa2D2lAAAAAElFTkSuQmCC") index.append('lock_delete') catalog['lock_delete'] = lock_delete #---------------------------------------------------------------------- lock_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvVJ" "REFUOI1l0t9rm3UUx/H38+RJs6RZ2tltlVbapU2NOtEWJqPiLtReKJMhKnihoCIIQm6krH9A" "wRu9EUQU2WUHkovBQIShXsisc7BhNs1ao2kstfZH2iRNluTJ8/2e79eLutLVA4dzrl4cPhyH" "fZXNZuO+7583xkyKyANaa0SkYoy5BnycyWTucqCce8vc3Ny4iFwaHBxMJhIJXNfFGIPv+5TL" "ZUqlUskY88rMzEzuf0A2m423Wq1fUqlUKggCVlZWaDabiAie59Hf3w9APp//MxaLPTE9Pd2+" "B3gA7Xb7/YGBgZRSikKhsKS1fi4cDv8TCoWo1+sD1Wr1p5GRkYHxpJ8ac/Ktc5c/pLn1A/ir" "b3kASqnJWCxGsVhERF7KZDLL+65cnp2dnXJ2vrtzaqyP6NE36UlOUCulWbhy4SMPQESOua5L" "o9GgXC6XDgb1xvjFiUTydRK9p6gUF+hyAg4nHiTeN9TjLF99x14rptnYiSIinDt5g5BVWNFY" "rXFsnd7UGXpGXqCz9hXtbYfN31sE7c6237n7tIe1vPbqszi4OKEoDi+CccA7RKt8nU4tR8/o" "WfzVL3C7NOH4MJHmLfx2ZOr0B98WPCsasOitLF7kKI4TBxNmfbUEjuH44y/jr36OG9YE9STb" "8zfxm5tMTC/mAFyrNRgLElDL36R25wbrywtUKx2OnzxLsH6BUJelUx+mfPVn+p9/G6Nae/m4" "ViuwFiuK3vTDbAYulVoUZYdY+/VTDD7NyiBb89c5MurgdSewKtgHKIW1AqKo/pbj1u2/eOyZ" "94is/Ejh8jy5KxUWv/keN7SD6xkwBqvU/QDWYCWgd+wEfyxtEOS/JvnkGbq702zcXiR9eogj" "o31YHYCx9wGeVQEYg9EBtXyefGGNT778jKceOUHsWITJR9ME63+jmg0ODyWwGKw+AFgrRB56" "l+hwiItTEfAOgRsGIxC0kXYDUR2skd28tN4HBB2WLp3HKoXVGqvVf633JiK7jyWyuxvZA/4F" "qDGpKMiksH4AAAAASUVORK5CYII=") index.append('lock_edit') catalog['lock_edit'] = lock_edit #---------------------------------------------------------------------- lock_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAttJ" "REFUOI1lks9rXFUUxz/vRyeZcRyGmDI1E3UsY2sNllAUG4uIoIJYXPhjKVK6EHEWYkiWCsGF" "YHb5CypZyECzdSOomBrBaLNwJKaZjuNApYw6mbw3897ce8+9LtLW2H7hyzmLw5fvOd/jcQj1" "ej2fpumCtXZORCaMMYjIP9baDeCzWq0Wcxe8283q6uqsiKyVy+VHC4UCvu9jrSVNU7rdLq1W" "q2WtfX1xcXHrHoF6vZ4fDodXq9VqVSlFp9NhMBggIoRhSKlUAqDRaOzmcrnT8/PzyW0BHyBJ" "kvempqaqWmt2dnauR1FUCYIgk8lkMnEcV7a3t28opSiXy9Ver1c77CAE0FrP5XI5ms0mInK+" "Vqu1D820l5aWXmy3279WKhVEZO4eARE56vs+URTR7XZbdx9KRFpxHOP7PsaYo/+7Qfu7C26j" "eZKb/SwiwmszmwRO48TgzAG1Fi5tncFaS2m8x6vlTR5/96p34MA53nzjBTx8vCCLxytgPQjH" "AQeiERNhvQV6wx6fnF9m94vv/1vBiQEc5q864dgknpcHewSyRXAWhn1k/xqp2md68hRvX36f" "j5Q5JGAMWAei2Gv8hO/fR/GJZ/ngyxWwCuUEpTUPTpzg1LFniNIBHyY/gMPDw4XOaHAOJ5ri" "yRP4mUnwLMYqXpp5B3EWsYLFcaPf4cnpc8Qq4alPv1WbbpQJndY4JyCa3i9bBGMFiqfPkRqF" "OEv772toazBWo0WzP4qYfeg5Yj0M9z5eT0OnNTiLE0XxsQpB7gHwFalJMWIoFR7GWEGc5c/+" "H0zkj/Fz5wpXdte39YAzodMKrMUaxV6jQZC7H8bzJCbl0sYyyo5IjeL45Axnj7/Mj+11mr99" "RdBntrXCKHRa4ZwwNn2R7CMBXmYMwnEunz0CVkAlSBLx/Odv4flZur3fWR4EPL1iRwcpqBHX" "1xZwWt96HH2L5k5FhDiI+HrvG9YGHr6VOzH+C3Vbr9eDoK5oAAAAAElFTkSuQmCC") index.append('lock_go') catalog['lock_go'] = lock_go #---------------------------------------------------------------------- lock_open = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnVJ" "REFUOI1dks9LVFEUxz/3jTpab3KiMaQJs+yH1KK1BQVBizZRq5CEihZGiycu2oh/QNCqTbQT" "BSFchIsWLaJNraIoqMlJJSh9SDTga8bxzbz747R4acNcONzvPdz74XvOPYq2NTc3d0lEJhqN" "xohSaq/W+pW19nEQBK/b7wKo1sPs7Ow93/efFItF5XkeAFtbW6yurkqlUrk/NTX1tB2Q2REz" "MzPDvu8vFIvF7NraGuVymfX1deI4pr+/X9Xr9Yvlcnk5iqKlVoC3I2q12ttCoZALw5CNjY2x" "IAhUEAQqDMNbKysr9Pb2+qOjow/bHXgtOmuMIQzDzYmJifmd5PT09BxQqVarqq+vz28HdOw2" "Q6mMtRbAtl+anJzsa8/tvgP48eaOvPh0FuMU1lqunnlPRjRiDWLS0IlZtNVoEaVueMgVTwzD" "4x9V6kCE8dsjKDxUpgfFFXAKOroBAav5Oj92TSl1DeD49YesPgv+lyDWAIKpLNCRLaCUD64T" "evIgDrb/cPz8BZI4xJltcA5Jmi0AY8AJ2ISo9AHP20v+9DnWXj5C3EEGLlwmKpdI4k1yg/sR" "sYhOWgEaRBCryZ86iddVAOWwTcvnSg8DJOSHjtKoZxGzDeJ2AR6AaI2IBavZ/PKJqPQOPINr" "OJpxEyQh+rZEtPwzLdc5ROsWB1qnVJuQPzFIZs8B8BKO3RznmDZQ/UXv0CG6qp2pAyftgASc" "w5mEqFQisycH3T50dIEzUI2IN3+j6zVyA/sQXFp2K0DEkj18l54jGVRXNv1CrxOchSQmF9ew" "uok4m/bLmBZA0uT78wdpL4xBjP4XZnfH2nSwrE21Swf2L2AqbPdkPyL+AAAAAElFTkSuQmCC") index.append('lock_open') catalog['lock_open'] = lock_open #---------------------------------------------------------------------- lorry = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAc9J" "REFUOI3VkstLlVEUxX/f163IULg9lDSwB1HcHKQgBTmKHgg5DfoDIpCgv6BoVCBE0Kwgp0FE" "g7JJhBTYg6BoEOI18CJcJJCQSrp59qvB/byRBA2jPVlncc5erL32gX9d2fT4xbq797gbZoqZ" "oCqophaKJFTSk5Grz0+tFSi5e0/n0WEijDAnXHE3wpQwwU0JU949Gj/5JwclVcFdWfmyQJji" "KrhJEzXhmtjYsYNb7WOcuGJhaqiauejo1PXTt0uqia7KyF9ntWeTXD47gHlQX1xed/P+22tA" "U+DS4zlmFr5hydFkWDJ0xVr8QPdmVJSkwcHeMv27y9y4+3oLQElkhfPbp/iezxeWBSusr/K2" "rb2cqw/SsSlj/tMS+3eWkSS0BFwSlhpFo7QaXVMzSBUkCaLOdH2ZRrJfAin9wDSxob2rmbgW" "ybsWGzBCBU2CaLCnsw2xQEWb/+DM8UMR4bg7EU4U6BFNHgERzOX9RATh0cQIZt88zPJ7T99n" "HxakVt57hO6+Y8wsZo3egWE6dh3m4+f1kxMv57KJV7Vs+sWDjKWZ2lDfNgb3tZN/nZ0EyAAq" "lcpQRIxFRCMi7uR5fqE4j1ar1erqKte8++3uP66fa6179WmHBVcAAAAASUVORK5CYII=") index.append('lorry') catalog['lorry'] = lorry #---------------------------------------------------------------------- lorry_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk5J" "REFUOI3Fkl9ozXEYxj+/7cw2205GjE02LZl/Yf6tKRcYrexWuVGS1CgXbtyQK5Za4mJF4Y4S" "hXFzkj9t0xIic1JkrU6nsYnZONv3+77f18U5ZknNne/N830u3qfnfd4H/veLkpePpEIIVSEo" "qoKqR8Qj4ibRe4d4l2g59XjnnwKxEELVvM3NmCmmAQtCCIqpYOoJKpgKLzov7/ibg5iIJwRh" "YiSNqRDEE9RnURxBHIXxBVwoO0PTSTUVRUQ1eGntbt91MSbiqFjeMu2u+ugBJ/bUo8FIDY3l" "n7/x/DSQFTh+7wNv06OoC4hT1CkyoZO8rrIE8YITY0V1OWsXl3P2Wu9sgJj3Exyc282PvIGc" "ZY/mrP/iM+dUcyC1gXhxxMDgF5YuLMc7z6RA8A51mdygnxwM4rJBisc7j5dAMjVGxulvAefG" "UXHMKKvIJi655IPkLqCYeCpn9XHz4W3GMl/oeuaIly7K9mD39jVmFgghYBawHAazLDcjvryC" "pTvrWLdsPQtnL+Hhm1v09nXR/364Pe/6/ZdRX9r3l9c2ULlyK2+Hokx1fTPxmk28+1zw4O6T" "D1Febcn4mrrVaJ6yekETGnkaVjUCdigGEEXR3p6enjNmljGzS4lE4nDu3wrwdexzUUFUSvOy" "/QAc3XaRztcdRNwpigEkk8luoHHK2a9O7cDwyMfxN+knRa/S3RxrukJbYh9F+YUYNp4/bYOA" "yvWlxaNuaEtNRQ3DP1KMfP9Ez6suvn2dOBf9iwDAxtb5bURRawRlBqOYdTztGDz2E9OrkCfG" "wX5NAAAAAElFTkSuQmCC") index.append('lorry_add') catalog['lorry_add'] = lorry_add #---------------------------------------------------------------------- lorry_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAj5J" "REFUOI3Fkk1IlFEYhc/9vilN0Ril/I1xalFpi5JEwTapFRO5k8JNtAlBoqhVLQo3GQgRtImC" "hFZBBC3KhZOIlUabIkLUCCfMcTDEwp+c5t73p8V8jRBB7rqbc8/ifTj33Bf438dM9F9IikiV" "CIOZwOxA5EBkc+qcBTkbb+99cexPQEhEqrY3x6DKUBaoEEQYygRlB2GCMuHd0/6jf0sQInIQ" "IWSWUlAmCDkIu6yShZBFXnEF7hb14UgPKxODiFkcdY/ePHEvRGRRVtv+z7fyyDCuddaDRZFc" "WPVvP357A0AWcHUgganUCtgKyDLYMijDOb+nshDkCJYUdZEwDkTDuPXwTQkAhJzLoGvbKNa8" "mSCyAwfRf/uC0gjOJhtQvMVgZv47dleH4axDDiDOgm06GHS5QSGbLZIcnHVwJJhIriJteR1g" "7U8wWWwuKss2TkHzQsEPMJQcDq8Mwl2/gmhqGrakHC2ZRkwBMCfb9quqQESgKtBARTXrVdFU" "JIjVVaC2tQN50TqkP8Qx/vI5lj9OnvceDb034yn3ObyrCZX7WjC1YNKR+hiKaxrxaXHT8LPX" "CXOQZxN7WzuQPz0C86ATBYkn2FlTCoZeDAGAMeb02NhYn6qmVfV+PB4/F9y7AcAXE80vjwLH" "L60vUE8FfDU1ZiP7PtjmzzZ3nqku/DKATHoeawBWln1MTmPO3wigq6F867evqUPeZt9z/g8s" "LSoSKY+ZtG9DCQDg1akdl9cWU12emIh4OifQO7Eh6f0FhlqO4Z3FS5wAAAAASUVORK5CYII=") index.append('lorry_delete') catalog['lorry_delete'] = lorry_delete #---------------------------------------------------------------------- lorry_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnhJ" "REFUOI3FkUtoFGYUhb95aDqFMR3RmJhi0cZEY8UaCwpB0UJ8gJZWEWlduCoFBbtwo4iimwqC" "iOKiSslGtEXsQqUIIsVHFkabEEp9ocwkMcRHxKLGTOb/78PFxFQk0KUXLofLhY9zz4X3XYlb" "rT/2mVmtmaIqqEZEIiJhVGMMSAwX1vx0ecW7gLSZ1VY1r8JdcTXcBDPFVXCNmAquQue51uVj" "OUiLRMyE0vN+XAWTiGksqwRMAhUTajia3U/LHnUVRUTVomxuO7D6WFokMKVxzf/eqpf+ZPe3" "Tag5fQODqcOnO/YBZcCuP/Lc6X+JBkOCokGRko7OXzc+ZPvn7WioY9b0acyfnuPgr9cmAqRj" "LPHD5DaGkj0jliM6Yt0k4BaprHFyM1bT//QCPY/W0fBxjhgiAMkYS1gMaCgiI62hiIZhNAwz" "rqJI5bQWJtTMJzVwiULhJl35p6OAdAjDqATGZ6eUE5eR5E1wfUUy0U120kfoi7NUz/mOoVvn" "eSZ1SJQyoLXtCX71KGaGu+FvFGd9Sw0rN2yF4U6unzjDou93kBxo5/iJLpLd6fIJpy52Jf7p" "j4Xcp4uY+tmX3BlIFD9pWsW8L5pobl5MNjeElQrghg7eYMbSbWxc8Ips6f5lgBRAVVVVR29v" "7+x8Pn/P3fc+6CnUblrilTMXflWRsk5cnjG1cRJuQ4z/sIJMZg714/4+99uVR+cTY/38r58X" "b5nc+M2R6voMOngd90DH77dZsG42iVQlZFZw45edTxJiy8YEtB9a2Dd348naVLIbl38Bf2ub" "JJVp4PHNLu6e3Xs6PRYglsIHHcfWFt28HKoZ7s5/s4MZmFe/BlW1lIjERNKoAAAAAElFTkSu" "QmCC") index.append('lorry_error') catalog['lorry_error'] = lorry_error #---------------------------------------------------------------------- lorry_flatbed = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWNJ" "REFUOI3tkj1LXGEQhZ97Y6OQgB/YiE3AFIsG/AILg2BjE7G2Si82+QNpUgQCaUIKEUKwFxG1" "sBLESEBMlSCuGDeFksKAsJh7974z846Fq6LVgoVNTnPOzBwOMzDwH/dG0qhx4u2mRzNMDVWz" "KDrz9cPL+aZGA0yUN9MDWHSOT88ffVz8/g6YTxsNUFGCOm2trYw978ZE2gAaDpAgPGlO+Hl4" "jPllDdC09+X1sqlMiRSEkBNCTq2WURQZRfGPWi0jhJy5IIhGshD5/efvTYCpTLUPjd2sGjIk" "q6JZFQ35df/TuiDqPO1sQcxRUQCSV5MvPEYjRiOaYVHrus7RiDFylPbj7nj0S3bnYGclSRdW" "t5Ldo7NKc1cf7c9G+HFS5F1947R0D7J/mm6sbP9K1r5Vkr3tpYSz/cpobwfDPY9JqwcbUP+D" "Uqk06u7v3T13989pms7W9Uy5XC5fnXHHd2v2cLgAs77lq9cfzooAAAAASUVORK5CYII=") index.append('lorry_flatbed') catalog['lorry_flatbed'] = lorry_flatbed #---------------------------------------------------------------------- lorry_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlBJ" "REFUOI3FkstL1GEUhp/RSWFEcUynGlMxkTJblBQF1SIrQ8hFm6CVu4I2/QMVRTcoIiiIatE2" "inZRCzGxkGqh1SLES45oJoYY3XR+833nnK/FmAspateBw8s5i4f3XOB/R2zw7okpM6s2U1QF" "VY+IR8QtqfcO8a6r4+KzA8sBcTOrTu1sJwQlqBFMMFOCCkE9pkJQ4fWju22/cxAX8ZgJua/T" "BBVMPKY+r+IwcRSXreF26WX2n9GgooiompfjfVcP3omLOFZt7PjrrNrbw+kjLagFpmZ/FF5/" "OHAJyANOPc4wNP0ddYY4RZ0iOV2qN6RLEC84CTTXJdlSn+TavVcVAHHvcxyr6mOhYGLRskcX" "rf+qEyvruFHxlPv983SueEJz7Wq88wAUeJ/DvENdFllMdVnURaiLMB9h4onEsbayiRu9e+h/" "/3EJEHcuQsVRVLoqv3HJb/7Wty5CoceZ4L4MUV3RSNPq7XyP5rnSsw3Vk/k/OLxvcwjBMDNC" "MMKiVh9Nsr+5Ew2GmmIEZr5OkSxJ8TLTzcDEc6wgKi940P029m7ajycbdpDe1MrQbCxb19JO" "JA4NxsTcKONzI4zNDvIlO8fE5zE21+xmfXor37LMFQKkUqmBycnJpkwmMxpCOJvJZNJV26Wm" "MdVCoqiMRFEZJcXlLLgFKkvTvPnwgt7hns9ZZVfsT3c/dLPeIudw5ojE0VDVHNuxro3+yRd0" "D3fNOGXvzCUG/whYHhvPxea31bYmekeefvQx9k6fZxjgnwH1J5nXUJjIoes+XWD8V/8nXlaN" "tvKIa90AAAAASUVORK5CYII=") index.append('lorry_go') catalog['lorry_go'] = lorry_go #---------------------------------------------------------------------- lorry_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqdJ" "REFUOI3Fks9rXFUUxz8veclLHTJk2kzGTGuGxsUYQwIVRDCBWUg0QYO40bipLlJKzcK/QNtV" "JIoI7uoiWzeSCipiF9LBBEVIYSAMkkUgYea9xA5tOs6bybv33HtdJMYfFLr0bL58F98P33M4" "8H+PV119v2atPW+twRjBGI2IRkSdqtYK0er2/HL5lf8CfGvt+aGpOZwzOGNxVrDW4IzgjMYa" "wRnh7jerLz+qgS+isVZIHoY4I1jRWKOPVRRWFEF6mJv9HzNzwzgjBhFjrJb31j997QtfRJF7" "dv6xu5o7P/Lh289hrKN2r9X9+VebHwHHgA++2+G38A+MsogyGGWQxJz6Z/IpRAtKHOOFDJcu" "Zvjsy1/OAvhaJ1zNrtPu2j2prDEn1f/yT5wrcKX2POkzHrv7DyheyKCV5hRgtcKozklQnwat" "qONDikYrjRZLtdaio8zfAKWOMKLo7c9hjXDUOaK626Le7mdwaJj9cIcXujt4KubO16sMD53j" "17v3ueAnPDUzk/JX13/H/XQTay3WWUxvhpdefZPL775FHMfUak/zw/ffcqlnk9fnFznT10cU" "RfQFm9xu9F73AMbGxnampqYuttttstmse2dx0ftkeZlms+ny+bw3MTFBFEU0Gg3CMCSdTrO0" "tMTa2trDLgDP8y5vbGz8vLW1tZfJZASgUqmUW61WZ2Fhgenpaebm5pidnaXZbJpKpVIGGBgY" "CHyAarW6Drw4OTl5LYqiZWCgWCwmh4eHPSsrK6RSKQDiOMb3fVssFhOAer1+5P3zWcbHx8dG" "R0fXSqXSkyMjI9b3/bMHBwdsb28TBAGFQoFcLoeI3N/b2+sql8v7/wIA3aVSaSKVSt3K5/PZ" "IAi6nXNdjUbjiud59cHBwVtAT5IkJgzDe3Ecv/EnFaqXBld7GvoAAAAASUVORK5CYII=") index.append('lorry_link') catalog['lorry_link'] = lorry_link #---------------------------------------------------------------------- magifier_zoom_out = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjVJ" "REFUOI2lkj9MU1EUxr/3+vpKBS1Q2zQtCf4ZRKLGBf/FpIk4diLB6ODkYkIcHVgk3YyDi2l0" "cNEYSSQaBwYZgGCMidaJCFKtASRpq1Re/7y+vt57z70OBCIpoMZvOWf5fvm+kwP8p7SNRSml" "T2dZShASkkRUkAQXMscFjc/1dQwlNU3uCFBK6VNZNtXuQ7xjjwZDV4ACXKGwUnTxbbU+szQd" "uZBMNkN0AJjKslTAp+LhNg0uJxRtwneb4DCJAyE/wgFvPHh6MbVdAh0ABJeJTr+GaoPgMAUh" "FYgUakxhrU6IBf1gjBI7VhifrdLxmKmv2gSSClIBJBX6ntyBx7Ig7RqobIPKFVCpAlGyreCX" "2U4AMACAcQGpTAipICVAan16LAvOmR5IJkBMQLoM1OAw7j7q2EiwDmAi53LZZegaHCE3E9R1" "E97nM6ByBVqpAirb0OwapOO6Wyo8fp2/H9pnXj8UaYXlEGpMQkrA59XQ7vcg/akAe2HSPWaN" "ney/NZFpOuLXycjQYqE6M7dcgtcDhPcaCAcMmLrC+/kC7J8FXIz9aHEZe/Py5rkj2z7SyIjS" "W09kUozLBCMRFZwgOOWD7hzrD3w82HX0FHKZND6nJ4q84Z6/+iCT2QLYSc9GBk2zkR8NdfcM" "dPeexcrCO8ynJ4rXHi6HNivspkvJMcZ8a1eW5t++WPjwCuGuw2C8sb+pwh+TDPaaVltp1DBb" "BpyqdfvGU2v4b72/QeC5dzkY/WfjbvoFjJUuNZxE0wgAAAAASUVORK5CYII=") index.append('magifier_zoom_out') catalog['magifier_zoom_out'] = magifier_zoom_out #---------------------------------------------------------------------- magnifier = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAfpJ" "REFUOI2l0j1oU1EUB/D/+8h7jbYkNSaWtFDFQe3gpqIIARVcMhUqOjg5FkcHpxAn9xJwcLag" "IA4d7NCUgggawaUJjaQ0tZCmNTaFJK/vnftxHKzR0kRF/8u5y/3dc7gH+M8YPw7MbC5WKCcV" "0lrJpFQaQuqakGqueGF4OmsYui/AzGa+Qvmoi9TwEQO2yQADvmRsNHx8/rK3VF0cuZbNHkZM" "AMhXKBdxOZUYNOALhUZbYaut4JHGyXgYiUgoFbu0luvVgQkAUuj0sbCBVqDgEUNqhlKMDjF2" "9hRGY2EQqXRfQEiZtEzAI4bSDKXxHdGMTqDhhCwQiWQvwAYAEhKaHUjN0BpQ/LOyBhQDvpA9" "f8EEACJZ84WGbRr7L6NbQ7YBzxeQgdjuDwg5V93yMOSacCwDar8T1zYQDVtYXm3gROdjdOHR" "zTM9gdWFkem1emupuL6LkAUkhmwkIjYck/G+VEf7ax03RrcHfKI3rx5cOYB0FymTYfPo+XKO" "hE6TkkkpFKRQmzG/SNcjy6fGzl1ErVzAp8J8QwT+1btPyuUDQL88z0w5TrA5Gx8/Ozk+cRkb" "K+9QKsw37j1dj3dH+F1uZV8QuTt3qqW3L1c+vEZi7DRIBMcPjfDHTqYmnObg7qztDEx6rebj" "+8+aD//27i8IrJnbsZ4L9c/5Bsa3EGXTJCwlAAAAAElFTkSuQmCC") index.append('magnifier') catalog['magnifier'] = magnifier #---------------------------------------------------------------------- magnifier_zoom_in = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAj1J" "REFUOI2lkk1IVGEUht/7M3ecURsdf5kGRFtYLtqEQT8gGLSalWHUIgjaCFK0cREthtkFQZtB" "atHKRYJCtHCRCzU3UU4RVDM4ZThqqaU509zmzr3f32kRmWZa0bs53+Y833MOB/jPaD8eRKRP" "zbFBIRFTUkSEVOBCLXMhx9Kdtf0JTVO7AohIn5xjkzV+dNUGNZg6AQS4grC07mJxrTydm2ru" "TiR2QjQAmHjr3Q75qa+pSoftSbicIAnw6UC130Dy1VWU3CI8l7lDZ0YDWwE6AAiuYuGABtuT" "cBhBKIKUhBIjbJQlbKeA7oZ2uCWv4lcDEwC4EBFDt+AwglQERYBUhJH5AdilPJp8VbA9B3W+" "IE7f6iJW9vKPrj8JbxowLqAI339WP+uX4mecqG9FNBhCsfwV+0PV6GxrQdnxarcZMCaWXa6i" "pq7BEWrTwOCVGMu8QNgKIBoOIb3wHosf1sDK3N0O4GIs99Hpa2uuhJCEElNQCrh4JImagIEr" "Q93YFzCQW/yE5zdfalt3oAPAu4nm/vlVezq9UIDPABqrTTSGTFg6YSazCuWZmJ6Zhd8V6sHA" "8fbfHlI8Tnrl4ewg4yrGpIgILiG4XKlz0+xU6HVr9NBRLGdTeJMaX+eee/LCnWx2G2C3jMR7" "LctbGW5oOdjT0nEMS7NPkUmNr1+6u9CwOcJeOZsYZcy/cT6XeXx/9tlDNEYPgHGvfscIfzTp" "7bDyVYVh06rocez8jcv38tf+tncLBEbyXF3knxv3yjdITycgxqAhSwAAAABJRU5ErkJggg==") index.append('magnifier_zoom_in') catalog['magnifier_zoom_in'] = magnifier_zoom_in #---------------------------------------------------------------------- male = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiFJ" "REFUOI210z9oU1EUBvDv3fu0L+lfqE2CRaxUKoIiQgcjiJPgYEChQ0dnB6duQkFB0KGbpZ1c" "dSmikaJ28g88BDuIWmlUtK1CW/AlTdo0755z73FISQUDEcQDd7v8uOf7uMA/jtfqwuTTaJuZ" "YZnBlkFEYGYYIty8fCzhtwKIGLlTvYEIICJwAESAuw/f1QBAtQKYCYtLRbIisAK4nWOI8VfA" "2MX+xPxi6V4UbVongHVAXDNCJl4BgMYKIuJNz0WjzJIjy1lLBGYbkqX9xw8mT3f1dOhSqeI6" "ujqVFcAwoQGIiDf1rHjtUNofz3TvUUGbVg6Cra34gNbaa0sEauX7Os+GS4/PDfdfyKR6Ne+s" "4APA5Fw0Opjyxwcyga+U9kQAT4D2Tl+LANWtqpsNl19TbK4+evH5PPFHZrK7ABPnMt2B8jzt" "ra6Xeb5QssSEk4e7dTqzz9+uxWJMvDw9dnYFQOL3jBQAEFN2b6CVE+BNoWjXKtWhqFgZCt+v" "WueAZLJdEVG2Wch1wHCjHiYD1GrYBsBEcAJYSKO2pgAzhZubNecEODHYoxOBLnT5Uhg+mtJO" "gHJxw7GhsBlQzyCm/Ncf5ZEjg20qlenzc+k+X1B/EZlYFr6sOUOUbwZoAHj+4M6HgSefRCyd" "CXwHXyvPssVG9NO9XViyr+a/3Zi5fWkKuP4HsPuZRLwrEy9HY+acJc6SNWDmkJnyM7dG7teL" "/Q/zC+aEQljYbuTNAAAAAElFTkSuQmCC") index.append('male') catalog['male'] = male #---------------------------------------------------------------------- map = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAr1J" "REFUOI1lk8uPFFUUxn+3bj26Z6q7q+meaZhheBjwFSFGEzeaGMcNAXez1bhl5UII/4J7V8aF" "JC5cwNYoiWJMJEYSwxijwhgRBtLA2HSgum89blXdui7mReCsTk7yncf3nU+cXDlxuTfoL0sp" "eTIET4fYqQmgMjUPNx7+4PYG/eUvPj2PcARVXT4FsNgtWFoqQGCtg60tFsPZc2eWXSklhgpR" "fkXy3SrdyymjcweYbYWsrf3M9eRz7o1iWq02G+MY6XpMkpwPT1o8V+Jsz4vjMfFLPhOlSC/9" "hVL3UUoh9Co6m5KlU4pMkWWKKk8QogYE7vZdnc4c2JKZj/bAJ9cIVvrM71ugWd4kq47Silr4" "0sH1fFSaI4QGxPYGgjiOUWrK43nDpFuRXfwHTI1Nf6LUinSaUOoUnScUOkUIC4DLzgbzYEui" "Tpv49Mt0PxtTvb2PoK85UIzxwiVmAonne0zTApiAAGdbsDzXJColnsRMZw2Pnof8y3+xJscp" "viHPFIVOyBNFXSRbqCc4aDYjwnZCp90GwHv/EM2Pr+Cagyz0/iRvZiyGvxP4I4rsNtL5AAG7" "DaZxglIaSPh1+IA7pcPgiOGF82sMTyUM5NfoyY9EM8cJro4RvRQBOIjND2tHe6ER8Vtacbvw" "iKI5Hrx7kP1ul2y0QBROWFxv0Pz+Bnd8g/X8XRKttVy9e4vV4Q3CsEWe5yiVoLTmlxcdjl24" "ibq2zrDrcf+155h4giU/2GwggLRKGJmSwA+ZbXbIdUHYCOn8sc7+eym+B49eOcbdwz5B0GC2" "0GB3ZBQI4dCiTSZSAtNkRoQMrv+HP8y49eZx9BHFW1ce8/fSXmTgATWmrDZJrCqDMYbFPa+y" "2GNHHnEUeAf6YqvyRs3rskQ2fKQjMbWhMgbx3sqpb+cG/RPSc5+x7LOG3k2qyjDaGF36H5Ym" "NqAIJJ/WAAAAAElFTkSuQmCC") index.append('map') catalog['map'] = map #---------------------------------------------------------------------- map_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAt9J" "REFUOI1lk81vlFUUxn/3/Zhh2ndmOh90bIuVRKtAYmFjYhqJsY0JgnHTrcSwc4MLMfwLsnZh" "lIUkLty40ASCRIJGJQQTI6RYaiNIpbS0nRnxnbn3/b7vdVFaG3yWJ3me85zznCOOzh650mg1" "p23bZicET0Js1wSQ6ZzOeuc7p9FqTn/20TmEJcjy9AmCwTymBakEBMZYmNxg0Hxw+tS0Y9s2" "mgyRfoG6fIPalYD26XEGyx6Li9dYUGdZbfuUyxXWuz6249JTEe8cNbiOjbXVz/e7+PsL9KQk" "uHQbKR8ipUTEN4jDPmHQJwklYSjJIoUQOSBwtuaqVneDSRl4rw4f/kpxtsnwyCil9C5hNkF5" "qEzBtnDcAjKIECIGxJYDge/7SNnnn2FNr5YRfnkHdI4JfiKNJUFfkcYBcaRI4gAhDAAO2w6G" "waQMVSv47x6g9kmX7NURis2Y8aSL6z3NQNHGLbj0gwTogQBrK7AoilEywO/59Ac1j56H6PM/" "MTrCSi4ShZIkVkRKkifqMWvHDkqlIbyKolqpAOC+vZfS+1dx9DOMNuaJSiFj3hzFQpskXMK2" "jiPgP4G+r5AyBhS/rKxxP7VoPad54dwiK8cU68ufcuv+MjIMScI+Lx0obgogNi+sMvQUvSzm" "ZhCwlLjUa3XWZgQzFzPO/5ETljtMHz7MnvoE389/zY+/fYXKK5spGGP4efkeF+7c5sHfXaIo" "QkqFjGOu7zMsrK1yaN9BtKU5OPI6WqS8/OIUnXwJSwBBpmjrlGLBY7BUZVdxEG+Xx95lnz0P" "VmirLq7weGv/SQBOzZzl2eFJDPlmCkJYlKngiTJFXWJAeLQWNhhdCbk3NYnf7zK/eo0zl08A" "cObbE9zdmMPCwskyjdaasfohxhpsxyMmgNegKQRvrPtcn7vA1OQrnL/1MQXhcPXmD9QZR7w5" "e+yb3a3mEdt1/veyO/Ew/51O/hc5GRYODcaxNmqX/gUD0k0LyUCAvAAAAABJRU5ErkJggg==") index.append('map_add') catalog['map_add'] = map_add #---------------------------------------------------------------------- map_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAttJ" "REFUOI1lk0tsVVUUhr99HvfVc1+9l96WQoWkBV8hzh0Qy4QUZ3ek0Tg1DhyAwZlx5tyRcSDR" "gRMHGqNIxBotaGpChBApaVJoUVtaL7dw7tl7n31e9zgorQ3+w5X8a/1r/f8Sc93T861Oe9a2" "bfZD8CTEXk0AaTbkwdaDH51Wpz37yYcXEJYgHSZPEHLyxzSdSECQ5xb5MCcn453z52Yd27bJ" "SBHJ56jL12nOa3rnpxipeiwv/8pt9TEbPZ9qtcZW38d2XAbK8MZcjuvYWLvzfL+P/0yBgZTo" "S0tIeR8pJSK6ThQGhDogDiVhKEmNQoghIHB296rXD0CeUHl7FD74nWK3zdjEQcrJHcJ0hmqj" "SsG2cNwCUhuEiACxq0Dg+z5SBjwayxg0U8IvViAbkusrJJFEB4ok0kRGEUcaIXIAHPYUjEGe" "0KjX8N98luZHfdKTExTbEVNxH9c7TKVo4xZcAh0DAxBg7RpmTISSGn/gE4xkPDwG5rO75JnB" "ii9iQkkcKYySDGP1mLXvBuVyA6+mqNdqALivHaF89ipO9hQHW7cw5ZBJ7ybFQo84XMO2XkfA" "fw0CXyFlBCiurW/yZ2LRmc44fmGZ9TOK1uJ7yJ9/4OHmNsKrMJzbUeEgdhJWa4wzSCNuaM1a" "7DLaHGXzlODUxZR7C/cp+VucePVdikefI7z5PUtX55l+5O24kOc5v/21yjcrS/y93ccYg5QK" "GUUsPp3jLvzCzMkupTs/IT59hcrdLzky1WR6+9bOCjpV9LKEYsFjpFzHRDFeyaP+xz0ObWjW" "E0Np/CjMnd0LuvP+BDUjcUAghEWVGqHQFLMyFeHRuf0PhfWQ1RdPYC1eRt/4lpGv3yIKN9FA" "MLCRxQpOmmZkWcbk6AtMttizR8wAL0FbCGRXsXTlKw41yzi2S9BLWevZrDSOI17unvnuQKd9" "2nad/73sfjyvVjm8cY2qUchShZX6MRbS8Uv/AqxbTdwwzbuyAAAAAElFTkSuQmCC") index.append('map_delete') catalog['map_delete'] = map_delete #---------------------------------------------------------------------- map_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwRJ" "REFUOI1dk91vFGUUxn/vvDOzu+zszG73oy0Vug3W0qqh2MQLwZg0XhDWeNNbonfGKy7Q8C94" "jxcaVEyIISbGRBIjGIMGQUKN2gaUgukXKaWU7RZmd3Z2dmdmXy/q+sFzeZLzO3mec444OnPk" "Ur6/MC2l5L8SPCnxT00AUdxla3Prez3fX5g+c+pThCaIuuETDQr1d5sfeoBAKQ3VVShi3j35" "zrQupSQmQoTnaH43R+6ST/XkXtIZizt3rrHQPM39qksmY7NZc5G6Qb0Z8OZRhaFLtN48163h" "jpvUPQ//4i08bwPP8xDtOdqtBi2/Qafl0Wp5REETIbqAQO/5cpwiqJBdx/vgvd9IzBQoDe4m" "FS7RikbJZDOYUkM3TDw/QIj2DqDn13VdPK8BpRRBLsL6YhFe6qL8K4Ttw/gNjWLnMgfqF5DW" "8zTPX2a/newBwHFKoEKyjo379gS5D2tErwySKLTZ26mRl78zrN8iVTiGM3KQxytjvLB1Br23" "sCBo0/R8hFA00jHyGQjOLqPeyJNtnWZ0cBRr6BDbSwuYokPGHqCv8NS/GaRSWSy7iWPbABjH" "yqROXEU2JOMDIzgjr9Le+Bxzl+Du/G2iruSzhRCtB2i4TTyvjVtv8sv6A84trXDj4DYp3cbZ" "VyG4/xHCeIRhZUj6q5hTFeqhREPsXJidHYBklnk/YrVjUGw8YuLQJM7TrxOsf4BmhHTqZao/" "zHJPK6IVhwF2QlRKMbu2wtz6bSwrg3FvkTGrTOnZCp0HHyNNReAO8/DH6/y8b5xqOknFTOwA" "BOBHTapxSMK0MJfXmEyNEXVLbNx8n1zJJNjew9a1X7n+3BTKyZHutEEpADQQCKGRwcYSGYzF" "VSYOv0Vi7Sp/nv+J+W+3ufHNFezl3Wh6GhMDE4M4jBCAHkUxcRwz1DfJUB6+/OQsnT++ZuTA" "y7jVGms3F9l//BRGag9TMkQmTaQmibsxURwjXpupXCj2F45IQwcE9fmvmCwXeXG8TLUrmH2Y" "x1eJ/7+4gCiKqW5WL/4FeQQ7/rMrp74AAAAASUVORK5CYII=") index.append('map_edit') catalog['map_edit'] = map_edit #---------------------------------------------------------------------- map_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuZJ" "REFUOI1lk09oXFUUxn/3vTczTDJvZpKZJNOkjaC0kIZC0IUFUSGohNpiJbooCMWdKzdKV+5d" "FCnUTVDQUkVEF4JUDWiLULWWSiMYolVbjSGpYTrqm7nv3333vutiOrHUb3U48J1zvu+cIw4t" "LpxvTDTnXdflTgjuhtjJCUCbnFvbty54jYnm/Fun30Y4Ap1ndxEs9jYtyiQgsNbB5haL4eUT" "L817ruti0IjsPcLPVxg5H9E+Mc2wX+HatW/4MXyDrXaA71fZ7gS4XoFumHD8kKXguTiDfkHQ" "IZgp0pWSaHkNKW8ipUSkK6RxjzjqoWJJHEt0EiJEDgi8ga5abQxsxtCLo/DqVUqLTcZ3TVLO" "rhPrvfh1n6Lr4BWKyChBiBQQgwkEQRAgZY9/xg3dEU384a9gcmx0kSyVRL2QLI1IkxCVRghh" "AfDYmWAcbEa9ViV4YT8jSx30o7soNVOmVYdCZQ9DJZdCsUAvUkAXBDiDhSVJSigjgm5Ab9jw" "9z5Izt7AmgRHfcq5H47wxY3DhPIvchXeZgmcgQflcp1KtUGt1sKvjFF4bo7yukfZ3MNkY5PU" "KHY3Zzh3/SizrTdxnRwB/5nYC0KkTIGQ7zb/ZHntCvYxhfr2Z5TWTI7uY6b1IL0k5JUv3+XU" "00f6BRD9C6vWW3R1yvdRxO+qgM4Vj88ex9gckxtyLFvBBgd2P4RUMc+/v8AB8WzfRGstlzd+" "Y2XzJyoVnyRJSLTC2Jz1zi9kuUbnGZnJ6KY95vY8jMwiLsbv9CVEOqRtMkrFCsPlGkmqSHSC" "NpqJ6jQ6NxibczP4g9FKi6sbX7O6tcb93aN4IBDCwadKLCJKpsyQqBDphDOXTqJyRaIV9zVn" "OXjvE1xZ/4rL65d4bfEsHy19gqe1wRjD1OgcUw121nNw71P9SPQzx5YeQDhlVrdWef3YB0zV" "p9HmY8ThxSc/G5toLrgF738veycu+GdQ1vJI+AzD+GhtaG+3l/8FUsRmPWMpLAkAAAAASUVO" "RK5CYII=") index.append('map_go') catalog['map_go'] = map_go #---------------------------------------------------------------------- map_magnify = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArhJ" "REFUOI1lk8uLHGUUxX+3vnpMz1R310z3TGeMGSaEBIwgiUvB16zC6G7AleDWlRsl/4J7V+LC" "gIgbl1lECBE0IvjASUCSDCQmZiaZZ2tq+quqr56fi7YTTc7ywj333HPuldW1c1d6g/6KUor/" "Qnga8rgmQFU3HOwefOv2Bv2Vzz+5gDhC1ZRPNVjsv21pqQHBWgfbWCw1H53/cMVVSlFTIeVX" "JJfXmb2Ssn9+iZl2yMbGj9xMPuPhfky73WF3GKNcj8PE8N6qxXMVzmReHA+JX/A51Jr0mxto" "vY3WGsnXybMRWTqiyDRZpqlMgkgDCO5kr253HmzJ9Adz8PFvBGt9Fhafo1XeIatO0o7a+MrB" "9Xx0ahDJAZkoEOI4RusRjxZqDmcrsq9vQ91g06uUuSYdJZR5Sm4SijxFxALg8ljBAtiSqNsh" "fv80s58OqV5fJOjnLBVDvPAY04HC8z1GaQEcgoA7CcyYnESPmUczNeoUZF/8wfdnV8lsg3l4" "C991UVVM0OojuP/3oNWKCDsJ3U4HAO/dZa5+6TPTf41XTgzwfJe9uGD3IGb33nco5wwCTwhG" "cYLWOZDw64Md7pcO1bF3eGN5nkeFQ2VqrCiWn+9z/8/jSJIigIOML6wTHYGpiGtpxb3CI4rm" "MWVDEPhUdUPTWEzRUNaCVQHW85+YaK3lp827rD+4RRi2McagdUKgBJOXlLVQNWPXrYDJDNbv" "jQkESKuE/bok8ENmWl1MXhBOhSTxNXb2Fol6PUoUriNs/1XiJpts/XJjokAQcWjTIZOUoG4x" "LSGDm3tEO79z+w5Ud1/CUT5pXuLEm7x65G/2r//AVDLCraqauq45OneGo71JqIKcBN6E4zKu" "zI0a9pTD1vUhBxs/s3TqZV7cuoi8vfbWpflB/5zy3Gde9tmHHsNPtzk7V2NMzj/mJDzGMPjz" "cQAAAABJRU5ErkJggg==") index.append('map_magnify') catalog['map_magnify'] = map_magnify #---------------------------------------------------------------------- medal_bronze_1 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhRJ" "REFUOI11kz1rlEEUhZ/Z7zVpDBYLQiKaQiSNggQlPyCFhZDeRixELOwWiyCp8g8sVAQrS2sj" "YhECQbQQJKDYhBQrmMXE3Xffmblzr8W7rht3HRjuDMx55nDmjmNsyP17xqUlZGsLE8FSQmNE" "h7W6uoq9ecfs29fuj6YyDhgX2ZhQRYq9CBbiuOQfQBRMBPUeFSlAIqN1ZQqgdAIQIuY9LCyQ" "vEe9J3lPynPc4iKaDbAQ/u9AQ9goHe6t16/2aF6rQaU8BDskywnvP5N83PgvoHFj/0BjqSdL" "t2Z9bZ6USpjkOMmoDvapu5c9rssBd/9qRmnai+Vlxb2Klx+2fKij2U8k72MxxySAK1NvOJpf" "Hndc0Ju1B3u7JzJQkXa6eLvlpUnKjkihEFoMaJ4hRz/Iukf4+bVW6ml7IkSzuBJnzqODX4VQ" "AkhEo8ckoHGAHB8ykFO4XFYmM1Dm1MpYzFEJWIqoFOIUhhCfk7yQUmluyjNa0UQSR9ZHMw2r" "BCx5TKf0gal1XeyBppPWxRc5RA8oiMdF604AXIrblaM9XKWKpnDCenFzolRt0vDfiYHtCYD2" "dbP88Vmn6jJK1QaoYqn4E5hRbs5Qn6lS/rTTceY2J/oAwD+6cIfERriy1sprZ0mimM8gZtT6" "+5Q/7HQssX766bcnUwEA/fa5ZTvWthNdSermSGDmupbYlkp988zzr7vj538DpFylIsmNfrMA" "AAAASUVORK5CYII=") index.append('medal_bronze_1') catalog['medal_bronze_1'] = medal_bronze_1 #---------------------------------------------------------------------- medal_bronze_2 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiFJ" "REFUOI11kr1rVEEUxc+8t5u3L0ljkmLBEMQ0plSQNPsPxEpIKagQrKy0WiyCpMp/YKESSKNl" "WiGNEiIpTGETSLAwRFg/srhx9+2buV8Wb41v3ThwuQxzz28OZ8ahtB5u37dbC0vYb+9CTCEq" "g1KwMm7ONLCxtYk3j9+6P5pKGcDEUCuGRQWsOuh/KwQuS/4BBIYZQCIlSFGqWpx5GgJE5Q0F" "RoJxJFENJIwghCAEEkYSp0htEhSGAUMOgqe19uH71Xv5N0yftZByYTeLIrTGp7H9+R2C57X/" "Al7h+0nvy2m3unB3kmbn0JMIxjkcZ5jtH+PO0evuyjxOkpLmPE3bXFxUuC26/qTuQwLNfoLz" "HoxyGAfAxUhqDunhs5YLenvs0cHeUAbK3JRrK3XPKSTrQEIhNArQPAN3fiBrd+DnluvS1eZI" "iGbUoImr0P6vQsgBYIKSh3GAUh98doo+j8Pl3BjNQDGlFsMoh3KACUG5EEsYQHwO8QyRaOqC" "ZzSYCJTp3Pp5yaBzgImH6QX/wNTajrqAyrB19kUO5AEowB6OrD0CcEI7lc4BXKUKlTBkvbhZ" "EFVT1PxXUMDOCEB7uh7vv2xVXYaoWgNUYUIwIsAMcTqBZKKK+ONuy5lbH/kHAOCfzj+AYC3c" "WK7nY5chrDCfAZRhrHeM+MNuywSrl158en4hAAB6zSuLdqZNx9oQdVMQwMy1TbDDlWR9ZuNo" "rzz/G6Lmoe5Y078KAAAAAElFTkSuQmCC") index.append('medal_bronze_2') catalog['medal_bronze_2'] = medal_bronze_2 #---------------------------------------------------------------------- medal_bronze_3 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhxJ" "REFUOI19kr9rU1EUx783Ly8vzypiVQyKRVoHwakuBcnuJkIRHFxEOjjqFByK1CWTox1UCqKj" "4L8ghJYi7aBoocXBLkaowdS8l3fvPT8cXhpeTPDA4XLhfr7ny/ceg0LdePpB7928jI3vHQgp" "mAXMAmEBkaA+dxrP325ja/W2OWLKRQFhhoiC/ACk/GTKm0jBxEVkVGA4zXMOFeCh4D8CpREH" "xEhSj/MnInjHI33xZIxeasH8Xwe0cvD14/Ldsxs4F+2hKgkAINUYPzCLtS/zYApWiowpXvTN" "9aWEqs/Cq3eO+8oMmEtQymAoRdjfh9t914uRPooefH4xJqCvFxYE5r2ff1yzLoKkv0FZAvUZ" "lBxgAkRVg3h3tW2c3Ko83NkcyUCIGnzlfs1SDE67YJeD6h0kS0HdA6SdLuzMYo170hgLUdXX" "/dQspP8nB8kB5CHeQslBfB90+At9OgaTUX08RMG0aAD1GYQclD2EcpjdQMRmYEtgLk1P+EaF" "MkPID60PmwcnOShbqEzYAxXtGN8DhEetk81z8BaAAGRhvHbGBAz7Vrm7A1MOIexGrOeTGaUw" "RtX+hHdojQlIIs1g+1U7NClKYRUQgbKHeg+oIoinEE2FCD6tt42a5sRFsk/mlsBYcdcWa1nl" "ApgEalPAp6gk+wi21tvKWD718tv4Ih1V0ri0oIfSMCR1FjMNBlRNRxktKkfNM2t7m8X3fwHh" "lqcvDtbvjQAAAABJRU5ErkJggg==") index.append('medal_bronze_3') catalog['medal_bronze_3'] = medal_bronze_3 #---------------------------------------------------------------------- medal_bronze_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoZJ" "REFUOI11k01olEcYx3/z7m52UzegUdKktBr8AJVY24Om1RwKpeChFMGLJ0E8SchBvCxSejAe" "ordeFAq99NSj1xr7Qf3oh1DoRwgIudgoi2ZXd7P77jszz8zTw5vGrJIHhnnm8P/xn//MY1gr" "mZlWDk4g8/OoCBoC0Xvi2l46cQK9/RPVH24ZNlTx/2ajSDcIo0h+FkGd59V6CfCCihCtJYrk" "IJH1vrgJIFkHOI9aC7t2EawlWkuwlpBlmL17iWkPdW5zB9G5y0lj8YvykQ6DHw5AsbAGNkia" "4R4sEKy/vCmg8umj5eiTjkycqdqBnYSQoJJhJKXUe0TZfNvhmCxzvh9gAPSbycmIuenfvzRq" "XZmYvkCyLuozVByYAuWKYfDhjbpx8eTAhcXf+jKIIrWw/9yolUFC2iK4XKjeEbMUaa2QNlvY" "nadGQyfWXgtR1U/5LbuJvdVcKA7EE71FxRF9D2k36MkbmEymXs8gMhy1gPqMKA4Nnii5OLh8" "/8W2ePCkTnv7xI7Ts++0n3ca1767+veVtRA1/0Ti162vr+D4uddgaazIRweO8/bwPn5cuDn0" "6z93Zo9Oj23NrxC1aXwHYui3Lhb1ju+7dd7bf5iQBA6PfUIwng8OHQN0OgEwwd8tthYxxRIx" "uD7rKo5nnRVKpspnB2YAuPjxV+wZeReDqeSv0I1zhT++rpdMSlKqQIxoyGcCVdrtBgtP7jM3" "fxaAuVtnWXr6F4pmBYDZ+ebjz49vaxeX7h1JRt6q6pYRksoQhXKFYnmAYJvcbz5k/M1xVtJl" "Wt2n3PvzDu0X9su+0ezWxie1HWtG4lSIZpgAqqapgbvnqrL6b6InDQwprKJ6/ffr9dp/lmS+" "YLB2+ekAAAAASUVORK5CYII=") index.append('medal_bronze_add') catalog['medal_bronze_add'] = medal_bronze_add #---------------------------------------------------------------------- medal_bronze_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoBJ" "REFUOI11k8FrXFUUxn/3vcnMJI0LSympYpNKBbHdFCmhmo3gIhYXBd240I0rERfppkGKlLaU" "0j/ArlzYVXd148IkSsG6KIKIkI5UkkVIQrTNtJPOvHn33nPP6eLFNNOSDy7n3MX38Z3v3uPY" "hnz1pfHWcWR+HhPBUkJjRLfr0PQ0tnCb0V/mHLtQ+7/ZTbJdRBWp7iJYiDyPZwJRMBHUe1Sk" "EhLZ6Wt7CGQ7AiFi3sP4OMl71HuS96SyxB09ihZ9LIS9HWgIF7PN1jeNk12GT9Whlm8LO6Qo" "Cb8vkny8uKdA88OVVY1ZV45/Nurrh0kpw6TEScFQf4WGu9nlHVnli0EBB2A3JicV90M88fWY" "Dw20eIyUPSyWmARwOY2mY/j+9Q0X9Ex9pnV3IAMVmU1vfj7mZZhUdEihIloMaFkgnYcU7Q7+" "8EdjqauzL4RoFqfivtfR/pOKKAEkotFjEtDYR7Y26csIrpSpFzNQ9qvlWCxRCViKqFTkFKra" "WVqk83OL8r+NAz+9n68Y9u30gl7dDtGqTyRxx/rOSYHOcguVLm9/OkPjyDH6f829du/Xucvz" "9nevGkGt7WIXNA1aF4/FwIPFu7zx3sc0l27jvv+EkeVbTIwfyBM2UwNwKd6pdVpnQu1VNIUB" "6yYB7XZpjh2B02efzX7hELm5ieoVeno1/+O7jSFXkA01QRVL1U5ghhsdofjzR7hwCH/O8eic" "Y+vfB6Tc1nOAS/PttfPvvrxVW/rtZHbwlVHbd5Cs+RJ5o0mtUadufVbv3yOr58S8R2fTWF7P" "UhK7NrCavdmJSdvSWSc6ldTtJ4GZa1vizj+R9fbDtdOZunHNbE2x6x8s6JWnqnHFcWbsFncA" "AAAASUVORK5CYII=") index.append('medal_bronze_delete') catalog['medal_bronze_delete'] = medal_bronze_delete #---------------------------------------------------------------------- medal_gold_1 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgdJ" "REFUOI11kj1oVEEUhb95uysxJiJbyIpIigQFEds06Q2kERs7Ky1ERKzcKkUaA3YWWtjbBcRG" "MSJBUphCwc4iCGJCFjEbN+77mTd37rXIJrvJxoHDnSnON2fuXMfAkvv3jMtXkOVlTASLEQ0B" "7dXa7Cz2foWxD+/cvqc6CBg02YBRRfbOIlgZBi1HAEEwEdR7VGQPJHKwrx4DSA4ByoB5DxMT" "RO9R74neE4sCNzWFZjlWlv9PoGW54Lpf52tzW9Ru/oYTHlUjZgm6/QNdaWM+LPwXUHvwaUNz" "13WTD8cYvYSRkGiOCx109xvlyNOuzhUb3Oh7DrpZfjw/TWKv3NSzhlVOo9IG+YvFFIsFOAcx" "0P3cbMWS6+dusXa4B1Y23YVHDaueweQPxByLRU8p6n9hmjJy8W6j3KU59ASVMFM5dRWTXUyL" "nnxPBaYZGnZIRs8iKTNDvxAt1i2pYpqD+p6KvmIBsQsWCIH6EECjgglo2Y++f3vsJ8I84o+Z" "AxVpW+hgFo5EL/oQlFhmSEF7CGDBr8btNZyrHI4fe9UCSXKSfOsnWYfVIYBkLHa/PG5psQ2V" "EcwEi70kKK46jhSO9aU3rSJjcWgOADafc0cDC+PTtxu1+iQ4wyQllh3SzXXWX75tZRnzs0u8" "OBYA8P0J036HpnhmYqAePPicdp6yqoHFa6/3Bmh//QPHPZ+Qy8eH9QAAAABJRU5ErkJggg==") index.append('medal_gold_1') catalog['medal_gold_1'] = medal_gold_1 #---------------------------------------------------------------------- medal_gold_2 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhdJ" "REFUOI11kj1oU1EUx3/vJZKktqVEKVFxqigublKQ7H5Mrg6Kgw7ipIuZOnSx4Oagg4Mg0q1Q" "XFQQpFKEDhbUQYciFFsMSl9NzXt5736c45BXkzT1wJ/D5d7zu/977gnoi9tvruul0xdZjd7j" "VfDicwlOHGcP13m6+IzXd5eC3ZpiP8BZh2j3sBePE8lzT8a4/pI9AONQBet9H6QrEenuZXYA" "EPYvrHGUGKEUlrHeYbzFeIv1jlKhQkVHsWYQMODAZHY2Wl+auVr6QtWuU9YUEaUtBX7JUd5+" "FkzmZv8LeD71cSNxn9qVyTujjJxCCQmkw7htMbrzlYnoYfvKuXTjUF/Nv26ad8emCXUxOPGo" "poVxxEXg/qA+Rn0KQQDe0v7QaHrD5SPXWBnsgZpGcPxeTYsTqPsNvoP6NFeMZD9RiSmfvFUz" "OzSGniDO1gsHz6BuB5U0V5YrRSVB7DbhyCQupj70C159VcMiKh2QLFfak0/Bt0Et1lIdAogX" "UAdietZ3b/c9R2iGy/aZA3EuUttC1e6xnvYgCN4kuJRoCKA2W/ZbKwRBYdC+z7NawrBC58d3" "khbLQwCXMNdevd+UdAsKZVQd6nMnCEFxDJcGrC28bKYJc0NzALD5mJtimR2bvlE7UJ2CQFEX" "402LeHONtflXzSRh5sICT/YFAHx7wHS2TcNl1L2lajPIOkSdmGWxzJ1/0R2g3fgLTqeaZY3V" "GmkAAAAASUVORK5CYII=") index.append('medal_gold_2') catalog['medal_gold_2'] = medal_gold_2 #---------------------------------------------------------------------- medal_gold_3 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAg1J" "REFUOI19kjFoU1EUhr+XRE1bo5KiRKVQaFEn1y4Z3OokIrg4CIIdBCcXM3WogwXBsR0cRbeC" "uChuSrF0aBcROpSCSDGITU2a9/Leu/ec45CkSZrigZ/DHf7v/Jx7Avpq9tlne3BrmrUfNdQb" "IoqIoqJ4r5Snxll6s8nG8t2g68n1A1QEVcO7jtG3u/i2vDfES79lEHA4zUnb1Gc+BB4BZAYS" "eCGMHJcKp3CpDGji7AjNKEHkvwn8wp+dr/P3pj5xvvCNfFBH1QjdGFV3jdffbyB+bKHfE/Q/" "/NrkXJiefDk6+fg0o1cxMpi2MFdHG1vsby038xw8Gb/jXg0B0i+XZ8jYu2B6qWTZM6ivgT/A" "JMQkhiAAcTQ3KlVJuX3xPuuDO7C0Ekw8LVnuHOb/grQwiTsK0eQ3piH5K49KaYPK0A7Uu3J2" "7DrmG5jGHSUdxZhGqNsnM3oBH1Ie+gUxKVomh2kLNOko7klikCaYwzmKQwAVBfOgaS96d7r0" "EmEJPjnmDtT7mrk6Zu5I9LgHQZE0wsfUhgDmklXZWycIsoPxpdPNkcmM0Pr1k6jO6hDARyw2" "N59XNd6DbB4zj0knCUqQK+DjgO2VD9U4YvHYQ9pdZk4dC4WZh6UTxSkIDPMhktYJd7fZfvux" "GkXM31xh+JC6tfOCmWSfik8oi6PoEkha1Fohq+pYnH3fPqBu/QOSYaDbWPWasQAAAABJRU5E" "rkJggg==") index.append('medal_gold_3') catalog['medal_gold_3'] = medal_gold_3 #---------------------------------------------------------------------- medal_gold_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnhJ" "REFUOI11k0trFEEUhb/qSUvMQzSKJqgoGJ9oFPGFRFyIEhBE3LgTXEoIKi6clQsVjHGjLrLw" "PwjZKCQRI0YlCgo+Air4gqghTiaZme6Zru6qui561CSSA4d7a3HPPaeoUlRhujqFLVsxg4OI" "MYi1uCTBVavf0YE8eETDwwHFDNT8aWYOyYxBZ0x6NgaJE+bin0BiEGNwWuOMSYWM+dvXzCPg" "/RWIE0RrWLMGqzVOa6zW2ChCtbbiyhUkjud34OL4sgpeX/KP/sQ/mYMFGucEW/Zwk99wj/KI" "Ti7PK+CfHRlzFRWodecbqNuI4OG5Ciop4IrviWtvB+5oNMaJ2QIKIH68ci+e9KnW3mbJLMKZ" "PJgSYkPERqAU2ITgZXbcxhxvOcXz2XcgcVatvtgsNYsRMw22gtioyhCnJxAXUrvhTHNcJPtf" "BGeS9kx9G2KKiIuq1FVGiCvjkim8uuWYkPb/IoQPGq2/877noh9gy6l1E1QjBIgJGPoaMvwd" "CpWQYlgoTQWTPf3X315NHVgHYsDF/6z/2W4jBj4VeWfqOHhgF6ua1jM02tc48m74yp7OlsVe" "GsHkJSkgksyxnvLexzw7Nm3HepbtLYexKmHftv2AdHrpK9RP7ORzlMqA0+CilDatE8Ucvmrg" "2OYuAC4cusO65W0oVK0HYMp0B6+ujbtoEjK1iBjEVp3gKAU5Rn88o3vwNADdA6f5NPEGQaIM" "QM9dvp87QrH8oX93zZJVDZn6FpS/COUtRCRDaTrHyM8vrF2xllx5jEI4wdPXwxSn9a1ZX/Pz" "DfbqKbJG024TmhINukK+EvLk5tJlpV++f1xBo0AJkd4XvePZ36xFvdeazk63AAAAAElFTkSu" "QmCC") index.append('medal_gold_add') catalog['medal_gold_add'] = medal_gold_add #---------------------------------------------------------------------- medal_gold_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmtJ" "REFUOI11k81vjFEUh59735maVuMrIm2QttEgiMRCbLqwECk2IhJs7EXE16JdSSOCsLNg7Q8Q" "Fiy0TdP4CguChfiIJmiLMq2OmXfe+773nmMxU21JT/LLOXdxnvM7N/ca6uFPHFc2bcEPDKDe" "oyEgWYbUc767Gx0cpnmo3zAncjPF3Cad0yje187eo2nGvzELyDzqPeIc4n0N5P3fOrcAwP4F" "pBnqHLS1EZxDnCM4R0gSTGcnElfRNF3YgaTpeVN+dS6/7yv5Qz+hwSGihNgixU/I8CTqsvML" "AvInn45K1ZTNutPNNG1AsVipYrJppPSWtHCtLPuSUQ7MBxiA9MHqHVi9Yzqvt2i0BPGT4H+j" "oYKGBIyBkFF+3vstpOxvPcqz+Xegaa9Z29OiuWWo/wWhioakrgriJlCpUFh/rCUt0fvfCuKz" "rmjxVtSXUEnqcnUlqMRINoVtWoWv0PUfIGhYYW0OlSqIqyuZVUiYePyOiSd3icdyK+/v0s+K" "Xu8elMs1B0FAPUg6a31mekiYePKBeCRj2+GzLOrYTPV1/9o3D/svDOjbiq2t4Cc1m0Y1+8d6" "TV+GXtC58yCFj8OYm0doGrlNe9vKKKCnc7VX6B6F4rP9dulGdK79UMu+GFNo6YC9Z2Z372sl" "UtNuAXzM5fKLS98kKUJUQNWjoe4EIVreSPzyHvS14noMUz2G0vcfhEjHI4Artxg7tZtS/O7+" "9tzyNc3R4lZMfgnGNqIa4csVxl6/xzZEZFGF6aIyMm5D8Hpl3tccucoON0Wvd3SFjBWZA1dl" "slrhUYNdNZ5MFfdaMW1idUzQG3sG5eIfxNC9CuDWbBAAAAAASUVORK5CYII=") index.append('medal_gold_delete') catalog['medal_gold_delete'] = medal_gold_delete #---------------------------------------------------------------------- medal_silver_1 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAf5J" "REFUOI11ki9vG0EQxd85rs6ObeLK6oFIIUFVkUkMAgoKAgtaEl4ZVOUBUYBRpHwD198gBsVN" "1VpVSCSrLLAswLJbA//Z3dmZmy1IfbrkkpVWOyPN+83s00TIHfn0MeDlK8jlJYIIQppCmaH/" "32eHhwjfRqh//xptNOU8IC8KOaGK3OUiCJ7zkgcAFgQRKBFU5A4kksXlRwClewDPCETA7i5S" "IigRUiKkziHa24Mai+D90xOo9z1y7nT+7j1WjTrc1haYGbpcovLnL178+IkGce9JwO+Tk9tg" "zOr5zk69AkBVEUIAADjn8KtUWpk3r29xdJRpMjdvbm72mflLkiTJcrmEtRaqClVFqVRCHMeI" "4xij0WjCzG+73e71PQ+Y+bjVaiWLxQLGGKRpijRNoapgZqxWKxhj0G63E2vtccFE7/1BCAHW" "WohI1l1VM9h6vUatVoNz7qDggfe+qaqZGDkP8jkAEFGzAGDmrDj/PoxDCHDOFfeAiOYbxzd/" "34y/iaMogojAez8vAJxzV9ZaxHGcdc3fEAKq1Sqm0ym891cFgDHmbDweTyqVCra3t+95EEUR" "arUayuUyhsPhhIjOCnsAAP1+/wMR9TqdTtJoNAAgm2Y2m+Hi4mJCRKeDweDzowAAOD8/32fm" "Y+/9ARE1vfdg5rmIXInIWb/fv87X/wOrjrYLU4cXsAAAAABJRU5ErkJggg==") index.append('medal_silver_1') catalog['medal_silver_1'] = medal_silver_1 #---------------------------------------------------------------------- medal_silver_2 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgVJ" "REFUOI11kr+LE0EUx7+7BjfJXppgYIv7B+wkIJcijaU2Wl9lIynsBCGCXBEQAvkP1oBgmxTX" "ChYRgnAQbCQg1hFiAinyY3fnvZk3FknWza0OPGaGee8zbz6Mg8x4+fm5fXL/Mb6tvsJYgRFz" "CIEWjYf3mvhw/RGfXn1xjjWFLECzhth9shEDLXKY/waRzpbcApCGtQAbk4HsQ0T2Z4pPAG52" "w6ThoQzPLYKNBhkGGQYbDe9OCSV7BqZTwEkHpLjzaza/elR5iru2CIddsDAis8NG1vj5/QdI" "6c5/AW8fvJtFFG3Pq+dnAA5tWwBAkiRQv2n7uv5mdonLtCa1OZ1OL5j5OgiCYLPZII5jiAhE" "BK7rwvM8eJ6H0Wg0Z+ZnrVbr5sQBM7drtVqwXq8RRRGMMTBmL4+Zsd1uEUUR6vV6EMdxOyeR" "iJrWWsRxDK11eruIpLDdbgff95EkSTPngIiqIpIWZx1k9wCglKrmAMycJmfn22trLZIkSSWm" "T1BKrY7Gj28/tn9cO44DrTWIaJUDJEkyjuMYnuelt2bDWotSqYTFYgEiGucAURR1J5PJvFgs" "olwunzhwHAe+76NQKGA4HM6VUt3cPwCAMAxfKKU6jUYjqFQqAJB2s1wuMRgM5kqpq36///6f" "AADo9XoXzNwmoqZSqkpEYOaV1nqste6GYXiTzf8Dm0Oyv0SyhiUAAAAASUVORK5CYII=") index.append('medal_silver_2') catalog['medal_silver_2'] = medal_silver_2 #---------------------------------------------------------------------- medal_silver_3 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgJJ" "REFUOI19kr+LU0EQx78vBF9+XBAjwUfgsNDGNs2liJXFdWJjYyFYSP6FVFfEJpDeg5hWm6Tw" "L5AIATk4BYv8AQcpYiKBS17e292ZnbWIeb5c1IVhZmG/n5n5sh5S5/TNZ/fq6UN8uVpC2MFa" "gbUCsQJmQePBXbx9/w1fz597O002DRBrIeLA9FvI22x5G8wOlm1asg9IupHdilLiBHgDkNmb" "gC02EaFa8kHG7sXx7TzCSMPa/07A7enVz7Mnj45weu8WPCEQCSItuNYbfJr8gGVu/xNw/vL+" "dKMoPK7eOQIAEYFzDgCglIK5/h4+ruamLz780SRuTiaTEyL6GARBsF6vEccxRAQigkwmA9/3" "4fs+RqPRjIieNZvNiz0PiKhVqVSC1WqFKIpgrYW1FiICIkIYhoiiCLVaLYjjuHVgojGm4ZxD" "HMdg5qS7iCSwzWaDYrEIpVTjwANjTFlEEnHag/QdALTW5QMAESWP0/lm7ZyDUioxMVlBa73c" "Ob7bfTf+rvY8D8wMY8zyAKCUGsdxDN/3k67pcM4hn89jPp/DGDM+AERR1Lm8vJzlcjkUCoU9" "DzzPQ7FYRDabxXA4nGmtOwf/AAB6vd5rrXW7Xq8HpVIJAJJpFosFBoPBTGt91u/33/0VAADd" "bveEiFrGmIbWumyMAREtmXnMzJ1er3eRfv8LEqq5N7+wPYUAAAAASUVORK5CYII=") index.append('medal_silver_3') catalog['medal_silver_3'] = medal_silver_3 #---------------------------------------------------------------------- medal_silver_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnRJ" "REFUOI11k89LFVEUxz8zavP0PSEt6ymCQgYVlSGkES6ECnQTLgqiXSsX4qqNC2lRLSxXbVz0" "Pwhu0yhRk35IYvYIF0ILLRN/NW+cmftj7m2h7/UsPHA558A9n3PO93IdDkwP9FsuXERPTmK1" "xiYJRinMga/o7sa+niLzZsKhxMoLQWmRLSk0Wu/nWmOl4l/7C1AaqzVGCIzW+yCti3H5EQC3" "CJAKKwQ0NZEIgRGCRAiSOMZpacGEEVbKoycwUj4Wcfxo+85dguoMcVkZSilMPk9qc4vTb6ep" "FurxkYCVoaFVG4bBicbGTAowxmCtBSCOYz67bhDe7Frl/v1DAAcgl8t1KKXGs9lsNp/PE0UR" "xhiMMbiui+d5eJ7H1NTUulKqt6+v78MhDZRSg3V1dVnf9wnDkCRJSJIEYwxKKYIgIAxD2tra" "slEUDf4nopSy01pLFEVorYvdjTFF2N7eHul0mjiOO//TQEpZa4wpFlOiQSHP/fzI8sIC/rHd" "k/eedPk7wdbzV8+WnpYfrFC8XOoL8eLaHJvuN7o622msPcvb3Hj1+68zT9r764+7AEKI7YLi" "hd0L4xtj+PT9DVfOtZK4Ca31t0gcxbVL1wHb7x4802wURXieV+xaejb9X1Q4GW6fHwDg4Y2X" "nDl1GQcn5QKEYTg8Pz+/nkqlqKqqOqSB4zj4wS65H3MMTz4AYHjiASsbX7DYuAxgbGxsraen" "x19eXr7a0NCQqampIZPJkE6nqaysZNffYXFtmubTzWyGq/ze2+Dd4gz+rnhx6GuOjIx0KKUG" "pZSdQohaKSVKqW2t9eySncwLN+h1oNpCHmtHP46uD/4B/9jKGadrVf0AAAAASUVORK5CYII=") index.append('medal_silver_add') catalog['medal_silver_add'] = medal_silver_add #---------------------------------------------------------------------- medal_silver_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm9J" "REFUOI11k89LVFEUx7/vvak3vww0pVGMUbAW1UoKNy5cSDiuJIrIf2AW0aI2upAIiZDc17pN" "O0mCFqnYULaINCQwmoUuYhStxmp+3Pvur3NbOPOcUTybcw7c8znnfA/XQc30vbsWl65ALy7C" "ag1rDEgpUM2fGhmBXcohubzgoMEi9aCxyDYUktYHudawUuGoHQKUhtUaJARI6wOQ1mEcOQHg" "hgCpYIUA0mkYIUBCwAgBEwRw+vpAjMNKefIEJOW0CIKH+zdvodKSROB5UEqBymVEfxdx7t17" "tAg1fSJgc2qqYBmrnO3uTkYBEBGstQCAIAjwxXUrbHiogPHxJoADABsbGwNKqflUKpUql8vg" "nIOIQERwXRe+78P3feRyuV2l1Fg2m/3UpIFSarKjoyNVKpXAGIMxBsYYEBGUUqhUKmCMob+/" "P8U5nzwmopRy0FoLzjm01mF3Igph1WoViUQCQRAMHtNAStlGRGExGjQI88/z2F2bx9XCVvvb" "Ye+HhX02skQzkdoK4eNGH8Zrr3Gm8BEXb2fh914G/7pw/tuHhceL9nvVBQAhxH5d8fru9fGJ" "CHzlJS4M3UB0MwfnxR3Et16hJ93uGdj7kdqZVjjnY77vH9z+yCRucQ/RVC8w+uBw90ed8KzT" "4wIAY2xmdXV1NxqNIh6PN2ngOA5sWzvY+hvgUSfEhIM/Ew5Ke79gPLvjAcDc3Nx2JpMp5fP5" "a11dXcnW1lYkk0kkEgnEYjFIzlBcX4Z32oXyqvhXtNjacY3R9mnT15ydnR1QSk1KKQeFEG1S" "Siil9rXWK9f/5nZiP/OjLjlpcu02wT7PLNGT/2SNyz+KrXTZAAAAAElFTkSuQmCC") index.append('medal_silver_delete') catalog['medal_silver_delete'] = medal_silver_delete #---------------------------------------------------------------------- money = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArxJ" "REFUOI2N0t1LU3EYB/Dv2TnzZe4sj8ep021uynwJb7pLvLAuAm/yH5CoRUkUIwi7qNClmUV1" "YUFBCEVY0QuJQg5S8y3ojW1eaKhzWkqbbvl2No8dz35n686M1PrePnw/PPA8wH/k5nCL6Pzo" "1G03U/2rfGOoWUxPS9ckrVOC0/U3sitwffCKmK5N1xj1JvAsD4WSBIfL8QeyI3BtoEnktJzG" "pDcjKq/CrDcha48eSTFKcLT/RrYFWgYaRY7lNGa9CZENARKRMDT2DgWGQhgyDCDJklDTXqPb" "Frja3yByWk5j1psxOjcGf3Aa8UQcJYU2CPIqiow25HA5oIiyAAD01nJTX8M6z/IaS5YFxXwJ" "DlmrEIqEMLv0DZm6TLBqFt7pEfi++8gT+/OUzQ1aP7TaGnvrZZ7NSLVk5WNsbgx5qWY8fP8A" "+83loFUMtGotPP4R+APToFU0U+msZACAvvPpVr0QXeng2Qy6IMeKiBzBYnQRoUgIB2wH8fhz" "O8qse+GdGsFU0A9HlQPhtTDWlAg98drXT13uvZTgWR4F2VZEYhFIyk8kEgkEwvNgKAalxlJ4" "/F6ExTDs5XYQRYFMJNztuQeJkAyGUTGPBFE4Or+ygGwuC55JL0oLimHJyQerZuGe8kBWybCX" "H8NSdBlvZlwbP4LLydF1sY7E41aqeeiigchUkBCCvMxc5PK5EDYE6JJ0cPs8CIkhHC6rxtfF" "afSPDvYQokwgFrvdfe7tDABQAHDBVddWnF1yYjQwiny9GSa9CW6fG77AFIqMRZiYm5iRFfmk" "kojNu870jW+9HAUA5zvPFqelsV8qCivoLm8ndBodxmcnE0lqdQ8hZPjVqa6WnT6WAoDa+7Vq" "FRd/QUisOi1Fq5oNzZIUdXK5LEvLHae7Z3YqbwIAcPzpkX0KibdtKLLzmf1l926lrfkFZwko" "NnWbNIsAAAAASUVORK5CYII=") index.append('money') catalog['money'] = money #---------------------------------------------------------------------- money_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvlJ" "REFUOI2N0jtsGwUcx/Hvne3UcXxuzhc7CUlcO8ElgUCKgCpUQCilkicmtqoSYaOSJxZQaU0L" "hAg6FIYOgGAIIBCoA49KENQHVUtpXqJNkeM4lRNsJ2fckjvHydnn8zEg3uHxX//6ffQbfvA/" "7tWvR8qJSwnfZj/xv8KvnHux3NzU7GlYF7TEqb8j/wqMnn2h3Oxt9nQGulAkBUswtPip+J+Q" "fwRePnO0LHtlT1cgRKm6SijQRXBrgAZT0OJjvyObAiNnjpRlSfaEAl3oFQ2jZnBu9jzd7T20" "+9upbTG0fWP7fJsCL50+XJa9sicUCHF1aZZ0foG6Xae3J4pWXWV7Z5Q2uQ2hZq0AOP4YPvrV" "4XVFUjzhYJjblF72RmKousrijQwtvhYkl8T0wgypbKr23vCH7t8aHP/mePTI+KGqIvkbw8Ft" "zC7N0tEY4p2LbzMYuh+H6MTr8jKVniGdW8AhOpxDiSEngOP1b48d0ko/nVQkv6O7LYJe1SmW" "iqi6ysPR3bx7eYz+yO1Mz88wn08Tj8UprBVYs3RH8rPUaeH58YO2Iil0t0bQTR3D2sC2bXKF" "ZZyCk77OPqbS09xcyeHegNK6hmFusEoFS/L6HY8+8UikYlZ2APibZCaSU7TICopPoUPuYHJ+" "mlJRpaVRZNc9O9lzXwzDWUC9Mcfy9R86RJzms7V6jYyaIVvM8uAdD+ASG5BcEpOpKdS1FbR8" "nh29A1iixUD7XizBZPDOXdTNyuPic0MjyxWz8tatwSjp5essqktILh8Tc5PMZVMEm1opagVc" "gpfH+uIAPL3nDXqCdyEguEWAWtU8lrmZsWL9MVK5FBOpCb5fTNqiIH6RXEweLGqqcS1/kdHx" "4V8m/uUwC4Ur2NiGA6B/94BepjRwdenK9i0ut5DOpWtuV8OgWTU+PvnUp5/ccq+3sVT98aFw" "a5jiehatXODCd+fRVyuvCb+O6Mn3999t1epvVqxq4oPhjz7/60J3HmgbRRAOCCDZUMK2T1w+" "sfLMz4p8QIEqodeYAAAAAElFTkSuQmCC") index.append('money_add') catalog['money_add'] = money_add #---------------------------------------------------------------------- money_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwFJ" "REFUOI2N0ltsUwUcx/HvOactpespOz1rabO1tINy0QX0wQQjZmI0mfHNmBglGvGF8NDwCASh" "gDoJ8kB88UGjMVOj0WCCQmIgXCRRYOtmXGO6rp1d03a0bmM9XWcv5+KT93n5v/7z++T38IP/" "cW98PdxI3Ex4VvuJ/xU+ff3VRndXt8uxItQSF/+O/Ctw6torjW53t6vPF0KVVQyhWYtfjP8J" "+Ufg9asnG4pbcYV8YertJcK+EP51PhwdoRYf+R1ZFRi+eqKhyIor7AuhtWo09SbXUzfoD24k" "6A2ir2nW9ozs8awKvHblWENxK66wL8xkIUW2nMO0TLZujFFrL7G5L0ZACSDoxh0A6Y/hk5eP" "raiy6or4I2xRt/J4dIiKVmF2IU+PpwfZLjOemyBTzOgf7v3E+VuDs9+ejZ24dLStyt61Ef8G" "UoUUvWvDvPfNu+wMP4gk2nDb3SSzE2RLOSRRsg0mBm0A0pu3zhyt1e+eU2Wv1B+IorU15uvz" "VLQKj8R288HtEQai9zA+PcF0OUt8KE51ucqyoUnpLzNXhOOXjliqrNK/PorW0WgaP2NZFqXq" "HDbBxra+bSSz4/iTt9k+ladTLGD2qNzqVbm5KeKVHnvx0Wir07oPwNulMJpO0qOoqB6VXqWX" "selxwqlJHlpYZvuTLxB77gBBrws596Ppn0xJIrbOYd3UyVfyFOeLPHzvLuyiA9kuM5ZJUlm+" "Q3hsgtjgUzhz1xDefxbXzOf0R1QxsFR/Wnx5cHiu1Wm9s8kfIzs3w2ylgGz3MDo1xlQxg79r" "PbZqFWcgCvHzcGoRDs9ga6SRLCEiAujtzpn8Yt4YGhgiU8owmhnlh9m0JQriV+nZ9BFDtIor" "312A40FaBwXuHhTQKj9hSFZZAhjYvUNrUN8xWfh+8xq7U8iWsrrT7tjZaTc/O7f/i/P7Hgis" "W6yUd4kOSexIDWoLFjNl0TB067Tw64he+uj5+w3dfLtltBMf7/30wl8XeuOZ0KGVhfI+0RQ2" "mKJVMrHeeuKyOfwLP2BBdH0wJE0AAAAASUVORK5CYII=") index.append('money_delete') catalog['money_delete'] = money_delete #---------------------------------------------------------------------- money_dollar = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlBJ" "REFUOI19k91LU3EYx7/nnN82d85WZ7m5OTVPpCDBRKELrahjXXhRcOjVikDFrgoLb6I72V+g" "3UUFIyI0o9rSIOvCWYJBUIoUQakHe9G5hsu9ubPz0lUgek7fy4cvH57nAw8Fi/SOXZZCFY33" "DIB8XH4fvi09GDTrESvAHl4I+90BLw0aRTV0E4ApgDYbXh3tFBna5qYMGqAoEIbs6IleGOgY" "koStXWrr4ErsUtfB2raIg7AgNEFJV8DQDLJKDpliBlPy28Ghjid9lieE/PsHWJsLeS2P+bUl" "OZVPyT6Xv6nc6eUdxI5qT1C0dNDzrENkHRxP0wyy+XV8/v2h+f7JWFqKSDzj0K47bE4hn1X6" "LAEqIJc0Bbqho4ywUFTSf+rhiUlNQfzpxbGwma9tDm6M9040+EKiy8YhU8pgQy2gUNrA0ro8" "s7CyGB7rfhXd3Ge2ArzHKmMK1lsoihE0XQVhCHY4dsLr9AUqPcHzaNVn558vfrHcYHOOR9pF" "wzCONATru/buqhcoUHgjT8WHzz1uM3UgRSTeyZGBXCE3O9r5cvBF93gcQFy7q0162YqJcs6H" "gLuiyVSiFJGEfdV1EzV8jaCqKjxRj7SymojBgBz0BfpZO4ecksNCSo6bAgCkk7lV2e8KCKyd" "Q0vVATHvy4pFvQTO7gIMHX+KaaTW0rc2A7Y5aL9ztKuuqq6/lhcET5kHumEgWUhiLvFp5uev" "7+Gpa9PR/wL+5ezImclDu1sPg6Iw/ePd3PDpkUaznuU3JpIrj765vzbrhoHlxPJrq95fLR7c" "qP5awh4AAAAASUVORK5CYII=") index.append('money_dollar') catalog['money_dollar'] = money_dollar #---------------------------------------------------------------------- money_euro = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiBJ" "REFUOI2tks1vEkEYxp/ZXT4Ega32YBXLErVQeuh6qJoqEePNi3AyGo2cTLwV/4HqX2C9NiZw" "8ORlNWp60Cj1YKLGFIJRtm0CDanRBstiafjY3RkPDcSWpSffw2QyeZ/f+8wzQ7BPqS+nZcoT" "EQbgNIRcMLGo7e0hVsLiqwtx93Dwoe2AXyKMAKBgtI165fOc3dx6EEzktYEAdWE6KR6/nCZE" "AO3U0aqvZnnBLdkPBiTC2dDc/JoLxJTT3X7hX/H3hbOS72g0TRjB1o/3GW7bSHVtF5Uzcc+R" "iXRzY+3ZwDsXX5yb2SjMssqHGyXLTJ5OypYZlJSLIvW6006vP+bwjInN6pey2W6UwRhAKQAG" "09C1E1feJPYCBADoOM1Z3/BEnOe9YEYLdrdfgotKAAMoAxhDbSV738pVL0RVmZJ9gegSITw2" "V99eAgAYvQXj1/NZK8CuEMEYAHNnb+wIORNa6GY+ZyXuAVRlSvaNnl/ibV6AAYek6DuAApSh" "tpxNAdgfAN2UW1U1a3MPyQ5vWDRaPzW9/jtnGm0tfKswN0jcV+qTyeSvT/fY+uK1mpqO9D1Z" "cT48o86f2nXe9xMrrxMl59CY1KmXtMb6coaazeecCckxNHLbNRKJUb2B2rePwfG7atkSoKYj" "suvYScXuGZUIZwPTtwGOAyEO6H8qWmOtkArdWckMdNADPQ4lBc/hqzxvFwGKtlbNUd181J38" "3+ovx2TdelLMd24AAAAASUVORK5CYII=") index.append('money_euro') catalog['money_euro'] = money_euro #---------------------------------------------------------------------- money_pound = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgVJ" "REFUOI2lks9rE0EUx7+7pE3jmmZjGq2tyCpVEA8q/gFtQPAiJCAIgiLxIHox4EXEgwRBKAhB" "EHsQjVXxYku8eO56UnuwQTD4o5KNlgg1qdvobrK7M/M8VEMS0xLwe5l5M+995r15D/hPSZ0H" "qamcFg4omd3D4QQnoOEwc7H0/VnFttLTV04aGwJSmdzB/WPDc5HBTaq/rw+uxyFLEuqOh+UV" "y3xdMGJP0qfyrTFyqzG2cygXCSoq44TStx/mwoey/vFLxWCcMBRS1JHolkxnBk3AhZszicig" "osmyhM9L1fz82+Vd188djb37VDxklE3DZRzatvBEPJXVWgG+vxsuxAFZlmDZHgpG9dbj9AkT" "AKbTSfP45UfJhcLSOHm0CsDsCvAYVhknEAGMM7XVaXbytA5A70y/rQQhoNcbDP5+Hw7vHb3W" "zbmbml24M/OSgsoAAn4fVmp1/LJdCAI4Bxa/VvS7VxOxboBmCYIE7IYHIoIy4AdnQM12wLkA" "Yz2mE7/0MHH76Suamp2nY+fv91RG2xxs3xpKBfp9cD0OwUSpF4AEAPFUVtu3Z3RuJBrU1M0B" "OC5HzXLw03JABHABEBHyb4wHz++dTf4DAIAb2Re0IxqCIIKgtXbSn0ABgAShWDYxefFI2/g3" "P/F9sapzRhNcUNurggsIABBYW9fT+JmsutH9evoN5bb16NwQwA0AAAAASUVORK5CYII=") index.append('money_pound') catalog['money_pound'] = money_pound #---------------------------------------------------------------------- money_yen = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhpJ" "REFUOI3FUE9oUnEc//jURDflhXu6kPlnjagGm1LZiEQZRBELtg7Rbu0UdHKXLhG6UwSBEl46" "ROzQfaNo1GHuUbGKahOKJlvTt+l8vrfZU5+pUb/XSXiIsaBDn9P3++Hz+fD9fIF/hKY1jD2+" "GBtx+cPfm3Xp89Ybz/wUK6mFo4lQ5MyR01G5KUsrG5987DSbBQCqJdD+qM3symLW1mWjKZ05" "pjYHY0H3kGswbNJ14+OXVLxlBgBta0jPcw1LwMw5rc6rhywOL05QbGYhkwUA35XhR0ftg97V" "XGr12Y2FSXU4pV5eXF+ce8e9nztAGeCw98YAIHjv7LivzzterVewvZWbav+Btp2wBexvu0zG" "ay7a7YaP0B6HK9xj7KEXV5LxV7dez+4bwD3nJIPP0Oy3uy8M9A6MOMx9tFAWpZ382gTHFhvt" "eqqdAAD25su4VJdg1ltACIHcqErsTErqpNWol8sPJ5KHGU+IEIJugxlWoxV6So+9WgkFKQ9F" "UaDT6IX7kwl7y6NTB/ySCbtWWWdBCBiGCdGOg0FOWJfyFT4lFopL5CcBAfnzBWqcv3MuevL4" "qQhf5vnNzNcHyQgb3bfCpcRY0sU4QwoIGJMdtImGQhSUarsofONBoECUxOST6aejHSs0yk02" "XU6zhBCIzF7I3+8PZsQNuVASPhR3+CVC8PcVArcD0eFjQxGhKmS3N3Ozy3eXO1b4//gNn6/k" "EbEvnDwAAAAASUVORK5CYII=") index.append('money_yen') catalog['money_yen'] = money_yen #---------------------------------------------------------------------- monitor = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAfRJ" "REFUOI2VkztPVEEUgL+5exeVJfJQIiG7dlgaE9BKQ0KjNLb8ADex07+wHUaTTdh6rSy0szLE" "BioTUAtLDPHVCVFexl3uzDlzLC6sy0KCnszkzEzOfOcxZxzA2tqaxRiJMaKqqCoi0tHdM4TQ" "0XNzcy4FUFXGx8vs7O2BGeQDzDDAzDprzBgeHmJx8RUAHcDO7i4PGm/4F3ly/zre+78AETlw" "CeXKZQb6+6iMljh7JmU/GEEiQUENVt5+wKKRZRkACUAIIQ8TcM7R2he+7+zTyhQzEDW8RDLJ" "bcw4GkEIgXgYn3M45/jVEqJlDJWKpGmBJBp2AIgWjwMs5gjXBWl7xYdIqb+PQiEhcbkPiycA" "6ErBOZdDAHOOVqa4xPJzIPam4L0nKSQAfPv65dRXKKSF44C+Ysqj6jVUjWKxyObGBqWB85gZ" "29s/GLs0RrvdPqh8PAaoLy8vTR92mYiMeO+XyuXyPRFhfX39qYjMhBC2DrtQVV92atYr9Xr9" "YQjh7s1b0zODg8O8eP6sraq1+fn5x722RwALCwujIrI5MXGFkQsXUXEEEUqlc3z+9JHV1ZXf" "jUZjoPtO2r3x3k9VKhVmZ+8gIpgZZkaSJExNXmVr62epWq3ebjabr0+MAKBWq70XkcneX6iq" "hBDeNZvNG6c+0//IH9RAUzcZArNFAAAAAElFTkSuQmCC") index.append('monitor') catalog['monitor'] = monitor #---------------------------------------------------------------------- monitor_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlJJ" "REFUOI2Nk01IlEEYx3/zvrurtZrZB1i4QWAHL1GZHqQIkkAjBOngOYqCwDp08Sh0kUTBDh66" "RKduRUYIQYegIiJQi2BBRdcV3VUpV2Pd952Pp8PWtuVCPczwDMM8v+f/n2EUQDKZFOcczjms" "tVhrMcaUcvnUWpdyb2+vigBYazl8uJGNzU0QgeIAEQQQkdIaEerr9zIx8QKAEmAjl+PW/bf8" "TwzdaCUMw98AY8zPltCYOELN7hiJg3GqqyIUtKCNQ1uwAu8/TCFOCIIAAA9Aa12UCSilyBcM" "mY0C+cAiAsYKoXEEpnhGhD8VaK1xv/QphVKKrbzBScDeeJRIxMdzgvwEOHE7AeKKCFUG2Q4t" "oXbEd8fwfQ9PFXuIqwCgzIJSqggBRCnygUV5UtwH3N8WwjDE8z0AUgvz/3wFP+LvBMSiEQav" "ncBaIRqNsprNEq/Zg4jw7ds6mWCW6fRbtrZzDI0/QuyuIgygp6dnz9zcbGwxlVpZTC2szM3N" "BEtL6SfO6lPr61leJ8cnC7XpQ+0tbXS0dlKIZEltTxFv8mtVJYkjIyO3tdbdZ86eO19XV8+9" "8T4uX7oIvkd3cx/Dr67j4/H46bNCpLxwdHT0oDFmtanpGPv2H8BoyGTW+Pp9jaiqoav5KgB3" "Oh7w/PMYivHqPwBhGJ5OJBJ0dXVijEFEEBHuPs/xZfkd08tv6L/wkMGXV6j2qxCksMPCwMDA" "R2NMS/kPTOlpvKMrtB8/w7GGk8xkJnn36Q3p+dxwxTuoFG03GwZR6qaCWoEtRMY+jGX6fwCU" "sGBj9XUbOgAAAABJRU5ErkJggg==") index.append('monitor_add') catalog['monitor_add'] = monitor_add #---------------------------------------------------------------------- monitor_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkRJ" "REFUOI2Nk81LlFEUh5/7vu+oOaJOfpA2k0kGQYuCrEUUQkFki7ZD6wJJqKBFRIuaVQTBgG1a" "tuofCETK0NKCyAKpjYtKpbTxI9QRxpn3fpwWo9OYA3W4l3O5nPuc37n3HgUwNTUlzjmcc1hr" "sdZijCn58qm1LvlkMqkCAGst7e1xVrNZEIHiABEEEJHSGhFisUaGhgYBKAFW19a4/ugt/2MP" "+44ThuEfgDFmMyXEE/uoq60i0RKlpjogrwVtHNqCFXj3fhJxQqFQAMAD0FoXZQJKKXJ5Q2Y1" "T65gEQFjhdA4CqYYI8J2BVpr3JY+pVBKsZ4zOCnQGI0QBD6eE2QT4MTtBIgrIlQZZCO0hNoR" "ra3C9z08VcwhrgKAshKUUkUIIEqRK1iUJ8V9wP1dQhiGeL4HwOzM9D9fwQ/8nYCqSMCDK0ex" "VohEIiwuLBCtq0dEWFlZJvZtjNz4U/TPWTL3Wtlbc2AbID06OtKz9cuMMbvDMByJx+OXjTF4" "r59MNEfXu09cuqqqOw+z8ekF9WPDbvhscE1VkphOp29orS+eOt1zpqEhxpdbJ+Vc/x216+sr" "mHsDDY0sBx18fD4+HZQfHBgYaDHGLHZ1HWR3UzNGQyazRF0+q2r2dMKFm6XYINWGL2r/NkAY" "ht2JRILe3vMYYxARRISJ1jZyk4NEn/VT2MiQA9azPtZnfkcJqVTqgzHmWHkHHlr7zBH/Ox1N" "msD7wfqSYSbj2zDv7la8g0o2nkzczv2a7/Oc6nCezDnkce9Ld/83V79g8J9A7e4AAAAASUVO" "RK5CYII=") index.append('monitor_delete') catalog['monitor_delete'] = monitor_delete #---------------------------------------------------------------------- monitor_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApFJ" "REFUOI2NkltIVEEYx39z9mKu1q6aF8pVNClMoaQblNCFqB4iJAohoijs8hT01FMvEXSDwiAq" "kCAi6qGHIkKCSLoYZS9bPSSKrktYuoK5puueMzNnetg8bReijxm+GZj/b77vPyMAent7jeu6" "uK6L1hqtNUopL+dOKaWXW1tbhR9Aa82CBZVMTE6CMZAdYAwGMMZ4a4yhqChCZ+cjADzARCrF" "scvd/E9cOLIKx3F+ApRSP66EymgVhaEg0dIC5uT5yUiDVC5SgzbwuieGcQ22bQNgAUgps2UC" "QgjSGcXIRIa0rTEGlDY4ysVW2TPG8GsFUkrc2fqEQAjBt7TCNTaRggB+vw/LNVTTw54Vnfj6" "B9kw9xmxKw37PIBxswiRA5lxNI50KQgFWZz/nM0lCfLn7yVc08REfAkfH3ec9wDktCCEyEIA" "IwQLrRdsq08yL7yO8YGPBIXD3HkVFJZUhf2Q7cfyWQAkhuK/ON5Q0s/utQ6R2m3YX+4SDAkS" "sV6mphWuTC3zAMGAn7Nty9HaEAgESI6OEvH1Ew3PEK7bQWb4GlZQESisJk8luBdfyMlzN/tm" "ARe7up6un/1lSqniwumX8S0bqzaF61rIDF/FCiicyRo+d73WD4er+5Jp/23Ps9/j1pmWG03L" "a/fXr2+xnNGbCJ9DJlVJ8nnPjHamltYffzPkPVqusL29vdQaf5fctKYCJcooKe6mqCxIJhVl" "pPs9dwai6dMXrxfkaqzcjeM4K8tDCZY2Hybv00v6HnQTezxO39MY1TsvUV7TGGpra9uaq/mj" "hVOHGt0TB48KLE3syX0Gh+J8yN/IVzkHKeXbjo6O1f8E7GqOzKxYVO5fVV+LCdiv7LGxA9vP" "fhj8m1cA3wFlt1E/ubMoMgAAAABJRU5ErkJggg==") index.append('monitor_edit') catalog['monitor_edit'] = monitor_edit #---------------------------------------------------------------------- monitor_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnBJ" "REFUOI2NkktIVFEYgL9z79xxGp1KcyjHV2lKiD0mMtyELVLatGmjuyiKFkEtWkSrNi16gKDt" "bdUigqBCWlhKURC9kCASiR4QlaJhU01z73n8LcbGsVr0c37+c+Cc73z/4SiAqakpcc7hnMNa" "i7UWY0yplqfWulT7+/tVDMBaSybTwEIuByJQHCCCACJSmiNCdfVqbt8eBaAEWPj6lePDD/mf" "uHi0iyiKlgDGmMUroaGxiapknMZ0JYmKGAUtaOPQFqzAo8eTiBPCMATAA9BaFzUBpRT5guHz" "QoF8aBEBY4XIOEJT3CPCcgOtNe63n1IopfiWNzgJWV0ZEIv5eE6QRYATVwIsGbgiQpVBfkaW" "2YWQGl7SV32ZpP+jaOD+AaCsBaVUEQIEvmbLiglaW7toDx4sGvzRQhRFeL4HwPt3b5e9eF/L" "FM0t3aysy7Jh8hoNVT34Mf9vQDyIce7wNqwVgiBgdmaGVEVIYuYWqdoubO4m67cf4Gj8Dp7s" "/gswODEx3vP7lxljarQOJ3Zm3h9q2rofCs95fOUG3UdOI/MvuDt5/o3Wq0ZKgIGBgZPl2oOD" "gyfS8Y8H69ZUkarOY3NvQRz2+xM27D6JHj0bZhMMXwL88oNDQ0Pp3t7eH+1trXtb/Cfr6jp6" "8N1zxHwh01GLuDzxZAUEm9O5D08LI3c+3fPKAVEU7aivr6drvaG2IUsyNYeYeVA+z65PAw5X" "mCbd3oyNomP3z3R0LDMYGxt73dnZuS/18Wqmbc8pvJiPChrxEpuoz+7CS2xCxVuJVbYRT22s" "nH01vlbxj3hwITsnxiXFCeJcMUVYWgs4B06e/QIgiGSqvCqWzQAAAABJRU5ErkJggg==") index.append('monitor_error') catalog['monitor_error'] = monitor_error #---------------------------------------------------------------------- monitor_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkVJ" "REFUOI2Nk01I1EEYh5/5766Fmqmkiewqih5UisiiIKiDJNk58NAhqMBbHrt08JAkFEt2quhQ" "dOwcUlgWrPRpdCm0KDPJNAn8yHX/8/V2WF3Xj4MvM7xzmHne32/mHQUwOjoq3nu89zjncM5h" "rc3l/GmMyeXOzk4VBXDOUV0dZ25hAUQgO0AEAUQkt0aEsrJSBgYeA5ADzM3Pc+nWMNuJ612H" "0VqvAay1KyUhnqihuLCAREURO3dEyRjBWI9x4ARev/2IeCEMQwACAGNMViaglCKdsUzPZUiH" "DhGwTtDWE9rsHhHWKzDG4Ff1KYVSisW0xUtIaVGMaDRC4AVZAXjxmwHiswiVB1nWDm08RYUF" "RCIBgcrWEL8GyFkgz4JSKgsBRCnSoWPWdzFlzqICi99oQWtNEAkAmPgxvuXNV7SE1FY2sdDQ" "iw8ebQYUxKL0XTyAc0IsFuP2yHnEG7S3aGupLm+kqeoIi5klLg+202zOrAMkh4aen1jtMmtt" "uS3RdSdbzuHE47zDI0zNT7Ivfox/epnh9F1p7WO32kpuMpns/lT28Obp/ReY+PsV4y3WG4wz" "BEEBlbvipL4/4c14ykXzD/b391dYa/80NDQyMpPBOsvekhqsdzjx/J7/SXlxFR8mh0l9S81q" "R/s6gNb6UCKRoKPjFPfvdfPg1Q2012Sspn5PM0fr23k3kWJw7Om0drRNX+PzJgs9PT3vrbWt" "G3/hy8o7HKw9zosvz34ZRdvUVcZyfbOdqLvCkpNIYYirn+kl99b/ASACddRHXfO/AAAAAElF" "TkSuQmCC") index.append('monitor_go') catalog['monitor_go'] = monitor_go #---------------------------------------------------------------------- monitor_lightning = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAo1J" "REFUOI2Nk81LlHEQxz+/Z1fL3UpXzXzNQ2rSQYhKQkpBk5IIIgoi6CZ0iS79AXlKKLpsUJft" "EB1a9JARJh6kCJIkwYvo1pZCIWm1tr7sPu7ze+uw66ad/DLDzGU+zBdmBDnFYjFrjMEYg9Ya" "rTVKqXzdmlLKfPVvArTWVFfXklxdBWshG2AtFrDW5nusJRQqYWRkeDsgubLCrfB7dqL7N07g" "ed4/gF/PEkgOcff8Oj7Hh9EGtAGj2PB2M7R0k5Qtw3EcPs/OYI0lk8lkAXbgim9OTREoq+FQ" "2X6sVFip0J6L+yfGy59dpE0I4QgQgpwLPM/DAVhs/FkXNJMUFNVjUjMIJ4jRio3kZ17NtzOb" "bsMKByEEIgcw1mQBdvpIoZMxvUUlhwEfxl3EqAy/5kcZnmtlOt3xb1AIRM6yNVmAf3Gt9Kgw" "6sauvY1Y5YKvCqRESodiZ4m2QBSf8djQQeKcIS0qchtkLfiFNg93l58odxMxjDIUBhrA+Kmq" "76YkEUdLj+TCFIPfLjKd+o5nlwDw+X1ZgNFqILUw/m7BPXm7smI/q/HXhGq7UBtJvPRvVtRB" "Ms2Paasv4NKBSlzXBcAha2HTEtFo9IGVa53Hi8ItwX0NzvKPL2pu/ch4puJyu1KKeDz+RCnV" "KaVc3rxCrfWLPADg62DzWGGgpjP9e37gbeL6VFIGuk+d7ugsLg4Rff7M1Vr39ff339s6kwd8" "GWzqsZ55tCaL77xJXHva2NhEaVk5WgmkUgSDRcx9/cTExIdUOBzekz/APEmy4GlzYezX1bq6" "uhp6es6hlMJai7UWx3E4fqyF5eVEsLe392wkEhndtsFW9fX1TSqljv3/hVprpJQfI5FI6w7e" "ZWf6C6oXiAxQtsS8AAAAAElFTkSuQmCC") index.append('monitor_lightning') catalog['monitor_lightning'] = monitor_lightning #---------------------------------------------------------------------- monitor_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoFJ" "REFUOI2N0c1LVFEYx/HvuXfGO3XFruhgXqpZWGGICxcGgiBuQjeBUClYRItoI/0f0iaC/oH+" "gHFVRvTmIoiCaNWYFE7mOF6awpcZnftyztNiahorqMM5nMPh8Hl+D0cBLC8vizEGYwxaa7TW" "JEnS3FtXHMfNfXp6WqUAtNb4/jG2dnZABBoTRBBARJpnROjs9FhcvA9AE9ja3ubmnRf8z7h1" "Y5goin4BSZL8KAnHjp+g/XAbx7MuGSdFPRbixBBr0AIvX71FjBCGIQAWQBzHjZiAUoq9esLm" "Vp29UCMCiRaixBAmjTciHEwQxzHmZz6lUEqxu5dgJMRz06RSNpYR5AdgxPwJiGkQqgXZjzRR" "bHAPt2HbFpZq1BDzF4CWFpRSDQQQpdgLNcqSxj1gfm8hiiIs2wLgU3H1n79gp+wmoADy+bwM" "D59lZ3eX/f06798vs/55jWw2S7m8yclTp8mdyPH06WOOHu2hUvnK+vpnCoVCuw0wNTXV8fHj" "h7bi6urmw8UH1qFDmfbZ2Vl838fzPF6/frVbKLyTS5cu2n19faqz06Ner1MsFtOqNdrQ0ND5" "8fHxe5evXTty9/btr0EQdPX29jI4OEi5XKZSqVAqlXRHR8ejubm5yXw+v221Ao7jnPM87wjA" "5StXu8IwZGZmhtHRUSYnJ5mYmKBare5Xq9ULAJ7nOalWwPM8giAA4PmzJwDMz8/jui4AtVoN" "27Yz6XR6AaBUKtUPtDAwMHCmv7//zcjISMb3fTKZDEEQsLKyguM45HI5enp6SJLk29ramrW0" "tLR5AADssbGxQdd1F3zfzzqOY4uIValUriulSt3d3QtAOgxDvbGx8aVWq019B2LjVPn3/VHt" "AAAAAElFTkSuQmCC") index.append('monitor_link') catalog['monitor_link'] = monitor_link #---------------------------------------------------------------------- mouse = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm5J" "REFUOI2lkjFoE2EYht//ktRemvQqjZSzSUlQIsRJnDrUQcVRcBbHbs6Cg5QUEVoDxVHEJaCU" "gkVXl4SqpHQIaUlNKm2pFxyu4SzJccnlv/+/z0F6oK2LfeHb3ueB7+MDzpC1tbVb7H/Aer0+" "ZJrmI9u2H54qaDQacSHEYyHEHc75D87585mZmc8AUC6Xr/V6vWeO49xwHCd6QmAYhtrtdj9p" "mnZ9bGwMjuPAMAxYlvUxHA43HMe5m8vlMoeHh1hfX3/7h6Berw8RUXl0dHR6amoKRATGflea" "zSa2trZ6uq5HNzc3f9q2nbcs6zUDACJizWZz1vO8J7FYLJlKpaAoSgB3u11EIhF0Oh2srq6i" "0+k84Jyv5PN5rhAR297efjcyMvIyk8kk0+k0LMuCaZoQQqDVaqHdboOIMDExgWw2CyLS8/k8" "BwClVqvNxePxe6lUCrFYDAAwPj6Ofr+P3d1dhEIhJJNJhEIhSCmRTqfBOb95vLYyGAxua5oG" "IgqGMQZd18EYAxHB930IIcAYQ6/Xg+d5Q4HAdd2sqqpBUUoZlHVdh2VZ8DwPw8PDqFarWF5e" "lq7rzh8LwqGjI0gpoSgKpJSByPd9MMaQy+VgGAZKpRIqlcpX3/fvLy0t1QLBOdNsttvtC5OT" "k5BSBjARIRqN4uDgAMVisep5XnFxcfHF33+jnN/f30usrMCvVBCJRIIbqKqKfr+PjY0NuK77" "dGFh4QQMAOHLqjq71zKuXHT7098TCei6DiLCzs4OGo0GarXafKFQeH8aDAAMAEpzc+GEab7a" "17RLti+vflOjA875FyHEh0Kh8AYA/Utw5vwCF+ZcDJKWvS0AAAAASUVORK5CYII=") index.append('mouse') catalog['mouse'] = mouse #---------------------------------------------------------------------- mouse_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtJJ" "REFUOI2l099LU2EYB/Dve7ZZRzePpaQHNpmZUot+SGAWGfT7LugP6MILb6yugn5QIasII7sV" "+nVZhJBUV6aCQy3FoObacJazsVF5XCc5O51tvnvf83YRDqIuoh547p7vB54HHuA/amxs7BD5" "l2A0Gi3TNO2caZqn/wjMzs56GGMXGWNHKaWfKKW32tvbJwAgFAq15HK5G5Zl7bcsq/w3IJVK" "ydlsdlxRlF1VVVWwLAupVAq6rg85nc5Zy7KOBwKBhqWlJUxNTT36BYhGo2VCiFBlZeWe+vp6" "CCFAyM+ReDyOSCSSU1W1fGZm5ptpmkFd1x8QABBCkHg83lksFq+43W6vz+eDJEmlcDabhcvl" "gmEYGBgYgGEYJyml/cFgkEpCCBKLxZ5UVFTcaWho8Pr9fui6Dk3TwBhDOp1GJpOBEAK1tbVo" "bm6GEEINBoMUAKRwONzt8XhO+Hw+uN1uAEB1dTXy+Tzm5+fhcDjg9XrhcDjAOYff7wel9ODq" "2tLKysphRVEghCg1IQSqqoIQAiEEbNsGYwyEEORyORSLxbJVwFkoFJplWS6FbduGbdslJJlM" "wuPxYHJuBCNvnsPMGzArjLZj57ddfnHz3XWnY3kZnHNIkgTO+W9IIBDA4+H7+Jh7jQPtu+Fd" "34TR2NPyqej4tdZTapW0RtPimUwGhBBwzsEYA2MMnHPIsoxkMonhyIC9c/MOcIljh3oEnBTR" "tm0vAHFKWrewkKjp74c9OQmXy1W6gSzLyOfzmJ6exvJ3XXIRN45vOQMAOHvoLho3bAcBWStt" "kuXOL+nUJAuNIpFIwLZtcM4xNzeHwcFBhMPhq18NrRD7/Ao9wx0AgJ6hDiSWIhAQBQIAo93d" "zhpNu7egKI2mzbe+l8tXKKUvGWPPent7H7Z2qdd8G5VLe7fvQ1NdCz4svsWryATSH43bf/2N" "rV11PSCkiwAeAZgQom+6b/HCD3b3gbKZ0mJrAAAAAElFTkSuQmCC") index.append('mouse_add') catalog['mouse_add'] = mouse_add #---------------------------------------------------------------------- mouse_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtxJ" "REFUOI2lk0+IE3cUx7+/mUl0kuxmZUO3U5I1wZJi9CJKwcMWqrbgRdCLeOihBSlKe9BDUYou" "KUUU17NIKSi0PSztikJBVsGw659lQcguWTNbdkPMVnE2nZVknJnkN7/fPA9iQPRQ9MG7fb6f" "x3vwgPeoqamp3exdgpVKJWpZ1g+O43z3VkG1Wu0TQpwUQnzJOX/MOT8/MjJyBwBKpdI2z/PO" "uK77meu6sTcEjUZDb7fb08lkcvvAwABc10Wj0YBt25OaplVd191XKBRyq6urmJmZ+eM1QaVS" "iRJRqb+/f+fw8DCICIy9REzTxPz8vGcYRmxubm7NcZyibdu/MgAgImaa5uEgCE4lEol0JpOB" "oii9cLvdRiQSQavVwsTEBFqt1lec8/FiscgVImILCwt/xePxS7lcLp3NZmHbNizLghACKysr" "aDabICIMDQ0hn8+DiIxiscgBQCmXy6N9fX37M5kMEokEAGBwcBC+72NpaQmqqiKdTkNVVUgp" "kc1mwTnf9Wptpdvt7kkmkyCiXjPGYBgGGGMgIoRhCCEEGGPwPA9BEER7gk6nk9d1vQdKKXuw" "YRiwbRtBEGDt5mXc+3oz/ju+AyMPLmy9sUc5AQCa+uwZpJRQFAVSyp4oDEMwxlAoFFD97Rzo" "4Q18eugI1uW2wJ+f/ODh9OTPN8l0lXWWZTabTTDGetOFEJBSQtd11Ot11P+80M1/fgDrl0tg" "Vw4hVruK7MaUKkHHlA212nJqfBzh/fuIRCK9G+i6Dt/3MTs7i1jneXT9hzng++vA2TXgZA2a" "a0IlltU+1vXDyyuNTz7q+DsfpVIwDANEhMXFRVSrVZTL5Z++UOgbr/x3On79KLr+U3gAnLYK" "qeIJA4Dbo6NayrJ+qSWTm5xQbvlHj3U553eFENfGxsZ+nz5ojEYT8R8zKalpyr9wmgL1p6rk" "nfD0//7G6YOZE5795FslZBtDhR6HoIt7b4VnXgDmjocCUZwJ0gAAAABJRU5ErkJggg==") index.append('mouse_delete') catalog['mouse_delete'] = mouse_delete #---------------------------------------------------------------------- mouse_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAs5J" "REFUOI2lk81rY2UUxn/vTdKZpEluMk0pAROrDqkToVjHjUIFP3ApjLrQhe5mpRsVBBdSgjCg" "/gkiwoCzKFqwG0GUydRCS3TGNCQ0dtqMRJ1y08ZMEm8+3vve93VRjIqz0gPP4sB5focHzoH/" "URsbG0+L/2KsVqtTjuO83e/3X78rYHd3N6aUekcp9ayU8lcp5YfLy8ubAMVicWkwGFxyXfcJ" "13Uj/wI0m81wr9f71rbt84lEAtd1aTabtNvtr4LB4K7rus/l8/n7Wq0W29vbV/4BqFarU8aY" "YjwefyybzWKMQYiTkXq9TqVSGaTT6cjOzs5v/X6/0G63PxYAxhhRr9cvep73bjQavSeTyWBZ" "1sTc6/UIhUJ0u13W1tbodruvSClXC4WCDBpjRK1W+zwej19IJpNMT0/TarXQWpNKpTg8PMTr" "ljk1/J65xTfJ5XKUSqV0oVCQAFa5XF6JxWIXMpkM0WgUgJmZGYbDIfv7+wSER6h3jciZRTqN" "L5ifn0dK+dSfsa3xePyMbdsYYyYSQpBOpxFC4B1dIzLzCPH0Endufc2wcxPP86YmgNFolAuH" "wxhj0Frj+z5KKYQQzNqG0S/fEEsl8HvrzJ57mds3LhuUe2kCCHQ6+L6P1hqlFL7vn0A8j35j" "ndkHn4fRDUqXPyWaGDI3dcyLZyuJCeCU49SPjo4QQky2K6VwnR9g3CeWHKDHt8Bo/N+/4/4n" "3xK+lO9tvv94DMBKNhoHqdVV9NYWoVAIYwwYn07tConsw+hBBaOHnH9hAS1vc/r0HnOLL52D" "0RsA1tlw+OLhz80tVbzKwcEBWmvu3PySyJkFIrFjjGqDCHB9bQ/Q6NEes7l78aV8bWMlnxcA" "V1dWginH+ahh2w/0tf9QNl2yH331k0DA+gmjOoD5271aBMILOLUyP64XPrvrM21+sHRslI4Y" "bTBan8gY/uoNaA3aXP8DEs+G6wC5l3IAAAAASUVORK5CYII=") index.append('mouse_error') catalog['mouse_error'] = mouse_error #---------------------------------------------------------------------- music = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcBJ" "REFUOI2tk7+K4lAUxr+4CSOCCGIk6GAvLGJja2EvPkB8goGBqQWRaacRexsrH2AKS1uFAVGI" "RKtUkyYOikq899ybTLMJLBu32f3gcA+Hw+/84wL/KCUpOB6PQyklhBCxEVH8Rv7xeISaBPB9" "H81mE1LK2IIggBDit9hoNEoGRNVnsxksy4Lv+3Esm82iWq2i0WhACJEM4JxDSon9fo/pdPrH" "mKZphvV6HZxzpJIA0ZxhGCYuLpVKxTmJAM55vLwkMcbiRd4FRBX+VuBuBxGdc54ICMMw7uLu" "FaKESN1utyWEmDDGHsvlMg6HAxhjXzFgMBi0iGjCGHssFovwPA9hGH4BgGmaL7lcblgqlaDr" "OqSUWCwWIKJ3FQD6/f5LJpMZ6rqOfD4PIQSWyyUYY++dTufJMIxhpVLBw8MDhBBwHAfb7RZB" "EEzUXq/3VCgUhoZhQNM0EBEcx4FlWbherxMi+qmqKogI6XQatm3Dtm2cz+dn13Xnqud5P263" "Gy6XCzRNw263g23buFwuz+v1eg5gXqvVrM1m80ZEihDiQ1GUV9d1P4Ffn6ndbrdOp9Ob7/sK" "EX0oivK6Wq0+E0/wv/UNGuZJWe0yFYwAAAAASUVORK5CYII=") index.append('music') catalog['music'] = music #---------------------------------------------------------------------- new = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAUBJ" "REFUOI3t0j1rUwEUxvHfTW9rIHfRpd1cVBxc1MHsOhecHRXLLUVwMZ/AIXERQe4iCDppB8Gt" "Szct6AeILYKm+BKHXN9SE4K9xyFa7ezaBw6c4TmH/3nhQEl03ESOAhPkwkPkEh/wFW8lCpVj" "oKaukqspREcZozLi0YWIjn4M+9N8MowotyI+vox4tRpxO4tYuzqNtm4MuhF3FyIV6tI6i4+5" "cyQzl7FwlsmQeyc+mcvmLfU4vcLR81Pu8ZeTZjN2+u9SVKJic5Vmq7E3XP0wV7bmjQa8fsqZ" "FX6OmTnEuRaDLnTTvYK1pR3Xyr8Nxp+nBLyRzDRd/8H2OpPvHL/I/VNQ1Pat9EWb2cZ+gksb" "TdXuSOzyrcf7Z9RSyk3JDU+SaLv1zxUaErlQSFxGDwPh+W/PA1R/PEnL8v8/woH8Ah0VioYI" "i9+mAAAAAElFTkSuQmCC") index.append('new') catalog['new'] = new #---------------------------------------------------------------------- newspaper = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmdJ" "REFUOI2N0sFKG0EcBvBvk9W0axIvVtMibDxZiSGpBHX2ENQHKMVLoS8g9AmMFE99hDxGE+gl" "eKoVwY0KdRepRtIqxBqQEmxM424y85/pSYlVbOc68/tm+M+n4R+rVCpFhRAfpJRfBgcH383P" "z4ve/cB/4IIQwuKcvz0/P3+/vr6u954JPoQ55wUisizLGkgkEqHDw8PpZrNpzM3Nba6trREA" "aA9hIYTFGDN2d3ehlMLCwgIKhYIkohIRLS4tLfE7LyiVStFut1skIosxZuzs7MDzPBiGgdHR" "USSTSc1xnKdSykgmk/kcvA8LIVgvjkajeDb+Ah+dn7jwCL9OK/1ERKFQqBjoxb7vFznnjDFm" "bG9vo91uIxKJgDEG+/gSX+u/sVlp4OWrRY2IpohoMtCLiYhZlmWUy+UbPDMzg/39fbzOjGAk" "2o9p8zGcyndwzh9xzvsDAOB5XpGIstls1rBt+9bN5XIZUkq0Lpt4k45CXJzhaK/cVUrN5nK5" "TzoASCmlEELnnCOVSuHk5ATpdBq2baOvrw+maeLq6gq10x84O3J9IkrkcrnjmyJxzmcTiYQW" "DoehlIJpmtja2oKu64jH42i1WqjVanCdPU9KOX6NbwKklO1WqwXbtjE0NAQpJSYmJhCPx9Hp" "dFCv1+G6rgfg+fLycq33565nkK5UKlzXdWxsbGB4eBixWAxSSjQaDbiu21FKTf6NbzUxn8+H" "g8HgsWmaT3zfRyqVQrVaheM4frfbTa+urh7d19pbVc7n82HOeXVsbCymaRoODg58pVRyZWXl" "2334TsB1SLvdrhLRAICphzAA/AFWQ3HhJyet6wAAAABJRU5ErkJggg==") index.append('newspaper') catalog['newspaper'] = newspaper #---------------------------------------------------------------------- newspaper_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtpJ" "REFUOI2N091Pm3UUwPHv89CXWdY2McCYIQHURAnU1qXCnseEAIuJ8WKR3ZjsbheEBPHKGyFe" "esGFl4wL/wZLYkwqmYnYQNby4toMNkpkEmdYVteGlfLYlt9zfo83utTMTM/tOZ+ck5NzDP4j" "0ul0xHXdr7XWd6LR6Ofj4+Nua978Hzjluq6tlJoplUpfrK6u+lpr2l6ElVIpEbFt224fHBwM" "7u3tDVer1dDY2NjaysqKABgvwq7r2pZlhba2tvA8j4mJCVKplBaRtIhcm56eVs9NkE6nI2dn" "Z8siYluWFdrc3KRerxMKhejp6SEWixmFQuGi1jqcTCZ/bPs37Lqu1YojkQivvPE23xSecFwX" "nv5WDIiIBIPBZbMVNxqNZaWUZVlWaGNjA8dxCIfDWJZF9pcT7j06Za1Y4eqH1wwRuSQiQ2Yr" "FhHLtu1QLpd7hkdGRtjZ2eGj5AUuRAIM975EofgApdQ5pVTABKjX68siMjo6OhrKZrP/6JzL" "5dBaUzupcj0RwT0+Yj+fO/M87/Lc3NwPPgCttXZd16eUIh6Pc3h4SCKRIJvN4vf76e3tZf3+" "LfK/rnPaOOGkUVXHp5UPgDttAJOTkzeHhoaCnZ2dOI5DNBoln8/j9/vp7+9n7f53PGz+xLvJ" "Ya688z4qWAmU/3g40f56W9j8awKnVquRzWbp6OhAa83AwAB9fX00m03W91dIvBlHTCF+8T3E" "UFyO2YD38d87SBSLReXz+chkMnR1ddHd3Y3WmkqlQrlWwm+c5+rAJwB8euUrXut6CwPjnAkw" "NTVVqtfrLx8cHDwJBoNkMhnK5TJHR0dsb283yk9LzXuPbrPw/Q0AFm7d4MHvd/HwGs/uYHZ2" "9lREXt3f339smia7u7vk8/mG1jqmPe/L3N3bBPDx7c4SAcPHeiEDGDef+4XFxcXzjuP8LCLt" "wKX5+fkDgOGZ7gUMY8aAsAc1PG9pc+nxZ38C1uOTgWFOwdsAAAAASUVORK5CYII=") index.append('newspaper_add') catalog['newspaper_add'] = newspaper_add #---------------------------------------------------------------------- newspaper_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtpJ" "REFUOI2N089LFGEYB/DvzOy6OuoKtfgjjFk7FKLiJpLOHEQ9BF0ivER1FqHs0MmUDh0i+gOk" "6BJG19YoaBENdRGc9Qe6pOVKqx5qzU3XzbXZWX3f550uFRuF9Vyf58Pz8PA8Ev4RoVDIyzl/" "LoRYKCsru9PR0cHz8/J/4CDn3GCMXU8mk/cmJiZc+TXKUZgxFiQiwzCM4rq6Os/Kysq5vb09" "tb29fWpkZIQAQDoKc84NXdfVubk5OI6Dzs5OBINBQUQhIurq6elhf0wQCoW8h4eHw0Rk6Lqu" "zs7OwrZtqKqK6upqNDQ0SNFotEoIUdrc3Dyp/A1zzvV87PV6ceLMWbyMbiNtE75+jBUQEXk8" "nmE5H+dyuWHGmK7rujozMwPLslBaWgpd12GuZ/Bu8xumYilcvNQlEVETEdXL+ZiIdMMw1Egk" "8gu3tLRgaWkJl5srUOEtwDmtCNHYGhhjhYyxAhkAbNseJqK2trY21TTN3zpHIhEIIbCf2cPV" "gBc8ncDqYuTQcZzW/v7+cRcACCEE59zFGENjYyM2NjYQCARgmibcbjc0TcPu2BAyk89QsfUR" "xxWk4NB5AAsuAGCMtdbX10slJSXIZrPQNA3T09Nwu93w+/1IjQ2hYG0crdduwFNTB/vtaNX7" "qdF7Y07Mkn9MYO3v78M0Tfh8PgghUFtbC7/fj4ODA6THnuB0excK1yYhPb0Cdf0F/JpPITi3" "fu4gEIvFmMvlQjgcRnl5OSorKyGEQCqVgpL+gsLKGuDmK+DBLtC/DpcVg+JIfhkAuru7k7Zt" "H4vH49sejwfhcBg7OztIJBKYn5/PcQVb2ehr4G4VDvokpPskZJLbIMXZ/HUHvb2934jo1Orq" "6pYsy1heXsbi4mJOCNFQfMz3+N10mH/OFSGjuJHelRD/JJHjOA//+IXBwcESy7I+EFExgKaB" "gYE4AExdPnk7m9rskYWkCdlJCDiPLrwR978DpTKejCAZ6dwAAAAASUVORK5CYII=") index.append('newspaper_delete') catalog['newspaper_delete'] = newspaper_delete #---------------------------------------------------------------------- newspaper_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArpJ" "REFUOI2N009PE2EQBvBn20V0aUs0gqiVBowxWBpQ0bJrJIDRozFePHrEePZC4w2NHD3sR/Bo" "STjY4F8koi2g2IRIqwiNEokbJFrLssvOO+96wtRo1LnO/DKTyYyCf0Qmk4kIIe5KKWfr6+uv" "9/X1iep84D9wWghhENFVy7JujI+Pq9U1wb9hIkozs2EYRl08Hq8tFAony+Wy1tvb+2xsbIwB" "QPkbFkIYuq5rMzMz8H0f/f39SKfTkpkzzHxxYGCAfpsgk8lEPM8bYWZD13VtenoajuNA0zRE" "o1EkEgkln8/vlVKGu7q6ngb/hIUQejWORCLYd/goRvOr+Oowvi0XtzEz19bWjgSqseu6I0Sk" "67quTU1NwbZthMNh6LqO7NJ3vFlZx7PiGs5fuKgw8zFmbg9UY2bWDcPQcrncT5xMJjE3N4eF" "tQEo6hUcbw4iX1wEEW0nom0BAHAcZ4SZe3p6erRsNvtL51wuByklXOEhursNo4VLKLye9Hzf" "7x4cHHyiAoCUUgohVCJCR0cHSqUS7q0O4cn9YXhSwPsisG/nIbQ1JVFxbTx0bqtUI98BgAoA" "RNTd3t6uhEIhbGxsIBaLQVgezsYvg30JlgwJHyvlZSSip7DuOYFXHyfKx4exa2sCu1KphLPZ" "LJLJJCzLgis8sC/xYW0BJAWEJBATvm9W0HngNNZpIzBVmlzb2kFnsVgkVVUxMTGBxsZGuMKF" "YIE9kWY0RWLYW9+KmuAONIT3Y3b5OSYXJ1dtQtfPSzRNMxQMBpdisViD67q4Y12D43nw5CZc" "8vyDDXGlu/UcXn58gUdvH3z2GGc+38L8L6dsmmaIiBZaWlqaFEXB/Py86/t+IpVKvT8ypNgn" "mvu1p+8efyIFZ1Zu4O0ff8E0zZBt2wvMXAfgWCqVeg8ALddhsx/UNsGt1k2Utup/AKHUo0If" "AhscAAAAAElFTkSuQmCC") index.append('newspaper_go') catalog['newspaper_go'] = newspaper_go #---------------------------------------------------------------------- newspaper_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvVJ" "REFUOI2F089LI3cYBvBnkq+OO5mMsztuk5WAFEoRNCAiqzOIqCe9lDbUVsSDFysU7yL0uBeL" "x/kD/AMa9xZlkbVhoYmKrWLFKO7WiBM7NG13YoaJfn9ML1VYl23f8/PhfQ7vK+E/JpfLaYyx" "H4QQP7e2tn43MjLC7mci/4OzjDGLUvqt67rPNjc3yf1c9EOYUprlnFuWZcW6urrko6Ojp57n" "KcPDw6/W19f5bVb6EGaMWaZpKjs7OwjDEKOjo8hms4JznuOcZ+bm5uh7DXK5nHZzc7PKObdM" "01S2t7cRBAEURUEqlUI6nZb29vaeCCHifX19P+bzeUHuY8aYaZqmsrW1hSAIoGkannzag5Wf" "Kvj4IxWMMVUIMaDrugrgbeQWNxqNVUrpHfZ9H/F4HKZpovCmhsNKHa9Kf+KzzzMS57yXc94N" "AJFbzDk3LctSisXiHe7v78fBwQG+7ksgoTXjaccD7JVeg1LaQiltBoBIEASrnPOhoaEhpVAo" "vLO5WCxCCIGrmoepHg3sbwfHvxRvwjAcWFxcfAkA0YmJiWnG2CepVEoyDANBEIBzjo2NDUiS" "hOPjY8RiMVxWHPy6Wwjb29uJ53lfdXZ2Cl3X9wmldKC7u1tSVRW1Wg2lUgmEEMzMzMD3fVxc" "XODfZmJ6epoRQpovLy8f7u7ufl8ulx8TIYR/dXUVLxQK4JyjWq1iYmoKtm1jf38fyWQS6XQa" "nudFlpeXmx3H4ZqmvZifnx8vl8vfRIIg6CmVSpQQgrW1NaiqCgDIZDJoNBqYnJzE4OAgxsfH" "MTY2hnq9HtTr9S8BQNd1mczOzrq2bT86PT19YxjG40qlAgBYWVkB5xxLS0uIxWIAAN/3EY1G" "5aampucA4DhO4+6UbdtWXdf97ezsrK23txfJZDKUZVlyXRcnJyeQZRkdHR1IJBJgjP11fn4e" "yefzv7/zCwsLC62EkNeHh4cPDcO4bmlpkcIwjFSr1VlJkpy2trbnAJqur695pVL5w/f9L/4B" "Yy2f9YyeXIoAAAAASUVORK5CYII=") index.append('newspaper_link') catalog['newspaper_link'] = newspaper_link #---------------------------------------------------------------------- note = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYpJ" "REFUOI2lk72KVEEQhb++48+KGogiZoKxoBgY+gBmBoJiYOAr+BJGPoOJIGYKRkYKgpFgYLIa" "GCy46rLDjk53366qY3BnxxlnIqeC7qbhfOd0U5VSN2KT6jZSA0cOD/7lpWzyE6lH1pA3ZD2y" "irxCK7gVZBla4cztp2kJIDeOXr6z4iBBgtkCCPaf311NUMc7nJBQ5OEigRRAQvwlpO44ankV" "IDOi/4ZN3kNUpH7Yo4coKAqKzLFzt4g2XQPwChiKAmoz0aK4oJiCDPVrEtivvSHyknMmoswg" "GSIPJvZ7FRBeKNtvsfoZvAcZXg7Yunh+cI6CPINi/R943sMOdjh19R4QRP+VyYdnyKegKfIy" "JJDhC4B5IyWJ9v0j+68f4tNt8EaoLYiHFCFfSjAHSHD6+n3a+AfjN49n4jIXKwpSBXxopn+f" "gBXSqOPktQfkT6+YvHvB6OwVti7cIBDIAQMCWZ17p8Nh2n1yU9EqsoJaxvIu0NGlhKxAX4ko" "Q2ubc+nRKC0B/rc2nsY/cboweYwVQacAAAAASUVORK5CYII=") index.append('note') catalog['note'] = note #---------------------------------------------------------------------- note_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhZJ" "REFUOI3Fkk9IlEEYh5/ZbXVLRYOQ9dAfKqGg1IokpVMidIoiiLoU0s3o1CEhgg4e7BB18tCl" "Q10iuhRFdglMFqqDqESEiVhoS2qru/XN7PfNzNth3WVlJbr1XmZgeJ/nx/sO/O9SpYuffSk2" "v4RIiNgIcRFiQ8QWEFeAyOCsQayGyNB09qEC2FQCiLMkDpyvMoisWUoqgeyTC+X3MqCwMs9m" "EcTrcjYRDyikIqyK1SKRrgaItfgwg82/A19AJCyePgRvEG8Qr6nZdgYfBRsAXAGwiDcg0VpT" "ZbNBfABikXCDBPbXcjHyOrPGe7MG0eB1UWJ/VwO8M5jpt9jCF3AhiMWZHMmdzUWzN4jTIH7d" "DMprXHx6URLNrdR3nAY8PpwjP/6Y2h1bQQLezBhG5zyrWhMGWb7nszdHbk8NxkuA6+fabrlg" "HjP7nJrULpR4TGaSRKNi5HOeCb2FriNd9Bw9ia75yVLw9UTd3nhDrHLfDZ2XiFYWWRm9i5cI" "xCDO8OJTlo597biYo72lF6cijh3sBuRKGYA1qHiMusOXEdtEPv2MeLKdZKqPH7llEqqeU/uv" "AnCt5z57mttQqGTFPzBkX91DrEEiTainYCZN8OERuVzIx4U0EwtjDPQ+YOh1H8l4LYKY8hD/" "Vp39LYPbdzfe6G47TmvqENOZcdKTY3ybXb3zT4AiJDWEUv0KGgTyiAy/H84M/AGMFzyJhh4p" "VAAAAABJRU5ErkJggg==") index.append('note_add') catalog['note_add'] = note_add #---------------------------------------------------------------------- note_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgFJ" "REFUOI3Fkj1IlVEch5/zXtObWgRJ6CAqtBX0MTg0RENDBQ1SkBLUENFcS0IQDhFtjc3hVA5B" "kIRdKDSCJsHBxLQvvOInijffc973Pef/b7jXN0OJts5yDhx+z/M7H/C/h9layNdh9ZUVVFPU" "Z2jIUJ+iPkFDApkjeId6C5njwKVBA1C3BdDg2XO0d4dBtWbZUimsDfXl+zkgWS+zVxUVm3dT" "FcCg28qaqAHN7E6Aeo+kC/jKR5AE1bQ6SwriUHGoWOpbepAs3gUQEsCj4kCzWmh72KESg3o0" "3aWB/7larfyH2SLiahALYqsSv7kTIMHhPo/hkxkIKagnuA2KHYeqZnFosKCy+x0Eu4rfKNN8" "/CogSPqdyvgzNMSgMYujMyyOThHPPydqNLw+G/WfK8mjHGBUyZYmWCu9Z/+pmxhjEM3y8OZ0" "xoneuzR0HcFOjDA5NvLgjU5tRtvfe1/3dbL1ZdZHH9fCDg2OudI4h89cpjj7DvO0j8YvL+js" "aCkE9HbeAO8whYimkzewk8NUPrykcPAYxdbTZCtDFFu74MKd32cfaKOgpjP/ykuDF1WyBPUO" "zSzeLgIRkTFMv52ju+caTT9ekdgFYqCyUeDTLOUc8LcxdqVtoL656V57S6iri+aoLHu+LRRC" "6uT+PwGqkPb+eHX+ViSmQyItC/rkfEke/gLMgkY1wcUB8wAAAABJRU5ErkJggg==") index.append('note_delete') catalog['note_delete'] = note_delete #---------------------------------------------------------------------- note_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm1J" "REFUOI2lk0tsTGEUx393nlVTM1QmlXiGhAalEo+IHQlBJCISQmJhZWFBusJKYsGGxMICKxuP" "DRshROKZiIm3FC3V6ox2pvMwr/vde7/7HQstOu3O2Zzk5P//nX9yvg/+sywA03dbdGUEERfR" "HuJ7iHYR7SC+A57C1wrRNniKxK4r1hggBCC+JrxszwS6yOiGMblA8cbecZoQgFNKM0UEMfaf" "XCIGsJC/QbECUcSzJwJEa4w7hK48B+Mg4v7uxgWjEKMQYxOZuRPj1ScB+A6gEaNAvFHTv2aF" "mDp2NkU+2kbPrVNSG3kIKn0gBKCr+d+Rx222MUaNQmzcch/Oz2balu8nvqCTUt9iuu9eOhMC" "ML5C9TxGO73guyAaX5VpmpdETB23PABNncxIrqbwpZuI5dIyrY1Y69x4CMC38+hymtjKfYDB" "uP1UXl1D/DpebRCiHcQXbMb5cZVIs0X/64+4tpNXTnV9AMASwcu+pXi/C7/eA76HEQ+n8h0J" "tRNfuA2VuYgVLhKOtdBU6x02teFNaw/f/BwYu3fLmgN4pRylR2cx4lHIZ3DNEuKLdqDSFwiE" "PdzyfLIPnqLq9e2dR+69BggAoBVWMMDUVQcRnWDgzmVMYi3Jpdtwhy4RjAhOeR65JynCuee0" "H32RangHiuKdc4hWDGQLxFbtQEuSH+/OMz0ZQRXmUHj0mFD+JcZVE//Cv3X99EbZfegyn652" "kfn2jOjcFXjZXCYRZPPK46n3jfpg46Bj/pQT62bHA9NnzaEwOML3D93VYDi4ccPJN+8atZMC" "Wpu9Y/1fP6CreeNE/ScBzJatp99/nMwM8AvLamgSjrLbyAAAAABJRU5ErkJggg==") index.append('note_edit') catalog['note_edit'] = note_edit #---------------------------------------------------------------------- note_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAj9J" "REFUOI2lkj1oU1EUx38vabVpG4201Yrix2JIqaIWFARBQRAXsXapFnFwdBLdnMTJSQUHFSdF" "QdSlgzg4+QX9RCoiWqUFrdRoTdIk7928d+85Dm1Na7p54HK5cP6/+7uXA/9ZHoBMPFVb/IVq" "iNoIdRFqQ9RWUFeByOCsQW0AkSHVc89bANQBqLPUd/bW0FXnb1hoV8g9OrGkpw6gkp8ioYpK" "8NdLVQAPrYrixVaiUVALUGuRcBpbHACpoBrO7RKCGFQMKgErWruRyF8G4CqARcWARvOhxWGD" "ig9q0XCpQQzAlmbmlDVcFA4QCVAJMOUCuekCLiqitlxrIM5gxl9iK5/BhaAWZ2Zp2LwWsWVK" "M0WaNx6jMDVa8wcxABfMYGenaM700dx5msb0IZAIdT7lXIHG9iOsWr+L/Nd3hLFYLcBTJcqO" "kXt+AeePg4sQjbCmRCHrk2xN4Wb7aes4hd/UwvCtrvolAFVI7jlNlP9J/sVVRCNQQ356lpb0" "STCjDN69T3MqIIg14ZE8ugSANXjxGE27z6A2RfFNPxFb0HiG5BofqUyACq40xNYD53FhePnV" "lX3JqoE15J5dwx94iPzOEnx5zczkKKlNOxF/DJWArp40En6noeET63b0ZsCcq47YPzV8c//Z" "to7uG+3bErjSIKohI08+0NWTwYuvhsRhhu5czHpWDi4LGLi+99v2vgcb4rFJ1OZgfqAXXh1P" "pPnx/i0f+y89rlsOEFXChpHbxwMVRUXmlirVs4IIiLb/AWOzZ4pvTpAaAAAAAElFTkSuQmCC") index.append('note_error') catalog['note_error'] = note_error #---------------------------------------------------------------------- note_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiJJ" "REFUOI2lkk9IlEEYxn+frluhacVSBpb9oYNZIB4yirqEnYsuRQcP0TGqa0iSXroZdOgcnaJb" "B4nyUqkQiIGBFBrhiqWZrbq633wz78zbYXcrWz31XAZe3uf3PMwM/KcigPBlQCX/A1WLikO9" "Q8WikqA+AWfwYlCJwRl2XHoSlQEpAPVCzbHLFXTVUkJ5XSH37Mq6nRRAsjTLNlU0xL97qQYg" "Qv8UJaragrq4EqAiBDuH5N9BSFC1xTNYCAYNBg0x6cxFgitsAPAJIGgwoK5k+tts0FAAFdRu" "0EBWF4uV1yXHhGBKkBhCXAyRtUpA8AYz+RZJpsBbUMGbFbY27y4mB0Pv2AQ5c5u+je7Ax4vI" "yix1bVeBQLDT5N8/RX0BtIB6gxFLU6aFm8lYJSBSxX0fJzc4RP2p60RRRO98FuY+Y4NgRdi7" "8wgtjR3kzRqd/Tn36tZ8mghNld97e0cXPwfvsvSmn4azN5Bg6WztwmvAB09A+bo8w/Gm06za" "OJW7/9qOapJOASCGqLqK2vZrxBMD5EeeY8TiNTC9OIkLggSH846VJE/bvjOsukJqqWfIlP6B" "IffiASoGdTE2/oBpqEW8sKd+PxI8XgPflrPsqmtkbGaY4amhj26N9ohNdOHRQW+sxQZLIpbD" "mdaqk4fOM5odYfDTy/H0MiemHpJs5q9Qa1+00PX4nDbfYfRoD+nyfNMG/+pANwtBqzPZlK/h" "HlKe/wJanGlieFq9AQAAAABJRU5ErkJggg==") index.append('note_go') catalog['note_go'] = note_go #---------------------------------------------------------------------- overlays = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAl5J" "REFUOI2lk19Ik1EYh5+ztlnzz8pIZWGmpmYiFhYh6oVEf6ioIL0LI4jugroIvCgIQqgIL4wo" "0OhWukrJCwmL0mVgE01yNjQzU9emc87U79v8zulic3qRQfS7PZznfc77vgf+MwKgttF1XUAW" "QlQApSipQAikwmQSmARIKTFWVNBqZqQgM+UgUnGjulAAcLHR1aT+MfeeDykAM4ASVAI8dQbi" "auov2pfLU3GPB/U4AIOM1cO8tITo28SfL3/5qQOgaWHrmoFSttWqHp++YeU0vYtKbwsjs8XU" "Od6KukdFtVEDKc2rahtlabqN0HAPW4ovYM8+QHCsAHdH8/2YQXQaNbc70aREKmi/c5Sxqfno" "c4KvsDNEal45gVE3VhEmOSWDpO277FGAlADMLEc4st9Bu2syXjkx3ItFfcKecxx9ugWrTTDe" "P0xoUUBkpsQUBUR7vqAZRJRiSV8BQM07sfx6jT33JNpUE8IyhyUpmUQV4Nn3Mg5ffeExAYiY" "ga5HWI4YGFoEr7sN2+I77HvOoE0+xmSJEA7txtc1wI5j9Xg1OwBRg3VTVwqKbf0EfzhJKzpF" "2NvMJqtCD2Xh7+5DVDWwOb0QpVbWADJixAkTPS3cOmEQNhxMDz5EorEY2InvgxtR1YBITCfW" "NxUHGFJ+Axh8co7zuX3sq7hCwkQ3nlYn/R0BPG8GyDz7gJz8vWQ77DGAmosvEoZqrbnZmS9R" "Zft9vm3hzy/JLqlk3j/LqMtDZ/I1/PUfUaoXkArUghImN8R+4/pUV2xdLs1NNx8qzEFZ9Pe6" "33/p9N3Brxst2G+vDT2RcV/4pwAAAABJRU5ErkJggg==") index.append('overlays') catalog['overlays'] = overlays #---------------------------------------------------------------------- package = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAu5J" "REFUOI11k01oXGUYhZ97Z+7MnWmGTKaYlIRGwaZtHLRWV1YK3VhBVKo1EqVQQXRhQReiiISu" "zEKRIlgEBXEpLlxIISi2EIpaA1Or0DYlndok03Qmk4lp5+f+f+/rQiyo8SwPh2dzzrH4H136" "5qmyjXkPpSCxvFWe+PbCZjnr30b1u2cGkyh5XdUc23rvs0Xjt/hj8UxXjHyaNtaJ8RdP39wU" "UKm86hRWGy+pmrcLI4/vGBp/DlsM3XoFJ5uiWZ3lVq2yJKof+m78+b7nf/bvABZmDh0UNVPu" "wN79Q7sP4w6MgUYkG1e5PjvN9vsexc7fTdhbY7V6nk5zfk41nn74lcop68rM018gevSusUnL" "Ld1P0Glxe20eE3WJe3WyVsi20V0QbJDqG8V2C7TrC6xWz9PbWPoyjdEjOx87acWdFt36LBK1" "yXpreO067doKD01+jJPbAr1FtFfFai+wdfgB+kvwy8y1ibSo9BSrP+NmKZRG8dcukx8oUhzI" "kcODYBlMBoIV8Gt4jTm6iz/h3nMYMdJLqwgIYGVw+sdwsgWCZgXpNnFSYHnXwFaixmk67Vsk" "uSJksmicoCKk1QgKgAENIb0Fd3AvSSaHG6wjje+5HXdI3D5MtoB4ESSKRAlqBBtj/upRDUgM" "4oGGpPtGKGzbiedAlHVJwgQTRBgvIPZCJI7RRLDFmJztOJDKgQYgIUgAxgd3mERBQ4N4EUk3" "JO4GOP1lbAXEuDaiZ38/+xH+xjJkhyGVBxOBxoCgsWCCiMSLSGVG6d81gZgc1co5VHQudWwy" "/5XfatZaV8+MR36nVBjajZ0bBOlA4tFpXkQil77tT2I5JW5cvEDj+uxSEq4fzxv/zTtT/vWT" "RwZjK3pDRV8b2XOoOPzgExAHtGvn0ESpX77E+vKPXRX5LEV0Yt/UjZVNzzR3ck9ZY31XRV7Y" "ceBly28ucnP+N2K/9rUx1vSB49V/vPI/gL/1wwflg5aYd1RNRo2+v3+qemqz3J+H2Z+jsNHT" "3AAAAABJRU5ErkJggg==") index.append('package') catalog['package'] = package #---------------------------------------------------------------------- package_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxZJ" "REFUOI11k19sU3UcxT/3trf3drRZt8UxN50mUMZc2Jj6oEMMiQ4T0QVFDBoTNUYeMOoD0SzE" "R0nUqDGBLFFDSHzhUYnJAgi6MP44UsQQgTmKbGtGu3aj9P9t7/39vj4YeRA8jycnn5dzjsH/" "6NLh5/tM1McIUe3pD/q2H7lwt5zxXyN59IV2v+G/J6LeaVv1YkzVlrg5e6Kslf46qIwve189" "fuOugERipxVdzLwhoj6Mdj2zemXvS5haUU4nsOwA2eQEt1KJOS3yec3xDgy9/GvtNmBmfOtm" "Leojp2Vw48q123Ba4iAN/PxVrk/s5f6HNmA2PUC9kmMxeZ5S9sqUiLf3kbcTPxrT4yMH0fL6" "PfEdhtO6Dre0RCF3BdUo41XS2Eadju4ecPMEIt2YTpRieobF5Hkq+blDQZS8tmZ4v+GVliin" "J9CNInY1R7WYppha4OEd+7DCK6Ayi1SSGMUZ2jr7aW6F38avbQ9q0RXBaA45NtHWbmq5yzS1" "xIi1hAlTBXceVAjcBailqGamKM+ewXlwG1rpSlC0Bg0YIazmOJYdxc0m0OUsVgCM6jUwhUbm" "OKXiLfxwDEI24vmI1gRFaQQABVKH4Aqc9kH8UBjHXUZnfqLglfCdCMqOoqsN8AXd8BGlCaLU" "Pz2KAu2BroLUCUa6iHasoXAzgWc6TC7YnF0KU3RdGm6BjfmL9PiaoFYqbFoWEAZ/GXQdtAuq" "Dk4nvsDP8yH+tNrY9OSj3Nca55dLP3Dsj0mmC27ERMvJv05+RS0/D3YnBJpANUA8QCOe5ui8" "x/q1AyhTMXDvMMrweGzdEKfLnmGaVnZLaX5y5/SRPcm5c9+hCEG0B6wwCKi6R660jGVEGOl9" "F4DdT33DqvZ+FJi3p/z72OPtntF4X7Ts6hrYGutc/yx4LsXUWUYO7OO5LU/joxkdPsgnx97E" "Cdgc+v6we8eZpvYP9Ikne0TrV1ZvesuoZWf59vQJLsd8hvqfIN4xyNXMBc5cPEXqeuGLOwD/" "6tRnfZsNrUZFVEiUfLr7RnkDhrHLgKhACZGxc2OZ0b8Be7COHkNjkrEAAAAASUVORK5CYII=") index.append('package_add') catalog['package_add'] = package_add #---------------------------------------------------------------------- package_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxFJ" "REFUOI11k19oW3UcxT/35ia5aRv7D7vaarexdnMGN+fwYYqwB52somzOyiaDCaKCgoLgUBER" "cYoiIjgUH0R88lFELOqqlG1Mi9kUxXXUdGaNXdKk6Z/8vbn3/r5fH4Z9cPM8Hg6fl3OOxf/o" "jy8fSNmYN1CSEsgLqbFvfrlWzvqvkfl2f1/oh8+qmmd6Nz3UZZqLLGW/r4mRjx1jvbf10YnL" "1wSk009GkwuFx1TN0eTgfcPrtj6MLYZaPk00HqGYmWQll74kqu823eCTOx/5qbkGmBnft0fU" "vOJ277h73c0HcLtHQH3C5T/5a/IYN91yF3bbelr1EguZs1SL01OqwbGdT6S/si6MP/gpokeu" "HzlouT234lUXWS1NY/waQT1P3GrRP7QFvGUiHUPYbpJKfoaFzFnqy5c+dzB6ePO9x62gukgt" "P4n4FeKNEo1KnkpuntsPfkA00Q71LFrPYFVm6B3YRmcPnBufHXNEpa5YnTE3TrJniGbpPG3d" "XXR1J0jQAG8OTAy8eWjmaBSmqGXP4G44gBipOyoCAlgxop0jRONJvGIaqRWJRsBqzIKt+IUJ" "qpUVwkQXxOJoEKIiOGoEBcCAtsBpx+3bQRhL4HplpHCC1aBK6HZg4kmk4UOoiB+iRnAw5kqP" "akACkAZoC6djkGT/ZlaX0gS2S3mqRPnnObyFFezrYvTt4gpAjEnY0SiQgLAM0gLxwLTAHSBU" "WJoq4xdcdh5+ifjGFM3fvuP86QnCYKXdRvTkxZPv01yeg/gARNrA+KABIGgg5M/MMLJ7DHd2" "EuuzQ7Rd/IINQz20ciuhY0eL91fnTh25kD15tGfTPcM3bhslktwCjQx4dUwrwCz7uP0bYfT5" "tQk7r92A7Ul8bcq/frirL7D851T06cHt+7oGbhuFwKOS+5Fzr7/FHXv30z73Na1mgQZQrUSY" "nmX+qjNNHd+e0kBfVpFDw7sft5rFLLkTPxCpeDrUG1qO/TfVUki2EDG+J69eBfhXp99J7bHE" "vKhqYmr0bX5vpRrly0/ZYq0XW+cF/WjvhLz5D8tjmZW7WD5LAAAAAElFTkSuQmCC") index.append('package_delete') catalog['package_delete'] = package_delete #---------------------------------------------------------------------- package_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxtJ" "REFUOI11k1to1nUcxj//d+//PWy+bu/ObnOT5dS5zFYXlSZ4kSsIY2aGRWERepGUN52QbqQM" "OhCBEnTRgQi6KIgIhmHCcGluvLOEcjrf6Q64w7vp3Hv8n37fbxehF7Wey4eHz83zPBb/o79+" "3NkVwryLkhBfXu/ac+L35XLWv430z7vqAy94VdUcrLnrySpTWuDm+Km8GPksbKyPO5/9ZXpZ" "QCp1wE7Mzb6gat5IND+6tqHzKUJiyM+ksKNlZNL93JpKTYjqR6WY//mWp8+V7gBG+3p7RM3b" "sWT3toYNu4klO0A9gsUrXOs/yuqNWwmVt+EW5plLD5PLjAyq+kfv35/6ybrU98SXiO6r69hr" "xao34eQWWJofwXh5/MIMUculsXU9OIuUrWglFEuQnRllLj1MYXHi2zBGn1u347jl5xbIz/Qj" "XpZocZ5idobs1HXu23sMO14BhXG0kMbKjlLTdA+V1XC+b2xPWFQKilUZiUVJVLdSmr9IebKK" "qmScOEVwJsFEwLkOpSmKs4Pkx88SW7MbMVIIqwgIYEWwKzuwowmcTArJZ7DLwCqOQUh5c+h7" "Fl2Xd9Y0QCSK+gEqQkiNoAAYUBfCFcTqu4lUdxJLlCOzJ1ma+AEn8Gmp7eTQ5XGk6CBegBoh" "jDH/9KgGxAcpgrq8NvQdqI8nPl4QsCq5js7GB8g5BV68Osg3tQ+jgRAWY+Ih2wbiENwAcUEc" "AvHY0bUPo4IRg6BML02xqWUrea/EzoH3+FCaYmFET189/ckjTRseI55sAZ0G7yZO4GFUmLhx" "BV8CAvHxjU/WzXHv6m3k/SL7r52JhEJ25vHc5MCBSycOpyeGvsYQgcR6nMAhMAENK1tpXNnG" "qsp27LI4dYlmzk+d4cLYb3O97oq6O1P+49OH6n3LO6SiLzdv7q165c+vcDwPTzycwKO9ZiMP" "tveQmjxL/+jJkdAt7U4fw/3PmQaPb+5SXw+ryDNrt79klTLjTI9c4GB+wL27bXu0//Kp4Qqb" "LReP4C37xtv69YOuHkvMW6omokbff95JfyFaVjsZNjZHCG7n/gZ50qMOfGm6ZwAAAABJRU5E" "rkJggg==") index.append('package_go') catalog['package_go'] = package_go #---------------------------------------------------------------------- package_green = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAyBJ" "REFUOI11k11oW2UAhp9zcpKcdEmbtms72m4O15b+4OrwysncRJ0ycMz9uYkwQRRU0CuLSBEE" "e6HobhyCg+GlIOxCJlVxw4pzrJJ1m1varku1bZqlSdrm/+TknPN9n1cO1Ppevrw8V++j8T+J" "f/PckI74EEVEuvKdoWPfX99op/27SPzwfLvneG8pJd5s3XE4KmqrrC9cqkghvzCEdnrgxYv3" "NgTEYq/5I5mVl5USI5GuZ3o6Bo6iS0ElHcMf9JFNTFBIxhalUp/UTPfc7uNXa/cBc+OH9ksl" "Rs3mXXs6+o9gNveCcvDyd/lzYoytg4+hNzxAvZojk7hGOTszqZQ79sirsQva7PjBL5HqVFvv" "Cc1seQi7vEoxN4NwKrjVNKbu0LG1D+w8vvA2dDNCKT1HJnGNan7xKwOhXup7+ozmlleppCeQ" "TomglcMqpSklU/Sc+Ax/aBNUF1DVBFppjtbOnTS1wNT4/DFDKllVaE0BM0ikZRu13DQNzVGi" "zSFCWGAvgQiAnYJaEmtlksrCFcztR5BCVg0lpOnKOkH8+Jt68Qcj2NkYspLF7wPNmgdd4axc" "pFwq4IWiKB8gQQnZYCCkL1H8DkOu0xt+Ft3YhNm+Cy8QwrTXkCs/UnTLeGYYEYwgLZd12yKl" "bJDSr0spvMZAO3eLP3Mp/QGp6mVQdYxwF5EtfVh+cIImXt2jbNn8Us/yrVEgrwmkJ5WhhNC7" "G/fSEejnp+URfiucp83fwXDoccJmJ56Cuu0xVS5yS1QQGjzR+CSDRcmsFI7v9cPb91bWlh8M" "R7rp33KSNt9m4uUJ5u04nsrzRybDeCHDorQZCA9yfPNBGouSpfh1PHv1inb768GAW42eUlKN" "tOx4qqd75wF0w+D33FlmK1PcvpOnLdDKC11H8Vl1UtM3Ka3dWETxaYNnnbt/5RufP9ruas7b" "Sqo3uoYPRTsfPoDrFMgmY4SFTno6ztrSrxUl5Vkfzundo8upDWWaPDM8pFz1npLyZM++V7Ra" "doF7Mzdxa8nzQmhj+95P/MPK/wD+zuWPh/ZrUryrlAgooT7aM5q4sNHuL/c8nVtP1fsiAAAA" "AElFTkSuQmCC") index.append('package_green') catalog['package_green'] = package_green #---------------------------------------------------------------------- package_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA0RJ" "REFUOI11k11oW2UAhp+T5OQkS0PStFu7lrXFrtO2mzK9mtYWlLkWdXO/FB04BQciDG/0Qrx0" "FwVRRBFlyhAvJsw5h1o27LRVJ52kVTfsSpr+LG2TJv1Lk5z8nHO+7/NCEBzzvXx5eW5eHo3/" "yV+Xnu50Id5CEZS2fK3z6OXf77bT7iziVw5ucSznlFLilZrWQ2FRWmFt7mpBCvmxR2jvtD87" "lLwrIBo9qQfTSyeUEq8HG/dtr2s/gksKCqkouuEmEx8mOx+9LZV6u+SzP3342GjpX0Bs8Jkn" "pBJv+qp3P1p332F81W2gLJz1KWaHT7Ot4xFcm5qpmMuk42PkM7euK2Wffuil6Dfa5OD+s0j1" "/Oa2fs0X2UU5v8LG8i2EVcA2Uxhahfqme6G8jruqCZcvSC4VIx0fw1y/fc6DUMd37P1As/Mr" "FFLDSCuHUVymmEuRm1/kwf730f0BMOdQZhwtF6Om4X5CERgfnD7qkUqaCi3k9RkEI02UlifY" "VB0mXO3HTxHKCRBeKC9CaZ7i0nUKc7/iazmMFNL0KClBApoXPdSGbgQpZ6LIQgbdDVpxGlwK" "a2mIfC6L4w+D10DZDkpKPEpIFAACVAU8AXxbduN4/fjKq8il79mw8zi+KoQRRBYtcBTSclBC" "4kGIf35UAqRNuZjll99i3JguUh3pZSU1yd6dEwQrNl+NP0BtQwer6QRtmSwhS2keKYTfpeuA" "H7uc4dzX18g7tTx3/ASmabKw0MqPo24M8hw48gIe3UcqlWJsbIxsIhJwv3yopaewunCPv2oz" "ozfSRG8m6d1/gAufv8uZs18wMzPL1sZWkisWQ1d/4Mvz5ylnJul6/CluzmxIl0vPPJlP/Hxy" "8vIb8Z+uXCAQqALg1Rf3YFsl+vv76erqoq+vj97eXiqlAt3hawmAYKjG8ew8NmEBZ/74cM+l" "tdTUZ6IU3gdoA5+MI4TGwMAAgUAAANM0cSTyoz87Zk89RtPi4mL5PzJ1dna279je8l13d3fj" "tsZ6r8sbJJ1OE4vFMAyD5uZm6urqcBxnLZFIuEZGRpbutNHd09OzKxAIXGxs2FpvGLpX01xa" "yJ56byob+ba2tvYioFcqFZFMJpdN0zz4N2f6lU+8WE5JAAAAAElFTkSuQmCC") index.append('package_link') catalog['package_link'] = package_link #---------------------------------------------------------------------- page = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiJJ" "REFUOI1dk72PTkEUxn/nzL3vfliWJWIrIYsQDRsRhURD2GgUNBqNUiVUCo1S5Q+QKLbRi0bh" "IxGJkCgUQkJis2GxhNjde++cR3Hv++7aSSaZOZN5PuY5YwAnbzy+NDQ+dDEZ0xLDZhgABshA" "QR3x4de3eLT4cf7a2/sXKrphAGduPXt678r0fjc2Y5YQgyEBiIU/NbMvfzL/afnv53fvJx7e" "mVkBKAA82b5e8s1vFyy5GbSkZAVNI5bqzIk9Gzm6t+BFLIxKU4unrzzY8vDOzIp3RGNA6iWn" "dCgMkkMyMAPHgGByU4+zRybZNTU8Uo0N3wVoAcysv3EDN/t/JmP+xxI7x2oOTBiXj20lFcX5" "gYW+1yKBYciMyAI3igQ9Oe+/iyoaIiqO7x7CSm8GABIIKMwRQoB5G4UClBx64GFEJISDteJb" "ACBo/RqGupoCytTPy7FsyEUM0ukAomkL0Y++O3UHwiiSun4AYeSAHGsBQu0l0RnoP0y/WQwT" "FN6SDJfQ1FoFyAFZreRYdzvUnqtby6BMTlM1axTUIiRuvq4wRBhIBgEyDVLqg8/uKKmrvApQ" "N5mcYXJTyeHt3rIKsnWs/aQEb742KES9vEZBriLqnFVl7PlcJkyo+08hWlUCueFhpETkJlb7" "oFrKXzYMpW3XD65sAJw1csdHioGFkbLtjDL576bR3ADAybdPXX1yzt0PBTG6PgWtLhAsK/Sq" "dM0C/APyiBZGztqynwAAAABJRU5ErkJggg==") index.append('page') catalog['page'] = page #---------------------------------------------------------------------- page_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoBJ" "REFUOI1dk1uIzVEUxn9r730uzLgNqVNK5BK55H6JIo0YXhRevBBKTZ5EHjx4UR68CeVFIYUX" "jOQaMu7KZS5FIxQzaTBEczn/s9fy8D/nuKzaD3vt1re+b31rC0D9vrubc8Nym7wwx4y8CAKA" "ACZgSqL69scXvdXzvmt3+/mNRcohAKsPNN87uXPOFCcMR8RjVMMMwOj+lXDm2Xe6PvT3fnzT" "UXf1cMMAQABwXiZnvRve3i3eiUDalGhKqWT0JZFlE4ewYFLgsXYPNpvQs2rnlRFXDzcMuHKj" "WsBnvSPjIAh4B15ABBwCKIWhWdbOKzBuQn5QsTZ/AiAFEJHKxQk4kX+PF7q+9TG2NmFqnbB9" "0Uh8CBuqEipagwdBMBE0GjgheMiao+OrUdQSqkWWjs8hGVeqApiBAUEchmGAuNQKUzDvIAtO" "BVWP4UBS8ikAoKR6BcHKOVPI+IpfDomCOUOr7pQBtJQmtGJ9+dU5QIXgrbwPYAhRIerfAGpp" "kVEWUBlMZVmEltcXae1o4mdvD0kpwQ3MDFWAqBAtpaz/VavBk9ZzdP68wfIl8xhTN5HbbRfo" "bb0c5jcWDqUMEkPN2P+8iGCogJmAgolR03aa9WtWEl1kZqGem+3nWTh9Me86LjYGgKQUiREK" "QzPMHu1QSxlFSRlcedRFRmpZPWUrALtWHKep5SjCpXwqoaiaxGjFiDz8FFExrPyf1ODbrx+0" "dT7gZWcze+tPcPD6FvI+h2H9AaDYFz/X5PyoPdMGagCH/ZnFsEGBU9+3cf/VSRbPWEJTy1Gy" "Emh+cReQIwIwd8e1xqTEOufcLEUH/++CYQR3NmTCnQD9GNloOu7602N3Gn4DjqUkm1dALZ4A" "AAAASUVORK5CYII=") index.append('page_add') catalog['page_add'] = page_add #---------------------------------------------------------------------- page_attach = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAr9J" "REFUOI1dk09oVFcUxn/n3jdvRp1otFLJIqQt1n8IojFoEakFq9amomhF2ggBERfVleiqC7sQ" "BCmIWhQp1HaRjeDCReqirfinjikhKoJ/atqatiEJUaNEmsm8d8/p4s1MaA/cxT2X7zvfd797" "BeD9z6925mflP/VCqxkFEQQAAUzAlET1t5dP9cexJ0OH7l/YWaFaAvDB0RvXvzvQutgJjYh4" "jHqZARijrxK6el8wNFD+5+9f++dcPrV5EiACcF4Wxt413h8V70QgG0owJU2NiSSw7u0GVi2I" "6NHR6WbzxzYd6J59+dTmSVcdVAR87B05B5GAd+AFRMAhgNI0M6a9rYk35xemVYqFbwAyAhGp" "bZyAE/nv8sLQ8wlaiglL5gh733kNH0Uf1y3UvEYeBMFE0GDghMhDbI7+Z0ZFU1QrrH0rj+Rc" "WicwAwMicRiGAeKyKEzBvIMYnAqqHsOBZOIzAkDJ/AqCVXumkPO1vBwSBHOG1tOpEmiaNbQW" "ffXUOUCFyBuYMDLwiAvnjlEsFmlOkkJHR8dHDkDVMpBNgalJI1M1MvCY65fO07Z6LcdPnKa/" "aU85juNvI4CgECyTrP9Dq8Ffvz/kh4tfs3jFGpa9u5V9ezoJsiAaHhuOMwuJoWYcuV1BMFTA" "TEBh1rO7NNzpIm1ZTXdjOyd3b2X/J1vouVWK/iyX34gAkjQQAjTNzLHidYdapujFoxL3rpzl" "j8I8NmzcRe9nG1n/4Q5+6SlxN7ejfPun9kEHECqqSQhWCVAaDJSGUnqGA4+/P0/feBGePuGL" "9c2s3NLJywc3OfnVGU01mnoHlYkwMiPv5x5eOjkDcFQT2d7bx5WrN3k1Ps6tn6/RfekiJ06f" "0Wn53Hia2uDUZyJ8ueHgtW3OueWKTq/fY+tRmlsW5fMRbHqvTR40dJbXHbxRNrW+nLMugH8B" "RC41tIOVkIoAAAAASUVORK5CYII=") index.append('page_attach') catalog['page_attach'] = page_attach #---------------------------------------------------------------------- page_code = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsFJ" "REFUOI1Vk0toXGUUx3/nfPfeuTPJ5DHGlqFosY19xCDaVnxgsRvxgRsFRcimgqIgdddCoeBC" "CoK4EHERXAgKQXQvduHC1KBCbEU0C1PRVmOMk3RmTGNm7v3ud7pIMqMHDufAOfz/5ylsy6Pn" "vjxZGi5NOeGoGakIAoAAJmCBPIRf2qvhi+Zvy6cXPn0u2wkD8MT5ry5+eOroYRVGEHEYPTED" "MBo3cmbmWyxf7fz7x89Xap+/+2Q32klSJwcTpyMLDXEqAlukFBbw3tjMC07cWeX+AxHfhkbF" "bLz5+KnPRrXPwyDgEqfECpGAU3ACIqAIEKgPJTx1X507xtNyNph+0AcQkY3MUEAFVOT/6oTl" "65vsHcyZqAkvPXgLLoqe7bUQUN6cbdMujNMPjPHO9y0iD1OTVSInJKZcWTOy4Akh4/i+EhKr" "V4CJ16/VwtCtSRQr2t1ix0O1DB9datPNjNgppcSRJo40iTEURNG7z//6/D2TpaWJ26vabhW8" "eKyGinDyrmEarYJKGd7/rsn84gZxpCTOUYqUsL0dPbSvNL236tLlZs4LRyqMViMMGK0ozxyo" "stL21AeEud83ECBSIXJKEaAIoJfn119e/LPbqSWO6Ytt1lo5ZsbaDc8nl5uMRMrVlYyH6xVi" "VSIVnAppLPjc0MW3D378zVxzz48L10OaKu9d+IsiwPTsKgOpsrGW89oju3hocggDgoEBsVN8" "5vuXePzs3Ob++p50NYPKod10rzX4Zx2Gx8fQRHoXGbbzZx6LOXFmttNfY/C8MbWbt35KOLJL" "CftvozAopM9qtqU//O2xYOQdTw+gyELIi8KyAvl6qSCIYdsFBgPBtoBU0CA4Ryh88D2AbLNY" "GSi5sTOT3QFA+U+5w+Wo10I5FsBC7HTde1vqzeDYKxdezT1Pq+q9gVDpv+KO6TkYdCzYJTWb" "uQn9Qy2v3yDC0AAAAABJRU5ErkJggg==") index.append('page_code') catalog['page_code'] = page_code #---------------------------------------------------------------------- page_copy = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkVJ" "REFUOI11kj9IVXEUgL9zfr/73vOp7z2DSoqGoHybDRJEJKJDLdHQEAQNThEVEQ1BTUWQQ0O7" "QyQ0OQa1RJAglJBBa4iTGSmZvt5f772/03B1iN476+F88H0cOf/g43x5IDqhSsUkpCCIGe2E" "xk4jfmE/dmcX5ibb9Bhf6ncj8w/H+jfqKQIumBEnhvOU5pa2735Z+j46dv31neXZS82uAFUp" "/moEt7JhiEKSBmqtmImRPsarFQYimaq9r98HHnUDqJmJF8hHkPMQqVDIKT+3W1SHYPpMhWPD" "xWs9FQBEIKdgBnihEBwL3+rHO0mNJAmMjhzm9suvDVKTWjteW1vrvGq21599en6l5QMgKKp7" "yGAEJ3TimBuTR9isBwQINlyM04B3nJxb2n68vFQ8nb85f9WbQchsEFKcQOSFNDV+N42VTUPV" "iJNArZUwMdLHuWqF/pxefPOuPuPNDAEiByqOYKApGOAECj5zFMvabGy3qA5FnDpU5sNC/paC" "koSkayCRDOwFvBMKXlndEhZXO+y0jMgrXoJznfQPMPTPsQGC4PbjiBGCQd4hKjjnMMAncacR" "6WB/uRATDJwIIhkhayMIASeQ84qYEYIgIpiBT1Jbn366fHA3trJhLciuSxXP9PhRvIKK7sFB" "A5CDPg9mhn87c/ZCN//LTz7HaUj83qv8N8ESCIJ23QJizneSeq81naSOmJPueKDZbG9FOnig" "XIgxA91vQybptERq8a70AkzdW1xQpycFGcZo7LeB7C2CpfVSMdf3F6zf+cWV/1n7AAAAAElF" "TkSuQmCC") index.append('page_copy') catalog['page_copy'] = page_copy #---------------------------------------------------------------------- page_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAo1J" "REFUOI1dk0toVVcUhr+1976PPDQPJXiDECPWUCsF46N0IBREqtFJC22RTkqL0FcGKdiRAwd1" "LgTEkYIDQewoJcEWEqoWRFCUgqG0USpVo9zYJE3J9Z5z9lodnHuv1QV7sNdm/ev/17+2AOw/" "fuWTUlfpYy/sNKMsggAggAmYkqreW17Q6cU/54/NXvowoRECcPDkL9fOj+583QndiHiMVpgB" "GNV/Uy7cXGL+wfPVh7/P9V4eH6kDBADnZajoXfdsVbwTgbwp0ZQsM2pp5J3X1vDW1sANrbab" "bVk8MDrVc3l8pO4ajToBX/SOgoMg4B14ARFwCKBU1hY5vLvC4JZyW9JZPgeQA4hI8+IEnMjL" "xwvzf9cY6EzZ1iscfXsdPoQPWhKaWoMHQTARNBo4IXgommPumZFohmrC3s0lpOCyFoAZGBDE" "YRgGiMutMAXzDorgVFD1GA4kJ58DAEquVxCskTOFgm/65ZAomDO05U4DQLM8oU3rG6/OASoE" "b419AEOIClH/D6CWFxkNAc3BNJdFiDNnSKZPkz76g7t9/ewpHwgzTYCoEC2nrK9Uq8Hz6TOU" "717kzY8+ozT4BrVff6L92nTYty+M5gxSQ804cTtBMFTATEDBxDgycYpDn35B+d7PcPU72ru6" "2TwwwK3fbCwApFkkRqisLTDc51DLGUXJGfQsPaC8YRBGvmnxCycqeJNNuYRENY3RkohcfxRR" "Mazxn9Sgv6vC6p1JOia+pF57wiqw8o8neh4HgKQWn3aU/Ppvt9c7AIe9mEVXW2DhydfMXjnL" "xp42gi+wUs24/9Rjlp0WgF2f//hVmvGec26Hou2vumAY79Ynw3D1e7++viDLhTX1v4pDU2M/" "XH//P6O5HySKW8ZvAAAAAElFTkSuQmCC") index.append('page_delete') catalog['page_delete'] = page_delete #---------------------------------------------------------------------- page_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAshJ" "REFUOI1Nkz1sU1cUx3/nPj87Ng6OQoVIStNGNOIzCgghhlLEAFRQqVKXLq3UTt2YEF3KAAMD" "SLAwhPKxZIiQYKBqkYC2qgC3ZajSFBRAEYYgSJPgJARs4+f33r2nw3McznLvcn7n/M/5HwHY" "c/jmN5lC5ktP2KpKmwgCgAAqoI7IudKrWffby4mpQ/cvfRHSDAHYd6x4e+jA1vVG6EDEQ2mF" "KoBSrkYM/73A1NPgzfPxR53XTu9vAKQAjCdr057puF8Wz4hAUhSrjjhW6pFlV187e7qKrKwM" "5bzd/UFt814IJr9ONQvlAS/tGQRFAWcAB1bAIDSmr9BXuUO2/ysKvVtYeLKWB9fPn0gAIgJg" "ABHQ5ghUBCNQqN/A6l06+z5ivvSAtIS0L19FfkVPIfW21pQHgqAiOKtghHy9SE9mhELvJzSm" "LpLOCU9HH7JQEzXR7IBZTFYgJQYjggE8I7RVbtGjv1BYs5/gv3OI/xI/307WzfPD3L5o+4Er" "4wkgkYsICUCEYOInOms3KHz4GcHkIMaPCF9/wMztf8nuPMqk7XKLsnFx0oVrwmqPr5Kr/MnK" "jZ8STp/HSyuN1+8zUxxhbscgsmId1iXSE4BTtKljeuQi2YW/iFw3U/dO4wiozb/LzJ2HVHae" "QfJdtPlCHOkSwDqwmuy+fO8CG3Z8S+ZZkfEf/2D0+jxjv45S3X6cONeNAr5niMOYlpFcpDhV" "jvwT0l8qE479TO/Ax7wqz1EaLfH7rsvMTryHI0kaXuUThXYJEMUWa6Fruc/YoxecOjvItnW9" "1LsHqO4eYnP76mRTCndfxKhTouCtDmzoXGSthhbp+P45j0UpNc3kqiDVGKegRjBO8DycjV3c" "AoR1O7Ms473z3abGMsDQ3AhAIZtqGS3rC6DO90wljnVy6ZiwJ/cevPW5MWaLw+WWTnHxaX1Q" "CNTpiG90GOB/UyFPOKMILW0AAAAASUVORK5CYII=") index.append('page_edit') catalog['page_edit'] = page_edit #---------------------------------------------------------------------- page_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqxJ" "REFUOI1VklFolWUYx3/P+37nfMdtZ51Npx1IlqYbbngxl4SIIUJQIkhFggjRTTAIb4LuBBXx" "Qu/Eq66CgUJYRgbOwIJsGrOcQio1zNR0o7a5HHM75/u+93m8OGfH+cBz8T7w/J7/n/8rAG8d" "+Omj+KV4nxf6zSiIIAAIYAKmpKp/PZnSH2buTXx2+8yehHoJwDtHh38e3N+/wQklRDxGo8wA" "jMm5lNO//c/E/cr8w7E77RdO7qwCRADOS3feu9LtSfFOBGpHCaZkmbGQBravL/JGV8SITjaZ" "rZt5e//5tgsnd1Zd/VAL4PPekXMQCXgHXkAEHAIo5dY8uzaXWbOusCxpKXwBUAOIyOLDCTiR" "F9sLE48X6GxJ6WkXPt6yHB9FHzQsLHqNPAiCiaDBwAmRh7w57kwbiWaoJmxbGyM5lzUUmIEB" "kbjaRcA7IeeFSIRiZZTVj4/R7Ocp5HMYDqQmvgYAlLrfJdLFhLxUaJ76mo5VGyk9GSKOHNpI" "pw7QrDbQOszMAMM5yE0N0baqj9ZyH/n/LhJX7xIUgi4FqNWWbHG5/knmH8Kj7yiuKBFmz/Fy" "717if74k9oEsteeAoBCsnn2jFX1who6u3VAZ5ergKVpKC9j4ZarjI2RJRiMFTQ0149D1BMFQ" "gdfSGwwUZyi2rSTM/g2mhLlfWbP9U+5f+RyXfvgckGaBEKDcmmPTSodpRtfvg5R6d6DzI5gu" "0P9+N5qMU2geo7R6C2/e/DEablhIVNMQLAnwy6PA7B/f8kp5PU3FKSybBvFcOzsGKFoZo6Or" "k63xsL90sKdHADYNXLw7dGzriqeJNQNu+ps99L53Au/uYdlMPZvFcvhl3fx76wZ/njv8lQC8" "PvD9J2nGu865PkWbjr96JM5TFVPDVJe0oaomQc1Zmonp1Wdaaz3vApDIQgAAAABJRU5ErkJg" "gg==") index.append('page_error') catalog['page_error'] = page_error #---------------------------------------------------------------------- page_excel = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtBJ" "REFUOI11kk9oXFUUxn/33nfnzWSSTJpWSqDRRKfGiChN0G5qKUpD/7mogqj9Q4uibooLyUoR" "IbiSBmq6ElHqIiDiqmiD2kj/pFBoQl20StHSlkooCRmjyXuT9+69x8WkExD6bc7ZnO/7zjmf" "Atj54bkjcSU+YBSDIhSVQgGgAFEggTyEPxfnw9nardnh69++mrEKBbD7k4sXvj422K8VHShl" "EJoQARDmlnLGr/zN7O16cvfGH50TY3tWACIAbVRfweiO63PKaKWgIYqXgHNCmnt2bG5j6+MR" "l8Nci0i1tuvYD+smxvas6FWhVsAUjMZqiBQYDUaBUqBRQKCrvcC+Z7vorRZLWWvxKwD12vEX" "boawvqejHJQXxUD1JRaW5/nl11MIENtWfHDsHXiDg9vfIbYRST3j4Oi0+2lku41EmHl315He" "NJ7l1sLvzEyfxoWEgc3PkHlHkqQEOql2v87lO44QMp5/NEZZ7QD0oi0cOHnmR79eqrSX2+l7" "qotItzD/zwJJUicyGzm68zPayxWKBUOxYBE0qMb2euK9iZU0vJJ/M3WK/tKLtBVLVPseoZ7W" "cS7iraFRSjbGRpqCMcSRJjS/AxogSc6aSzcmOfH9CM9t2I+PUp7sf5qVvMa12z8TGbBGEWlF" "ZDQ+gA+rBAPDXW8vpV/YrU9sQ6xi9PTH7O4+RI15NvU8xpkrY7x5ogclDQKjFUWrcHnDglbw" "EQhT1yb57eZV0szz5eTnvNxzmErbOjof7mZL7zYECAICWKNxmQMgmv50dtOODy6m48ODxbkl" "C8Di8j2+mxphuV5DKU2l5SGsBqsbCQ8i5JmnmcTcebxfi2+lvJGjQyd5ECQIed2tHdFnIeTe" "ywMn/gdjVPAuuKaDLPX3yrHZgMrKgEYg3HdTihqqAiWrAQnW6H+dk7+aBBp/fOj98/u11lsC" "oWXN6/3SbBCoS5AZq2Uc4D/1DydNrs+wqQAAAABJRU5ErkJggg==") index.append('page_excel') catalog['page_excel'] = page_excel #---------------------------------------------------------------------- page_find = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAv9J" "REFUOI1Nk01onGUQgJ953+/b3WySTU3aUESatvnRqhetKKUKigixqMWDXrx4aEtRCl5sL4oU" "8SRF0KtQ9ZCWSC1iayNt1aAoFUkhxcWkSbrJ7maz2e1uk3R/st/3vq+HbDYODDMww/wwzwhN" "eemD8bejXdG3tLDfOWIiCAACOAFnCaydXSna6+VU7v3kt282NsMAvPzJ7799c2L/PiVsQ0Tj" "aIlzAI7C/YCRv++Rm69XM9Mz3WNfHFr3NpOUlocjWm1LFkQrEdhoinGWMHTUAsPzg508M+Rx" "wxbizg2Uh0/8+IAG+OjMmW6Tnjh97dp11bd3iLOff8wfP1/h4AvDgMM6MMbR16OpGc3Agx2U" "gro/s7Tar44dO9UlLv7hnr2DLNyZZbVcIp/Lsrt/gEujZ7EmRImgtJAr1ejrCHi0Wzh6oAft" "eW+oHUO7EsnJiSPFfJ77lTq3bv7FulEEVjF+9TKV1TKeFiJaMXNXuLEQ8uvtKlFfI74K1diF" "88dr1WrHnkceo/ehPgqlFRKJTrbv2Ek83s4Po1/jieBrRTSiiUU0sYiPQ4EoVP/AvnfaOxOM" "XRyhUszQ3REhn57l0uiX5HNprlw8h68FXwm+p4hoTdRT2OZ1vI5EV9urrx1mbj7NYmqK5148" "RDadYviVw+TyBa5evoASwdOuyQM4BGPBWPCMCaOhMUwlJ7lXzLO0mEG0QpTizsy/ZOdTTZ4E" "ceApsEDMhzBwqMraKguZReq1Gpl0msraGivlEtNTUxSXl7hbWMI6h7HgAOs2rK8VYSPEyyzM" "TX937iuqxhvc1dsj3y+3MXd7nmQqS61axfTs5vTNoEWkbYI3stMnaJgtlA+eGq+dP/l07NN/" "IjzZqzbgcWBkq6tzGzq5HPLZAXj2vV/qLZRNw9rAGNcwyJ9ZgxWHa9a3DqRJpFOCsoLWWBPa" "sFWgUTP59qjefvLx9XZA8b9xu9q81gptvgDO+lqthaHLtlZ46vhP7wYhryulnrDY+NYrbpqW" "g4O6s25COTfyHygscqDbyiMsAAAAAElFTkSuQmCC") index.append('page_find') catalog['page_find'] = page_find #---------------------------------------------------------------------- page_gear = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAttJ" "REFUOI1Vk09onFUUxX/3vS8zk2nSaaby5Y+mMjpWGlS0VapSUYKiRjcF7aYu7MIilC66qBuF" "6KJk464LUZAGwW6yFGwVu2gqiFCrpqVKkybKNJ2ZZKbJdMrM5PvzrotvEvXA5XEX99xz7uEJ" "wCsfXXw3nUsftsI+VTIiCAACqIA6QuduNmruwtpf5ZPXZw4FdCEAr5/68dJXx/ftMcIORCzK" "FlQBlNV7IWcvr1P+u9O6dWMhf/70xAaAB2CsPJqyZsf1VbFGBJKlxOqIIqUdxrz0SD/7d3v8" "7FazqsW1145/O3D+9MSG6S7qA2zKGnoMeALWgBUQAYMAjuHtKd58ZphCMdMb9GXOACQEIrLZ" "GAEj8v+yQvlOmwf7QsbywnvP7cR63ttbFja9ehYEQUVwsYIRPAspNSzUlcBFOBfwwkNppMdE" "WwSqoIAnBkVRQEwShTpQa2iVZtEwIFMcRzEgiXiT3BgcXb//kd6ul1hfuIRsNMmkU2SzWaR9" "h4s/nOPZ/GrPFoGLEhWuS6aqgNIoz7Nr9AHa5Tl832dkZISoeo1i8WGyzT/s5ORk1gNwTpMh" "pWsgQTY/SqfToVarMTs7S29vL2NjY7RaLWoyGn/6yeGWAYgdxNrNvluLv5wj5Zr4vs/8/Dxv" "HPmQFw+d4NbybYaGhhh/fMBOTU1poiBUnCof/xogKE7gYKOBtZbBwUF83+fUbyEOGHdCs9mk" "VCqxuLiYpBBGMXEMw9t72OsbnEI7eovl8jXylQqFQoFXb35N5ByFXfdTr9e5MNeI+53zPYA4" "cC6MYw1i5KflGCeKYjlw+yrk9lCpVNj75BN0Oh2WlpbI5XIMmpKt3L3b8ACCdlzdlrb3ffDY" "xjbA0E3k8vpOpqenOXL0GH9evUK1WmX/8wf0i88/k7V44N43MzOxADz9/nfHwoiDxpinHC77" "71fcfJSX+7/PrKys8HvmnXV1esWonp07M/HlP53pTZLk0IjNAAAAAElFTkSuQmCC") index.append('page_gear') catalog['page_gear'] = page_gear #---------------------------------------------------------------------- page_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqlJ" "REFUOI1Vk01olUcUhp8z8917E02TmAZr0Fb8J62CP4iKCG4MrUjFhW4K6kZx40p0JeimS1dS" "ilBQXIjSTUuhuFCJGgniTxcFF1ahqdFoo16vibn3zjdzThffTWIPDMMZmOe875w5ArDj5M2D" "la7Kd17YYEabCAKAACZgSq76tPZar1f/Hjv+6Od9gVYIwDffD92+eHRDvxO6EfEYM2EGYIxP" "5ly6/46xkcbU6OMnPVfP7mwCZADOy6qyd92PxsU7ESiKkkyJ0ajnie0rPmHTyoy7Oj7HbHn1" "66O/z7t6dmfTtQp1AL7sHSUHmYB34AVEwCGA0tdZZtfGPpYsb2sPHW3nAQqAiEwnTsCJ/H95" "YextncUdOV/2CIe2fIrPsr0zFqa9Zh4EwUTQZOCEzEPZHE/eGEEjqoFtSytIycUZgBkYkInD" "MAwQV7TCFMw7KINTQdVjOJBCvCveGJSW34+kiwklL5Sc8Mv9b7l8ZyuVzKEz3WkBNBYH2oKZ" "GWA4VwAzD82Ys6i3nx+urSUpJC0AGYCqFZeMlgE4d2M7WCJoJMRI37xl9C/YxETjA/vPLyHm" "V2YBSSFZ4bcFJmpgx1cHSKYkTSjGi9oz1izaymSo82BqoA1DCgW5oWac/iMgGCrQFQPJlJE3" "f5FrJGpOnnLeNydY+/k2JvMpqqeGGhlAHhMpQV9nifXzHWpw/UWDmCKfdX5B1EQyZaz2Dz0d" "C3j47A7Dj0esWae7sBBU85QsJGT4eULFmIqBC8NnCBpoxMCy3n42Lx3g3sgQo7WXtP/744en" "P+2qZwChnl7NrfjeE6ubcwGHga7+E4Cu9uKv7T63EHHtjE9U+fXw3dr6Q4PPZ4eJdGbg2K09" "zrl1is6ZHcXpzZic36yMVgel69Vv7zYeGXxYcnYJ4D9DB0iz8O5G8wAAAABJRU5ErkJggg==") index.append('page_go') catalog['page_go'] = page_go #---------------------------------------------------------------------- page_green = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAg1J" "REFUOI2NkjtoFVEQhr+Zs3vvzUMToyBBQZSoKFhIELEQbAwatBDUxsbGMo1iZ2tplSKlYJEm" "lY2kEXw1glimkAgKuYRw1SiKSXb3zFjs40YLdeBw5sH8889DAM7fe36zPdK+EYRJdzoiCAAC" "uIAbudn7b5/s6fqH1btLC9czKhGAi/dfvXw0M3lMhVFEAk4j7gBO70fO/JuvrH7c/Lnybnls" "cXZ6CyAB0CBHW0FHl3oSVATKokQ3isLZyCPnDu/g9JGE19YbdJ9YvzDzZNfi7PSWVoWGgdAK" "SqqQCASFICACigDG+M4Wl06Nc3CiM5ANdx4ClAAiUhsqoCK/vyCsftngwHDO8THh1pndhCS5" "1rRQ95oEEAQXwaKDCkmAlivLn53MCswyzh5qI6kWDYA7OJCI4jgOiJarcAMPCi1QE8wCjoKU" "5EsAwCj7FQSvfG6QhnpfikTB1bFmOxWAFaXD6tVXUVXAhCR4dQ/gCNEg2nYA8zLJqRqoB1Mf" "iyAOiZZFOikUufcBokH0krL9kW1exr3SXSANSpEV2xjkjrkz9+wy/yMnrj4mz2IfIC8isbTZ" "v2/vX5NXumu4OfnmNgYxM8tjdEBWumv/ZBCCWCysfwfZRlwbaoc9t6cWhgDF+7MYGShvzR0G" "UgXc0iDfi8K7DYASH0zdeXFFVU8aNtiU8vprFBw23fxtqj4P8AvG7vPN7kd50wAAAABJRU5E" "rkJggg==") index.append('page_green') catalog['page_green'] = page_green #---------------------------------------------------------------------- page_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsNJ" "REFUOI1dk01oXVUQx39zzr33vTaveTFGISQYDG1jVShaRVMpRqF+VBdaqSAudFGFQruQogtR" "cONSXXRRBFHooqmo3bWN4kf9gFKQ1lJNS42x1YQQ8syH7Uveu/eeGRf35VUdGIZZzH/+v3MY" "Adj+xrcvlqql572wxYyyCAKAACZgSqb621JNv1q4PPPq+CfPprRCAB5/+4fvD+3bsskJXYh4" "jHaYARhz1zIO/7jIzJXG8tSlie6xAzuaABGA8zKUeNc1PifeiUCxlGBKnhsrWWBkwzru2xhx" "WufWmq1feGzf8RvGDuxoutaiCuAT74gdRALegRcQAYcASm9nwpP39nLr+vKatFL+CKAQEJHV" "xgk4kf+mF2bmVxioZNzeLbw0fCM+ina1EVZZIw+CYCJoMHBC5CExx8RfRqo5qinbBktI7PK2" "gBkYEInDMAwQV3yFKZh3ECvdE+9TCZOs6AhIP20EA5QW77+siwmxF2InVP44wkD3nww++ALM" "f84GfnJtAc0LF9oSMzPAcK4QLE8dpT86SXXoHupXThCv6WPvwDfJib2Dz0UAqlYMGS2A1Ycp" "Srx0lur9TxCWf6Hc008jTDEwcgdSnz0YAQSFYAWv/m9aDbKkj2zhMs7XEFcn6axBY5lrM01f" "OMgMNeOtsymCoQJmQl/jArv4gGpHhuYNnC6CW4dlKedHJ/n1Uu3lCCDLAyFAb2fM3Tc71KBn" "9hi31D9l4/Awln6BhKv8PJaS1Zt0JcJ7U89kHx95fbRASFWzECwNyKnpgIqxe+k4t217iLR2" "kCiqcv5k4LN4D4ubH+XdB0THXzl1/RbSlTDbUfI9r93Z7AAcBtE5j/hpfOkmLny9TDy0hze3" "PgWYlhN3Nc9t+voxEd55ZP93Tzvn7lJ0LcDOnjjaPnna/z2f8+HvD+cXz1QCo19i0DC1M7Gz" "wwD/ABdNNe5K15glAAAAAElFTkSuQmCC") index.append('page_key') catalog['page_key'] = page_key #---------------------------------------------------------------------- page_lightning = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuFJ" "REFUOI1Nk01onFUUhp97v5/5Jslk0mRqHVBSJTG1+BdqURcFrYq/4E9pBd24EBQkggsF0YUg" "uhOUbroTXGTRLMSNWKqLYLUIQaKUEkpi22CcmEkyk8bmm5l77zkukkw8m3vgHp5z3nvfY9iJ" "Jz+afr1QLrwWGY6okhmDAcAAakAFJ7KwsSo/Nq7V3rs8daqzew3AM59e+OnriSN3W8MAxkQo" "3VAFUOr/OiZnmtSut7b+ujI/+P3pZ9vxbpGNzFga2YHLdRNZY2C7KUEF75XcBR4dLfHQXTG/" "Sr1HdaTx9MR3+7qAeyoL/e7PM9Gw82hQJAgaAuIdXnpZHPoMKFLtT3n+aJXz6XLxai37KgbQ" "syejqexSXOg9QE+yH3UedZ7Qyckbc9TKp5DCfmrrOcN9EYUk5uAjQ0xfvHYyBlgeXbn94bwR" "JcUX8Bsz2GycENZoNa+w2v8q7YHnSL0wvxboiEekw7E7C5jEequXDqe2LW+Uh8aACMmXEd+m" "sXieZukEcsvLxMaQRJZCGpGlEVmaoFgwlnh5c3DciH+zUBpFfQ5RFZxDJMZsLZJe/YLE5ThK" "bB14EZNWUavIzu/EJsjprHK0kq/NIV5Ie0ZAYgarj5Gv/U5wHW78PYse+oQ424diUAxBIAhY" "Cf7szaVfPp+aKfm2HWF1/hy+fRPXatLZWmXD3IE/9gMMv4KJeomtIbKGLDF4p3tGOv7xz/nk" "xKFsa/oJsr6DbDZXcMPvoLedQHS7mwBBFDVwf9Xy+IcXWl0fiFPy2XdJCoNcXK/yTe8Z8noZ" "/vGo0a4jZad+8tYE1wl0AYf7Zm24cZ1vix8w8MBTHFcICsGAKOgOQBX+WPGoKK7l9wD1zbKY" "+77UucV7jS4FxCi7CkXBoNsga7BiiCIkePFdwMJ6tdZXGau839/uBSz/G7dcjLsSiokBVJLI" "bnqvS91HfPCtc287z0vW2nFBevZWcffoJii0VPQ3qzr5H1MpbtwSUWmDAAAAAElFTkSuQmCC") index.append('page_lightning') catalog['page_lightning'] = page_lightning #---------------------------------------------------------------------- page_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtlJ" "REFUOI1Vkl2IlGUUx3/ned6Zd3dnXWe2lXH1Yin8wGAVUQmXVSsY2JGCEtIFLbsp+mARhS6C" "oKsutoQI77xwoSAC7yRKC6llN0PLLvIDGdRamJ13xlWnaMfZed95n+PFO7vkgXPxnMPzO+fP" "/whA4aPpN/3V/mEr7FClSwQBQAAVUEfk3J1/77uL9b+DD26ePRjSCQEofjI78+XEji1GyCJi" "UVZCFUBZWIz4+vd/COaWHpVLt/vPn9rfAvAAjJXNaWuyNxfEGhFIhhKro91WmlHM8xtX8dwm" "j8tuoUd1Q31s4rvc+VP7W6YzqBewaWtIGfAErAErIAIGARyDfWle2jXI0xu6usPerimABCAi" "yw8jYESeTCsED5sM9UY82y+8tfsprOe9tiJhWatnQRBUBBcrGMGzkFbD7QdK6No4F7LnGR9J" "mfYKQBUU8MSgKAqISaxQB2oNpME4wTmLYkCS5RMA4Ej0CoJ2auogZZf9MkgsqFHcijsdgGsn" "BbdsfadrDOAEz2rnHkARYgex+z/AafJJYanV5MYfv1C5e42B/hzVew/Y9eIBulflmDk3RX5N" "jkv1Orn/+rxCoZDxIKHFClEY8eO5b/B1kTeOHKbRaFAul7ky+y023c2BV17G8yxBEJC6etX7" "4Vb642SDSHGqfHh2hs0Ld3n9yDjHPj3DYulX1g2uZXh4mGD+L06e/I1KUGVkZIR9e/cwNzf3" "tgGI2jFxDF71Ov19GQBeOHqCpTBifHyc0dFRisUiY2NjPGpFvPveBADZbNZPJITORXGsZvVa" "KQeXAfhpahKNYyYnJ8lkEmij0UCc8sXnn2mhUJD5+fklDyBsxrWMbweOF7dmvjo9bWZ/nubQ" "vq2wd5harUapVML3fYaGhsjn84gIM5euxJVKpSoAO9+58H7U5lUjbDdhtXfg4fep9fms+H4K" "Aa4tborapke39fyZFpy2WqGrVGr1ZqNeeAxMazoaGHLdRQAAAABJRU5ErkJggg==") index.append('page_link') catalog['page_link'] = page_link #---------------------------------------------------------------------- page_paintbrush = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtFJ" "REFUOI1Nk01slFUUhp9z7/d1aAdoIW11MKAdWkpLQzBF3RldqMEYEzcubExYGHeGBQE2LCCE" "hASUBW6MrFxUo8Zo3IAJIYg/aBSliZUiiEyrA0zb6bSl7Xw/57iY6Qw3ubk3uefnfe97Xnnh" "8KW9mfbMiBeGzVgjggAggAmYEqveqkzrhfI/xQPjn70e8dCSPce/u/zRO8MDTuhAxGPNRzMA" "o7QYM/rLHMU7K0tTN25uPHfm5epqTOC89Ld41zFeEu9EoNaU1JQkMZbjlOf61vHMtoCftNRm" "1lv++NTu/t6cfLAwU5hwwFrAt3hH6CAQ8A68gAg4BFBy61t45akc23sqrZt3vPr7tmf37THN" "vh0gIgCOWoLVv8BEcALOC8XZZR5f63Fxia7uy+S27to4cfEk89OLZ4NVroEHQTARNDVwQuCh" "xRw3Z4x45T+2LH1O344hZm99wp2xGx/GvvNAYAYGBOIwDAPE1aQwBfMOdIrHlr8gPzjIXOFT" "vj5f0mycOTRyYjxyBmgdvhNpbDEh9EJQnaSr8iX5gQEW737FH9/f5lz0VjxyolAGcJrUKCg1" "JGYGGPHSNJXbF8j8fZT8YJ7q7HmufvMrW54/zZxsaogdqFotyagTgMq9CSqTY2gyR3V2njU/" "vk+lHOGHjtH9xE6S+OfGrLhUIbW69gqTxQI/jF0n2LCZXbufpr3/Da79uY5ydi/ZvpcIvSOJ" "EpoIYkPNOPJbREd0l+6Fv3iks5crk1XOXlogkDZ063s8cJvgWsLooyFxlDYLxElKmkJufYi/" "cpF5C5kpzvNgMSJs7Sa/c5Cunh7MYOx+gqkRrzyEII1U4zS1KEVs+E1UDEPIAGowhVEoJpgT" "nAreo2mijQpBtJzey2Z858GhahZw1BUBaG8NGqZqDWuTEXq3kCT2b9NMpO++uP/b15xzTyra" "1rTi6tG4YLBialdDZ6OrYf8DPvtVbv2/qNgAAAAASUVORK5CYII=") index.append('page_paintbrush') catalog['page_paintbrush'] = page_paintbrush #---------------------------------------------------------------------- page_paste = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmlJ" "REFUOI1tkz2I1UcUxX935r9v37rqGhX8wN2AYFxlBTFEG0UwFjZaCFpYmSKEWFgIARFESzsh" "TZJGEgKShChYWFmIqKABQRARTPAjAZFdNau85/O9mbnH4v/Wr/U0A8O9Z86594zRxw9fja21" "EG7zASQ9//bUwwUf3s/Afto/tsGDHTeznXMXLmHfkWO0n/wFwPDijfx67DCd9gskTgs/e+DU" "v2feJagU7eyOr78bXbR8OU8v/IwkSrc98zpb1o0yvP5LXNp57sfvdwHvE4B9umjZCqb/vo6n" "l9z//SRIgHiiGwgxdesqC8c3zsNsloUKQLmH50QYm8BLRhK/lYMUOe514fO7bWzzdr6ZeKRn" "r5bc+W/ywefXTu7tVABeEp4TnrqU7itAlMo5unucqZZjgEuk4lRxHb9cn15T3ajuDR74Y1VN" "kLt4ySDHrHYQQ+D/l+KfKRGCSNl50cls/WyIzasXMNwISy8r3ww1QQ/PPUrq4bnguQAQDZoV" "NKLRiEazEZic7rD6E9i/aYSStLJWkLoo9VB2PBWQKE1hBgOxVqRoNKvAvWei9bjLF2ODDFSB" "6q2CgqeCZwcXLmEYMYR+YoS7YDBiwYgxojdbSAX1ylv5/cnXh2E40aBRBUzC3TAzpD5BTpmS" "Cl5K3wJ4EQZUAYIFXPVMggMNGKrqoNUKehlPBZWCsiMXAMXzjMhZcGVwo0K63Gm1tswdHUcz" "FlS76+YW8PF/1M0tTNEqGScunv9znhnr3y2YnNjDQFjJSDMhQTB7k2QDYphPUerNDncf2w5d" "uRRiWGXYUkS7bqutmWGu0po/pzH0GodQT3jmxlFNAAAAAElFTkSuQmCC") index.append('page_paste') catalog['page_paste'] = page_paste #---------------------------------------------------------------------- page_red = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiVJ" "REFUOI1dkjtoFVEURdc5d97LVxOjYKxE8UPsJIhYCDaKBhsLbWwEsbQSwcJOLK3sVSzS2Esa" "Cz+NICIWKfyAghIkahSDiTNzz7aYee9FLwzcz9x19r77GMDx648vDE0MnU/GrMSwGQaAATJQ" "UEW8//k1Hq18WLq6+OBcSTsM4NTNZ0/vX56dcWMSs4ToDwlALK9WzL/4wdLH9d+f3rybWrg9" "9wegAPBk+7vJJxeXLbkZNEXJCuparFWZY3s3cXhfwfNYHpX2rJy8/HDLwu25P94WGgdSNzkd" "h8IgOSQDM3AMCHZs7nL60A527RkeKceH7wI0ADPrLdzAzf79krH0fY2d4xUHpoxLR7aSiuJs" "30LPa5HAMGRGZIEbRYKunHffRBk1ESVHdw9hHa/7AAkEFOYIIcC8iUIBSg5d8DAiEsLBGvEN" "AAgav4ahdk8BndTLy7FsyEX002kBUTcb0Yu+PXUHwiiS2n4AYeSAHBsBoeaSaA30HqbXLIYJ" "Cm+KDHegrjQA5ICsRnL8dzvUnKudy6CTnLqsNyioREhMX7+IsPbvDCbUIyqwVlHcuUdV5gGg" "qjM5Q3f7NGMzM5AzigxhjbVQCwhW375FIar1DQpyGVHlLKrSVl+/QrlVAJggUFNdYC5Sssh1" "DPqgXMtfxobStuVrN8YAR4O3mBgp+o020nFA0Un2q671uQ9w8q0TV56ccfeDQYz+n4IGEwTr" "Cr3suOYB/gKeqxmixV90FQAAAABJRU5ErkJggg==") index.append('page_red') catalog['page_red'] = page_red #---------------------------------------------------------------------- page_refresh = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAulJ" "REFUOI1Vk19o1WUYxz/P+/udc3b23z9oK2ZJp4XihBRJMqqbJCOiSAfhTUhENyO2ckUE5YVe" "pV14KWEr0NCEIJCygk0XOZszFNfa2cRBx2mzzeV2jvu9f54uzs5mL7y8F+/D9/l+nj/y/Ee9" "b2QaMrsjYbMqVSIIAAKogAZsCGMzt8PP09cn9g6dbEu478iO/X3nvmzfvM4IjYhE6NKnKoAy" "OWs5NnCHifF7xb9GRpd/f/jF+UpMbCJ5PB2ZxqFJiYwIlJPiNeCcUrKe5x6r48mWmP4wWa2a" "m36h/fSyiogBaoEoHRlSBmKByEAkIAIGAQJN9WlqVn/L2lw6m9RWHa04MIhIRckIGJH/30iY" "mCrxcK1ltlTAZT4niuNdiwgV1jgCQVARglduJXkGb3/Hjdk/cGMelzia69Zg3RzZpq/NooAq" "KBCLQVEUuDmf57fJb3iwejkbV7xE0IBXT1CPC55isd9sP/Ts6JnO3lysQKDMKwgK5Gf6WZmu" "YVV2NYOFAfI3R7CJo3nZGrzzXB2dDz929eYATHBlhEDZiapybfp3Bm9c5NSVk8wVDR1Pn6Dj" "mVP8M1XCFQ2++GaytWNrFiAOQdEFDl0Ygj3rD5ZFFXzwHB84wM5NH9KQfoB9r3zMy/sHOP/Z" "+RJA7AN4Lfc+LI0QLiQIKY70vc/d0h2Cwuvb9tH11dvMJReqNr6zTl3ixuNglaDKJ5cSBCUI" "qAoEQ/L3BzTXzZBJOzq/eAqbOB5tfoTdO9sYGv6TnnO//BBb5/EemupTbFplyrYVTp99jYca" "62nNteLVs6Fl/WInRq6N0dPbd9F6ezz2SQjWe0088mvBE0RRhBUtJ7h+tZPiXD/WOYaGh3GJ" "w1lPcGu99fa98e5CT5yU/K2aTLSya8N8DWDQpVo0bPmUvd1vUfx3ir4DlwEN2bS527rnTCHf" "vaOnvEz4g9vfPfuqMeaJQKi+r44LTxsuOpra1v6TVbinQQdTRo9Vwv4DqpeBRE8vf3wAAAAA" "SUVORK5CYII=") index.append('page_refresh') catalog['page_refresh'] = page_refresh #---------------------------------------------------------------------- page_save = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqFJ" "REFUOI1tkk2IlWUUx3/nPM+99/XOnenOZOUg2Qc6YhTWiEpBEEVRIUQL27hpI+LCldiqaFO7" "hKBVmyIXRbQViSLKPqgBE9pIhoWZOOhNZ7qT9973fZ/nnBYzYzPRgbM6nP/5/8458vSrp19u" "3dY6EIRdwCQwQgAXcKM2+/WvP+2LhYvzx8598lLFf0Kee/Pbb04c2bVDhS5IWC24Azi9v2s+" "PLPI/O+jweVfLkx9+s7z5VqBqEG2N4N2z/UkqApukN1IyRnWmSe2jbN3JjJnvbb71oVnj5ya" "XCuiQAcIzaBEgaAQBERAEcCYnmiyb/c0920tNlSd4v21DhQRWVVSkfUZhPkbQ+7p1DwwJRx8" "9HZCjPvXIazyxgCIYNlBhRig6cqF605lCbOKx+9vIQ1N6wTcwYEoiuGICgJ8cPI84y0YVInJ" "TpMr14acUti5qVM89O5PvtAf8uXZK3ujA8a/zA64wXAw4sk923lhtsPJHy7z2oEd68534qse" "ZjKnlpYRDHB3wFGFQVlzY2nZ7ednrt5qHCXol9BbrBAxopkXvspx6wlAVQgOdTaOH57FzHEg" "4LQjlGVJ/2ZFrEsf1ebF6z9WuDjuAgZTDWVU1rzx8UVUIGXDsi0jrgxsN4xYp0zOMD3R4OE7" "lOyQBebOO2VOBG0AjpAREdwcdyOlmqpKxFyZ1Tl7lZHv5xOOALA0qGlI5PC+cZJVy5/i4GIU" "sclbH13iev8msRrmq2OtsPGVB8sxHLWVNRw77QQaGEPeO3uIje0tCEpv8AcHd7+NUjAoK6KS" "jz9z9OsXVfURx6ccH+Ews2W8uHcT3NVZ4qmde+g2N4PC4mgzd44l2k2IIit+/ydmD3323czd" "Gx7rtroUcYJkNWKGeMZkwM+XfuNav+YfTCM/egrfO5kAAAAASUVORK5CYII=") index.append('page_save') catalog['page_save'] = page_save #---------------------------------------------------------------------- page_white = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAT5J" "REFUOI2Nk8tuwjAQRY9jxJ4N3bRS/6Eq/c4KseCTqv5Fu0BkQxAhJtHYtwsIDaGhjDSSX/f4" "jh+OYzwCD4DnduTAF5D6Ey8hhKJpmmhm+isPh4Pm8/k78AxkfcCsaZpYlqX2+/05t9utNpuN" "1uu1zEyr1UqLxeIK4oCZmSmEoLquFUJQCEG73U5FUSjPc5mZqqpSWZZaLpctBHfKVzP7iDGe" "LaWUkISZUdc1k8nkwvJoNHoDPkfdwSzLcM6d2zFGvPeMx2OKoiClhJkxnU5/QV1AK27b3vuL" "fgu8cNI/zT6wFTjncM4h6X5AK+yW1o+r+xyCAHjvybJLyaCDrlVJOOdI6eoB/l9CF9Tf/Sag" "PbCh2q8AkuR6q4fEktpalAECUowxdCYGQ1KKMVZAhOMzBnji+J3vupWTOAe+fwCXA9OcPJGc" "bQAAAABJRU5ErkJggg==") index.append('page_white') catalog['page_white'] = page_white #---------------------------------------------------------------------- page_white_acrobat = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhtJ" "REFUOI19kz1oFFEQx3/vY/c2BHPGJJcoKpYWIhI1FkKwsNBCRCSNKClSpAuCoKKFjaWg4Qza" "2FrbWokISgpBVEQUNMQiXkJyd+Q+Nm/f7lgkJpe76B+mejO/+TMzT7Gl/cAgYPi/FoF5IGt/" "ON5sNivOudR7LztFHMdSLBangUOAbgeMOOfSWrUq1fu3ZfXVS6nX61KtVqVcLkupVBLvvSws" "LMjMzMwmxG4UKwCttTZakSYJurcPrTVaa0QEpRQA+Xye8fHxKWstk5OTDzts6DBH2myQfvkI" "gDEGrfUmIAxDoihiYmJiCijYDoDW0NWNykVYa0nTFGMMYRhSqVTIsgzvPYVCYT2/HaCUwpdK" "rM2+RSmFMQZjDNZawjAkCAJyudxWw3aAn5/DNxr4Wo3k29cOiLWWIAj+DSg/mSY3epb8jbus" "FB+QzP1AKYXWehvor7bNIF1eIp77Se/1W2T1GhKE/Lp6mWBoL2ZgENM/QDR8ku4Ll3Z2sPT4" "EeGRozQ/faA++45dY1fY9+w5uVOnkVyEGIuv19pNw5uD+d6n/T33vo9dlLWV5c3LS5JEkiQR" "55w456RZ+i1rq6vinBPvvQAj9v3Q7lGcOn9Yy7nBm3cwPfltG2k9Irunr6O5TtPsWur98OfY" "veg6NiztCUqpHUNEMtg44Q2diOP4tTEmUkp1bKdVIpKladqIouhMK+AA69/5v8UtSoHFPxKc" "+o6IhxSDAAAAAElFTkSuQmCC") index.append('page_white_acrobat') catalog['page_white_acrobat'] = page_white_acrobat #---------------------------------------------------------------------- page_white_actionscript = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAl1J" "REFUOI19k8FLVFEUh7/z7nUaE3SG0hnIqUFKBRdNk9WyokUy/4SLCDfhslXUrkUEYuYm2mVB" "KzeWqwzBJBdOgUJi5CKVSSFGaXTee/Puuy1GHEetH5zF5dzzcTi/c4Sa2oEEoPi/NoGfQHg4" "cblcLm/5vm+CILDHheu6dmRkZBhIA85hwFXf902pVLI7Ozv7sb29bYvFot3Y2LBBENhCoWBH" "R0f3IXqvWAAcx3GUUjiOQ5j/AtPTaL9CZfAeIgJAS0sL/f39g1prBgYGhuQA4EoQBHPGGJiZ" "IXw1RsP5M3ifvmLevsHzPOLxeF3LWutrmkOStXXMi5foswn8hRXo6UEpRSQSYWtrizAMCYKA" "tra2KqSu2lrCsdfoCykqgabh+TDEYhhjqnARjDEoVTOqbpL2xwr2+xJe/huqrw+URkRYXl5m" "fn4erTX5fJ7V1dXjAebde3R7kmhvD96Dh/jPRgEoFAp0dHSglKKrq4ulpaWjgEednZ3BhynA" "sjs1hzV2/5PneSQSCQBaW1txXbc2SICN67lEEJbvR7rTlD8vcGLoKdJ0EpqbmZycJB6PY61F" "RAjDkFQqxcTERBVQup2bsV4laULOhX92ULduoi5d3JupJZPJsLi4WGvZcVhbWyOXy1Xf1vUy" "YaXS0Zjt1t76byJ379QsFSGZTGKMoVQqISKISN1OOLYSNOFX5NfHucXok8dWTp+q3wsR0uk0" "s7OziAjj4+Nks1mstSHsrfCeel3XnVZKRUWkzh3P8yiXy8RiMYrFIo2NjaHWejcajd44CEhR" "PecjV/YPGWDzL6MlIJZ/ca9oAAAAAElFTkSuQmCC") index.append('page_white_actionscript') catalog['page_white_actionscript'] = page_white_actionscript #---------------------------------------------------------------------- page_white_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeFJ" "REFUOI2Nk8FrE1EQh7+3uw0qHoxIpFBBEEUPtYI0igoK4tWTIHiLCILBk/9ErxIixIt68OLJ" "InrQQhFKtRS0VnoRvCgYspdsyGZfNnlvx0PdNNk06sDAzHvMx2/mvVFs2wxwGHD5u/nADyDJ" "XpzVWge9Xs8aY2Q373a7UqlUHgJHAScLKPZ6PRuGoXQ6nYG3Wi1pNpvSaDTEGCP1el2q1eoY" "RAFFY4xorSWOY9Fai9Za2u22BEEgvu+LMUaiKJIwDKVWq6UQ1B+fN8asWWsHkpIkQUQwxhDH" "Mfl8fkSy53nngHVv+NBxHJRSg9hai+u65HI5giAgSRKMMRQKhR3QMCAtTmPXdUfyFDiiJDvN" "LDAtUEqhlEJE/h+QFg63lrV/AlLI0qdFlr+8ptVp0jd9LpVO3F558m19ImBY6pu1F2zUl7h8" "cZ6Zg8dZ3npJNPXzbrE8HY79qN1Aix+ec+bkHNaxzE1fw6o+52cvAFKeCEh7VkrhB3Wm1H6u" "n7oPwIOrjzlWOI1C7RkAJDtedibfjlps/Vpl4V0JgIW3Jb77mwjSdQABEmutFpGxLQO4eeUO" "HzdXyeHx6usjcspjZeM9oKrp2xxhe50ntjR761B57wHvhlJqn4hE/UiefX7auPcbQ5sFU0l5" "TfwAAAAASUVORK5CYII=") index.append('page_white_add') catalog['page_white_add'] = page_white_add #---------------------------------------------------------------------- page_white_c = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAh1J" "REFUOI19k71rU1EYxn/n3nMTS9NCorQWLdQPpCARpNi4iKJInUSRglPBQXB2URz8A7RLKR3q" "rLvg2NlBpw6FiojaIoRkaFJzk5N7c855HWqbpKk+8C7vx8P7vB+KLk4D40DI/1EFtgF/ODBj" "jKmnaeqstXKUtdttWV5eXgKmgOAwwWyapi6OY2k2mwe2u7srtVpNKpWKWGulXC7LysrKAIkC" "Zq21YoyRJEnEGCPGGGk0GlKv16VarYq1VlqtlsRxLKurq0vAlAK49+rrOVPZfjl3o7gAwkQu" "5OzJiEtTWUQEay1JkpDP5/ta1lqX1Pzit5nimdxaIafzofc4Jxgn+ER4ev8Ezjmcc1hr6XQ6" "eO+x1jI2NobWuhQMHcs8Gx/V+Q9rG+8f3y7w5M5xJoYCdtqO2HjCMCQMQ7TWZDIZoigim80e" "dBFMn8rOx21H5efm533nw5sFSpN7SUqpPhKtNVEUdWU460lEkf6uNXr13b3W1auUIggClFID" "RxH82ul8D4DM6Pnp3sDiuzKbP0wfCUAYhgRB9wSCzY34TdLxXL4+s/Bly9BoOl6/LbPVdHgv" "iHRNKYWI9HWgAEqP1p9fKA6/yI9kR0zqsR3P3PQwD24VAAaKAIIg2FtjD9GVj+u1TyJwtThy" "kHhU8b4krXVJ9zpnL+ZEHZrUUYP7S+yhe8sCeOec2Q/8DyLinXMtwPXST7L3zgNf9g84oPoH" "DkIpPPMYvBcAAAAASUVORK5CYII=") index.append('page_white_c') catalog['page_white_c'] = page_white_c #---------------------------------------------------------------------- page_white_camera = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjxJ" "REFUOI19k71LW1EYxn/3I0QxCbRLllx06SAtEii1RNC1k/9DF6F2c9DFLgWnbiIB/Ts6NdCl" "k3TSpSoqjaYqXsk18Sb33I9z83YoJsaPPvBwhnPe530Pz/sYDFACioDF/+ECp0Dv/sVrpVQr" "juNUay2PMQxD2djYWAcmAPO+wHQcx2mn05Fut9tnu92W6+truby8FK21XFxcSLVafSBiANNa" "a1FKSRRFopQSpZT4vi+tVktc1xWttQRBIJ1OR7a2ttaBCWN1dfULsCwiAIhIn0mSsLa2xsrK" "CmEYsrm5OTSybdtvTa318vz8PJOTkziOw87ODp8/vOLTu5/s7e2xtLREPp8nl8uxuLiI53m4" "rjsQGRsbY3d3l3K5TKFQYGZmhu+/ztjenmVhoUy326XRaJDNZtnf3yeTyWBZA6PsfD7P1NQU" "X0+eUzs1wcwyW3Qov2hSq9WoVCocHBxQKpVQSmHbNrffBTCz2Syjo6N8q5u0GKFtjPCjmcOy" "LG5ubgjDEKUUURShtcayLGzbHggEQYDv+/QEQMAUxBZc1yUIgkcFTHOwAmaz2eT4+Ji3z5rk" "jJCcEfKSEw4PD4miqF+cJEnfnSEnrq6u8DwPx/nD+0IB3/ep1+v8PjujWCzieR7j4+MEQUCS" "JEPdAezz8/NqGIYfj46OjFvv4zgmSRIajcbQXszNzWEYxpCAced8kyTJtnH/xRMQkV4mk6nc" "ziNAL01TJSIPUvZYcZqmAZDe7ebwL84PUvYEUsD9C1EMdqoenNumAAAAAElFTkSuQmCC") index.append('page_white_camera') catalog['page_white_camera'] = page_white_camera #---------------------------------------------------------------------- page_white_cd = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAl9J" "REFUOI19kz1oU1EUx//3vvvey5c2kaYqWpKCWForRfyI0SKCpbhZEMRF6OroVOniooIgSCmZ" "XMRBioNTB0cVhQoOarFFsIM1WPNqm0Rfvu7HOw7SpG2ifzjLPZz/+Z3LOQwtHQSwF4CF/8sD" "sAIg2Jk4XqvVSlJKo7WmTlGv12lmZmYaQBoA32lwSkppfN+nSqXSjHK5TMVikQqFAmmtaXV1" "lXK5XNNkE5fdfPBswkmkL3xYkfiUV8ivKzAQEjELRIQgCBAOh2HbNoaHhzOpVIrPzc0tsVtE" "fOCtf0cpM3luIMIahhCPcVR8jdmX33GsL4zs4RikbCCRSGxDFkJk+MC8f0UpPXnpxC7WFRZY" "9hQCbmF/MoQb42m8WljHUr4Kx3FQKpWwsbEBz/OaJlxpPTHSH2FvvvyG3wiQ7XMRMgZaE0hw" "XBtN4d3nIoQQcBwHtm3Ddd0WhZR6sCoN6tIg6hAePl9APBrC5ZFDWPECuJbAt7UKLMsCYwyM" "MRDRFgNtYILWQ9S1EXFtEBGKFYPuMEFJDc45GGNtSyFkQy2GBXqPpnfDcAtXz/eDiLBWBSyL" "Q9Wr6I67zc6WZW0j4FLpR7Mv8pSMcqzXGJbLAos/GQq/AvR2Mdx/8h5nh5IgojZ8AOD+x/TT" "htT37j5eoHq5jBiXiNsKkaCCqdxrXMwcwOnBZKuAc3DeWsLNodj49emp0bGx219/+FBKY9+e" "EM4c6UF2qKdtbgBgjEEIkWFbjE4qpeZZp5/qICIKbNvObrIQgMAYUyOitivrVGyMqQIwW7v1" "4u85t13ZP2QAeH8A9UM1ZcPmVKIAAAAASUVORK5CYII=") index.append('page_white_cd') catalog['page_white_cd'] = page_white_cd #---------------------------------------------------------------------- page_white_code = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjdJ" "REFUOI19k89LVFEUxz/33TvjrzFTa6y0lAgSyhZKGm7atG1ptAnaREEugjYhLQqMdqGIi6lF" "i1r1H4SUtBSiNtWmRSDhMLNw3nN+vDePe99pMeroaH7hLO495344l+85iqaGgAFAc7SKwDqQ" "tCYmwjD04zh21lo5LKIokqWlpUVgBPBaAZNxHLtKpSLVanU3giCQUqkkhUJBrLWSz+dleXn5" "AEQBk9ZaCcNQ6vW6hGEoYRhKuVwW3/elWCyKtVZqtZpUKhXJ5XKLwIjaA7jqV+O1DiO7LSVJ" "gohgraVer9Pb27uvZWPMlNk5dJ0bzzz/7BPYhNc3T/BwxacLYW46Q4fRpNNpfN8nSRKstWSz" "2QYEYPTJr76h096C0gpdawB1Ipi0Yn61zNz1DF1pg1IK5xxaN43yrrz4c3t8ov/v2IW+sXLg" "eHbjOABPp4/hlx0qBY8/brHyI8IYgzGGVCrVBIyeb8sNd+v2/GbsZq9lGOhp/CrbrZmdyFAM" "LKc6FR9+hiTiobXGGNMEfP9avv97ox71tRn96pNPoWQBKASWhS8+PcZjvRgzc7GDlFForfG8" "5ggogDN31vqHB1Orly8NjEWB5e2DQe69L9DW7iFly/zMSXo6vV1nth3AGDPlAWy8m9r89ubu" "I7YskW3YGMUJElhe3mo+BvA872AHO3NgrV2jRSLSetV4oNT+OdguFqWUai08TCKSQHOWBUic" "c+FO4iiJSOKcqwFuL/4sjXU+sGX/kQOK/wDP1icqAyasqwAAAABJRU5ErkJggg==") index.append('page_white_code') catalog['page_white_code'] = page_white_code #---------------------------------------------------------------------- page_white_code_red = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAihJ" "REFUOI19k89LVFEUxz/v3fveWKk0pWVqZEQgxUgU6n8S1kJqEdUmiogkohYRRFFo5mKWQdta" "ta+ttGgXRIsipNGXzDybH++H977TYnTGRvMLZ3PPOR++3HOOQ1vDwGFAsbsC4CeQdSbORVEU" "pmlqjTGyU8RxLPPz83PACOB2AibSNLW1Wk3q9Xor1tbWpFKpyMrKihhjpFQqycLCwjaIA0wY" "YySKIkmSRKIokiiKpFqtShiGEgSBGGOk0WhIrVaTYrE4B4w4WwDj62FlMduzt2UpyzJEBGMM" "SZKQz+f/say1nmxZmNiX647v3SG5eAGlFOvTl7G3buA06iil8H2fMAwpl8sEQdCCuABLo4MH" "3p4tzIoR6NYbeBAU5uEMbr2K1hrf9/E8j1wu1wYEY4NTPSfPLPWOjhUwf+h68hwA/9lTpFYh" "S4X0+hXsx/dordFa43leG5AbPl10TxzvMstL1rs9g9t/pJk4NIA/c5dsdRkZGsS+eY0rFqUU" "Wus2oBF8vmq+f43VQL9qzD7Crv5qfuDvEtGLxzh9eWzpB+rSNI72UUrhuu0VcAC+jPcc1Pmh" "D33HCgXrJeRfvqN67TyQw/ZCz/05nO79rclsTKA9hVOfquWpxW83Ta+LxHGzMI6azQ9etZoB" "XNfd7mBzD4wxi3RIRDqfmg2Og9Z6UncUi+M4TmfhThKRDNq7LEBmrY02E7tJRDJrbQOwW/FH" "aZ7ztiv7jywQ/AV5byMoN5vASQAAAABJRU5ErkJggg==") index.append('page_white_code_red') catalog['page_white_code_red'] = page_white_code_red #---------------------------------------------------------------------- page_white_coldfusion = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAg9J" "REFUOI19k79rU1EUxz/3/WhCa6t1aATbUlCsCi4VqyLqIDiKg/oP6Kazg5vgXqRWKI7OUiji" "P+CiUhehBemkDm1S0iT05b0k7973dYhN0qT2CwcOHM73fs8932PoYhIoAD5HowT8BrL+wuUk" "SaqtVstZa3VYNBoNLS4uvgZmAK+fYL7VarkoilSv1ztRq9VUqVRULBZlrdXW1paWlpYGSAww" "b61VkiRqNptKkkRJkmhvb0/ValWlUknWWsVxrCiKtLy8/BqYMT0EV6y1X51zHUlZliGJzbpY" "KQeUsyEWznXrQRBcDfrn8DwPY0wn34jEm+2A2Bl8xO7uLtZaJiYm2iT9BPvN+/mHHZ/IGi4O" "Ox6cbBAGIb7fXVQA8HAtniqvr91fLRuGDNwZF6GB9ciwGRkkOJ2D8ZxPYISkLsGjDc0Ni0+j" "czcLq0VwghtjjjCAjzuGpgOXwcq2z0xeXBsTvQhCxwKiUK1HP2+dGpnNezAawE4LftQMLoO5" "4yIAJvPC9/2DCnBcssCfb5/fP3t69xVAJYW3vzzqKZwdFi/OuE5Tlh1UYO5917s8PElT1zyR" "83MZEKdQt5Dz4OWs4/zIgGvxPK+9RhfzPBpi2he3K832H2SCQk48nhYXjumfTQ7HASOlafrF" "9O7xCEjKwjC8vu9lAZlzLpE0qPeQZudcDLje16Zon/PAlf0HDij9BRUMLxMfO8o5AAAAAElF" "TkSuQmCC") index.append('page_white_coldfusion') catalog['page_white_coldfusion'] = page_white_coldfusion #---------------------------------------------------------------------- page_white_compressed = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmJJ" "REFUOI19k09LVFEYxn/nnuN4Z3QMR5tRNBWMQiSMrFy4EWqV0NYWrbMPUNB3KIgSV7UqpF3Q" "wlokpRFSEQxuhGoRSP43nHFmnOude87bQhlHix54OXAO5/c+vH8Uh+oEMoDm/9oAlgB3/GGw" "XC7nwjC0URTJvyIIApmYmHgE9ADeccDlMAxtsViUUqlUjXw+L9vb27K+vi5RFMnq6qpMTk5W" "Ier9k94RnWx+lTPXmla2uqir03gegMMYj729gN7e0/T3D5BKpQjDEOccU1NTj8fHxx+qDy8G" "f6XPpTs+fhqgWEwACgTEeSidwDkHRIyN3SSTyRyxbIwZMo1NiVRHTwdj3WvUmSSVaAlV2WNh" "FrqHnvL6zTTOVojHfXK5HM45oiginU7vQ5RSEpTzLC/PV8nd7X2IGAD8eIxiPkRrgzEKay1a" "HzbKiDgSCZ/OjrMAKLVLzDMg4JwQRQ6HQ2uN53kopRCRQ4BSitLuJivL36qXXW0WVAsiDsQi" "zuF53pHMVQDW1sXjzWTaesCV0cbim4YDBw5cBcShlAJAa33UQWk79/zHrNxQCk+8E76zFXZL" "AWuFdkrfF4nF6tnZKVaz73elxsGKv3grsdR15+6D3xem32ZnXk6/w0Z7xI3lZzZLY2OMqFJh" "eSNPvKGJVMPRAVQ156XV9a3P92diJNli9MwmX7/MsZCdR7ecJ9Z3m5akx73rzQfFVvtzUEuz" "XlwKhYJKNChaW09y5eoow8Mj7ASaZ9mIZL2u1kJEXK0DgItBEMxprX2l1F+LUisRcdbaXd/3" "R2oBp9hf5/9+rjUMbPwBBCEnpG2JUEEAAAAASUVORK5CYII=") index.append('page_white_compressed') catalog['page_white_compressed'] = page_white_compressed #---------------------------------------------------------------------- page_white_copy = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAUZJ" "REFUOI2FkbFuwjAURY8dCzYGBrpVzOyFD0IMLPxKVTGw9Vv4Cfa2EwoSCKhCgh99HYqjkFjp" "laJYefbxvTcGeAaeAENTKfAF/ERmpV6KoihERKtPnue6XC7fgCFg2wBjEdHL5aLn81kPh4Om" "aaoiolmW6Wq1CpB2QJ7nmmWZnk4n3e12pRPvvQKTuwtTj+rCIkmS8t3tdtlsNmy3W3q9HsDo" "vk1j3YyrtwUn6/Var9er/tdN6QDAGFM6sdZircV7j4ggInjv6ff7TKfThXOO+Xz+2mjXGIMx" "BmvtAzRJEoz5i9/pdJjNZgtgEP09ARI6sdaW3RyPR/b7fbNEAFV9gNRjBbCIxAHhUGxdjVCd" "OSB1zk3qKYCRiLzXY1VBAfABfEYADVV7qUfQyP7yW6ybOqBV9UMAIvIN3KJW7xoCg5b5DUh/" "AcrsxXEO/RaWAAAAAElFTkSuQmCC") index.append('page_white_copy') catalog['page_white_copy'] = page_white_copy #---------------------------------------------------------------------- page_white_cplusplus = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkJJ" "REFUOI19k09IVFEUxn/3/XH8DzPFmKRgJiGEgUhOu/4RtizCEAKpRdC6TVEUBLWpNiIubB0t" "I6hNuGrRIjdJCEqEpBQ2Azmj82buvDf3vtPCHCc1Pzhw+c45H+fj3KPYRhfQAbjsjxywAsQ7" "E0Na60IURdYYI3tFpVKRycnJCaAHcHYKDEdRZIMgkFKpVIv19XXJ5/OSzWbFGCOrq6syNTW1" "S0QBw8YY0VpLGIaitRattRSLRSkUCpLL5cQYI+VyWYIgkOnp6QmgRwFcevr1qM6uPBw5MzAO" "QmerS+8hnxM9CUQEYwxhGJJMJv8Z2fO8jBp9/m1o4EjrTKrVS7pxjLWCtkIcCrcvH8Rai7UW" "YwzVapU4jjHGkE6n8Twv4zQ1NtzpaPeSb2fm39y8kOLWxQN0NjmsVSyFwPJ+LsB1XVAuHxYN" "vu+TSCRqUzj9hxOjQcWS/b4wu0WOnUuR6U5gY/i8VMZ1XUS5fFkJ8TwP3/e3bVgTE4oi2sgX" "6/0tb0TMvvsFwINXP2v8k9e/uX42SV/z3wl+rFWXHKChva+/XiAsxFzNpGj0HR5f6+L+aCeN" "vuLRWCc96ToLC/PBi7AaM3h6aHxxWVMsWZ69XGW5ZEGEwd5mRARHUXvXQwFkbszdPTbQci/Z" "lmjTUYypxoz0t3DlfApgVxOA4ziba6wTOvlxLv9JBE4NtNUK92oGUErheV7GqyeHj7eKUkrt" "LNwLIhLD9l8WILbW6q3EfhCR2FpbBmy9fDeb57zryv4DC+T+AK9uO46JFb+OAAAAAElFTkSu" "QmCC") index.append('page_white_cplusplus') catalog['page_white_cplusplus'] = page_white_cplusplus #---------------------------------------------------------------------- page_white_csharp = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn1J" "REFUOI19k8trU1EQxn8nuUmbVKPRqsVnbeujFK1amwoiIuLChSCCO/EfEFwJgoK4EnyAaC1Y" "QReibkRxIyguCoqirgTxjUVFSZOquWke596bc+64CNZYHx8MB87MfHNmzjeKX1gIzAOi/B95" "4BMQTnX0aa3dIAisMUb+Zp7nyeDg4BmgHYhMJcgEQWDL5bJUKpVJKxaLUigUJJfLiTFGstms" "DA0N/UGigIwxRrTW4vu+aK1Fay2lUklc15V8Pi/GGKlWq1Iul2V4ePgM0K4Adp542+kVPh/Z" "sWXV3ihC67Qo7XNi9CyMISIYYzh5e4LuOXHWdCW5NFJg//bZLG5LDji7T33sW7+s+V5ranYa" "EUKB8YrwpeDR257AWsuHnCVChN4lwp1HeWo+zG+NA+DMSqmDbelY+tbI61vXD2d2Atx8XGS0" "HJJ3DRdHClT9kBnJKFcfaIpBlNCGnLqaBSDSszixW/tC9v2Lpz8HsmvDDHra4ox9r9Ex06Gl" "KUKtYkjFIkxLRlndGqW3M1EnCEOhFob4ZbfU+CXb+1Mk4hFa4grtQ6YrgVhw3YDujgQDq6bX" "WxgvmtEFs2IdLemulY0Ep2/k+OqB40AYCndfaaJKEYjiyv0Jzq9N11/w7E31QlATMpvW7X33" "xaOkLWdv1pP3bEwx7tZY2xZj2/JmvpUMx/fM5dy+BZOFnNtHu477B16q7hWJQ9ceTuDVQrxA" "2Ly0iVejVawVtmZSHLs8xtJmxczpsd/UpxrO/sfPi08E6O9umQwQkamKrScoheM4A07jZd/K" "pCil1NTAv0FEQvilZQFCa63+6fgfRCS01lYB20i/iPo6/7Fl/4AF8j8ANVBP2Bp3KbwAAAAA" "SUVORK5CYII=") index.append('page_white_csharp') catalog['page_white_csharp'] = page_white_csharp #---------------------------------------------------------------------- page_white_cup = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlBJ" "REFUOI2Nk81rE0EYxn+zmS27Wdhkt7SWUEtKEC0kRRAtohREvOlB8Z5jb/4RvUsrpTdPQr1K" "rh6EQgUv3lrIJRfBhE1TYjRN0uzMjofa7afiA+9pnvm9z3y8glPNAteADP9WG/gGJBcX7gyH" "wx/j8VgrpcxVNRqNzMbGxhugCFgXAffG47Hu9/vm8PAwrV6vZ7rdromiyCilTKvVMpubmylE" "Amxtbd1qtVov9/b2LGMMxhiS5Dih1ppcLofneQDkcjmq1eorKSUrKytrolarvQjD8HWhUCie" "mIQQnAV1Oh06nQ7lcpnJyck0spRySfq+v1apVOYanz/y6cM7hr0uOh4DYDtZsvmQm4+eUlp6" "zO7uLpVKBaUU09PTx5ButztnWRY3Hz7hZ9TkV7tJu1FHCIHj5wlm5wlm58lms4xGI2zbJpM5" "fSjped7AcZxskiTcfl5lYmKCo6Oj1BDHMUop4jjGtm2klBhjTgGu6363LOtGFEXU63UWFhbS" "8yul6Pf7BEFAr9ejUCic6w5gDQaDSCnF/v4+nuehtUZrTRzHaRLXdWk0GuTzeTKZDJZ1+gXk" "9vb2+6mpqbLv+3kA27YxxqQm3/dpNpuEYUgQBOfiA2R2dnbqWuuvUsoHMzMz+TAMkVIipSRJ" "EqIo4uDggMXFRVzXRQiR1urq6lvxBySWl5efra+v16IoAiBJEuI4plQqUSwWcRznXGchBFLK" "pRQA3I3j+IsQQvAfMsYktm3fP7kNAyRa66Ex5tKUXbVZaz0A9Nlu1zke50tT9hdpoP0bPJws" "iql3k2IAAAAASUVORK5CYII=") index.append('page_white_cup') catalog['page_white_cup'] = page_white_cup #---------------------------------------------------------------------- page_white_database = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAglJ" "REFUOI19U01rGzEQfRpJuyY2BjtgG9IFH+1CT20acsp/qH+Ef0iPPpQ25Cf41vR3FFzoKZCT" "Dz3ErLfYa/DXaiVND8VrJ07yYBBo3rx5SDMCe7wB0AQg8TqmAP4A8E8T7zebTWqMcdZafi62" "2y1fX19/BdAGQE8FPhpj3HK55NVqVcRiseD5fM5xHLO1lieTCd/c3BQiYjAYND6cX/z+m8St" "Wq1G1lqEYYh6vY6zszOEYQjnHIwxqNfrMMbAe4/hcPit3+9/Ed9vb3+97XajZrPZqFQqICKs" "VivEcYzxeIyrqytYa5FlGWq12iPLSqkLyr1R7XZbhWFYJIIgQBRFWCwWICJIKREEAdI0xWw2" "w3Q63YtYb4W1liaTCcrlMrz3eHh4QLfbhXMOUu4/RQhxdEclKmmttSQilMtlzGYzlEolVKtV" "OOcghICUElJKKKWglILWeu/AOS/TNFXGGABAnudF0lpbdCYiCCGOhkIJIbY78u61d8SdwE6E" "mSGlBDPvBQAGESEIAqzXa2itC4tZlhVkZoYQAt4/HkBKkuTH/f09Tk9PUa1W0el0EEURRqMR" "Tk5OiuKigAhE+yFUSZJ8Ho/H4u7u7lOj0XiX5zmYGa1WC71er7D/EsTBeZ7n+U/xGvsAzOy1" "1pc7LwzAO+c2zHy0Zc8VO+fWANxhtwj/1/loy16AAzD9B2sWFb/E8T1gAAAAAElFTkSuQmCC") index.append('page_white_database') catalog['page_white_database'] = page_white_database #---------------------------------------------------------------------- page_white_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeJJ" "REFUOI2Nk7+LE1EQxz9vdz1zZyFBjHegmFM7G0GNpZ2FIJxgY6FX2IgiiI2t/8IRI6YQtBYU" "/FGojSgnBBu1UEQUTuTWRDSbZJOXXd/bsTg3JhtzOjAw84b5vO+bxyjWbDuwDXBZ3xrAZyDJ" "FvZrrYM4jq0xRv7m/X5fyuXyElAEnCygFMexDcNQut3uwFutljSbTanX62KMEd/3pVKpjEEU" "UDLGiNZaoigSrbVoraXT6UgQBNJoNMQYI71eT8IwlGq1mkJQv/2gMaZmrR1ISpIEEcEYQxRF" "5PP5Ecme5x0CXnrDh47joJQaxNZaXNdlamqKIAhIkgRjDIVC4Q9oGJA2p7HruiN5ChxRkp1m" "Fpg2KKVQSiEi/w9IG4eflrWx/5wE8R9UeX3+AC+ObWb59G6ultTiugqGpa7ev067dpt9J86w" "cX4v+s1jcs+enH008+79PxWICCt3lthzeIHcx6eoWyeZ+XSXXcUtjrhycaKCdGBKKWJ/hdzs" "PBy9NKh7V+ZwRRUHABERlZlUmnqFOXqvHrLp3jki/ZUe0Gm7WJdVBxAgsdZqERnbMoCdCxd4" "W1vG70/TdjfQ/KH48EUlInItvXEHa+s8cSY3jhQWt5rvx6dRs33kW/CTm6ee28u/AJplBbjt" "xWEdAAAAAElFTkSuQmCC") index.append('page_white_delete') catalog['page_white_delete'] = page_white_delete #---------------------------------------------------------------------- page_white_dvd = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk5J" "REFUOI19k8FOU1EQhr9z77mXXrAoGkKCVqANiZoaFkYIwQ36Dq55C2JcsPIBTGXv2p2RhAdg" "o4kl6EJdEIyEpOkttNS2QO8954wLAgWL/smsJvPPN5MZRU93gDHA5/+KgV3A/Z14dHx8fJgk" "iTXGyFVxcnIipVLpNTAJeH8bzCZJYtvttnQ6nfNoNpvSaDSkWq2KMUYqlYqsrq6em5zhqlKp" "tDQ6OvqsUqkQxzHNZhOlFFEUISI454iiiCAImJmZmZuYmPDW1ta+KxHxtra2XhljlguFgjLG" "EEURSZJQLpcZHx8nl8uRJAkjIyOXkLXWc97m5uZzY8xysVhUURRRq9UQEYaHh1lcXGRnZ4da" "rUYYhhweHlKv14nj+NzEc84t5fN5tb29TbfbZWpqCq01zp0ueXZ2lr29PbTWhGFIEAQMDAz0" "KIwxD5IkIU1TQi2sr6+TzWZZWFhg/6BBVzRxy+L7PkoplFKISM/AWoN0ygy6GNvaJxoUMpkM" "tZZhr56SyXgY6/A8D6VU31FoY+w3PTSdGx66zy9XZ/xhlhvhLULXJfDBOce1KDjv7Pv+JQLP" "GPP205cfUpc6R90jOu02u7WfNH5XmRzL8nWrzPTkbUSkDx/A29jYeHdij96UNz9Lmqb4vkZr" "TcsdsPbhPcX8GPnJu70Cz8Pzekd4NpR6ufJi5cnT+ZX9ZoxzjuuDN7k3UaSQL/TNDaCUQms9" "py4YPU7T9KO6alNXSERcEATzZywCOGvtsYj0fdlVxdbaI8Be7Jbj9J37vuwfskD8B2VDQAwN" "5x98AAAAAElFTkSuQmCC") index.append('page_white_dvd') catalog['page_white_dvd'] = page_white_dvd #---------------------------------------------------------------------- page_white_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAh1J" "REFUOI19k8tPk0EUxX8zH7ThZSNFEBV5qMFH1BiDLpQVC2NMdKF7N8YV/4ULNy40RTGGaOJK" "ExcSDQkuMCZgcaGpaRqggEZ5g9ZSgX5Mv5lxAdQWKCeZ3MW952TO3DmCNRwAagCHnTEP/ATM" "5sbZdDqdVEppz/Psdsd1XRsKhR4ADYDcIIr1ek4pFVZKSSFEVtXzPIwxKKUIBoPMjrxmKfIK" "p/wky78+gDt1U6yLtHie9ymTySClxBiTFdBao5SiRA2wFB+kpKqVQOMZkt/DDPV2zRXl+pBS" "ZqsxBsdxsNZi/vSR0SNUHrlAYnwIn1BU7NpLefBgYIvAhgUpJVprzOIgvkyMQNMlVmde4CsV" "/IgM466sLi6vpM7nCeT6F0Kgfg9gku8JHL6KO/UY6fMoLq+nzE7ysDva3tEzFpcUwNzwG5an" "362TO5HFGVSqgYX+rwTb7tDRMxYndx155JEeUtNhqk9cQc124fgsq6l6Fvq/sOdaCH/N0exs" "0WbyaPgl5m8MT+xjJhpid7UPN1FH8vMwtdcf4VTU5s1vuUH041OOX7yNf6KfePcAkd4E8b4I" "1ZfvbiFvKzD6bQEVe0vj6VbKypqZi47TfOMe/qompJTZVRe0EBub5/6TTlqONVJx6BRtt55R" "Wrl/u6fKF7DWWiGEeN47WXA4Z3YjTFYCFjBa63ROY0ey1noF0PA/THWsxbngv9gEzVq0J/4B" "2vwDCNX+vIkAAAAASUVORK5CYII=") index.append('page_white_edit') catalog['page_white_edit'] = page_white_edit #---------------------------------------------------------------------- page_white_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhlJ" "REFUOI2Nk81LVFEYxn/3nlFHTXMyjcC0Fmm5SbGMdv0HfdGi/oyWbaJdS0NmYZsiaJVEGEEU" "BLkozLIQIrPAlGqaIZs7zp177r2ce94WNpMflb7wwHPew/vj4bwch9XqAvYAiv9XAVgC7MaL" "Ia21F8dxYoyRvykMQxkdHb0O7AfcjYDhOI4T3/elUqnUVCqVpFgsSj6fF2OM5HI5yWazmyAO" "MGyMEa21RFEkWmvRWku5XBbP86RQKIgxRoIgEN/3ZWxsrArB+a1jxpipJElqkay1iAjGGKIo" "IpPJrIucSqWOA9OptU3XdXEcp+aTJEEpRX19PZ7nYa3FGENnZ+efmbWA6nDVK6VQSpGszBJ8" "GkE5IQ0NDeuSbHrNjUBHYsqL92luP0KUe0JdXd32AQDlpUc0tQ/SuneQ8uJTksri9gGx/4Wf" "Hx/QsruNZGWCjv6LFOfuItZsDRBrWX4/zq6DpyCc4eXtO+xo05QWnrOy9GJrQCX/BhMUackE" "2GgBxJL40xw4eYmvUzfo62lu+idArOH7zE3augewwSxiNUPn+rDxN9LpeXZ2neDy2e4L6wAi" "IlW/PPeQxkwvTS0/ELMMjuL1vXnAYsN5Onp76Gp1z09e6T9cXfzRMAyfKaXSjuO4s7fOcOj0" "CMr9jJgiIGvyuajGPvLv3vJh4up4FbCP1e/sAkxeG3hMQlqsINauSizUzoJYK47Iq1+isjmh" "5HpvTgAAAABJRU5ErkJggg==") index.append('page_white_error') catalog['page_white_error'] = page_white_error #---------------------------------------------------------------------- page_white_excel = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiVJ" "REFUOI2Fk09I1EEcxT+/f6tErrrIbtsfyQ7VJYrChaKDRBFE4bEIrykdAi9BdpWoDhEpElHX" "FToEhRe7FRQFdRCMEKkOYohr5lq7/n47v5n5dgh3dbV88JjDzLzhO+89hxp2AxnA4/8oADOA" "rd84FoZhUSlltNayGaMokuHh4QfAXsCtF8gppUypVJJyuVzl8vKyLC0tyfz8vGitZW5uTkZG" "RqoiTv94t6wqWCuIsVgrWCMYbbHGYrTl7tlRUqkUSimsteTz+aG+vr779I93y1boedwlCwsL" "G0YCcv7iTImrDy+xI5siUmUa4jZeTY/R0pTCEZfFXz/IZjIkEgmKxSLWWrTWpNNpAPztbQ2c" "aD1FS7KZODuDFFppSAT8lp/MFma5ffkRN0Z78X0fx3EwxuB5NaPcuKLp6erl07cJSlNNzMoU" "jckE7ybecv3CIAd3HUKFGs/z8H0f3/cJgqAmoCLD1PdJXk6+4PmHPO2Vo6w0lckdPsnT10+I" "4pA4inFdF8/zqkJVgbAccfHeadLNGcQXhsYG2Rl1kO1oh2Qjd54NoCKD4zgAeJ6H69Yi4OuK" "4dq5AZLbmjFGsy9zgI/Tb/jy9TPK1bixJa5oRATHcbC2LoDnb+W2tLHzyn5RSq1j1UYVac7c" "PILR64NjjawL1uoI9XDWrJ1xHL93/nWyDiJigyA4vvobAlhjTCgiG1q22WVjzApg1r62h791" "3tCyf8AAhT+tPJZK1IqO0gAAAABJRU5ErkJggg==") index.append('page_white_excel') catalog['page_white_excel'] = page_white_excel #---------------------------------------------------------------------- page_white_find = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmFJ" "REFUOI19kztMk1EUx3/fo18fQtEoqAlSCCAYB2KMshnjoAEfbG5OGOLkqgOTA3E1hM1EYdEF" "jQZiiQmDcTExPoiiJUql1L6Atp99fKV+97sOSKEV+Scndzjn/s85/3v/CltoBg4CGrsjBUQA" "pzZx0rKsbLlcFrZty52iVCrJ0dHRe0AroNYSnC6XyyKfz8tCoVAJ0zRlJpORyWRS2rYt4/G4" "HBsbq5BoALdHRvZ3dZ/4HHw5q3d0djJ85y7B4AyX+i8gpURKieM4eL1eXC4XPT09vYFAQJ2a" "mvqiDg3davAY+4ZbO7qNSPg7OTNLIvaTw62d3H8wjuM4qKqKoigAGIaBx+NhcHDwJtCkNh5t" "8c/Pvbu+mkySK5SYefWWdaGyLlQmn70gmzXRNA3DMMhms6TTaVKpVGVvNTj5+IZVLNa1dR+n" "qTlAYtXE76/nQOMhfL49jE9MoGkauq5jGAYulwu3210hUK5eG8qourY3m16D3xbnzp7h6fNp" "NMPAKlpYuQwfP7xHCIHjOAghkFLi8/nQdb1Xr/M3eC9fGWBxaZmVSIi+/j4+LSxx/uIA8eQK" "r2cmURSlSoft0IWw3bYQhObnyK0liUajSFVFUVXC374SDv/YGFVRkFKiaRpSyi0NCrlfRKIx" "SpZFZHmZfC6PmUmzEAqxmkqQSiYqT7lJUjVBNLK48OTRQ8xM2nOsq6Ol3l/PSmyJ2ekYllWg" "vb2tuqNa/QGVbecp27bf1O5Y27FyUVE2RKwplkqNUjsJ97fWgS1DSMARQlibid0gpXSEEEVA" "bKc/woad/3HZfyCA1B8aXkVeFPKU0wAAAABJRU5ErkJggg==") index.append('page_white_find') catalog['page_white_find'] = page_white_find #---------------------------------------------------------------------- page_white_flash = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAglJ" "REFUOI19k01LlUEUx3/zzNzbLcEXiquQlkSJcBe9WS0rWgR+CRcRbsJdrqK+QCBmdxPttKgP" "ULsMwSA3FdgiiFxEYlcor3Wv93mZmdNCfXyea/iHwyxm/r9zZs4ZxZ76gV5Ac7DWge+Ab9+4" "2Gq16nEcO2ut/C/CMJSZmZlpYBAI2gGX4zh2jUZDms1mGpubm7KxsSG1Wk2stbK2tibVajWF" "mB2zAgiCINBaEwQB/sNHWFjAxAnJxB2UUgB0dXUxNjY2YYxhfHx8SmUAl6y1S845WFzEz85R" "OH2c6N0n3MvnRFFET09PrmRjzBVDm9SPVdyTp5gTvcTLK1CpoLWmWCxSr9fx3mOtpVwub0Ny" "bhH83DPMmQESayg8nobubpxz23ClcM6h9V6jcgD5toJ8/UL0+w+FybugDUqp1KCUQimFiKSe" "XCvcq9eY/j5KIxWie/eJH1VTYxAEaK3RWmOM2Q94MDQ0ZN/MA8LW/BLiJMtOu7DbpdwValdH" "e61vTRaHB2m9X+bQ1ENUxxHo7EzLFRGUUnifH0DTuDm6KFHS5zwn/d8m+sZ19PmzqSm7Arns" "AIGE0TmfJKcOXxg20eovirdv7St79/GykVYgie0gsfx8u/S578VsRR07qrIZsoezEhEPOyO8" "o5EwDBe01iWl1L6P0m52zm2VSqVrWcAA29/5QHNGDlj/B13r9mbysZO2AAAAAElFTkSuQmCC") index.append('page_white_flash') catalog['page_white_flash'] = page_white_flash #---------------------------------------------------------------------- page_white_freehand = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkVJ" "REFUOI19k7FrU1EUxn/3vdeYNpKSFFopDaYqKLgUbBsHKQ6Ki4Pi7CQiCi4dHEQdFRSEUjr0" "b7BDodhFHIRSaVEnxXYytNSYFJqX8JKXvtx7j0NKmqbiB990ub97znfuURxqBBgCXP6vErAF" "2O6DS2EY+lEUGa21/MuNRkNmZ2dngCzgdAMmoygyQRBIrVZru1KpSLlclmKxKFprKRQKMjc3" "dwyigEmttYRhKPv7+/K9WpX7+bxc39yQQrkspVJJtNZSr9clCAKZn5+fAbKqAzChtV4zxrBQ" "rTJd/MNu1CTtKH6MjuJETVKp1JGSPc/Led19bDSbPC78xteaXLyXR+k0va6HxBS+72OtRWvN" "4OBgC9INeFUq4jebTCUSLJ89Rw9gjMEohVIKYwyuezioFmB9/SJLS2OLlQrvfR/HWh4MDLAW" "BDSspQe4kkigDiAi0gYoAPXty4IS7mAtiHC5L8HUyQSvd3ZAhKTjUBqfQEQwxgAQi8XwPC/n" "AKim+UzZ/4q1YAy3+vtJOi5nYjGwlgHXRalW3q7r4jiHX8ABsLncW9n8uYy1xIHb6RRPhofb" "gGvJfkTkWPmtDEQcd2XlhljzEGO4N3SK7Ik4L7e3+Li3hwfcPUgcOPI6gKdWVxdFcRPXVRN9" "fTzPZHiW/8Wb7S0QYXokQy6Z7B7WIVCJHUOkJrvFD+/OX5C055EPQ1KOx9PMaV5kR9vpd1pE" "bHsKBxpvNBqfXNeNK6WOLUqnRMQaY+rxePxqJyBDa53/e7lDBij9BVcmMrQyLWX2AAAAAElF" "TkSuQmCC") index.append('page_white_freehand') catalog['page_white_freehand'] = page_white_freehand #---------------------------------------------------------------------- page_white_gear = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAi9J" "REFUOI19kz9LI0EYxn/ZXVaUS2FhIpiDVCIWghzRL3Hch/ADWFidn8BK5BALLcTCzu6IYGVh" "IRcP7AKCoHLRqGvEDbvZf8zMe4WXXIyXe+CFYYb3xzPPzJvjVSWgCNj8Xx7wCzCDB5/iOPaz" "LNNKKflXJUkim5ub34AyYA0CFrIs02EYSqfT6VW73ZaXlxd5fHwUpZTc39/L1tbWO0gOWFBK" "SRzHkqapxHEscRxLEATi+754nidKKYmiSMIwlO3t7S6E3J+qKKVqWuueJWMMIoJSijRNGR8f" "f2PZcZxF4KfTv2lZFrlcrrfWWmPbNq7r4vs+xhiUUhQKhb89/YBuc3dt2za2beM4Dufn55yd" "nTEyMvLGybs0+3V7e8vp6SmdTgfXdRkbGyMIAg4PD9nY2Pj6LoNBwPHxMeVymbu7O4rFIpZl" "cXNzQ6lUolqt8vT09MEZbOpXqVQiSRJarRYnJyeMjo4yOztLFEWkaVpdX1+Phl7h6OiIMAwp" "FApcXl6yurrK8vIyzWaTyclJKpXK57W1NTMU0G63eX5+Jk3TXurdVwqCgEajwdXV1fAMsiyj" "Xq9jjCEMQ66vrzHGMDU1RT6fZ3d397vWeqnnQESkH+C6LvV6HYCHhwfm5uaYmZmh1WphWRb5" "fP5LkiS+BQhgtNaxiLyZsomJCfb29pifn+fi4oJarcb09LTs7OzQbDZ/HBwc6O7P+cjrOA/N" "ZGVlpeZ5Hvv7+4uA5nW0G78B2ClKz+gytQIAAAAASUVORK5CYII=") index.append('page_white_gear') catalog['page_white_gear'] = page_white_gear #---------------------------------------------------------------------- page_white_get = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcdJ" "REFUOI2Nk79uE0EQh7/1WUYIClxgKEhEAbwASqDgBSh5DDqUBkEDNKQCgSwXpuAdkGjTgUQU" "hEKDwFEklIT4T+OzfPbe7c3eUJhz7HOM8pNGmt3VfPrNrMYw0TXgChDwf/WAAyArPty21obO" "OS8ielrEcaz1ev0tcB0oFQHrzjkfRZGORqNpDAYD7ff72u12VUS03W5ro9FYgBhgXUTUWqtJ" "kqi1Vq21OhwONQxD7fV6KiI6Ho81iiJtNps5BPMv1kRk23s/tZRlGaqKiJAkCdVqdc5yuVy+" "A+yUZy9LpRLGmGnuvScIAiqVCmEYkmUZIkKtVjsBzQLy4jwPgmDunAPnnBSnWQTmBcYYjDGo" "6tkBeeFsa0Ut/OcyCMCbb5u83nl5NgezVlWVzS/PEJ8iacrjj49O4Mx842kA8SkvPj0lwHCj" "dhPnU3b3dvm59+vgsNO7tbSF3Hb96yu6/TZxnBCLI5aEc5XzpEl69dKFix+mLaiqmsKkjDFs" "3H0CwIN391m5vIrzjtZ+i9+f/zw82jp+XwIUyLz3VlUXtiyXHcVYmbjotDscbR1/z2cAsMJk" "nZe2dO/52naSpKRxinMpPxqtVeDwL30oGvlpwdX3AAAAAElFTkSuQmCC") index.append('page_white_get') catalog['page_white_get'] = page_white_get #---------------------------------------------------------------------- page_white_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgdJ" "REFUOI19k79rU1EUxz95LxTFIkRLWzQVLTpUEYRqK0gHLTo56F/QWR0FF8FZwUVKwY4duzk4" "OCmFqJSiYsGpg7SRhqZKEvOS+959597jUBOT2PTAgXN/nM899577zbBneWAECDnYysAW4HsX" "Jo0xVWutExHdz+M41vn5+RfAaSDoBUxZa10URdpoNNpeq9W0Uqnozs6OioiWSiVdWFj4D5IB" "pkREjTGaJIkaY9QYo/V6XavVqpbLZRURbTabGkWRLi4utiBk/voVEVl1zrVL8t6jqogISZKQ" "y+W6Ss5ms9PAWrZzMggCMplMO3bOEYYhAwMDVKtVvPeICMPDw/9AnYBWcisOw7Br3AJ2Hdr7" "mr3AMAwJw5Anr2/z6NUNCLo7eCCgBQmCgMSl5IcmuL88g5V4/yt02sPl66gK1gtWhBO5s0yM" "TlOPG9x5eY7BfPZw9EP6A8Rbbl6Yw6nHeYdH2a4VuZi/RmQNlQcrb20sx/sCYrE49Wz+2iD1" "gviU1KX8TupcGpshSpvB6vfCzwMAMeKEkaOnEO9w6inVtjg2OMrn4nsKG4WKFWbbAFXVTEcf" "jSQsfXyO9ZZYLOND57k6fou1zQLr2+vsvuNe4wNfWvsvx3HcSNO0r5gmnx7RuaVZnXp2Ur8V" "vzaASdj7xgBj7Mm5b1vPPGbFER7afePumk8U2ZN28Q8jylaeuHmUQAAAAABJRU5ErkJggg==") index.append('page_white_go') catalog['page_white_go'] = page_white_go #---------------------------------------------------------------------- page_white_h = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgNJ" "REFUOI19kz1vE0EQhp/dvbMFQbhBiRSBhGhoEAUII+gQHx0NBTUdTf4CPQVCQkkkolDQ0FFR" "WbQQBAVlaNIFESu2wBf7fJfc7c5QOD5iO+GVRrur3XlmZnfH8E/ngQXA8X91gG1Apjeu53me" "FEURvPd6nO3v7+vy8vIr4CJgpwHNoihCmqY6HA4r29vb016vp7u7u+q913a7raurqzMQAzS9" "95rnuR4cHGie55rnuQ4GA02SRDudjnrvNcsyTdNU19bWxpAR4MHSylJrM9W3XxLdag8rSJZl" "2u/3tdvtzpQENKMxwZfCr57HWUNWGpxzWGsJIeCco1arkSQJIoL3nvn5+Sr18Xjjzefet8ga" "zsYgoqjAvSunORUrIYTKRIRGo0EURTcnbtJ7xRnYGQS2uiU7g8C7T32cczjniKKIKIqI47jy" "iY4CilIpy8DVxZi5ep2PmxneB4wxWGsxxjCtCYD3gijM1SwqShkUKQ9rNAZVxTmHqlY+9vHK" "9vMXra40n6zfLbzgA6iO6g9BEZXRWrWCTGRQr7lLFli4fO2+iEFEeP99QAhKPTaIMXzYSHh4" "uzGKaCc/YPTnt3/a+jlc/9F6eebZo9d3kMMMAHQ0XzwXH1v/zDOWZfnVnHRySqoqcRzfGuej" "gIQQclWd6bLjnEMIGRCORrvAqJ1nuuwEBaDzFzRiZXyu/dYNAAAAAElFTkSuQmCC") index.append('page_white_h') catalog['page_white_h'] = page_white_h #---------------------------------------------------------------------- page_white_horizontal = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAATJJ" "REFUOI2Vk0FuwjAQRd+Mg8SWTbuq1DtUohfhFki9SlWx4Ey9RlmlG5BCRAB7pgsal4QI6Eje" "fPs/z/fIQreE2+V9wxPwAIQ7zADfwBdgrfDSNE11PB5TjNFvreVy+QE8A9oCpq15v9/7brfz" "uq69rmuvqsrX67WXZemr1cpjjL7dbn2xWGRIASAimSYiebk7IkIIgdFoBICqMpvN3lSV+Xz+" "LsA0xvgJYGaY5WgAxBhJKXE4HJhMJh19PB6/Fv0Xam8OIWBmFEWByGk4m83mNAb3DLsAAIQQ" "cuvuf1NTVdy9o3UAbfa+FkLIADO7Djjf7EPMLENyV0OH+1309fP9C8C1GoIrgLvboOMKyH5z" "KGAppcaHwg8YVRURsZRSBaT2Mz3yzzhAAsrzQPd85bZytz9cVr3eZUgUYgAAAABJRU5ErkJg" "gg==") index.append('page_white_horizontal') catalog['page_white_horizontal'] = page_white_horizontal #---------------------------------------------------------------------- page_white_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjNJ" "REFUOI19k89rE1EQxz+7bxuD4o9QGwtGEAqiKEiVVqoXUcSDh578A8SD2JsXj948FQQpVeIf" "oILVoy1FKoqX4kFFWxpKUWs1NAlm0+xms9v3djzEpjE1HRj48h7zmXkzbywalgEOAIrtrQAs" "A3H7xekgCNwoiozWWv7n9XpdxsbG7gOHAbsdMBhFkfE8T3zfb3qlUpFyuSyrq6uitZZ8Pi/j" "4+NbIBYwqLWWIAgkDEMJgkCCIJBqtSqu60qhUBCttdRqNfE8T7LZ7AYE668PaK1njTHNkuI4" "RkTQWhOGIalU6p+SHcc5A7x3Wg9t28ayrKY2xqCUIpFI4LoucRyjtSadTm+CWgEbwRtaqc2h" "WAhrH7NI8JVq5uJm0vZutgOVUiilCHITJJO/6D13jbA4xd2r6aEtPegEqsxPYMovSZ28hL+y" "hK7G/F78VF+c/Xzd6RTUamHxA939VzC1OZL7M9TNCpnz/cnYLz/oCBCRplY7D7Je/oatSli2" "T2JPCeo1vHyotq0gLM6zNvcIO7FOrOvYsQv2bmQ9Yu5xLvqSq9zoCPCXJqkuPKf71FkkmsYy" "VRamQ7rCEGVZPHuXvzM6U3zSBIiIWC1zrC1P0TN4gaj0EMfZS+6tIXlshL6BywjEo7f2vQbE" "AQSIjTGBUippWZYNYHc5WOonakcPCzM1dp0YoW9oGBGJjTE1wEBjhACHaKxz8188vX385tEj" "vcNeyQ9fvPk+dm8y/6rlhYbGav/4A1UePWPpcJMYAAAAAElFTkSuQmCC") index.append('page_white_key') catalog['page_white_key'] = page_white_key #---------------------------------------------------------------------- page_white_lightning = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk5J" "REFUOI19k89LVFEUxz/vvfveG0eH0dEmTc0JFE0IsZoCF2bQxjZRLgpauHDhqty2Kqh1WAyz" "bNEu+gciXISbSGghUSAFEYa/JmVmcsb3fHPfvS3K+WHZFw53cc/3cw/3nGNQUw9wHLD4v3LA" "KqAOX5zzPK8QBEEopdT/Ct/3dSaTeQqkAPMw4EIQBGGpVNLlcrkaxWJR5/N5vbW1paWUemNj" "Q2ez2SpE/DEbmUdD6dKXGVNJiQ4VKlQQKsJKAESxTt0H2onH40xPT98VQjA7OztvALx5cEnE" "znovBs+MT1n2MXRFoiuSMPDw8iuIrtvo1nHa2tobShZCXBQAQ5OqF+VM2k19yOJ7zMgoYbiD" "X/iM230Lp/MqUkoKhQJKKaSUJJNJAEz9cdgxYSbaPhIFC+VtouQ+xe8LuCdu0HJyCsuyEELg" "OA62beO6bq2Kzd3EqKHkrBsbQEsPrC6oVNBKUNldpfDpCSrw0GYL0b5riEgSrXUNYIQqE+lI" "d3g7KyipcKL9oATxzst42x8IKwE/15fpSD/EbkqgzcYxMVUoX5bX3j5eXlp8jjNA/utr5H6Z" "il8g2NuGphSp6wu0nr6JaUexLAvTrI2AUXemA7+4tPZqArc5hb+bo3X4DrH+KYBq2Uqpgw7U" "unCgH+/mEE4C7XTTM/kMw441mIGG1wGqgPm5rrGg+I3EyD2ae65UE7TWGIbBUaoCVteDXHIs" "q922wYbso8xaa1X/BwDnfd9ftCwrYhjGX4ty2ByG4V4kEpmoB/Tye53/a65TCOR+ARh3Gy8A" "hJ43AAAAAElFTkSuQmCC") index.append('page_white_lightning') catalog['page_white_lightning'] = page_white_lightning #---------------------------------------------------------------------- page_white_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkpJ" "REFUOI2Nk0FLG0EUx3+TXUzAS/ZiArZYoeApCNa2IHoU9JCDFCFgv0LzMQoGL0U8ePToxZMe" "KniIYCT0JIQePBbNJqkhCdnN7mZn83qwSU0spX/4w5sZ3o/35s0oHvUCSAEG/1YD+AEMJg/e" "eJ7X7vf7kdZa/mbf92V/f/8L8AqITQLe9fv9yHEccV135E6nI61WS+r1umitxbZtOTg4eAZR" "wDuttXieJ0EQiOd54nmedLtdabfb0mg0RGstvV5PHMeRw8PDIQT122+11uUoikYlDQYDRASt" "NUEQYFnWWMmmab4HvplPN2OxGEqpURxFEYZhMDU1RbvdZjAYoLVmZmbmD+gpYJg8jA3DGFsP" "gWOVTN7mJHCYoJRCKYWI/D9gmPi0tUk9A/i+z9XVFZVKBcuyaDabbG1tkUwmOTo6wrIsWq0W" "29vbHxuNxvcxQBiGHB8f4zgOOzs7uK7L3d0dZ2dnJBIJstkshmFg2zamaX46Pz/3x8Z4eXnJ" "xcUFH3I5vp6eUiqVSKfTZDIZbNvm4eGBWq3GysoKa2trnJycdMae5M3NDdPT0wDk83nCMCSX" "y7G6usrm5iYbGxuEYUg+nwcgmUzGRy2IiKTTaVUulwHY29sjiiJ2d3dHUNd1EREKhYKsr6+r" "+/t73wQEGERR5C0tLSWKxWKsVCyyuLhIJpOhXq9ze3tLPB5nbm6OVCoFwPX1dbdardaGs3nJ" "43c25+fnXy8sLBRmZ2eT8XjcUEqpSqXy2fO8n8vLywXADIIgqlarzV6vl/0F2sJFKvxSsVQA" "AAAASUVORK5CYII=") index.append('page_white_link') catalog['page_white_link'] = page_white_link #---------------------------------------------------------------------- page_white_magnify = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeRJ" "REFUOI2Nk8FqFEEQhr/emd1sFmJYghskEaIXDyoiavQgXsxNfAMfQzx69iohhzyAr6BeRRBU" "vEmiSA4quMmEZGczs9Mzs9VdHuJks1FXC36o7qY+/qruNhzGIjAPBEyOCPgG+JMH16y1cVmW" "TkT0T8rzXFdXV58CS0DtJGC5LEuXpqkOBoMj9ft97fV6urOzoyKi3W5X19bWfoMYYFlE1Fqr" "RVGotVattZokicZxrFEUqYholmWapqmur69XEMwv3RCRt865I0vee1QVEaEoCtrt9pjlMAxv" "Au/D45u1Wg1jzFHunCMIAhqNBnEc471HROh0OiPQcUBVXOVBEIytK+CYk5PTHAfC2y8Ru0lO" "WkwxVQ+ZnfasXGr+H+DNxg+SYZMr5+YI6wFRv6SXFLze2Bu1PQmwndY5P9+iVxi6Bw4xAQud" "GXaT0Tv6K0BVSW1Jo1FHnMd7JS89pYDoyPjEFlpTdcqhY+hAvB6CDWSDwb8dGGM4M1sjsY6Z" "6ZBWM+RUq053f4jufebJg6v3xhyoqprj9whcXmqztZ2x9T3FKyRZwXB7k9unIw6WLz58Nltu" "VgXX8zx/FQRB0xgzcbBfP7zU/Y8vmFu8YD69e55VgLMcfueJxVU8ur9wd+XOrceoa/4EuYQV" "tUlDNa8AAAAASUVORK5CYII=") index.append('page_white_magnify') catalog['page_white_magnify'] = page_white_magnify #---------------------------------------------------------------------- page_white_medal = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlVJ" "REFUOI19k71rFFEUxX/vvdnNZCQZk41JChWxCSp+QAJRsBARBCsbOyFFkKiBgIWKrYWIjWgK" "tfIfkNRaGBA0IKSwjphigyIbmd0N2Z3dmffetYiOqwQPnOZezrn3XLiKP9gPjAGG/6MGVAH/" "b2MyTdNGlmXOWiu7sdPpyOLi4hPgEKAB1Nk7r+3B0dB0jeCtwzvBWk+kDOvVhOVHF/Hek2UZ" "lUqFzc1NlpaWns7Pzz8GqkHY38fk8XHWkjZZZrG5w1vPRKWftS81tNaICEopAOI4ZmZmZiEI" "Aubm5h5r55xtNFMOD5TopjndjmViuJ96IwXvMMagtS4MyuUyYRgyOzu7AIxqn9vbyx+/Zkk9" "5Ugl4uhIRFJv8fbDOreunEJrjTGGcrlMo9EgSRJqtVpxOCWrh+OVjYlXR4Y2Luwx23gn1NMy" "3+QiJ8/fBzOAc+4veu+J45ggCKZV/n7/Q8au3lXDl/C+i9gmPm9iv79BgkNEJx4gIoXQOYeI" "EEURQRBMa5e3bqiRy7i8gUuruNYXXLqOHp5ia/X5zppKFVGMMQRBUEQIvLODIiBuG1wbcW0k" "b4AydOtbf7IqhYhgjEFEirr21iOSIS7dEfs24lrgOuRdEJGCv016oW2WbUm+BT7/ZZKCOMRu" "k+eDAH9P1BqtdY/Bdv4s/fwSpUvovn3ocBxl9vLj0wrRsevF+v+yiJa8IG42uddOuCkZA3kG" "1g8Rn77Gwct3CaJ4148SEV8qlc6ontpUp9N5Z4wJlVJ6V1WP2DnXDsPwXK/BAXbe+b/iHjig" "9hMR8liZCo21OQAAAABJRU5ErkJggg==") index.append('page_white_medal') catalog['page_white_medal'] = page_white_medal #---------------------------------------------------------------------- page_white_office = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsFJ" "REFUOI19k01oXFUYhp/zczN3fpJpM820trZWW6rWgkjV+gd1VxCEKuimYKhVCo0IulG66UIE" "F/5QU5FYQXeCi8FsXAgiYhZKkbQL7a6psa11Jk1mJpN779x77vlchPwV6Qtn836ch+/73nMU" "a7ob2AoY7qwmMAv42wsH4zhup2maO+fk/06SJDI+Pn4W2A1oAPX70Zf+Mu2r24e3WROOGBXk" "c+TFEQqnG+iwhHMO7z1pmlKr1Wi1WjQajU/HxsY+AWZ1dnl6V3Xf4PR3Oni3eOos6vXzFIY8" "fqmD1hqtNUoplFIAVKtVRkdH35yYmHgL2KX+OPyADD23/+TOdxoXnXO/5XlO3jiGO/wh5y7E" "dFzOzX973DNc4PTRh7BWr85srT1ka3cFLLbn2iumxsOAIjeGfzoprz6zg1DnnPvhKjduzlEp" "WZxz1Ov1ZUhYzIhVaXYFoExAdGsLxfJmtlTa7N1aJjCKwkBApRISGIUxa0HZNCxK3c1PLX10" "RNIvX8QN3Ifdcy94x1IK703+Sd9rMm8IrMUahYisZSc/nbHXpo7cf+qVPS8nvb/FpZGkcUuc" "c9KL5iWKuhLFC9Jqz8hSvChRFEkUReKcE+BxFTc/fo2Z8fOd/oFYBUFR6RJ4Yejhz/nmwtuk" "eYLS4HyfK81F3n9hEhHBWou19pAmKpNlFSZ/2f5B7bFvGT74NTYcRFtLP19kx+YHOf70VzxS" "P0G/6ze2D1jvA5NlMHPtenPFLAQ3cP0Ozmf08pio3yVyCyTdFK31RsDCfDcJnOL5pwbfuH7p" "M0olT7l3BQQ2BU/w6+Ufmb50gjhOISqsPqjV1C42zuzbVvl+SvJsxBjQWjBD+yke+AJtC8x3" "5xARnHOUimWqlU3LyxfxQRA8uR73aJIkPxtjQqXUxj5vk4j4PM+jMAyfXQ/YyfJ3vuPldcqB" "5n9+pVBplGVs7QAAAABJRU5ErkJggg==") index.append('page_white_office') catalog['page_white_office'] = page_white_office #---------------------------------------------------------------------- page_white_paint = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAl1J" "REFUOI19k01IVFEcxX/v3pkJPyd1TPyYsMAPLEHKhAiKNtE2kIgWCW2FdoGroIg2QWG2y2gb" "QURYhESELULCikwypTLH/Bwbn844b96d9+5tIX6bB+7qzzn38P+fYwFVQBkg2R1zQAzQWwdH" "HcexlVK+53lmp5fJZExXV1cnUA2IjeQAIKWUBUopYVnW2sDzPLTWKKUoKSmhtbX1ihCC9vb2" "u6/uRNxI2YGHyb+xkQCAEEJIKRFC4PmarAEpBMYYVkXD4TBtbW1X8mQ8P1qTOhatbWoceHrt" "VGD1RyEEcxlN3DF4WlOVJ8gX6wKhUAi1PM3p5vDlfdVHGHl7m6X5VPcmgaWsIe0bjIaZtKGu" "UBIKhbBtG5WexZnsoaq+kcTPx4wPjj7IysjVtYVYlkWOhHTWJ+1pDBZSSgKBAGTjZKZfUFl3" "CDv2hL5nfR/nUsGO89e/qTUHANoYHNdDG0NlZA9SCtxUjGTsJRU1DaRmnjP8foxHPYlbvYOp" "Bbae5Lft4rgeaE3QXWD06xtmPt2kovYgbqKXL68HaDjbSe9g6s/GMwLwy1ZM2Rk8T7PXTPF5" "7AdK2QQTS1jefRYXFNUnblAcbdwUojUHSdfDySgW5ycZ+j4O4ShNzS0U1V9keDSf3PJLVB4+" "szWE6w72F4Z4Z8dJz89SEKmhf8Kluy9JeU4uHRfuURSp2EbeJFCUEyA2NIhngkxMZVhOKUrD" "pZw7WUdxaeWOZAALaMlms/3WxhzvAmOMDgaDx4EPqzvQvu87xphtLduJ7Pt+GvA3OoiyUmfx" "P+IW+KxUewLgHxydIjSkg5NZAAAAAElFTkSuQmCC") index.append('page_white_paint') catalog['page_white_paint'] = page_white_paint #---------------------------------------------------------------------- page_white_paintbrush = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAilJ" "REFUOI19k01IVFEUx3/vXmcgMwZ1TPwYsMgPLEHKhAiKNtE2cBEtGghaCe4CVy0k2gSJGW0y" "2koQFRYxVISLRMICJ0gdEnEstbLx6Tzn485777YYZpoP9Q+Xuzjn/M//nD/HAJqBekCyP34D" "UcAtDZxKJpOmUsqxbVvv9lKplB4dHR0BWgBRWFwBSCnlIaWUMAwjH7BtG9d1UUpRW1tLX1/f" "gBCC/v7+4Tf3/Gl//ZHH8b/RhQoAIYSQUiKEwHWzCoUQaK3Jkfp8PoLB4MBB+acq0GqdDrR1" "d808u3W+ItdRCJH/XddFSllE4PV6UTtrXOjxXT/ccpKFD3fZ3rDGighyyUIIHMdBSonX68U0" "TVTiF8mfEzR3dBFbHGc5HHmUkf6beYLC+Q3DQMr/pmQSq6TWXtHUfhwz+pTJ55Of4wnP4I3h" "bypPUIocSdqKEo++prG1E2v9JXNTSzyZiN0Jha1NSi0pxJa5QeTre9a/3Kax7SjpWIjZtzN0" "XhohFLZ+FNpYhpXlCIvzYZQy8cS2MewHbG0qWs4OURPoKsotU7CwHOXF1Dz4AnT39FLdcZW5" "SBWVDddoOnGxrFmRgqXVNT7OfkfWHGN6Jc3YZJyGA5UMXrlPtb9x11GLCB6Ov8PWHjJ6mx1L" "Ueer4/K5dmrqmvZaFQbQm8lkpo1CH/eB1tr1eDxngE+Q3YHrOE5Sa112ZbsVO46TAJxCBQGy" "57ynpSVwyJ72CsA/lHPveKG0pUAAAAAASUVORK5CYII=") index.append('page_white_paintbrush') catalog['page_white_paintbrush'] = page_white_paintbrush #---------------------------------------------------------------------- page_white_paste = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgNJ" "REFUOI19kj9oVEEQh7+593jRxJPwCPEfiYKdIIigXSprDQQrK+VIcUJSS5qktAvYiATSCIKF" "sRALC0WwUhBsbJUkICQXIaceetnZGYt37+VyQX+w7LK78838Zlfo6eGdyQtSq31mQO7ebq6u" "jw7ul5JHtycvW02WROT6sfwEtxYW6ex8AGBk7CqPF+/xu/MDd544tnZ3deNZPyD1RNauTc9M" "DtfrhC+fcHdit1NmZ+riBLVT53G3m6+ev7gBHASAnB2uH2fv5zZqyteny+AOODv+EXMnbG1y" "ZOxM5iIZIID3AQCLuCq10ZNYVNyNbzsdvrf/4IBt7SKbynqrC3AF2AY2AEsB3AxTxUIXC11w" "p9XaZXrhJUmaVeXOAEuq71dWVh7Mzc0tAxs9gGIx4G4978VI0owQAqqKqhJCIM9zGo3GfJqm" "NJvN5VoBiJgGXAMWIxYNtwImIiRJQpIkiAgAWZYxOzs7D4ynJQANeDRcDTPHtAAkSVLNQ0ND" "tNttYozkeb7fRLciq6lhGnFzPMYDFZRrEUFV+5+x18QQcTVcI2ZgWr1UBSktlHMFKLIXAOtZ" "KCvohwyC9v9BdCxYrwelBWNQZWBpqQC4vwt7e1MjpyeKQDPc4GhoVZfc/RCkArhw/+3rN3UR" "LlUBwHqry8w/ggBU9RcQD5/s6xww/p/zCGz/BQksMILgNALhAAAAAElFTkSuQmCC") index.append('page_white_paste') catalog['page_white_paste'] = page_white_paste #---------------------------------------------------------------------- page_white_php = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiBJ" "REFUOI19k89LVFEUxz/3zXvooCYk80TNaaR26iL8VRQpWORCadPU39DCbS2EQnfqJhEpNzK7" "thGtJNy4kJYV4SrmUZDMwMMR582bed43p8Xk/DS/cLjccw5fvvd8z1XUcA3oBSJcjizwCyg3" "F8Z8388FQRBqreWiKBaLsrm5uQEkAKOZYDIIgjCfz4vnedU4OTmR4+NjyWQyorWWo6Mj2dra" "aiFRwKTWWnzfl1KpJL7vi+/7cnp6KrlcTrLZrGitpVAoSD6fl+3t7Q0goQCSyWRkb+/rzNt3" "7z/v7//EsiKkHReAgYFu7ty+zr27cfr7YyilqpJN05xSc3MbbW3R9kXDUOvnhZXleV69/tQy" "veSTUWamh4Aytm1jmuaUGY1Gn2Ow/vLFQzo62nDSLnask5XleZy0S8zurOZ3UgeYkQizszeq" "pAaKZQDb7mJ1bZeY3UlYFlbXdhke6WvIjwz38eHjDyzLqj0DJV2g8LwAzwsAKHilhnv9WSye" "YZpmTYEIKYChRE9FtuNyeJgBwEm7Dfm04zJ9/yaGUVsBUwlLIFfTjvu4eXA7qQMSQz3VgY6P" "x3n29FZDjwJYWHjTm8v9Xnw092Dp2/c/nJ2F1QbLijA62s/EeJyxsUG6r7RXpBtGxcY6ogmt" "9Zdm60SkxU4ApVTFxqZmUfWb8q/xIohIGWq7LEA5DEP/vHAZRKQchmEBCOvpB6l855Zf9h+E" "QPYvSxEa0surVlQAAAAASUVORK5CYII=") index.append('page_white_php') catalog['page_white_php'] = page_white_php #---------------------------------------------------------------------- page_white_picture = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAh9J" "REFUOI19k79PU1EUxz/nvddXpVBiTUpQQRaNYdFoJKKT4T9wMcbNhcHZgdGEOGkMEFadSHR0" "czaamLCoYXAFDdii9Afta3vvu/c4ENpKwW/yzR3uOd/v+SbnCD1cAMaAkP+jDGwB/ujHjVar" "VTXGuDRN9Ti2221dWVlZAqaA4KjAjDHGNRoNbTabXdZqNa1UKloqlTRNU93Z2dHV1dWuiCws" "v3+Rzw09/NPwudxQPNyxjmzUl0I80xMj3L0+TqFQwBiD9561tbXl+fn5lzx79aFUKpd9o9nS" "4/hrr66Lrz/p7u7uQCRgJqonks3lRuT7dp2Pm08Yzf8mMZat8llun1vk1pXzCCFxHFOtVvHe" "k6YpxWIRgEhE8ymQes/wcJnTmQKeDj7epFRJ8OoxaUoURYgIzjnCsBcxUpW6KqP7iaHSbuO0" "ScN22EvaVOiACnEmJAxDRAQRQVV7AgCqsN/2bG5fwmc3aNiEauUil8ey3cIgCBCRgaUIEM17" "D9WW4+rYAo9qRea+BMxNPSeKIhQw1nebwzAkCHorEKGKoHz7+RhrLevGYMYzmI37WGt5cGcd" "VVBVRATv/13AKMD/UGcmn957x0EypS8i1lpOZXqO/e4AUZJ03i69+TqbKtdyQ/GwMY44DuFQ" "RDzTk2eOzQ8gfe9Na+1nOanyCFTVZzKZ2cN5FPDOuZaqDlzZcc3OuQRw/W4THJzzwJWdAAeU" "/wK1OFRVz0OZBwAAAABJRU5ErkJggg==") index.append('page_white_picture') catalog['page_white_picture'] = page_white_picture #---------------------------------------------------------------------- page_white_powerpoint = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdtJ" "REFUOI2Fk79rVEEQxz+7770LGMXkkCgkGhttLMWApa3Yi6ksxENLi4AWtv4AFXNcIbY5/5a0" "aWwUFJuQOyEXuZe7tzu7Y/G8l3jvogPDLOzOZ76zzBiObAU4DyT823rADyBOX1wfjUYD51wQ" "EZ3l4/FY2+32e+AyYKcBa865MBwONc/zyg8ODnR/f1/39vZURHR3d1c7nU4FMcO3LQXQGCEo" "GgIqf9yXES/Isw80m02cc8QY6Xa7m61W6x3DNw/1f/bz0R3t9/u1loC1VKX8i5gPyT+9Aizh" "+1fs6jVO332MPbuAFp5Go8FgMCDGiIiwtLQEgFUvAORbLzh1+wHz6xvE/BC/s82vjy9LeOFJ" "05RGo0GWZczNzVUfl04AGsAsnMPOz6Njj0rAf94p7wpPkiQYYzDGoKpHgOhKQPj2hcHGOlEE" "nBBF0GgqgLUWY0xtKKwWvjwsXyUWDi080Xl07EkvLJctOKmSkyTBWlsHnLn/hOTSFVQiKpF0" "ZZXFp69LBV5Q1Zr8soWJgoUmi883axIngKqi/XsAUy08vXu3yir+aIiQgIZY+az+AcyxeMN7" "v21OejmtSjVmWXZzokeBGEIYqWpty2YlhxAOgXC82kXKda5t2QkWgN5vBGBoABFhyyMAAAAA" "SUVORK5CYII=") index.append('page_white_powerpoint') catalog['page_white_powerpoint'] = page_white_powerpoint #---------------------------------------------------------------------- page_white_put = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAb1J" "REFUOI2Nk71uU0EQhc96LeMgRcgSdppECqIIBVDwY8ooPABKlReIFImGApKHSAeyrMgNDSUN" "rwAdoFQgkTopbN/G1/L67t/sHQpnL/ZN5HCkkWZ3NZ9mjnYEZloHsAZAYrkSAOcA8vLDU611" "6pwLRMTXhTGGO53OBwCbACplQNs5F5RSPJ1OixiPxzwajXg4HDIRcb/f5263ewUiALSJiLXW" "bK1lrTVrrXkymXCappwkCRMRZ1nGSinu9XoRAnEZz4noewihaCnPczAziAjWWjQajYWWq9Xq" "CwA/q/OXlUoFQogiDyFASolarYY0TZHnOYgIrVbrH2geEItjLqVcOEfgQidlN8vAWCCEgBAC" "zPz/gFg4P1pZNwIi5O23A3hHcM7DG1+8XfkQUcy8ENZ4bG/uYOf+S+jM3gyYBwGA1RaWLDQZ" "1EUdW7v3Hi4dIRr2/scx/vR/o7nSgiEHFxyajTU0H989WX1wZ6/ogMv2XkLetI9wG6swxsJ6" "A+sNBskASulBdsu9itY+M8Z8lVLWhRDXjvX60z40Z3DOgxXyz4df2gBOI2ADs3Ve6smTd48+" "+szTr5OzfcxW++IvVvoQ3RrM2gEAAAAASUVORK5CYII=") index.append('page_white_put') catalog['page_white_put'] = page_white_put #---------------------------------------------------------------------- page_white_ruby = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjZJ" "REFUOI2Fk81LlFEUxn/3/ZgZZ5SZCgypwQ/URlACBfsngqIQCvcWRJuIaFGkSwlSkVnYImgV" "FC1r26JtmGSh61AHR8IZ5p33877vaRE65gz1wLO55zzPfQ73XEULF4HzgMm/UQV+AsnpwpTn" "ebUwDGOttXSi7/uyurq6AgwAxmmD6TAMY8dxpNlsHrNer8vh4aHs7++L1loqlYqUy+U2EwVM" "a63F8zwJgkA8zxPP86TRaEitVpNqtSpaa3FdVxzHkbW1tRVgQAHoRw+e1oPweuFSaTLRGtEa" "Ik0SRkgYkQQhcRBgT05iz94+jmxZ1hVLHj98JoND82cuFCGVwrRtcF28nV18xyGVjolsHwew" "Pnwk5XqE167S29sLgJFAiVod1XRRI6Oo0hgqCIm3toh2dmBvD79SoZHNECQJxpd10ul0K4WR" "zs3q3d1fRsO5Z/T3w9QUJAlqexulFHE+j1sqkdv4TqEnjzn/BLHtloFaWEiA+z9mbp4b9YNb" "Vj4PfX2Ytk1XNks4Po69/o1C4SyZ5efEqZaYk89w+d375WRwiGjtJZgmdrGINTFB+HWTQiZL" "19IidGUwTRPDMNoNNIh5Z454eAT/1WvMsTH8jU26e/J0lZcgl0MphYh0TnAE++4cMjyM++kz" "VneezItFyOVaAsP4K0HbIh3RffNWooMDiaKoI7XWAkxbJ11ERJRSCiA1c6PtllO9yckRBEji" "OPaOCv8Tx3HsArE6cV7kz3duH7AzYqD6G5cqTrXugETlAAAAAElFTkSuQmCC") index.append('page_white_ruby') catalog['page_white_ruby'] = page_white_ruby #---------------------------------------------------------------------- page_white_stack = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAT9J" "REFUOI2Vk71qQkEQRs/+oKVgoV0wbRqrmAcSQRtfJQQbq5QGn0MQUuYJTNJILAQhoNcZsyl0" "5aqr4sCwA7P7zdmPXQPcAVXAcBoz4Bv4S/T28ZhlWaaqIaaIhOVyGXq93gtwD7hzhw3QUNV3" "EWEymTCdThERSqUSIsJgMBj2+/034OMcTUNVw2q1CqPRKKzX63ALjY+FtXa/pmjq9Xq33W5X" "UzSNOGk8HodLNLG3o6kB1udxjDFJGlVFVRERyuUyzWaz672n0+k826SzxuCcO6idc/sBhUKB" "VqvVBSpJgTyNcw5rLc45isUii8WC+Xx+aiJACOEqjTEGVU0LxKnnRGI/v88DM+/9E9tH9aCq" "rymaOD0vFAU+gS+O/kKKJu/L8RXCLn+u0RwLH3hwC42q/gKbtGvbqAGVC/0NMPsH8sHZ7dTF" "f98AAAAASUVORK5CYII=") index.append('page_white_stack') catalog['page_white_stack'] = page_white_stack #---------------------------------------------------------------------- page_white_star = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAfNJ" "REFUOI19k79rVEEQxz+z+/ISjRIDGgMqxMaoiEEkCVj7F/gHWFrYibWVYKshXJFSGwuxsbYT" "hHSWh+kCkrsrzHvcu9t773Z3LI68+5GYL0yzs9/Pzgyzwlg3geuA5Xx1gEMgziYeO+eyqqqC" "917PisFgoLu7uzvAGmBmAVtVVYWiKLTX69WR57keHx9ru91W770eHR1po9E4BRFgy3uvzjkt" "y1Kdc+qc0263q1mWaafTUe+99vt9LYpC9/b2doA1mQBsDvNf+yEMkcWHAMQYUVW895RlyfLy" "8lTJSZJsJ5MHvvUJQo/kTgMAYwwhBKy1pGlKlmXEGPHes7KyMoLo4asLRd7ZPjhoPZdYgO/i" "D99jlp5gLm9g7Xz9gIjUwLqKsp9/SOeWXtx/sIpJV9HUEbOfVH8+Y688Ze7eu9ogIogIqloD" "zPx692WsWt9GYxiFGou5tMHc3be10RiDtRZrLUky7tyIfAluOHyj/SYaHXhHzJskt1+DjEsV" "Gc3bWosx4xVIANIwuIFZwLe/En2JmIvooIUurtcXVRURIcbpBRyhYnmt2fz9cf7RdxY2f2Cv" "PkOrv1Pm2mDMVAVTe+C932dGk+ZJicjpPVBVlZNmZ3o/AxzHLYACMYTgThLnSVVjCKEPhEn8" "LUbf+dQv+48C0PkHjsEg5EFpO/wAAAAASUVORK5CYII=") index.append('page_white_star') catalog['page_white_star'] = page_white_star #---------------------------------------------------------------------- page_white_swoosh = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgxJ" "REFUOI19kz1rVFEQhp8558asJhISgyaQgKiVYCVqkdLC0s5GRLAJNiKKP8DKTggh/8LCzkZI" "G0EsUomgiIJho7Am2WTv3nvmvBY32XxofGEYOMM8M2eYMfY1A5wDIv/XOvANyEcDV3u93u+q" "qjylpH9ZWZZaXFxcAM4D4SjgelVV3u12tb29PbCNjQ11Oh21222llLS2tqalpaUBpNhNNoAQ" "QogxEkIg50ydYTNFymSQIq0aWqNj3L13/1EoCns4P//SDgCupZTe7VTO167xecvo1WKkECPB" "adFneuI0pyK0ChgKMDpc3CgO/uH9T/jwq6DO4kSAVoTgEDBCGGK9s8XJ4BRKTJ+dBGAAePz6" "05PlH4YQAVEHSBmyoEGARTACrRjpJe0Dnq9UzyrpdpmEaALRRIpGyuAyJoeNoRjpJcgENqum" "cPFiVePdnfS0nxQ8igYsosGVCbg0ZlweN3IGSbiLrRrK3c6LzZ10MyXG6wwJcIksuHPRmJva" "mzGYGZKIMTIWxJmiiRV1sgv9nK1yUBYpi1uzgbmpJmFPkjAzcj68gEVP2SpXqLPkagY3M3J4" "ww6CQji8gKFfQ9+hdKzx4s33PGh7zx+1AaB2OlWSlS56LsokVtqZhVU/Nnl3HhkgbOFvSxdV" "wkoXpUPfxasvzoPlmo8dcVSSsrvvAG4H3mdpzvmvKztGDqz/AV0fPqnIn7O3AAAAAElFTkSu" "QmCC") index.append('page_white_swoosh') catalog['page_white_swoosh'] = page_white_swoosh #---------------------------------------------------------------------- page_white_text = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXBJ" "REFUOI19kz2OGkEQRl/PcgaceIUjyAiwWCcknIJzWYiAEyGLjJCMdYAgYRADDT1VXQ7YGTPD" "7pT0Sf1X76tudTnu8R34BrzQHHvgHYj1jZ/e+zSEoCJin+l6vdp0Ov0N/ACSOuAthKBZltn5" "fC51PB7tcDjYbrczEbHtdmuz2ewJ4oA3ETHvvd1uN/Pem/feTqeTpWlq+/3eRMQul4tlWWbz" "+byA4D40FJE/qspisSCEQAiBPM9LTSaTSsmtVusXsGw9LiZJwmg0AsDMUFVUFREhTVNijIgI" "7Xb7P+gR4JxjuVyS5zkiQggBESlBMUbG43G1kvprDofDyryoJMaIqmJmzYDVaoWIVJyLxBhj" "ecUvAf1+v75UJhfjRsB6vS4fLsZYlg4QY2QwGDQDut1uxanuWI8nwGazKZ0LPUJ6vd7nADMz" "55zrdDqNjh9ni2ayBDAgqqp/2GhMVtULoHD/xgCv3Nv5qcu+COXe2n//AdgJRGOle6PNAAAA" "AElFTkSuQmCC") index.append('page_white_text') catalog['page_white_text'] = page_white_text #---------------------------------------------------------------------- page_white_text_width = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAT5J" "REFUOI3FkT1uAjEQRt/+oFSpkEiTggoJ2kgJ9+AAnIAcI22EKDhTLoBEm3KrLSzM2mNPCvBm" "ISgkaTLSyJ6R55unz/DfkV2pL4WeD9wDd0Dxw6UV8A7E1Hiw1tbOuSAi+l3u93tdrVZLYAjk" "ACVQFEVx673PQwioKr1eD9UDqYgQY8Q5R7/fZzabPQMsFovXIwmPSd1aq9ZabZqmvRtjtK5r" "rapKRUR3u50aY3S9Xi+BYXYUeAshsN1u8d6T5/nBLVVUlRACzjmm0+mJGWVZPpWpyPOcyWRy" "avdxOGVd18QYEREGgwHJg8N3ZBmbzeaL5Ukkxtieo9Hok6L7+JygK5IEktEXBS4RpIgxtkLj" "8fh3BImim38iSELdRVcJutsu1dl8Pn8xxtyICCJCCAERwXvf1s659kx9EQFoPgCV7SPjUQwT" "DgAAAABJRU5ErkJggg==") index.append('page_white_text_width') catalog['page_white_text_width'] = page_white_text_width #---------------------------------------------------------------------- page_white_tux = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmFJ" "REFUOI19U01IVFEYPffemedrQgUHRxcZhiFOEKnJVLqpkJrCjds2EdYqCWYx2NaFuyBkmMRd" "y0BaFIYtc1GCEFgiE4bMKMFjBmze6HRn3uu++7WYfDP+4IFv9XEOh/Odj6GOcwA6AAicjgKA" "HQD66OJqpVKxXdf1lFJ00lSrVUqlUrMAugHwowIxx3G8xcVFisfjNDMzQ8VikUqlEhWLRcrn" "86SUIsuyKJ1OHxNhAGK7u7+pf+AaXb9xi/oHBml1dZX29/fJtm0qFAqklCIpJZXLZZqfn58F" "0H3IBpHGk4dXMP38PKI9ndBaQwgBzjkYYwAAwzBgmiYmJiaeAYgEGgU4FMZHNhEIaLwTZRAx" "cM4hhIBhGLBtG1prKKUQiUT+cxqwvrGJ9yv3sctfYvDOJJaWPvgCgUAAhmEgGAyiqanJ5/gO" "hoaGere3c3j8NAnBAbOlDWNjYwgGg5iamqoFxRgYYyCiw/EnEokzsVjseyaToQMopSiZTFIo" "FKJsNkuu65LjOCSlJCklKaUIQIwDwNZW7nY0eulyX1+fry6EwOjoKDjnsCzLD/Eg1HpuANpb" "vVA2m8VfpaB1vWBr39ahPI1IpANEdKJ9bi1PXph+oB4J9we+rHyFELUm76wvYOHNa7S3tSAc" "bq0TOD/soLSz9oKXcvfGh5vxczMDWXEg/5SQ+zyHu715pCfDoF+v/AAPxr9CWfR8ZNIeHrlo" "nn278ak5PbcHt7KHbs9BfLgLnW0G8hZDS7ROqpWONFCrsH/JarW6LIQwGWPHHuUo2fM8aZrm" "zUaBLtTe+VRyAzwAhX/9sDRYdchmQwAAAABJRU5ErkJggg==") index.append('page_white_tux') catalog['page_white_tux'] = page_white_tux #---------------------------------------------------------------------- page_white_vector = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAktJ" "REFUOI19k79rU1EYhp/v3JvUJrZpjCZEW0gHUQcFEVsVoZMgCEUxk/9CwQ72bxB00VKXbMWl" "iKOdLO3QQVHBQXSrIEWhhFb7I96b3HvO/Rza0DRWX3inw3k45/2+V9jXIFACPP6vOrAKJN0H" "l8Iw3IyiyFlr9TA3m02dmZmZBiqAAfA7AJ7neX1RFBkRAWB9fZ2VlRUKhQLlcplCoUC1Wr1v" "jGFiYuLJ3ksAEGDEWqthGGqr1dIgCHRubk53dnZ0eXlZ6/W6Wms1CAJtNBpaq9WmgYp0AC5b" "a98551BVFhcX2fi1RfHEcQZPnaRUKpHP5w/82ff9UZ8uiQhLS0ts/Y44f/02/b1CrifBOcvG" "z02EBGstxWKR7gxQVSYnJ3GZMlfvTPHxh+B7StpAMetRyQu5Hkfa7A+qEyALCwtcGLtLeuga" "5QFD7ohQKRiSRGk0HVstwSZCvlfRLoAAo41Gg/7hW2xHwrmSodhnSHmgKuQz4Jwhto7YgXV7" "gNnZ2Wocx0+DIEjGx8d5/kHxUPIZIeW1c4GUJ3iipHyPJFE8A/i+GBF5JCI3s9ms8X0fp2AM" "ZNKCqh6wiIAqRnahAMYY8zidTr9YW1ubBzjaA9ut9nT3w23LGIMxBgGwVlFVqdVqOd/3r1hr" "9fP3SB++DjVo7a5vHMeH2lqrwIgvIgpsA4mq6umiEffF8nbFMXbGo73W3VLVBPYKASiQOOdC" "I5oM9wlvVv8q24HLzrkAcJ34IXbrbI6dvTFw8d6zB9/ev3r5dX7q0z84Dqj/AfTXQPexMuzX" "AAAAAElFTkSuQmCC") index.append('page_white_vector') catalog['page_white_vector'] = page_white_vector #---------------------------------------------------------------------- page_white_visualstudio = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmdJ" "REFUOI19k0FIVFEUhv/7fDNOipNlKJJGYRESRFBO6aqyAgumyEWtkoICW0QRgVELqWWbYtAc" "UkhoFVIQTi6ChAjCwiIKA0kIS2Umc+bpm3fn3Tn3nRamI+PkD2dxOIfvcO/5j0BONQCqABRh" "bSUATALw8gt7pZQppZQmIi4UmUyGI5HIAwBbARj5gJBSStu2zel0ejksy+JkMsnxeJyJiGdm" "Zrirq2sVRAAIERFLKdl1XZZSspSSFxYWOJVKcSKRYCJix3HYtm2ORqNLkEXAo75tnd7UYdbT" "Z1nJ7+y6Ljuzs5y6c5OnWk9w/4tPq54EIGQCwPnh9mZ/6cR14Y5AMEOs+wnt9iB9twf69TMQ" "TMTe/kA2UIbwniCICJWVlQAA88abtmYl5IADlDI0hD8L/H4P+/4ZqKEUDC2hzXLMZ/3ofpVE" "WYmDI/Wblz/OgJHtZ1VsDA54V6iiDzy3CfP3qpEZnAOrDMRGP6qe9qHj3E4Ey2z0j/fC5/Pl" "AEqWl/wZP+WzZo8HReAkZGQ75FAGyErATwhedRGo+4VQfRV2ND2Bu+ElTNPMAazpfbelVRuo" "qGvq/Hi5A5nYKKAdoCiN8g4F/yELRvwinn9uxGhyGMdqWmEYOQsYj9sudLvkXNMe+dwvHwDt" "gMnE+uhDFLc0APMASMEnv+JgdRjtu24VtKc4cKm3+11LmJONuzkdizERcVZOsjdxlL1vW3hs" "7DRLN81KKVZKLa9RrDBSAxGN5JOZufBEIWCa5n4zr5mFECK/sZCY2Vtc478cgKe1lkuFtcTM" "ntbaAaBX4muxeM6rruw/0gASfwGXtYBD6vbi/wAAAABJRU5ErkJggg==") index.append('page_white_visualstudio') catalog['page_white_visualstudio'] = page_white_visualstudio #---------------------------------------------------------------------- page_white_width = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAATpJ" "REFUOI3FkTFuAjEQRZ/Xu5sqEhISaVJwh0jJQTgAJyDHSBshCs6Ua6Sk2sLCrD32pAAvhKBA" "qow0smek//39P/x3mSvzpdJzwCPwANgbH90An0AuiyfvfRdCSCKiv/Vut9PVarUEpkAFUAPW" "WnsfY6xSSqgqTdOgulcqIuScCSEwHo+ZzWavAIvF4v2ghOfC7r1X7732fT/cnXPadZ1uNhsV" "Ed1ut+qc0/V6vQSm5kDwkVLCWkuMkaqq9m6pknMmpUTf94xGo29m1HX9UpehgJqmOdp9+Iaq" "0rYtXdeRc0ZEmEwmFA/2cZifCRpjsPYYTtu2FKWDimuZFRJjzNBF2U0EheRczZ8ICgmAtfab" "gupWglPQqV9XFRTgJZMBzHw+f3PO3YkIIkJKCREhxjjMIYThLHsRAei/AEff4NPqjcwZAAAA" "AElFTkSuQmCC") index.append('page_white_width') catalog['page_white_width'] = page_white_width #---------------------------------------------------------------------- page_white_word = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhpJ" "REFUOI19k79rVEEQxz9v972XHBq8XPCCYMSYRiSdGqOFiKCdhSBYamUaG7EVbEULMSG9Tf6X" "2ChpFAkI/iDH5WLuDnJ57+3bnbEI3p2XxC982YGd+c53lp2IAc4C04Dl/9gGfgAyenE5y7KO" "cy547/Uo5nmuKysr74DzgBkVWHDOhb29Pe31en12u11tt9vabDbVe6+NRkNXV1f7ItHD5Y1f" "RV52vMvGZ+uTcxIUAkgA8YIvleADr5/MUKvVcM4hIqytrS0vLS295f6bT1+ywmvp5Ug2f+f6" "6OVHbbVah0YCFuJQBp9Yw4v3X+nmgUv1CptbGROJpXrSsvFtn1AqaZrS6XQQEbz31Ot1AIx6" "RYG8UFKNmJmu0O4Jp6sxeRFQB1GpxHFMmqYkScLY2Fj/4Yy6g2AckEJZ3+hQOmGrWfD9p2Nx" "/gTGK9Za4jgmjmOSJBkIeBcAKAulsR/Y2S2pRhGbWwETKXdvTCNBMcZgre0LDTlQUOhlgimU" "O9dq1E7FVCqGm1cmmaqmSFCiKALAWosxZtgBGAvBCbNTCfdunUGBCfXcXqxjTYSoonogoqr/" "fJ7YBCo7uwWvnl0EhSz3PH88109o7RZ4Nyga7g4QixMePP3wuSzy8blztQsioCKogooiEmGi" "wQijiIbOq2VZrkfHZY5AVSVJkut//SggIYRMVQ9t2VHFIYR9IAx3m+FgnQ9t2TEIwPYf+A5j" "pgV6TOoAAAAASUVORK5CYII=") index.append('page_white_word') catalog['page_white_word'] = page_white_word #---------------------------------------------------------------------- page_white_world = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApRJ" "REFUOI19k8tPE1EUxn935g4zLUJbAlMQcAj1hUZrFEWNiUYToy5cqIlx4c4Vceuav8EQNkb3" "rlwY4sqN8RHFt1GMxChUoJRXebR0OszMdUGEAoYvOZtz833nnHu+I1hDC5AEdLbGJJABwo0P" "R0ql0pzneYHv++p/4bqu6u3tvQu0AdpGgWOe5wWFQkEVi8XVmJ+fV/l8XuVyOeX7vspms6qv" "r29V5F+74vTNo5dirdHLjz885PHHh3zKvGW2OEWVNIlFEoRhSCQSwTAM0ul0l+M4Wn9//3cB" "0H3/+k0VaD0n9x9PNdl7KWvNTObH+TMxgPQLnNp1jo7kIRKJxLqWpZRdsvvBjVNS1+9cO38l" "VRN3yC+YzJZMxtw2ovEktvmG50NPiUfqEEIQhiG+72Pb9oqIJrh6INVxIBerwfV8huerGZ5a" "ZsYfIbr9J0bEZTlTZHDiC20NuwiCAF1fW5SGEBet+hgjS+Po4TY+/S4QWHkKziu+yncMjA7i" "2C38GP+KlBIpJYZhrI0hlNjty2VmFgq8nCmSX9CpspZJmGm8SYfS9GuiKZOpxYl1lVcFQhEO" "aUvhnqhsZngiJDQSDI9VUXwPUaueZF2WmYVp7NpGAHRdRylVMYLiyXR2ivLcC0wzg/A8qqxa" "rJiPGR+gPVbme2aEjuaDCCHWkQE0pXj0a2zky46wmp0NBnakTJ3usr1mnM7GP5SKsyQTLRxs" "PbJC0DQ0bc2Eqz7wymFPo+2kYtHDaKIBQw4yNPqGprjD2f0X6Gw/ua6yEAIpZZeocOKt2923" "730b/cz0Yo6G2kb2taRJ7+ik3d696fOUUqFhGCdERa7Tdd1nuq5bQohNh7KRHATBkmVZZyoF" "Wlk55y3JFQiAyb+gMiH4yAFHogAAAABJRU5ErkJggg==") index.append('page_white_world') catalog['page_white_world'] = page_white_world #---------------------------------------------------------------------- page_white_wrench = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjhJ" "REFUOI19k01PE1EUhp9770xpGyghjUX5sBI/S40JQWOCJCC/gZ0SliwgJC6Ma0lcuSCGjWsT" "4x+oSxe4k9hIcWGkxoYx6aIkdUoLHce5c13w1WLDm5zVPec5b845V3CqIaAfUJyvCuAA4dmH" "8Waz6fq+r4MgMJ3C8zyztrb2CrgCSACrBaCUUj2+70shBKVSiUKhgOd5jIyMkM1mSSaTzM7O" "LkspWVxcXAWcY4AAkFJKpRSe57G1tcXk5CS1Wg3HcRBCANDb28v8/PyyZVksLCysihbAvSAI" "Pmmt2dnZoVgsMjY2Ri6XI5VKYYwhkUgwNTV1YtmyrPvy7CCklAgh0Frjui6RSATHcejr6yOf" "z1OtVqlUKqeQTmMuFAqk02mCICCTyRCLxWg0Gti2jW3bKKU6Aza2G2x8q5JUF4nH45TLZXZ3" "d/F9H9d1mZiYwLIsjDH/A568fP/441eXW5d7+Lx9ib3NEv1dNUZHR7Esi8HBQeLxOFrrNrcW" "wIt3pWdam6VsugfbhpvD3axvDvB6efok0RhDGIYopdocyJW3P5/u/+H5nasJISXUD0K+/9rn" "we0+jDFtIYRoKwaQe81wZfxad0QKaDQ1+WKd6wMx5mYutHVv3ZKUp8uz6s3Q+934G411Kb78" "qJMZjvHo4WHxccfjI+okuVf3l3Ib1dqbD+XmjaEYczOptgQhRMcwxoRwdMJHuut53rpSKiqE" "+O/AWmWMCbXWB9FodLoVMMzhdz63uEUaqPwD92H9V/Io7goAAAAASUVORK5CYII=") index.append('page_white_wrench') catalog['page_white_wrench'] = page_white_wrench #---------------------------------------------------------------------- page_white_zip = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeVJ" "REFUOI19kj9L5EAYxn/vTMwa8DbXuEfwOFJEkDQWV9nfR9jKxmJ78a7YL3Cf4Fi28DOkt7Sy" "tLIRNyjhQPAElxXjZYlJ5gov0ax/Bl4YmPf5zfM+M8Lj+gx8AjTvr2vgN1AtHnzNsmyW53l5" "cnJioigyURSZoiiams/nZjQa/QJ8QNXCeqO11h/yPFdxHLO1tYWIcH9/z93dHTc3N1iWRb/f" "3x2Px9+BL7VWAQKglFJaa4IgII5jRASlFCKCiADgui47Ozu7+/v7NeTJyn8I5+fnbGxsoJRC" "a91AAGzbZnl5mcFgsAv0AKxFwPr6OpPJBKVUA7Ftm9lsRlVVFEVBr9d70jwHiAgXFxeEYdiI" "tdZYloVt2ywtLdHpdFrptxwABEHA2dlZY11r3cBFBGNMq18tApIkaTKohYtu3gU8PDxwdHTU" "uqkOsQ71zREODw85Pj7G8zyyLGNtbY0wDDHGICJU1YsP2HZweXmJ7/tcXV2xurrK6elpy0n9" "Mm8CHMdhOp2yt7fH7e0taZo24T2vVwHGGNPtdtnc3OTg4ADf97Es61WAMaaZxQIMUJVlma2s" "rDiO44jrupRlSZqmL2Y2xlRlWf4Fyuch/vE879twOPyZJMnHurmqqvn29vaPF5RH8TXAPwaQ" "uKHqFpCCAAAAAElFTkSuQmCC") index.append('page_white_zip') catalog['page_white_zip'] = page_white_zip #---------------------------------------------------------------------- page_word = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqpJ" "REFUOI19k82PVFUQxX9V971+3TPNdA/Dx/QGPxgGxLgAQiYQFoYgHxM3mGgIbCSYmJgQY4wu" "jFvdEUn4A0hc4IKVG2WhCYMkBGNwAxNwRgMMTke6YRwh/fHeu7dcvKZ1xdlUbe45p26dEoA3" "Pp97N6klJ5ywy4yyCAKAACZggSyE31fb4ceVu81P5i++kzKAABz54upPX5/e9YoKdUQcxhBm" "AEbracaFX/6mea/XefDb4tpL52b7ABGAOtlaclqfb4lTEShE8RbIc6ObeV7fsoaZ6YjroTVi" "NrVy+PR345fOzfZ1IFQFXMkpsUIk4BScgAgoAgQaYyXe3N3gpalyJa2WzwNE2z+cP1ufHKt8" "cLHFjvEKsYNrzS4zGyukWeCHW03Gq3W2TKzlhaojiSNe3DPB3LW7bwPHNetxY0M1omxwaHeN" "K0sdeqmxf2eN5VaKGLw/u57FR8L1+zmXFzoksUNizQFULP95tRN469VRIlGetleYTiKcCjeb" "bQ5sbTCSOJKSo1xylEsxhoIU00chyFTi4NfFLl99v8S2zetpP/Z8+s0yBDi0b5zMG4giXjA1" "wnA7EGmfUQzaoqiHek+QWoRbanFsZhMqQuRskAcwBB/Ah4JAfZ/EvDC/8JAvT26nEgtpFnjS" "CezdOTYIiyAmRCo4FcqxkGeFhci8NZxAnBuVknJnuc+q/4fD05MEM4IVagaEgZHYKXmaFwTk" "Uru98JCzp14mt0AtVu6veI4cmCAM5nQKDoi1SHgwI0t9QfDHt6991tg291F9TVR+3IX3jk0C" "kzwPFoysVzhQAJ+GkHlvz331PzgnwechH95C2vV/jSZuHZKOAorB4JOpVaJC1aASK2Ahdvok" "z+3PIYHizxz8+MpRVd0RCCP/eX1Whg0GPQt2I1a7APAvfGscJI5vUoIAAAAASUVORK5CYII=") index.append('page_word') catalog['page_word'] = page_word #---------------------------------------------------------------------- page_world = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAx9J" "REFUOI1Fk0to3FUUxn/33v9rJpnMJJkmGRMTrLEPqLFpkwpKSRHrq1YJhW5E6FKR4ELciAs3" "LrpwowuXiotQqIWupKIFH60koY1pCVNs85i0nbwm40w6ecz8H/e6SDJ+m3PgHM75OOf7BLs4" "/fnvF9yk+54SHDcGTwgEAAIwAowm0Hp2fU1fL+WWPs1ePu/vlQF488sbf/4wcvywFKQQQmGo" "wxgAQ2EjYPRWmaWF6tbj+zMt1755q2btNUklDjpKprIFoaQQsLOUyGjC0LAdRJx6LsGLByzG" "dSFuTG/pjZGfmusDBPNN34/dVCX/X6pRiDI2TfbT9HWdocFrRyIATabJ4e3BDL84y7H5Je87" "BfDu169fOHXUOzd04CUOdg6STp2gJXEIP6owOXeFlNdDPNaCbQLaGgyZRkVfxuXq+Mphdebi" "KyeHjh27/Fr/aWViKcrbDiu+w2zBBpp5vsvh+p1LPJU8wlaY5GE5Yr7osz9t8+PEki/bM62f" "DD7T7/wjIwp+yMy6xb18wKPaLPnWP8gn8hzqaGM8ewXXUXiOwnNsDBKERHa3Zk6WLJ+FrUWU" "bmRqfoPIK7HR8xfT1i0mHmfpbO2gWJ7DtiSOUriWRO9+x7ItJ1aulihGNjeLm5SeKBwvoNl9" "AX+1h+21MUyvJoh8bCXAgEEQaYg0WJXNSjGB1xUPO8gta7TdTC7vsHkb4l6a9pYltrYrSOMi" "jMCSoAHPhjAwyGxu5qq/XqVWvoHrPkT4Po7XhJcMcVMT7E/WuP3gPt37jmIAbcAAtpKEfoi1" "srLx1bWx3955dfBEd2GfTa5Ww9cWJrHIs+lH1MowmU+S7jvP9FSA3tXNaIdN4EdY4xfHc/6H" "R86urtlTQwNK9DZ6hJFDIh1yZ67IYrGNc2e/wI0lMWbncHdXQ4w2BNUQC+Dvb6fvDox8Vn1S" "eBD7deESWodYdgwaXqaz732my3FEOdyhLwVSC5RCR6EO61LWQdvyx8PD6U3fNAASQ51uMqbr" "porZAjDaVrIShiZfd+PABz9/FIQMSyn7NTr+vxX3Qj3BQNVoMymNGf0P+0Rn4KLL+3gAAAAA" "SUVORK5CYII=") index.append('page_world') catalog['page_world'] = page_world #---------------------------------------------------------------------- paintbrush = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiFJ" "REFUOI2lkU9oknEYx7+v7+9VI805nf8iEnq1eVh0GN2KDhFrFbRFpwrGsm4Ro+gSzFPQLVqs" "FUhdgphR7FBrO5gKs6JNxbaobdSWTpBlTnx9X1/ft9e3Qw2itX/1XJ/n8+XD8wX+c6h/gcaC" "FhfqWwZrfDW86YCxoMVlY7tTVner7e3gxZJmM3Cs37zD7ulOO3a32WrfRqFIlJFsFI4HG3ba" "2HNJh7etUak8Q3L4uSKK1LENGfyE/UlHc3sjQ8XwJZ1ATaSvnryeH1kXjg4YPTPRy0Uu/1IV" "873qu6cH1SfXnA+W92saxO9Zmp2+8+NO31Ezgyg+jb/CbGL6deGr68LyzYoWQqEQ3cTzDJF7" "d9m8p+LbfcdNRI0gM5nAVDSVqRbJ3tMDmaUVBqqqUkNDQaOeWuopG8SUUqfeWFxuE1EjWPz8" "EVPRZLXKUYd+hwGABoBAIKDJFrNNekV6CDB+AHaZdmsXJ25TDEMj834ehVztyJm+hYk/jQkA" "mFjWPl8h/SZF136glUWLWwuB8yI2Wp5Lhx87hApz6WxfJvy3P5FAKKSt8lJnXVA6GE8LhpM5" "3BmRYdWLqJXZD3sEw/6uW7O51R5N1IL8SGa2dmqtdnC8BhWlAYLGgMm5dMmhk3q6bq4OAwAp" "FoUOQSyjKi5AFBVI0ncQ3bYXZq0YDN64MrMWDPyqMRIJkFKW26dR5cN0XbmrIbQg1Xj1hP8+" "t17AD/JG5y0Pd51dAAAAAElFTkSuQmCC") index.append('paintbrush') catalog['paintbrush'] = paintbrush #---------------------------------------------------------------------- paintcan = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApNJ" "REFUOI2Vk89Lk3Ecx997njlduu3Z1lYZZLqDNQ8WeTAQckREtKSCSccgoUN48CBEYvaYhyCI" "TtJ/0MndEqyki84x2soWkxlqrrR0Pm5PbY/fH8/zrEMYGUr4Pn0+H97v1+XD24JdFH40M8B1" "dp8R/cWaqNzIyN1sNx8ACP8eIkMfbZxz+Wyz21ZbhWs1itixV3hXQMH+zV4xdJEzA4wwMI3a" "9wVAAaBbFD9VAq1McPFEzdV9Afov1d4lGoWqEpAyw8njnp6xsbG+vQCWv5d4PD5c53AN3n6W" "gVok4ExHdOQ80nMZWKrrKNErsyo135RAHt+7fkEBAHE7HIvFhiVJGjzk92E9r+JOuAGiAJxr" "9aO56RiSH+as0pGGo9UHHB3KhnbmVPjmu+CVni1xO+x2uwd9Ph82NzfBuIHkpwJaA140HHaA" "MQaBa3ibel8pV2ywS/6mL/kfi5RqKcvU1NSQ1+t9UF9fj3w+D8MwIIoiXC4XCCGglIJzjlwu" "B9M08SoxV6lr6bSsbRTWV0rlFoFzbtN1HYQQCIIAq9UKSZIAAJqmgRACxhgMw0A2mwXUr/G8" "UkSV86BfKVlvCaFQaGBpaelpLpeDx+OB2+2GaZpQFAWUUui6jkKhgMXFRSwvL884HI7OMjOx" "/n3NKOmVcQEAurq6+rLZ7JN0Og1KKVRVBaUUhmEAAObn57GwsBBzOp2dsiwzjZtYKfHX6ZHL" "6T9fiEajL9va2iRd19v9fj8457Db7chkMkilUjGXyxWSZfl3J053f049DPfveCMAjI+PTwSD" "Qck0zfZAIIBkMonp6emdYQD5qeez2/MOAABMTk5ONDY2SsVisT2RSMRWV1dDo6Oje7ZxT/X2" "9nZHIhHb/3y/ADKbTnIVgak6AAAAAElFTkSuQmCC") index.append('paintcan') catalog['paintcan'] = paintcan #---------------------------------------------------------------------- palette = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAv1J" "REFUOI2dk11MW2UAhp/T05bTrbXlp7SDAkXGNlgZGhBNRDOa6NVcsmVcTC8kS9w00Wg0Ri8W" "47KYeOmiIdmFmokXi84YiYs/Uwnhxi4wIIMx1qLgENiA/rG27Jzv+45XJkuQG5/r932u3ldj" "G6b6++II+7BQMq6UkNKWV7HEpcfe/fbKgzltS/H8yXos8yMjEDpiBGsxykMgJcXMCtm/k2RX" "FlLKNt86+N4vgwD6g+WZ/hNv21J8429qb6tqfZyA70e87ou49Vs4/Yfw1+zGEwhWWPc3jx99" "xLfzy5GFKxrA1Fe9bm3Ve95b09wXdk7jzk0i3EH0liyavxs2hriTOoYtJUakDSUEicFzUgnV" "6QDQ7uw8463d01exrxPXvZsQ6cFprpJf60KsXSN/t52f9Ot8vGOIL+5+huZwED3Qo5vKfFWf" "6X+xQ0j1ecTV6HB8+j2m24vDOUehrIWiVUcx04BZeIjfjFvUljexbK7Qse7F5QtyOzlqOExL" "vFLZ0qVrEyns1n2InzNkg72oxqN4IgfwRNrRDR89Gw0U1xbpztUiCxu4XAaWZYadQsq44a+m" "1JGHkSnE4VbKyuv4a3KIlT8nqaprIRp7movTAX5Nh9lLlk+cCRyahpDS41DCDOtON/reGHbv" "QVS0CltKlv+Y4Nmzw9rS3DVsJfldVtJZH2IWP3KzgAYoZXn0E/E94XvppS6zmAPNiaeyHtAw" "S3mea9Xfr67fT0WwgeDqNFdz8Lya4dHow6TTyyykxmY1gOGzz8SFEHGhZIcSojsae8pbXb8f" "lAJbUVqcwcosYSuFEWrC4Q8xkfiOhfnxF7Ys8fI7T7QJeX/8yUOv6cW5UWQpD0qi6WXs2N1F" "qZAjeWOEVDJx7uUL629sEQBcej32dXN7/FhNQ4zNxZuU7WoGWzGfHGV89LJEytOnBtY/BHD+" "l0ChPpga++FIILBLtwwfS7MJbs9Pkl5fHARx+tRA5vq2Z/qXgZONbwolziglUspWwyg58NKF" "tbHt8v+bfwAlWleld2xSiAAAAABJRU5ErkJggg==") index.append('palette') catalog['palette'] = palette #---------------------------------------------------------------------- paste_plain = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgFJ" "REFUOI2Nkj1oU1EYhp9zEktsTSla8I/Wwa0gSCKSDp2cHFQQQXBScImdC+ISwUW6OIpLl4Lg" "YB2cHBRB6CANOOggEUWdLBWpJTW59/txyL0xTTv4Lvdw7n2f9/0+biDTwxvTMyHGDwzJ3Tfr" "S18nhu9zhUfXpysWw90QwoUDBw9z7U6D9sZbAMYmz7LcuM2f9m/ceezYyq2lb08HAUUvhJVz" "ly5Pj5bLpJ/f4e5ot52nM3dqinj0JO525cWz5xeBnQAIJ0bL4yRb64gJX548AHfA2fAmjtNZ" "/05p8vgIIYwMj1AEwBQXIU4cwVRwt51zdrZJNrf33EERwM0wESztYmk3a/B/ygCCadpPNg+8" "/zlORwvgvV14GOHHvhnq9fOLZoaZISIfM4BikoIKpkoikcL+Sa7evEeSJMOhC+5OjDGdn59f" "7AOQFFfDxTB1TI1ut8vq6io+MFJ+rtVqiAj/GqhhYpgopgFVBaBSqeww5md3HwQYliouhoti" "GrHM0Gw2++ZBSK1WQ1V7gF56D2D5CCjuvmeDXP0GqGOpZTtQXAMWBIC1tbVdRndndnY2A7i/" "SZNkbuzYFG6Om1FMofCrjLtTrVZ3mfOnmVH0wP3XL1+VQ+B0/pFSZGviDKVSiRDCrgYAMUZE" "hD3fNhqN2Gq1FszskKoiIvmPg5n101X101/aGGo/AJPwfAAAAABJRU5ErkJggg==") index.append('paste_plain') catalog['paste_plain'] = paste_plain #---------------------------------------------------------------------- paste_word = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlRJ" "REFUOI2Nkk2IjVEYx3/nfe9MM8bluj7GRzM+ZiNRSEiRfO1QsrIaS6xQktRYWhEb2UgpZYGF" "lQUpKSnFgmhEqBGmywx37vu+55znb3HvDDNR/nXq9Jz6/Z/n/xxHS5cO9q5wSfKCKZI0cujK" "+8rU+rjc5f7etZa4M8653dOr3Rw4NUB9+AkAXXPWc23gJI36KBLXhd06fOXDzT8BJaXu1va9" "+3qnlcv4t8+QRMzr4+5sXtVDsqAPyfbfvX1nDzAZAG7xtPIMih9fCBZ4d+M8SIAY1lOEyL58" "pGPOonaca586QgkAiygEksp8LAYkmzxnNkYxMvbXDEoAMsNCwHyO+bzVwf+pBQhY9JOcz/08" "Rup/khWBcnUJlgnWHOXQBWTBCF7EEMcBEQseYsBiBEESGpw/soNSmvzVuTZScOLiy98AgkfR" "UDAkocLTliacvvqakSyyYl4ng0MNym0plekpz9+OEb1IJjqIRgxGDBELEYtCQJaLdjl6ujv5" "VjfmVkpkeUQFuN8Aw3xErWPeUNEMsgOwXDx+/h1fGEOfc95/LNi4sosktAAWrekaIhaa91g0" "A/W5+DQWGa55Ks4xOBRJnNi1qRuLLQBRmDcsGAoRhYgVAkG9YSS52LmhSnVmic7OhC3rZjG7" "0o5FUUJ66Itic9fCHmRCZiCg1kaSQiyMpbPb2L11Ac9ejVJWYNvGeaSJwyRKcpx9cO9+2TlW" "/7mm0XQPw7Wcs0eXg6CRBY739028f63lhEK4f/2w7QcfvSkaPvd51tHXW11m1gxbApkwcyDj" "F9XteNW2ODz6AAAAAElFTkSuQmCC") index.append('paste_word') catalog['paste_word'] = paste_word #---------------------------------------------------------------------- pencil = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAY9J" "REFUOI2t0rFLW1EUx/Hvve+ZpyF5BNQQU2nFwRS1ZgitVaSIS6CULkJxy5+gLq1LwVUnBcW9" "i3SoUEGkrdChNC4aqdUh2mqUJGoIJq2giZpct7cE9YGe+X4O557fgTuWsPtwP/q8ppj07h0f" "iVpVUtLpSiRMo6pbt9vgbN93qkp+Ol5HEFKyPv+uKZc+nrY1QfJrUHn8I+juhwhpAFAu/OPX" "wmRZ2sF1oSl0U5BaneUiG+ciGwdAk/r5jRNY2MhTTC1QPjX4G8vgNv1k03/oHPwsNFv48BPq" "MoHR+BSRy1BI/CY49E3ANSlU4PMkDt9LstE1TrZ3CAz/tFzFDr5PBGzjigZfxlpU6M2MbWx9" "YSbyqKm51dh93DfOwc4iT0JFWxhAB7g01W7XwAeqHTVszK8Sy5doaOvhJLpE4SBD1/uVa9Oy" "LtGQGv9/TBB64GIrtkls+SNOr5dX4xs3Rq0BeFzaaJszR317mHLjMzL5I5Qo3YqtHQz01iqH" "lLwIePC5DarqzLnw22j/bfhe6gpUqroRWOTJnAAAAABJRU5ErkJggg==") index.append('pencil') catalog['pencil'] = pencil #---------------------------------------------------------------------- pencil_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjBJ" "REFUOI2l009I03EYx/H39/eb/XRtQ9L8MyUXRmqZC0xzUh2UKCSkYwQhXY3+0SEvgYcO6kmh" "LKJTl+iQWOBBM4REkcjJmpF/ms4xRdfmpj+dm3P7dUqIUfyg5/y8Hj48Dw/8Zwm9jb7xuqy4" "P29pfU3kaElNMpq8XouSUW/QO2DHVxDVklaqmlsQksTX9w9t4ZX1p7oS+IfsWra1DYP5CEJS" "AEjFNnAN9KQkPTi3+gkGi2B58jWJ4CyJ4CwAsmTY/WeCfaxEiC8PkIoqeJwBzBYrwZUfnL37" "Tsi68OpbtD0vSnENIhwg5nVjv/dBwF+ukIZ3/RwoaCI4PoU6v0DZ/bF9l7aDke4y3TgtwWDn" "cc1x4zlGy3YaHvGEmJAsajyxY97c3lDDW6GuwU73YxngWUuJ7c71/HB5QxeLrn5yLO4/8ND8" "GotFhZyvcSiNNZdJKCElGPU1HDwmmyWAPYu26Lj2isLio4SmJ3F+dLG6XsG3vmGWpr4zHEvF" "TpfbSUpJ7IUXSYoEdafqAe3W/g4USWZztJvqIhOa04/z5RuW53w4Hn0Rka1QZoYw0VxxG4AH" "jS8ozatCIDJlgGyT3H7SGOZw5SVSxbUEImtoIsmVrmkBcMguteVaFcOnhX7OlV6lY+gm6k4I" "98xMTAaoLDG2T0x7UJcmiMyNoRnpa2qfPPE7nfWMKUvd/XnBlm8jGPWzsR1gzDXKZiTeo/sb" "a1sLOhCiVYBZAxVN6/3cu9r2C6KkCso2gDcfAAAAAElFTkSuQmCC") index.append('pencil_add') catalog['pencil_add'] = pencil_add #---------------------------------------------------------------------- pencil_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAihJ" "REFUOI2l0ztMU1Ecx/HvfdgLFygkGlIQbGEQAz6GhiiGmIiLEOJmdDGMJC5aFxkZjNFOaFTc" "TFyMgyaSEMMj8UGoLC2IhRSUUkhbHhYoVFoKvfc42aXR3MQz/z/n/M7/fw7855KsFi77zhVn" "o5VLm2vSYWEIWS+NROzaofOq1Q0yy460MKo5faULSZaZHrjr2opvPrWUIDp8RlRU96CWHUOS" "NQDMvW2+Dj4yZSv4iPsJql0i5n/FQWKOg8QcAIqs7v8zQR5rSbKxQcy0xkJgnTJ7NYn4D87e" "eicplvDqG0QuglbTjLS1zl7kG2duj0jwlykU4P0oNkcHCd8kqe9hGjzjeVfQgw99DZZxQYKh" "h8dFy43n6PbdArz2aYpkKLKc283UmrKICsSzy6PmAwmgv8vpqm/UFk+0eVkJv+eUO1uAJaNk" "v+HSVZtW10RmepjZsWEjGQp5VICcXSy2XH9Jka2Y4ICfQNKgqqmVlG+UvZV1tidnwxc83vqi" "hY/w+R56eQUup1Pxh4Qn/xI1WWFnrA/30VLmAzMEvrxGr6yk0xuURtpUs8hRBx138tdVe6tQ" "hORSAXwzv7g49Jg6dzsZFETqBfrPKJ3eoARgyiKWnhqsKRm4STazShpI7SgYCnEF4KRT750I" "LpBamiA5P47QedvR62/8c1p3s6N8cy3eKtsU+UDZZXtDEI7LhpETXsu/cexabU96I94tm5LT" "lEXMRPS3j5r3fwOfHhQSlR9/5wAAAABJRU5ErkJggg==") index.append('pencil_delete') catalog['pencil_delete'] = pencil_delete #---------------------------------------------------------------------- pencil_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkNJ" "REFUOI2lkt1LU3EYxz/n7GzL5dbImVOXiWBWpgbrTXshhBC66KYbb8I/IaOoLqKybsorhaKu" "u4kuChS8UKkUnYTpQA1RMtzmlObb5kvb2dk559dVkpgx6Hv58P08fPk+D/ynpGyNkaGzOeno" "gfBqTMoThpAduaGQy26tU7JdkIp4k8IoovpqE5IsM955tzS+sPoiqwTRnhrhLrqH4ixBku0A" "mOoaY13tppwN7PE/R3FJzI++IbM8TWZ5GgCLrGj/TLAF2xOk57swk3a+BxdxuopYXpjhzI0O" "yZIV/OMdQg9h951Cii+ihiaoae6VYJcr7IC1KI8nNOLJDW4nHFTcDGxxOzr41FaxA7Z5r5BS" "k/g8R3mQs7LNvy1B97PDovb6Kxyun9zqaAWhoZkGWkancH851b7zDIc+Mhb9rPc2x2xICAXg" "ZdOh0rJj9tkj9a1MDrylyp9GNzUuVzZhCBPDNDARLKzNUeU7x6aWUuJP+7URkbYpALpLzNY2" "vmaPLYevnaMEEwaqDQxhEl75RsbU0c0MGSPDenqDEwcvsJlJKomHg+pWB3bZwvpAG/7iXEQw" "iqqr6IZOgasEr+sQhfvKsFpyyHcWE5wLEJgZnFI3cFsA3LmWR5WOOPnHGzB9p1lMxBhUYnwJ" "D5gjc/1iONwn1lNxqbygmpFIgJ6p7nHrGv5QO6oE0HgpT9hkmYsVbrxOO1aP633DnaFrfxZc" "+URaOllS7+mb/jC610rdZAvarn/wN5XeZ8kUFk9EMay0oP+e/wIvJQ5kCU/z/wAAAABJRU5E" "rkJggg==") index.append('pencil_go') catalog['pencil_go'] = pencil_go #---------------------------------------------------------------------- phone = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYBJ" "REFUOI2NkzGLU1EQhb+59/ryBOWxaLOQwPMPbLnYaZduW1t/gJWF5dYB2cIipLIQrBaScksb" "u5RiFQgJaYKBNGYhwZs7Y7Fs2GxCXqab4fKdM+cycGS1221rtVr2eO6OBagq/X5/Zx4eNp1O" "58rM3orIKfBSRJ6ICKpKvV4nhHAYEGP82Gw2qdVqm8cpJVJKqCre+8MAVaUoCs67JzwNylIF" "MJ5nkW+v/1Q7CCGQUkK88emNEJwhwNWvwN9/Wg1wzhFjRJyRecAMB4g3MI5zoKqIh8ufYAIi" "gIBZqgZ471FVrs9+o6qb8FJKFL7YC3D7AN3Fd27WXQaDAarKiy9fMbPqX7gHXOTv7pRf3TmY" "fXjPCfsz2HJwn8FwOERVGY1GmBmTyWQjULmCmVGWJQBlWaKqNBqNjcBBgHMOVWU6nZJlGbPZ" "jDzPmc/nmBnO7Z7OFlJEbpfL5bOHDkSEsiyJMbJYLHaucQswHo8/93q9i9VqtaUmIqzXa/I8" "//EY8B9+frUGIyWYHwAAAABJRU5ErkJggg==") index.append('phone') catalog['phone'] = phone #---------------------------------------------------------------------- phone_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgZJ" "REFUOI2N0stLVHEUwPHv+d3rvSMmlx4EmsVtrOhB2iYZgughYStd+A/kpk20KYhW0qLFFEzQ" "YhSCFkGrwFWralMUUoNIaC0iBsFF2qSFjjlDl3tOq8QxUM/uHH58OI8fbDOKxaLl83nbWHfb" "BVSVUqn0X91fn4yOjhbM7LyItAF7RKRJRFBVOjo68H1/cyBJkht9fX2EYbj2OE1T0jRFVfE8" "b3NAVYmiiJ6xnTT7Sk0FMFqDhCe571t34Ps+aZoinnHrnOA7Q4DClM/yH90acM6RJAnijMAD" "zHCAeAbG9jpQVcSD4bdgAiKAgFm6NeB5HqrKs65PqOra8tI0JfKi7QNj1aeEYcjBr8fJZrPs" "fviYiSs55PACVx8M2PLvpeqvlcX7L+5N3224y+Dg4J329nYOJJ1k7QhRFGFmfNhfZ96mOduT" "o/f0ZZJwMVxYnb3YcshrbfiJ/3ZQLpdRVWZmZjAzJmZfc+poN6lL6W67RCoJuZNnALvmNo5g" "ZsRxDEAcx6gqi9UKTbKD/mPXAbjZ+4jOvV0IkmkAnHOoKnNzcwRBQKVSIZPJsFT9yedv4+Rf" "DQGQfzlEuTKFYfUGQERWarUacRzjnCOOY4Ig4MKJAd5PjRPg83x6hEB83n18A0hR1gOFQmF4" "cnKyv16v45xbD7PQ8mXfavOPXSYWGFQxGymNzN/+C5Xa3XOxifScAAAAAElFTkSuQmCC") index.append('phone_add') catalog['phone_add'] = phone_add #---------------------------------------------------------------------- phone_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAfdJ" "REFUOI2NkjFI1GEUwH/v+/7eaaVnZKBo1/+kloLGcAg6grAchKZoaGtqy6AxGiIOwqFBb2oQ" "agk0CFrMQZKGnEIqgjq9xLoaLDjTu/rzvdcgmWbofcvjezx+7/fe90GDZ2RkxAqFgv2bd40C" "VJXZ2dlt+WjzpVgsDptZXkS6gA4RaRIRVJWenh6iKNoZkCTJUH9/P+l0eqM4hEAIAVXFe78z" "QFXJZDKcHN9PS6TUVACjNZUw1vd1d4MoigghIN64cVqInCHA8FxE9ZfuDnDOkSQJ4oyUB8xw" "gHgDozEDVUU83JwBExABBMzC7gDvParKoxOvUdWN5YUQyPhM44DxlQek02ly74/R29vLgXv3" "WTubZWBpnMEzkaqzJcNGz01p4b+AweaL651z6wbLpw7SPj9N/sp10rnjUpubPPR2ZvL2M3u3" "uuUn/tlBqVRCVVlYWMDMWH3+kKP5CzSXppGxS+yZf0x8uMMH7No2AzMjjuONGEIgVV2muTMH" "A0N/m93qwpvE255RValUKmSzWRYXF+nu7qba1s7aq6fsfXKVn7UvrAErVU/wfN4ygoj8qNVq" "xHGMc444jkmlUmTyl3nz8gWVegtV38T3b8KHJQlmNrrFoFwu352YmBis1+s45zaD6bPWziMf" "y/taEmtT5z4pWjw/pXd+AxqQ6SH5TNNNAAAAAElFTkSuQmCC") index.append('phone_delete') catalog['phone_delete'] = phone_delete #---------------------------------------------------------------------- phone_sound = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlBJ" "REFUOI2FkztoFFEUhr8zc7NZMWGJSkBIzFjZiJUvbAxEDYjaiJ2FhaLgI5BCEEELBQNiIbJG" "BAVLBQMKaiFYaGVIZ5oshGyCuLiYoNlsdnZm7zkWISNBore5xbn3+//zgv+cYrFoIyMjtl48" "+B9AVRkfH1837gBGR0fvmVm/iGwFtohIm4igqvT09OCc+zcgTdPhwcFB2tvbs8fee7z3qCph" "GGYfyheGz0rSfNv3tPgtA6gqhUKBvS+72OCUhgpgdOZSnu3/nkFnzw9d3yjp7aWleALYk9XA" "OYf3HgmNqweFWwPG7QFwBcdiohyqpZTPDp2TevNV8muZzjbdXT588mIGCIKANE2RwMiFRoAR" "YkhoYLCvnpBbWHhszcaxZLE+RNxEluPLWQrOOVQVCeHGJzABEUDAzPMq6uZ05Seo3YnePpfZ" "A0fvEzd3ZIAwDFFVXuyaRFWz4nnvKYQFAhGcC2j9rK9UcjmGZvPPHKwC3iyM8aHxjlKphKqy" "+f4TzIwjcz9wPoV641p5V/+Vjo0hLMdTfzk40nl8RXn7ioPqpTN0AaVNHXSVvl6UJPnYhn4h" "MSxOHqzpgqoyPT2NqjIzM4OZMTc3B8BEbzfbJt4/tHp8qt1BbfbHRPT9S3GNAzMjiqLs9t7T" "29vLqgBA3/Tnm7PdOyviW69XBytro6pSqVTI5XJUq1Xy+Tzz8/OYGUHwZ2X6qpOP+uanvq0Z" "ZRFZajQaHVEUARBFESJCFEWkaUqtVlt3Gx1AuVy+OzY2diKO4zVqIkKr1SKfz39YD/AbC5En" "GJC419IAAAAASUVORK5CYII=") index.append('phone_sound') catalog['phone_sound'] = phone_sound #---------------------------------------------------------------------- photo = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeJJ" "REFUOI2lk79r01EUxT/fbwJGbJpWY38kUBB06NCkghTEVbeCi5N/gM6KruLg6qiDKA5KQVwE" "hw6lHVxEtwYdWlBBi2CRNsakTZp3z3V4X2wGFaEP7vIu99zDOecmSZrjIC9ZujPnf2tKjuSY" "nGDCTAQTIYhg8S8PUJ2dRmbgjruDpzjgBu6OSygImSE5CJyU1berEUAWaG58Y3e79V+bi6Vh" "xisT+wzcnN3tFkvn3+BO3O4DBdyqXGPo8BQgHt9+wPGxMcxECqBMheWd+yzv3KOXrGGCkFXf" "4PVWHe02cO0RTHimQRo5R9qnRz7RS56z0rlKX02CQT9ACNDoXWBx8yyt9gfMhAQmzxhkAMEC" "Z4p1zIxX3Yv0WY8gBmvtKi+aV7j+8eFvBpKTlxwFi4Kpz/tWg/lqma+dLp3cPFs/ZxnVJb5s" "nqPdnUAhR00eXRkECCbq5e/MHJukUjhJrSTkNT4X1xELnKo+RUSbteJYMADyJkfBMRPjh04g" "F8H3kAtHTBamYhYQQrg7P9TALSqfDyZkTuHIEN27L3GLYNHz/QxYlg3JKY+M4JlzeTOBJ5RG" "ywwPH0WKjenLN+hsLAKiUJ7j3ZNHuAlJ4JAk0cDk2c0ZH8z2vzb/8ZgOeo3pgaaBX8Zvm8vi" "QPw/AAAAAElFTkSuQmCC") index.append('photo') catalog['photo'] = photo #---------------------------------------------------------------------- photos = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkNJ" "REFUOI2tkstLVGEYh58zc87gbUxLIYQgJIzMCrxAm6hVBEG0bNkyUCKI/oJa1CIIIlpFBC66" "t7CgRUQkVBKYBFJ0gS4mQ+ak6OSc+d5Li5NIlKt64YVv9fB7vt8L/zjR9WObJ92I1B1zw80Q" "BXNDzTAxxJ2hK1+6/waIzTzq7+/B5gKBCsFTRMDMWUjzFJubefJsfNUEsZiFUJ5NzvTcJYrA" "HSQo8+WUUmmRCwwSTFcHqHkuieoINSEfRSjOvod7u0wzhfdWob21ictHGmfMDFMQNdSdoStT" "7bGKIurMlVPycYSJo6r0bt+CzAcKzFINFaJcHhVjoRbT1Fzk6VimFQd1RISvpQr5OELVCZLz" "Wnk2OrJzisZoCRHDGwrUxwXW1bdy/L4RxH4pqNoS5E982b/FzTF3zJxX774z9MazJsxR/dGm" "VuH1qa5vBZtCVH99olgyOjFJR/saBvp60PlA8B+Ip1mdaiykWewnY+NAB7Waofo2Axwdnu4G" "GB4spqE8WzjcfZuNyVoaBD4FuDhwlv62jzw//w5Ro7FRSJJFRDOF3HIdapZLonrybYe4471U" "BdqAB9N7WAwbSKyMqHLw5iuq1aW/ANQQM1pqDewozlFq7UJyt7gx2Ufx6glC6EDEuDfygnuj" "L1H1TGEZIOKEoPRsXcO2pkHqmGFi6TRpeo3Olk3E57LYJ0fm2387pOVHMLEqcOBSiSj5Rufu" "9exiGx8ef4b4KWmqqNmfl7ii4IXRiUnUDFXn0UNDbaXG5f3v8xN2EHfLSCkXdQAAAABJRU5E" "rkJggg==") index.append('photos') catalog['photos'] = photos #---------------------------------------------------------------------- photo_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlNJ" "REFUOI2lk0tI1FEUh7//zIRm6qSZOlqGkYELXyBSZqtyEShBtGonQYG7HgshiBYu3LjMhQTu" "WiSE6ELQLCixclNaig9SSBGT0HF8zOjcc06L/1RuAqELZ3MvfOfjd86F/zzecHud/etR1VA1" "RA0niojiRHFOceLfhQCKq8tRETDDzMACGGACZoapok5REVQNFIwAE+MTPkDFEV3+QXwjdqjO" "WeFsCooK/xqYGPGNGMNXP2KG390OFPC46B6ZR0sApedJNyfz8xFRAgCaSmFkt4uR3afsebOI" "gktVUuD9ehUan8R0HyeKpTII+M6+ds3xRfa8Xl7v3CWpUZxA0oFzMLnXyODaRWLb3xBRVEHU" "UgYpgBNHbVYVIsLbxHWSzPkQgdntYvqid7i/8OyPgaoRUjXUiR+YJpmKTdJUnMfKToKdYBPr" "W9Xk6E2W1i6xnShEXZBKNX8qBwFOlKq8n1SciFCUfo7KsKJWyfesOZTnlOy9IBENEd9N8Pn8" "GRLxTUJASNRQZ4goBWmlqCnO9lFTDCWSXsLK9CYZ2wEuN9RyKreMN1N9fPj6jlCGEnKiqBjp" "xzJJdA5g4sP8mfs7sFBWyo3mZiQgVEUaeTXdy4WKenrn+wmJKJhHOCeP7OxcVP2Rlt96yM7y" "IKAMvRzmiJfJtfLbADy40s3Aly7E6/cNFmZm/uz2784TbS2+gRrRsGNqZYyJlVHaGnvoGGoh" "PZhG0MA7zI+ra420nz4bflRf2UBZYQ3zq58YmxxlaXGz81AAH1LYgee1epBlsIVZ13jXatsv" "kFWoFxwnHhAAAAAASUVORK5CYII=") index.append('photo_add') catalog['photo_add'] = photo_add #---------------------------------------------------------------------- photo_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk1J" "REFUOI2lk01IlFEUhp/55rOm/OvHzFHMjCgk0oIIom0FRdAmKNq1KWgRFBFCEC6iXbWqIIJ2" "bdpEEUH23yJqlUKRkhplYr/KqDOjc897WnyTuQmELpzNvfCch/OeC/95Ut3ntvq/HiVHckxO" "MGEmgokQRLDkLgZo2tSGzMAddwePcMAN3B2XUBAyQ3IQOBE9r3sSgCwwPvyVwlhuXp2ra2tY" "2djw18DNKYzl6N7xCneS7j6ngLONJ6hatAoQN7qusaK+HjMRAag8hUf5KzzKX2Y61YcJQrlK" "Bi9/daBCL64ZggkvzyBKnBPtzUuGmE7d4vHUUUoaJxiUAoQAvdM7uf9tG7nJAcyEBCYvG5QB" "wQJbqjswM54X91GiP4EY9E02cXv8CCcHr88aSE4sOQqWDEwl3uZ62dtUx8hUkan0Xn5NbGKp" "9vP523Ymiw0opGmXJ6nMBQQTHXU/2Lg8S2NmLe21Qt7Op+p+xE12DV4k+2yQeGSMYhxhQxkA" "YpOj4JiJlQtbkYvgM8iFI7KZVSx/0s+a/oj1BztZ2LqBQu8D3r3opr7wnTiYkDmZyiqKF+7i" "lsCSzJMdqBj5wrrj58kMPIXn51hcu4TVLS2MfugjNhN4itqlddTULENKIm07dIqp4fuAGDh9" "iUxDK+w5ObvmcVeWRSUlBoPv38/u9p/OPZ2HEwM5bXGK/Jt7VN45xnRhlDwwkUtTrEiTms+P" "e3Eg27WgqvJMc53FcTTMxPfAx9G0zRR1dl6ABNLcmf85cjRSqkWRfxF+dfdDnf8N94Opaa2K" "uRMAAAAASUVORK5CYII=") index.append('photo_delete') catalog['photo_delete'] = photo_delete #---------------------------------------------------------------------- photo_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqVJ" "REFUOI2lk09olGcQh59vd3WVjYlrNtl0A7uQQNSGGAsiiJEFqZBAQIS2podiUdRzaw96UIQW" "2kBpT/UggkcP/utNSkwh9SAqHgyVJguaNmt2XQ1JTPJl87nvzHj4Fo2HQqEDc5kXnnn4DS/8" "z/JGvttt//aoaqgaooYTRURxojinOAlnMYD2ndtRETDDzMAiGGACZoapok5REVQNFIwIj+4/" "CgEqjoVnFarzi/9p86amRtKZtncGJkZ1fpGRj+9hRrjd1jRwLvMVDRuzgHL5/EVaWlsRUSIA" "Wk9hdOUCoyu/EHiTiIKrd03g7lwvWh3H9DVOFKtnEAmdQ+2PNk8ReFf53T9JTRdwAjUHzsF4" "cIBbL/awuPwEEUUVRK1uUAc4ceza1IuI8MfqQWoUQojA5HI7vy6c4Ounl94aqBoxVUOdhIFp" "jceL4wy2pyj5q/jRQeaWdpLUTyi+2MvyahvqouxQC6+yFuBE6U3N8mFDG9G/sjRPJUk3f8ZU" "ZRLbe43OrVfgty46WrdR7jrCxKtJxDxiooY6Q0RJRXP8ebtCliyHvziM7/t0PuvkzoNRdH3A" "p4eOsD4Wp1zu4uHDZoqFKWJOFBVjQ6KBx2dvEW3dz74v9/PtN0f5Z97jg0yGnp4eyqUyP/34" "M+XSDLktET4/eZri30+IiCiYR1MyxZKXpLEpCcCZ709Rq1UZGhqir6+PgYEB+vv7Cao+A7kA" "gMbNydDg6cQETozXS1CaKQJw/tQPOKcMDw+TSCQA8H0fMY/rE8qxfijPFPHWfp7u7u7tHR0d" "N/L5fFs2m9VYLLalUqlQKBSIx+PkcjnS6TTOubnp6enI2NjY8/cAQDSfz/ckEombmUymJR6P" "R80sMjs7e9zzvJlUKnUTWBcEgZRKpZe+7x96A1eLqBickWWRAAAAAElFTkSuQmCC") index.append('photo_link') catalog['photo_link'] = photo_link #---------------------------------------------------------------------- picture = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAfJJ" "REFUOI2lks1qk0EUhp+Z778JJNDEkkqUtiC4KKJurN6AC1eCq3bhxu4LbrwIr8GfnQvduBGh" "6hUoCC6KWhHUpi39SdO0mXwzc1zEpkkjKvgyi5k5c55zzsvAf0oBPHz+9r445tu5pN38N69k" "+BhGkIU8uHPz8lII4IWFG9fq1SzLlFLBHyt2PDib82z5422gBzgwkqRpph6/2aHDFi21wtTE" "BlnUxIpney/jw6cSY3KekHHu3prCilYAIUCeg9YBWkFXN5iqbJDEX2maFtZZwiRhul7jy2qB" "clzB+4FxjjYe0FphZJM42mH3sIlxHbrWYqVNkiS0TcZ4phGkb8wwQCnEeozL6VjDYW7oeovz" "gMoR7wi1QuTYVd03WnqAlCqtdgEhwniHsQ6lYtqtIsV4kiDQIGp0BJHeCMXgNN8b65TSNcYK" "mkRZ9rfHWG/UqJWmCfVxch8gg4DoFJPZRb69e025+APlHFGnypmZBYppDef90LcY6mBlaxHn" "Pc57zplN5upn8cDq2jov9u/h9zzee+DliQ5EUMD1S0v9QDC7y0F7i3TtPZWri8wH0XFZ6RXs" "A9TR7YBcVsZlZUxlhlGdMDGJVROfly5MXAGlfqHkaI0kW9sl0r1QCBCHPHn66vOc8czKaMaI" "wgCiQB79/eU/6Cf91tSW+ziqFAAAAABJRU5ErkJggg==") index.append('picture') catalog['picture'] = picture #---------------------------------------------------------------------- pictures = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlRJ" "REFUOI2lkjtoVFEQhr85N7vXfcYXxGhhpWgRH2Dho7ATFhHLIDaipVUgghHExlIkCVHsxM6o" "INpp4QPsLIyiECyEFRWMYfdmc/c+95yxUJP4QAR/GBiY4eOf/xz4TwnA2OSDkVql1AgiLYoY" "xFBVS7i8ZcmT+P7l0cblXwF9ALVaqXHq8LY15UpNVsyqP5puknPlzosjwJ8BC10plis1uf1o" "dvBL6+PqhdQZBdSu8oqmav2CR5aJOzv1ZDZJ4unx0caFnwAiWrHA4mK25vih7X2lcg1Fsc7h" "UfWKBY8k7XlWtH719sww8DNAVbrOUW1HVvxShbtP33nzrY4JYkFEUOdjRPBENqQ9GTg79TRI" "kuj6+GhjpO8HSRWsc17mPIKONScP76Jcrv0pdAnTvH/q1swJYGTpBFVQNdZIyQtCpVyuMfup" "w7PmGfrr80RZzvu5dezfeJG92zZhjJGlE0ARlMzOY3sh1ik9oOcc1eocpcJaHCmu2ORzO8Kp" "Q9D6coiqn7WXbSj76z2/UMcYgyosRhntJMFqlzBPaUUJbVJQQaGzBIji+OH49MyO3MlQluZY" "F38DJI7mpy04/zVhHhG0N7N1wP/9H0ycaUwCjF15stMvuE3gDzoHQWzZOTDG7uYIb96+Jzh4" "iV7eQwFB6isy+KYoiu+N33y5BzVHBeXVh9Pkec7zLCMbLJC9HibPc44deI7qrw+0QuemHjfn" "W4EuhIkGYaJBGGt7cbnmWh09f+1Z+zcHy07S6YmbL/c5zJDxQJB+RRdw3xeMEnajG3/x8O/6" "CpzoNySLFUW+AAAAAElFTkSuQmCC") index.append('pictures') catalog['pictures'] = pictures #---------------------------------------------------------------------- picture_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn5J" "REFUOI2N0ktsTFEcx/HvuffO3HvbYRpt6ZSSViq6GEWlqbITQWJDYsWCiC7aVUOCsJCwYGHb" "hU0bOwsibJB4LKQREuLRRYM2gnb6YsaYdm7vPedv0WpNWfjlbM7ifPJ/HNV39+VV0RwuhOLN" "hvwdKb06MfAdek8cbOkGcIxwZP+Oumrf95VS9j+ExRQN6Cjk1sP3R4E5YDoQ1/N8df3Jd4pM" "kVeD1K8ax4/liMTw7YfPwIckZdKEQyWnDtUTiaUWKgpDsCwbS8GslaG+ahw3/olckCfSEY7r" "0lCXYnionIp4FcYsaQnAAJalCGSCeOw72ZkcgS4yG0VEUsB1XQqBT6VvIUjJYBYBpZDIEOiQ" "YhQwEwbMmghtABUiRuNYCpHSqVoAInOARzX5QjlCjMBogkijVJxCPkEiXottWyCqBHAWAEuR" "sFfzNTNG0hulrNzCVRE/v5UxlkmRSjbgWKWPARz5E4itpNbfwpdXj6lIjKC0JlasZu36IyS8" "FNqYpd9isYLBqQ60MWhj2BBMsL1uHQYYGh3j3s+z2NlybJPgQl+R6Zni8j2n0+fvX3l7yRER" "FLB3a/eCaqezTBem8EbfUNXewaYPL5mcHqSlaRtrVjTyeOC2evZu5GJrV6pivqvSwrRfQVC1" "nlz6AGLHeDHwhM0bm9GWpjm1G61C2tLtgHQ5blzlMGGyeVUbKDVPye8DwGRujJhKsK/pOAAn" "d13j7tseFHc8J+5w4+ajj9sDQ1qWTmg+2Xw2OTDSz+uRp5zZ3cvlB8fwbBdBin/v5R9p7Uxd" "qmtInmvftJPGmi28z7yi/81TPg/nrv4XMIfUXEapTgXLBPKI9DzvyZz5BYdFEGtMczAFAAAA" "AElFTkSuQmCC") index.append('picture_add') catalog['picture_add'] = picture_add #---------------------------------------------------------------------- picture_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnpJ" "REFUOI2Nkj1oU1EYhp9z7k3uvU00gaTWKLFNCxUpRbSL1dWhipMgDlZ0sYJbxcEfEAcRF2dH" "xUkHHRShxKpFESd/EJUWW3+gtmlL7U9Mmpt7zzkO0dbUDr58yzech/d9zyduPnh9zSiOlALj" "VgP+lalf7Qh4NjdOHOzqB7C1offAnmyj53lCCGsNwooqGlQYcO/xp+NADVD2jeO6nrg1NEeF" "WYpihFzTNF5kgdBofix6fBhN0GC2YZPizKEcoZFi2VEQgJQWUkBVFsilp3Gi31jwi4QqxHYc" "WrMZvnyOkYym0XpVJAANSCnwzQzRyBzzSwv4qkI1DAlNCcdxKPkeKU9iMHXFrACEwIQaXwVU" "Qp+lwKeqQ5QGRIDRClsKjKlvVQIYUwO4NFIsxTBE8LXCDxVCRCkV48Sjm7AsCUbUAexlgBTE" "rc18L0yRcCdpiEkcEfLzRwNThQyZRCu2rH8MYJu/AZENbPJ2MP7mKcn4BEIpIpVGtrT1Encz" "KK1Xn8WKg5HZPpTWKK1p92fozjajgc+TUwz8PEfH+zm2jo7z8foirfHUuoG98mzPoL5qG2MQ" "QM/O/mWq1TlPuTSLO/mO9O4+el/kWR+8pP3YeZxcB0vv8vLj8/zlR2a4ZNdS1RtTXhLlJfHT" "bbULzN+m62g/7tgQPLtMQyJJS3Oz9WrY9NtOVCygg8T2pl0gxG+U+TMAvJqZwt2Yg/2nV7Jf" "ymAZ0WJHbe7cfTLW7Ws6zeqGfqstllpXfvtQxu6fwl8qUAaKixbKYuLff1lDzw9nLkXjsQvZ" "tLJtOU5xJuRrwVLVir74X4AaJHu2PDtxUmrRrKX5rjHX9w3qK78AHboTpoxuNtgAAAAASUVO" "RK5CYII=") index.append('picture_delete') catalog['picture_delete'] = picture_delete #---------------------------------------------------------------------- picture_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsxJ" "REFUOI1tk0toVGcUx3/ffc4dx9zgjEmaEMNEsVgJIRYfabsqUgbbCm3RjYLFtoLdRcSFGxdd" "WeiqBbtQfKzsokWQLkpfQrVgKe2UGkxiTZhiTNRknMnMde53H9/XhZo0mv/uwDm/8+B/xLnL" "f3ymU/YFsc5EMc9LLw8tGzyLsx+9+/IIgKU0+996tXet53lCCHMFwpJCBWkS882Pt94HHgMe" "Se1mMp64cOUhIfM0xDjFzvt4dp1EK6oLHqP/+GT1JizyHN1TJNGGWJwojsEwTAwBkTFLsXAf" "16lQlw2SNMFyXfp7X2BqchXtTgGlnlkJQAGGIZD6AY79kFqrjkxDoiQh0QGu6xJIj7xnoNHL" "DrMEEAKdKGQaEyaSViyJVEKqABGjVUq/8xu1b09Qyg345TNvaMLpAxaA1o8BGdbSCGbQpo1U" "AVGSYpseQSPH9jVzlDqqeIX9+MUhalMvcvO7058uAQxBzuxhevYefmaG7CoDVyQ0q1nyjSZ7" "txVo87dQvX0TR0Ssbusil1/nW/r/ALuDbm+IO3/+THvuLiJNKbou77y+lfb+nciZizhZQaU8" "RtSS86FsvrI4wfj8IVKlSJVio3zAcG8fwq7TPTiEv34X4fSXGE6CnetDtKa0CuTO7SPfT1ha" "awRQ2jKyeFlzoEZt8gobutfjb9hNOH0Kw06IForMXStzPXswOHDovTLAE0cs96ucmyCfcejY" "/CbR7GlMRyMX+rh39Xfc0hfU3WL6NNdwHVFHxQx27mCwa5jV/96hs1UnVj3M/P05ipCg2sPc" "9THWvH0Kty2PbSx1tByLr77+6fawVAxoDV1T5/w9h88wfvEoE7/8irtukLB6V1V6jzxqXqul" "llnDNvX5pwDBM/rkw5fiYx98bGGklH+4RGXyVrOt4L9WOjn610oP9tz75bPx8crkKElzXkk3" "vWqgSrtO3hhbqRjgP0S/OQvINsGhAAAAAElFTkSuQmCC") index.append('picture_edit') catalog['picture_edit'] = picture_edit #---------------------------------------------------------------------- picture_empty = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWRJ" "REFUOI2lkj1uFUEQhL/q3We/jSAhROICRA4s5CuQYJGZgIQDwD04g0GOCHBCDJIvwAUQZ0AO" "QLJ3t4tgZn/8bAQSrRlt92xXdVfPwH+aAN59+vrWIyc/e2+v+zuyfDNsN9C1nL46PnjdAqR5" "8fTo4YOu6yQ1uGKy1rDBnmIzDj3nn7+9BArBryvvb7edzi5+MI5myCzfMRlGM9Z4TJNp3jx/" "xOAQQAD0PUQ0CFGWFo2Tq+JLkLmSMzm55M1ASQgTEhZYEAGeRe4QzCAZSYRMhpAhVPpNg71M" "dSawF/BSUTSahIJcNtafCApJRKni0HKDAifEaj4zgSvBUtnECqxaPaVCvEuw7qBoXd0CVZpN" "2Nh3dWDPiRF1opNuCaWRWcD1Yc0EqqchSNYkIu3Smdft7wxxf0+XZH/v2eF90KTd09oxMQzX" "bKL8agH2Wj58/PL9yVXy2LcRt6xtYNP4/d8z/8F+Az0BqUJGOLNpAAAAAElFTkSuQmCC") index.append('picture_empty') catalog['picture_empty'] = picture_empty #---------------------------------------------------------------------- picture_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAodJ" "REFUOI11kU1sTGEUhp/vuzNz53ZUf1Q7tKVTUdpk/JVQNtUNCzZEIqmFTVlXbMTKksTCFgmR" "sBA/UWsiIhGkUpJGSikNUq2atmNm7p1773csSmta3uQszlk8Oe/7qqv3X56XkO6cL/Giz2JJ" "6RqJghPhSs+B9l6AiBGO7NvVuNxxHKWU9Q/CvFwDYeBz58G7o8AsIO+JHY876tqjDC6TZNUQ" "qbpxnOg0gRh+zDgMDldQJq1EWMbJQykC0WruI98HrS20gqIeI1Uzjh37xLSXJQgDIrZNc+MK" "Rj4kqIzVYMwCSwAG0FrhyQSxaIapwjRe6FIMAgLJYds2Oc9hmaMRpCSYeYBSSGDwQh838Cj4" "HkUTEBpA+YgJiWiFSGmqGkBkFhBnOdlcAiGKZ0K8IESpGLWuxfG1oySiBRD1H4BWLLHq+TJW" "hzu5hDKpplxVozLVpCXL+pZO2uzHi5rR8jcgWstKZzOZgQzBqxEY+Eh66jupNV0sXbGZBnlK" "MPN+cYgiMDR5jNAYQmNo8SboaFyNWKDLipTXVBLO9NGwoZuJ4Zso9s8DRAQF7N3SO3e00lPk" "c99JfH5IMn0Y3Jc8v36PHT2n+DT6lGo7FZ2zMBtJabKhU4mJWiSqmimvymO8ERBD+PMFqc4T" "1M/0xZ+c3VkOoO2Ymsb4bKzbwcZkBxuSHaRrt1Ix+ozKVZsw+deIKdB+cB2m+JV4/C1NbV0a" "3F4Adelu/zkxqsMzpP9UvNJ9HNvWZJxki0P48zkiRfpvv6H9YCvKqgBnDy8unx5XgdldWupv" "Pbuw/XO6+0a9pT8iQWaBRY3lrOPb4ABDfWduRf4F8L1ivP/igYIYQYyZHRHmdwFjwEjyFyXO" "K8TQjiLkAAAAAElFTkSuQmCC") index.append('picture_error') catalog['picture_error'] = picture_error #---------------------------------------------------------------------- picture_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnxJ" "REFUOI2NkUtsjFEYhp/zzz+Xv52qTFt1a5NWIilp3OIWEQkhFlbCioQNsbCRsLNDiMTOigWx" "x0JiJ0hKIkHaBVFUtVXKZNR0Ou1//nP5LIoat3h331k8ec77qqu3nl4Qx76qkVxi+D1Se4Zp" "iEKuHNq95hhA6IX9uza1tURRpJRK/YEwm9iDs4Ybd14dBGYAU1qyuVykrt0bJ6ZERfXT0fqJ" "KF3GiufzRMSz143USRchTRzf24GVQP0wMgaCIEWgIAnG6Gj+RDYzRFlXsM4SZrN0ti1g8E09" "czPNeP/LlwA8EAQKLUUy6XG+TJfRLiaxFitVstksVR3RFAUIUlPMLEApxHq0M8RWM200ibc4" "DyiDeEcYKERqWw0ARGYAOVqoVOsR0mjv0NahVIZqJU8+s5BUKgBRfwEEinxqEaNjrcSlPHVS" "oEEVsJ+bGBtZQNBwiaF4L8bpWoD8DEjPY2G0ivHecWzfIPS+Jf2iSHvTOrQzLG7u4sT1jTiJ" "Z1f4btBfOozzHuc9S3WRZ0tyiE9I/AB6+giLCkvpmr+eSlzl9rvdc7ZcbMnfP1qcDEUEBexc" "feyHVqr7C32959i+/ABOPM47PML78gjdizcxmUzzZPh+ec05CuGMS22zLppLbBOceIZKrzDe" "Yr3BOMOErrCybTOTZip4NNhTCrMZVcabxhWtG0CpbyghtjHWWVrntGO9w4nnQ3mYQn4+T0ce" "0DPQU0wcO9Tlm0/Oi1cbtaf754nvlvY0xklC4hNim7CkeRkbOnfwePghPQMPpyb05Nqxszyv" "HfUfWXZKVde2b6279/LOqFFse3+afoD/BnScpOokVadxnR/PMPj9/StnVEQ6CNH4CwAAAABJ" "RU5ErkJggg==") index.append('picture_go') catalog['picture_go'] = picture_go #---------------------------------------------------------------------- picture_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqxJ" "REFUOI1908trVFccwPHvuffcO3PTiTOYV2M7xKm0pYVQtS7MZFHUCqG0m4KrKrZgs3IjlEL/" "AXdddOWm0FZQtDCCuLAtGt2qqCCKjo8x1kdiXpNxvJP7OufXhW3Umva3O/Djw+911M8nLn0v" "hi/CVPJJyqshLz+1B4Hmp68//3AfgLbCzk9Hy31BECil3BWE5xFZMFnKsdO3vgSeAZ1Ycvl8" "oA6ebRIxT1vVqQzMEHgtMrEsPAm4drtIl7yHpodvdlTIxFHLFaUpOI6LoyBxpqn0zpDz79GK" "22QmQ+dyvFUe5G7jNUp+L9b+qyUACziOIpZZfK/J4lKL2EQkWUYmIblcjjAO6AkcBHlpMM8B" "pZDMEpuUKItZSmMSm2EsoFLEGrSjEJFXKxB5BuTpox1OIa5HbEOSzOC5AWG7QLc/yIb0MOn5" "GcpLFf8fwFkGHEXBfYOH0wNE8wW6ZDXdajXZQg/T9wepeg2q7zcZrO5mff/V/MX968YAtLwI" "eP2sCTbw4PIZSoVHKGPwoj62lIf4uNKg+O52wnsnKRSHVFZu1U7ulT3LLdTnxzHWYqzlnXiW" "kfIQFmhMPSaQE5SG92I618j3vklkHrDmo/Vd2dOFA1pEUMDYxn3Lg3GHF+mE8+SnrtBbHacw" "eYq0OYnjzqGcEH/VHEQdnk7FrlYr3KsJSpighPU9Xr91CC8QbDaNYxfB6UbShBtH6tH1m61x" "nfNVC5sWPxjYDEr9TQlR4zeiydP0bxpFkj9Qps2N32N0HJEkRup3F3fuOvJnTfuao7WJOyOx" "ZfjFFW9Rxwtvj25zk7kDaF3k6kQiF8JPIj1UTX3SQ199t7X2vx/nfm3sXPx4v4T1z+TCDyPt" "H3ev27VSnv4v4NHk7KknrYm1YbOzdPvmzLd7frnz60p5fwHrfz+i6Py9YQAAAABJRU5ErkJg" "gg==") index.append('picture_key') catalog['picture_key'] = picture_key #---------------------------------------------------------------------- picture_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtJJ" "REFUOI1tkj1sW1UUx3/3+j4/v9jBVmPj2lBHcaYSLBRY+Ijwmkjp0EqQqAQJCbVDFlSpSJW6" "dUtFGLtSsTHQDkgIBj4ihMTQUhYITQqVQ/wVpylO+lI/v/vuZYjU1KFnO8P56f9xxPWvfl22" "Ee/5oU30Q/4/dnBVDniKz86dee0CgDKWhdm3TuQ8zxNCxJ5BOJyegUiH3Phu/QPgALAfWDeR" "8MTnPz6kxwP2xF3G8lt4ThdtDTu7Hr/fSzNkT6IY4eI7Y2grxRNFYQhSxpAC+rLFWHYLN16j" "G+yhI41yXconCtz/O0kmnsWYI5YADCClILAd4s5D/n3cJYh69LVGWx/XdfEDjxFPYrEDwRwC" "hMBqQxCF9HTA4zCgbzSRAUSINRFKCqwdTFUCWHsASJBjz09icQhMRKAjhIjj76VIxYvEYhKs" "GACoJwApSMVeoN5qk040GUpKXKF5tDNEu1WgkC6j5OAxgLJPA5znKXqTbN75gUyqgYginF6O" "0vgCqUSByJijb3Go4O6D80TGEPYjjnUVynmbbP5FNu+v0ti6glEBI51JvtmdYLfVeW5xcfHj" "9fX1a8paiwCmX71ApCN++vpnhksZ5ubm8H2fzfFxfrmVJSYls2dP4SiHZrMpbt9OXK3Vajl1" "4OpA2Opvf7Lf2Wf27Bk+vbbMH3dWKRwvUKlUaDabLH+yTKvVojj2kn7/3VOqVqudl25cdDEh" "r+Rf59E/AcPDaQAufnSZsK+Zn59namqKmZkZpqen6ff7vPzmaR8gk8m4Kq744svv/3ojMFTu" "bYVxtd9MAOLS5Staa62WlpZIJpMA+L5PFBlufXu9O/nhQrper/cGepmYmDhZLpdvVKvV46VS" "ySiljrXbbdbW1nBdl9HRUfL5PFrrnY2NDbmystI6WmysWq1WksnkzWKxmHNdN2atldvb2+eE" "EPVsNnsTcIIgiBqNRsf3/dP/AfNHPiyjImtpAAAAAElFTkSuQmCC") index.append('picture_link') catalog['picture_link'] = picture_link #---------------------------------------------------------------------- picture_save = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAolJ" "REFUOI1tk72PVWUQh595z3vOueeyeG/CwoqbNa4FhoIQlwh+dNpYkBhNqLAwJiuhJCF0VNgp" "xr9ADY0hRhuoICqNBqNubIgSFBU/dtnrsrv35n6857xnxuIaLusy3RTzzMzvNyMfXVo6bzXH" "+5U1yortYVtTn0Lh+XDxtUOnALwarx99YW53URQikjyEMImRQh0rPvv81hvAGDAIljcahVy4" "ts6INXpyk/mZVYp0k2jKvW7BjZ9bNG0/nl2cPjZPNCf3J6oqcC7BCZRuhfnpVfLsdzZDj1hH" "fJ7z5Nxefr29g3Y2jer/VgJQwDkhWIcsXWdjuEmoR5QxEq1Pnuf0Q8GuwmHYFmEmABEsKqGu" "GMXAsAqUGqkVkArTGu8EM9s+gdkY0GA3vf4ylqQs/3iGnTkMyoifymjqkJV/erz3yS3Uktab" "71y3L5f+PjIBOGEqmeWvlbu0GssMByNePPwUryxMcfn6n5w9vn9L5wvXOqjKN84eBKR7eKx4" "mvUf1hmEinu9CMDV7+5OrIzQDdDZKBHRyQo3196iVqVWZV/osJwJiUFVK+dPLqA6li/BaHoI" "IdDtl3gzQ4CXF07d75Ic2ODbK45RqHj74m84gVgrWuvYAzMwaKaKH1/EVmXrok1UI9SRxKWA" "IdSICKaGmRJjRVlGfJ7JJlq1Ds48CyL/oYze4HtS8Zw8upOoJeDAwERp+Ix3P77DWrePzzwX" "P/3il+eCcuBBi2u1VkKKMuSDpRNMNx9HcHQGf7D4zPs4GgxCiV989dCZbV8DHDv3tT3xKMxM" "9Xjp4GHa2Sw42BjNsmdHpJmBF0EeVgywcOLKV/vmiufbeZuGf4SoFaKKWI3KgJ/u3Ga1W/Ev" "ihM9QElJFpQAAAAASUVORK5CYII=") index.append('picture_save') catalog['picture_save'] = picture_save #---------------------------------------------------------------------- pilcrow = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAQVJ" "REFUOI1jYBhowIguoFz70FhDhWumqiSbMcO/fwwM/xFyF2792nMgX9wVWT0TugGGOtyrrJTZ" "jZX4mRgkuZkZLt79tWeCpyDjhVu/9iAbBgMs6AIy/MxKvCyMDAz/GRj+/2dg+P8XIv7vPwMD" "A8NfDAMwXHDx3q89b7/9Y/gPsw1G//3L8P8PpgswDLj76EfYjjNfVj9494fh28//DP/+Qmz9" "/x+rAzC98KhD/v0jBoaw55kPBbV02XfDXfIH2Tl4XAA3aLr8+6/f/r1ngDv7Pzw8iDIA3db/" "f2EBScALKODvf7ij/xEbBmj6kTgM2IKAgAv+IWn6i1U/EQZAwX8cCWngAQBtXmpqweJ9mAAA" "AABJRU5ErkJggg==") index.append('pilcrow') catalog['pilcrow'] = pilcrow #---------------------------------------------------------------------- pill = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnBJ" "REFUOI2lk8tLG1EUxr9rZiYTH5m0iQ+opeBjZzctmE0FW7svWLoIgrjrpvuitZvaB7jon1AX" "unChCKW4KkYQRSlRcSHTShHM1KFoo8lM7p3M3Hunm5pqSR/QuzlcON/vfOece4H/PORvCfl8" "vltK+UAI0SmlfNfZ2fmWECL+CWCa5lMjkXimR6MAAEopHMexi8Xi9XQ6/e2PlT9sbb34Ytuh" "7/uh53mh4zghpTQsFArh5ubmSTab1QGgrpZ4aXX1ZSqVGmtOJuH7Phhj8DwPjuNAVVU0GUZC" "0bRHNQHZbPZ5e1vb6JXWVlQqFfi+D845hBDgnKNUKiFhGOCcjwKAcl68Nz090SDEk1Q8Ds/z" "EAQBpJQXAEII6LqOCueXLziwx8Ym2qLR8WZFgZiagszlIIRAEATgnFdjPB6H47pwXfdT1cHH" "TOah3tExrieT4Ovr4JYFYprAwAB4X1+1sqZpkFLCNE2UKL0LAJHFrq5oS0/PenNvL4KNDXDL" "giyXISlFuL0N4brwu7uhaRrqYzFYOzs42t/PDI2MrAGAEgpxrU7TEJZK4Pk8JGMQjEFSCsEY" "IvPzaJAS6vAw7OVl+Llc5v7k5OxZ60qJUp/ZNmShAOG6PwE/IEokAm1hAScHByicnmZuz8zM" "nh98ZK5cLq4JMdiSSLTohkF8y4KgFLJchkoIVClxQgiOdncHby0tzf269joChF8t687eyopF" "Dw+D+mQSEQBNjY1QggCHjGHPtgfTprlQ69FV/8Irw7h0VVXf3Ghv748TEvcohU2pPGDs3tDx" "8WIt8QXA2f11LHYzRkg/D8PPlLH3jwHnd2IA+A6tB2AzrCYJagAAAABJRU5ErkJggg==") index.append('pill') catalog['pill'] = pill #---------------------------------------------------------------------- pill_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsBJ" "REFUOI2lk01oXFUYhp8zufOTNjOTOmlnghZKJ4VqaCuUGilUpFFwY3aCdSNdCdWuXNTGdtMf" "yUpwU8RNha66leJCi4PEpMXSpIlIpqmRtpnOmJhMZu69c+6dc88514USrRQV/ODl23zP+76b" "D/7niH87WF5e3mOtfcMYU7bWXiuXy18IIcx/MqhWq2fz/f3nMuk0AFJKPM9rtNvtfSMjI+v/" "mHxrdvbio0YjVkrFYRjGnufFUsq42WzGMzMzG5VKJQOQeBL8zdTURwMDA+PbCwWUUgRBQBiG" "eJ5HMpkkm8/3O6nUe080qFQqF54plU4/XSzS7XZRSqG1xhiD1hrXdenP59FanwZw/grfu3Ll" "/FZjPhzI5QjDkCiKsNY+ZmCMIZPJ0NX6qccaNMbHz5fS6TPbHQdz+TL29m2MMURRhNZ6c+dy" "OTzfx/f9xc0Gd48deyeze/eZTKGAvnkTXashqlUYHUUfObKZnEqlsNZSrVZxpXwFwPlyaCjt" "bNv2ad/OnUQ3bqDrdayU2CBAXL2KaDTQY2PMPviOW0vf4soWfscN1v21t4ELPW/l8+Udw8Mn" "s8Ui6s4drJQYKbGdDkZKxPw8006NxfRPHD54iNFDr6HS68k1+fDo1qGebMKVUgWNBrbZxPj+" "n+p0sL6PA1wPF3h+7wFMwnBg8FWMiHhx32Egfjfx5srKg8W5uR/chYU4OTiI6XR+1x9wUmtW" "5TpJ0cfYsycBeH/0M8o79iMQmYSAeKVWO3pvcrIm6/VoS6FAD5Dt68OJIupBwEZrJfqxPs3E" "18cBmPjqOEur88TEYQ/ANaXkHik/X7t//7kt3W7JUSrV3tiIf263zd1W6/Xp4cRDT/360q7i" "LtZkjXZnlam5SdxW95O/P5P4uLf3YK8QL+s4XpJBcP0UeAAvnChNIMQJAdkYPOL40veXfvng" "N7Xcjy62u4hgAAAAAElFTkSuQmCC") index.append('pill_add') catalog['pill_add'] = pill_add #---------------------------------------------------------------------- pill_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArRJ" "REFUOI2lk0toE1EUhv87M5lMa5tUk9JELbWvjY+NLrpRFHWjoODCR3EtbtzoploVii/EhVvd" "VemqiIiiLqoYofgAtbUWZGppUZJOSDVpk5neO5m5D3fxQVHBA4ezOf//f3A4wH8W+dtCNpvt" "llIeFEJ0SikfdnZ2PiCEiH8ysG37fLyp6YIVjQIAKKVwXTdfLpc39fT0FP+Y/GZ8/PJcPq+C" "IFC+7yvXdRWlVJVKJTU2NraQyWQsANCWEz978eJKMpnsb04kEAQBGGPwfR+u6yISiaAxHm8y" "TPPEsgaZTObS2lTqzJqWFlSrVQRBAM45hBDgnKNSqaApHgfn/AwAGD+Lp4eGLq4Q4mwyFoPv" "+wjDEFLKXwyEELAsC1XOV/1CkO/vv5iKRs81GwbE4CDku3cQQiAMQ3DOazMWi8H1PHie96lG" "MNXbe9zq6DhnJRLgr1+D53Igtg3s2gW+bVst2TRNSClh2zYqlO4GAONxV1fUWLnyZkNrK8JX" "r8AdB5JSSMZAhodB8nnw/ftRfXkH85khsOwMVFQvrg6DowCuGkqINs00oSoV8GwWkjEIxiAp" "hWAM+t274M5bKCOHzYeOIdq+AezDSOLj6MilJ8pe0iqUBiyfhyyVIDzvRy8tQXoeDADzEw/Q" "tf0ArJnnILd7UT97D+vakrqAOmkcKRS+3J+YmEym0xvr02lCJydrBBFNQ4RzcBXASrUDe0/V" "LmYMpKErsk4jgCrkcjunR0dz1HHC+kQCOoDGhgYYYQiHMXANRfr+ETCQRrWPYKGPoFL4CqEr" "RweAh0FAuym99e3z5/X11WrKCAKzvLCgZstlMbW4uK95Q+NcqeBs1UxdC/UllIsKs44mBFfX" "fn8mcr2ubksdITu4UjOUsad9gAsAo4dbT9Oic1yTpE1qak5C3djzVF75Dt+WlIxV1ggdAAAA" "AElFTkSuQmCC") index.append('pill_delete') catalog['pill_delete'] = pill_delete #---------------------------------------------------------------------- pill_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAr5J" "REFUOI2lk8tvVHUYhp9T5lrKTC/TdCpTiDM0DQiJEU1NjAkRcGtcmFhZuDHRhRtXhlpjQqm4" "MBp3upFF/wFjDAtBR5JWMNohBKUX0hBmoEMjHTLnnPmdM78rKxqJRE1819/zfO/mhf8Z798O" "Go3GuLX2NWNMxVr7XaVS+dbzPPOfBCsrKx/m+/tPZdJpAIQQBEHQbLfbhyYnJ7f+8fOvV67M" "3Wk2nZTSxXHsgiBwQgjXarVcrVa7X61WMwA9j4N/XFz8uFAoTA8PDSGlJIoi4jgmCAKSySS7" "8vn+RCr17mMF1Wr1dKlYPLl7ZIRut4uUEq01xhi01vi+T38+j9b6JEDir/CN+fnZncZ8UMjl" "iOMYpRTW2kcExhgymQxdrQcfadCcnp4tptMzw4kE5uxZ7NISxhiUUmit+fTiG8xVXyW7M00Q" "hoRhuLYtWJ2aejtTLs9khobQly+j63W8+Xk4fx6tNUopYi0pFfbz3jfH+H35Gr4QxwAS5/bt" "SycGBr7sGxtDXbqE3tjACsFHx9dx5g9k9XOk1jwxOM7+4iRB3OGL6285mTL3ARLOmL09qRTO" "99GNBjaKMFGEtpLjB9/EOIuxBotjo93gUOkFQhl5S/WL7cOfMJjwhZBRs4lttTBhuC2ItcQ4" "y62tGyir0VahjMLvBjw99iKhEj2/3FzY6nl9c/PW2tWr1/zlZZccHcV0OphOh1jHaKMZye2h" "mNvLaL5MckeW4V27qTUWWVhf+LOjeNYD+Kqvr3BwYqI2PjFR7IWkuH2bd6YaxFIirSRS0lWG" "n/KeL7/Mb/WfubD6/V1pOHr3DNe3t3Amnx8YSya/fqZUOpLzvFwsBE0hbD2KXjlx7965A7Ne" "57k9L/X+tPbDHeVxdOM0q/D3MXmfZbOHs553RDu3LqLowvsQADw5Q8e4Hb1dTHlzjpsPgQci" "x43qOw9HCAAAAABJRU5ErkJggg==") index.append('pill_go') catalog['pill_go'] = pill_go #---------------------------------------------------------------------- plugin = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeZJ" "REFUOI2lkb9LlXEUxj+vP3Lwx0v+QBKzIG7mvWJrNLa0CEH/QFMFEUVbTSENjdHS1tDS2BQO" "ZYZjZaJxJ4sraKjULVSy1Pc85zS8JtbNGjzLFw7nfL7P8xzYZyV/a45M3SxHqCTzMNno3dP3" "h/cC1P3ZuF2+0Z4Epf6WfgppITH5qX8pqAGMDN77upVtrmeRsb61jix7918Ld6ZvhbuQHLmQ" "eQy0n0jMjZmlmVXLJLnqzIyH5x4f3A1oAJCL480FPByPIPBE7kRAsauUKkSE87rytkZBDpBQ" "OB7O4rd5VjZWsDA8grqkHvfgWFrAzPYAmChXy7Q1pnQ39/D5exWFcjuxiVwYoqOlg/OPhsPM" "MBOjl58nv53x+otLUewqUv4yjdzxEBaOQrQ1pvS29uEeBM745ATPrrxMGnYDzIRCmPJX28ty" "YfVCnocc27M7Fq6NXQwzkTalyJ0ssjwTF+Z5Nr2tfczOv2d+eWHL5QekXQAzUeoeQARzaxWK" "7UM7F/FwKqsfkDsLyx8ZuzrRVBNiZoYhpj9NMdh5ksryHIvVJSTRmXZytOdIbmOvK1hmyJ1S" "xxAmZ7G6xJMLTxOAsw/ORN+hw2QybFt2LcCMN7OTmPJfLNPGr4HMzMdfTSD5D0lrNYT91k+9" "LGHVm8vdaQAAAABJRU5ErkJggg==") index.append('plugin') catalog['plugin'] = plugin #---------------------------------------------------------------------- plugin_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAk5J" "REFUOI2lk99rzXEYx1+fszM/2uabc46M5EbH7JzZVgotbkhSK+UfkISaIrmZK8kFF0ounAsl" "uXEpIRd+JpKYtc0RuZiSzhYHww6b7/PDxbGMbVx4bp566nk9z/v99MB/RpiueKS3u+iueRVz" "Ubl2rONU50yAxJ+Fw8UDqeDkm+qbyEbZIGpr/7bBFMCRlpMfvsfjldhjKt8rqMQD/5RwtO+Q" "mymqhpqiYt6cWhHEhP6h/k8Sq6ppQkQ4u/XC/MmAJICasrwui7lh7jgW1Ax3yC3IR+qKu/Fo" "8MmUDaoAVdQNc6M0+pqRsRHEBXMnEWowc5ZFWURkBoAoxXKRebURC+sW8+5rGXWtyvFx1BRB" "Sden2Xa+00UEEeXanhvhtzPuv7XbcwtyFN/3oWaYK+KGujKvNmJJw1LMHMe43XOX6113QnIy" "QERRV0SrWX82qyn2cZw3L57z7VuFyvgobpVfEvbd3OUiSjQ7Qs2IPa56YoqYMavsZObWsGr9" "Gpakstx5domHxXus3rvoRGJicn5hM41RI68+D5JLtZJPtZJPt7My044MVWhf0YYmlLZFm9AQ" "s3ZlB+B7kwCxCILS97aXlkwbg8OvKJWHUFUyUYaPn8vUhnq2NO8E4ODGM1x5WiBweU4SQGJB" "zcinWxE1SuUhLm6/GgA2Fzb46Oh7npUe0F+6T/emcxy/voM5NbNxfKwKEOHxyx5EFRFBYh2b" "MDYWMRrqwsOBB6GjdR1XnhaYFZLc77sLhNPTfuN0sbqr8TghdAVocPiCe+FRYbj7B+j6ZCOY" "8ddgAAAAAElFTkSuQmCC") index.append('plugin_add') catalog['plugin_add'] = plugin_add #---------------------------------------------------------------------- plugin_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkxJ" "REFUOI2lkztsjQEUx3/fvbfx6OPTl9Kg9bhavU0ZDNINgxCJxCImMdBEgtTE4hHCKBYmg8Vo" "ECpp69lFVKu4g0iUSNzb6EWVtuo7D8NtKW0ZnOUkJzm/8/+fkwP/GcFMxVO9R9PumlIxF5W2" "c80Xts8GiP1ZOJFuLQucVF1RHckwGYjahr8pmAY41Xj+4/dofCTyiJHvI6hEz/5p4XTfMTdT" "VA01RcV8TVl9ICY8zT79LJGqmsZEhMs7rpZOBSQA1JTVhUnMDXPHsUDNcIeGylSorrgbj/p7" "pinIA1RRN8yNzNe3DH0bQlwwd2JBHDNnZZhERGYBiJLOpSkpCKkqrGZwNIe65u34OGqKoJQX" "lbPzynYXEUSUtpaO4LczHr693xsqG0h/6EPNMFfEDXWlpCBkSfEyzBzHuPP4Pu0H7gaJqQAR" "RV0RzWedaFZTVj9/xaont4hnBxgrLWa4upT2SQuHOve5iBLOCVEzIo/yOzFFzFj3PEtzLkb9" "7lbmLE8x9qydhV0dbNycOJiYnJyqWoPivB7up6Gs6edFzI2V3Xeo23ucua/uwYMzzA8XsKKm" "hp4X3poAiEQQlL73vTRWrKV/4DWZXBZVpSKsYP2nEeYuWg7bjvza/snFxD2ozSuIBDUjVd6E" "qJHJZbm250YAsOXiJh9bUMRo300Krx9gfGyAUeDLcByNk5mwIHS/fIyoIiJIpN8mJ0Ui1ltb" "HVQ8fBDUlM0jES/gy6DwZiBQd7s44zfOFF27lh4d/ZBpiVlQYzF/Z/ilrZ129gc/GGu7vdAB" "ewAAAABJRU5ErkJggg==") index.append('plugin_delete') catalog['plugin_delete'] = plugin_delete #---------------------------------------------------------------------- plugin_disabled = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAZZJ" "REFUOI2lkkGKIkEQRX8VMgomjGWhVZ6hLzBHEO0TuBcXghfyDrprBPESw+hWXKiIVFI2iINW" "/JhFU9nVYzuz6A+5CTJe/h+RwBflfVacz+e/VPVJRJTkS7fbfX4E8P8uzGazOoCner2OMAw9" "Vf3xLwd3gHa7bW+325kkrtcrROTnfyMsFgslifyIiDabTY8kdrvdSd7kk0Sv1wuKgBIAkEQQ" "BFBVqCoAeCShqoii6LuqgiQ2m82dgxIAiIhrPp1OuFwuyAG+70NVEYYhRORzAEkcDgeUy2UY" "Y3A+n12cLMsczBiD8XisIgIRwXA49EoA0Ol0PACYTqdarVado7yRJJIkQRiGCIK3EaxWq3cH" "uUQExWHmsYo1ku6uA0wmExURVCqVDw1FF7VaDfv9Htbaq4h8y0FuiHEcQ1VhrUUURe51VUWS" "JCAJay1Go1H54Ra22y1arRaOxyPSNAVJGGPQaDTy/3G3Bb+YPY5jkESapuj3+95gMPCstS7K" "wzWKCNbrtbuUZdnvwmC5XC5B8iIir3eEr+oPEYZlHzhAeKUAAAAASUVORK5CYII=") index.append('plugin_disabled') catalog['plugin_disabled'] = plugin_disabled #---------------------------------------------------------------------- plugin_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnpJ" "REFUOI2lk01MVAcUhb8HjMQAzlSD0+JfRxwRxtbU1qIG49ZE0266cNe4kF3buKsrY1xoTIwx" "mrioTVdturRJ04REF/hvVEQZoyVVGkdAgUEgDLx57/50gVEQtQvP8ib3yz0558J7KnjT8GDX" "j3l3zamYi8pfh7ee2PU2QMXrgwP5fYsDJ9dU20Q2mQ1EbfO7LpgHOLj++GgUl0uxx5SiEirx" "3f+1cKh7v5spqoaaomLevHhdICbcGbwzLrGqmlaICD9//dsHswFVAGrK2pos5oa541igZrhD" "S30uqa64G5N9nTz4dbdX1n5CaaQTwv5vZwCqqBvmxsDkY8bCMcQFc6ciqMTM2V4Nran1LFyz" "jWTmM8b6mrjfceboDECU/EieRYkk6ZoGhqdGUNcZO15mrQzRVt9K3fIvGH14nwVBRN2iD6ld" "sjI5J8Yfzrd7S30L+WI3aoa58rE9Z2/DRlKrd1Ae/J3pYsDQ31OMhyFBWGqak4KIoq6IKmLC" "yrhI+0cbSDXuJBz4iSDxnERtHUQFTk09ofW7s71VAN+f2+siSrI6iZoRe0xD8Rl7Gr8kueYr" "wv7TVCSEaCJDofMqx+KIgtmrFESUXLoZxembeERrVMOW1EaW5nYSPT1D5QInHF/FwIVrVEal" "zC/7rv87p0ixCIJye+gmmf5JtgZp1Fcw2HMSI6Q0uozHl29xIA5pnrX8EiCxoGbklnxKujBA" "S1s71YVL9P5xme6OUW51XKQjk+Wp2rwmvrAg3Oi9iagy9fAZ0b0/yWzYxvhwkX+67nE2u8wG" "e7qmVXXijVWerW/aUtOfN6arNjWvxhPlK+Xh4T27jvQ8mv8FM/oP0stc969CNkUAAAAASUVO" "RK5CYII=") index.append('plugin_edit') catalog['plugin_edit'] = plugin_edit #---------------------------------------------------------------------- plugin_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlRJ" "REFUOI2lkztI1QEUxn//ewvt4b1pD+1hoqLmvSZGBmYRDUFEQVAQUTg0SFAQSEtNIlFRS0Vz" "Q0QtRZCDS03RZGkpRuSg0sPqdi0VX/f+z6NBSMkeQwfOcL7hx3fOx4H/rOB3Ylv3uT53TaqY" "i0rH5cYbB/4EiPwqtPa1FAROsmp5FRXxikDUGv7mYAGgrebat2yYmQw9ZDI7iUrY+88VLrw6" "72aKqqGmqJhXF2wKxISeTz1jEqqqaUREuHXwXv58wCIANaVyWQXmhrnjWKBmuENidTKurrgb" "nQNdCxzMAlRRN8yN4Yl3jM6MIi6YO5EgSrkJ24MoPaZ/AIjSl+4jtjhO4bJ1fJ1Ko66oKVHP" "UK9CSekh9ky2M3L7gIsIIkrHycdBBODS9uvBlZ03g9RECjUltJBQBTGhTkJKi/cTW7uF6nCa" "veVJGjc3ICoLUxBR1BVRRUyIqVA3nSFv1Qp0vJ0NNScoS7/DVBHRuRXOPGl2ESWeE0fNCD3E" "3KifylCcaIKZbjrvPqKh+Twrv6VIffiIyjwHIkqysJqieBGD4wMkCmrZlVPMtlgNeflTWGYQ" "3NCJ55TtPssxlzcXQ2I/AaEIgvIy9YL1yzcw9HmANQO9rNhYh0314jbN1sNVWHaY3Nx+CmuP" "VsNMy5yDUFAzkitrETWKvrwnWb6PpXlpXEYgiNL1sB8wbKaf1ZUlaDZ7+mlrIhEANN0/MhuN" "KiLCqbHvvuP4nSAaGcLlO+DzTh0huqSKL69f8ba97cFvv/HZ1S1pF1vq5rjZbLszNzuYgXnX" "D0XfcRIVRjM3AAAAAElFTkSuQmCC") index.append('plugin_error') catalog['plugin_error'] = plugin_error #---------------------------------------------------------------------- plugin_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkpJ" "REFUOI2lkklvjWEYhq/vtEgRJ45KS5AY2moPJRFR40KjK4mfYCUSC2GHSESEEgvTUiRW/oCk" "C0OQ1KyNNtWkRI8OOlFR7dFzvvcZLKqImhL38l5c7329eeA/E/2qPN58qM1d0yrmotJQv+nC" "zt8BEj8Xx9oOpiInXTG7grJkWSRqNX9aMAVwfNW5D3HIZ4MHsnEWldD6V4UTzw+7maJqqCkq" "5pWplZGY0NLfMiJBVU0TIsKVXdfm/ggoBFBTymeVYW6YO45FaoY7VM1PJ9UVd+NJZ9OUBRMA" "VdQNc6NvrJuPuY+IC+ZOIirAzFmeLENEfq1w5OEBV1XmTEtSMquE9uFW1HVCxye0pg+9IR+P" "M5xYiIgiojTsvRklAE5tPB+d2XIpGhobQk0JFggqiAnBhODCeMizqLiSaeOvqUmvR1S+K0xG" "RFFXRJXpg28wi3ETVIQFqXIqSzcwmsty5+FltGDFd8D+W3tcREnOSKJmBA8kLGZHevc3BcPp" "G+lh9aLNjMXjNHXfY91pkoWTL6dLKlGczKdOqlLVvOjtQN3oGn5FMEEsEDTwKT/K2sVbGQuf" "eZxpHC4ECCIIyvOhZlYVr6FzIENOcogKJXOWIF8/s3+km9TsUpp77tP4uvFdrNRNLAiCmpGe" "V42o0fe+Hw85v/rgLLHHUU5ilhenqVlWx9OuRm513BiIldqBetq/KghPXz5DVBERJGju+r5M" "EcD2i9u0EKW591EiShRx9+XttxJRO1BPx7c7+JcsPUpWvWBmHl02eJLMZP8F6VyE/27oGIkA" "AAAASUVORK5CYII=") index.append('plugin_go') catalog['plugin_go'] = plugin_go #---------------------------------------------------------------------- plugin_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApZJ" "REFUOI2lk8FrHHUUxz8zO5OhTLKbTRO23TZGE9e2SdOLF4lIUMhBLIhFbDxIT61QgtKbHkoo" "PUgOEvYP6MGLlx5yEHrYWiWnQrCSyIKYgiVLJ2PYtaZkp+lm3/s9D0GordWD7/g9fN7ny+PB" "/xzvn8IrP35WN9MJFWeicuOLqerp5wH8p4P5+qUBz5g41nuMSqHiibrX/s3gGcCVk4sP9rqd" "rGtdsr0Mle5P/1nh6urn5pyi6lCnqDg7MXDcEyespWsPpauqTn0R4dq7XxefBAQA6pRX4grO" "HM4Mw3nqHGYwPjRRUFPMHCu/3nnGYB+giprDmWOz3WD78TZigjPD93I4Z4wVKojIcwCi1Ft1" "8mGBUlym+aiFmu7XsQ7qFEE52HuQM1+dNhFBRLnx8U3vb2f89NYFGx8ap/77KuoczhQxh5qS" "Dwsc7XsB5wzD8d0Py9Qufu8FTwJElE5nD/k5R3lnlCNDR7mb/EL68gaSd+zc3uPFQy+RNlPy" "u0VmZmbiAOCTb8+biNIX9HH31j2OHzjF2XNnybKMsftj3Lxdw+/xmD3zIVEYkaYpvXd6qfXU" "5oO/Nk+UTnBv9T492wd44523mK9eJqmnHD50mMnJSdI0ZfHLRZIk0Xw+X5ubm3t7Y2PjQgDQ" "FUFQ6mt1pganAWhWUtorO8zOXqJYLNJut2k2m1Sr1V3f998Hsv7+/mjfoCuocwwfGSZtpADY" "N2HNc/6bCwsLYRzHAGRZRi6Xi8IwXAJIkuSxB/DR9Q9MRMi2dmElYOrV1210ePSPIAgGtra2" "WF9fJ4oiRkZGKJVKiMiDRqPhLy8v//b0N+amp6cn4zheKpfLQ1EU5czMb7Va5z3PSwYHB5eA" "sNPp6ObmZjPLsvf+BGH3XbKWFZEWAAAAAElFTkSuQmCC") index.append('plugin_link') catalog['plugin_link'] = plugin_link #---------------------------------------------------------------------- printer = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnVJ" "REFUOI11k09IlEEYxn/vzOw/Wozoy8NeQkEks4I0UKhTqJQgIniKQIguVnjqFqRRhwghCOsi" "FARBoFepbhEUQaeQLumqYRa7n9Wnu+q335/pIG4q2wMz8D7zPj/eYRhhl7puvR1KHUxd0tjz" "iAjCFlaIwiD1a5XH7x+cvc4+ye7iwr13lec32hNKCdZue9ZCsVThxac/rCxsbn6fmz/06tFF" "fyejdgOUVmFCKxZ+Gxb/aL6uCl8K0HDkAP3tORqaMplKNv10T2bvPCI7phKprh+/NjmaDbja" "eRhtzGBNwPj4eMYSK2vBaDBa0EowWphbFT5+C0klNCSIBwcHM3sAo6OjV0qlUkEhSQsYUSgg" "oQUjQiqpSSc1FoUWlTTGFAYGBq4AqLGxsa5cLjfZ29ubVUoRAyLbVxArJLSQMIqk1sSAUprh" "4eFsY2PjZHd3d5ex1o53dHRQX1/PqbUJHt6f2f9SVb0B2oCmpmv09/eztLT0xIhIc0tLCwB9" "fX00Nzf/FwAwOzuL4zg4jsPU1FSjiaIoGUURAIuLiziOg+u6NcOO4zA/P09bWxsAnueJCcOQ" "fD4PgOu6+L5PqVSqCchmsxSLxWp/Pp/HBEHA8vIyABsbG4RhSKVSqQkIw5ByuVztLxaL24Cd" "QDqdZnp6GoCtrS3K5TLr6+t4nofneVhraW1trfYHQYDxfT9eW1tTdXV1uK7LseMnOezU15yg" "WPjJ3Tu36enpYWVlhTiOMb7vT87MzHQGQXAic26Em72n2aiABWJriSJLEEVEcUxnxxleF3KM" "jFzGWvsZeLnnNw5NfIgSWivsP8/u2kWEIIziZ9c79c75X1weDC74Rf6dAAAAAElFTkSuQmCC") index.append('printer') catalog['printer'] = printer #---------------------------------------------------------------------- printer_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAspJ" "REFUOI11k09onGUQxn/zvu+3u6FLxObLxqwF20CIiZgULBJLEbFsoIaGEAgecqkEL6kexEsP" "HpKDoJSAIE1BC4UWekqoqFTpRUtjJVUJpWkhtE2Tso1p+m1MNrub3e/Pvh76x2zVB2ZgHnie" "mWEYYRsyn1w6En8uPqSxBxERhDJWiMIgvpZj4srxAx/wDGR7cejTy/7ZD/c5SgnWPuKshYcF" "n3O/r7N8d2vr/u07z//45TuVJxq13UBpFTpacfcvw+K65lZOuLkKexp30L8vzZ7Wujo/mThd" "o6mdR+QJqUSexp9rW7yUDHj/jQa0MYP/aTA+Pl5nqSprwWgwWtBKMFq4nRNm7oXEHQ0O1cHB" "wboag9HR0eFCobCqkJgFjCgU4GjBiBCPaRIxjUWhRcWMMasDAwPDAGpsbCyTTqdP9fb2JpVS" "VAGRRyuIFRwtOEYR05oqoJRmZGQk2dLScqqnpydjrLXj3d3dpFIpuvIn+OLzC89e6ikuAq8B" "ra1H6e/vZ2lp6aQRkbaOjg4A+vr6aGtr+18DgLm5OVzXxXVdJicnW0wURbEoigBYXFzEdV08" "z/uX8Pr9GW6u/Ea+tM7X0z5v7z3MxsaGmDAMWVhYAMDzPCqVCoVCobbrygxrZp63DrzOrp2t" "/HTjG76fO0m2FKGCICCbzZLNZimVSoRhiO/7NfHHvZ/Z+3IXkYroas4QSUD3q/sJd65jgiDA" "930AEokEU1NTAJTLZYrFIpubm3jpBziS5FD7MAAfH/yK765PgPoWU6lUqvl8XtXX1+N5Hu2v" "dNLgpmpWGD0/xI3lK1xbnuZY5jSfXXyPhI5jq6A7OztfnJ+fj83OzjYV24f46N03aUilaWpO" "0/hCMw2NzZT9MjO3LrC7aTdeKctGcZVfrl3GuxNM13zjkRO/Ro7WCvsPZx/nlQdnyOV+oFrd" "wsIm1k5cnVg59je0DB4LdkOhyAAAAABJRU5ErkJggg==") index.append('printer_add') catalog['printer_add'] = printer_add #---------------------------------------------------------------------- printer_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArxJ" "REFUOI11k01olFcUhp9z7/1mJhqiMl8mZqTaBGIw0gjVRQrFTUlAAyEEgotsFNFF1IVZu0hA" "hVICBVE3QheWFkqCoNgWcdEf0VoKEUkDoTFOwmg0fonJ/P9839wu0qQZW184F+4L73PO5XCF" "Teq88PPx8LbwgMZ+hoggFLBC4JfDy0tce/jFp2d5R7L5cuTSr6Wb5w45SgnWrnnWwptMiW/+" "WOHl83z+xcyzHT9eOVpcz6jNAKWV72jF87eGxIrmryVhahGa6rfSeyhOU0tNTak28lVVpnoe" "kXVTiWzUwnKePbVlTn0SRRvT/7+A0dHRGktFWQtGg9GCVoLRwsyS8HjeJ+xocKj09/fXVAGG" "h4dPZjKZRYWELGBEoQBHC0aEcEgTCWksCi0qZIxZ7OvrOwmgRkZGOuPx+I3u7u5apRQVQGTt" "CWIFRwuOUYS0pgIopRkcHKxtbm6+0dXV1WmstaMdHR3EYjEOpK7y5effv7upDd0DDgItLWfo" "7e1lbm7uuhGR1ra2NgB6enpobW19LwBgcnIS13VxXZexsbFmEwRBKAgCABKJBK7r4nnef4LB" "77fwH49TSM7yoCHOru7TrK6uivF9n9nZWQA8z6NYLJLJZKrCauIu2xcesffYacJN+8k/vcfU" "g++IJvKYcrlMMpkEIJfL4fs+pVKpuv3Db2k5MUTk2U/wy0W2bNvOh7v38PGf02uA9UAkEmF8" "fByAQqFANpslnU4zsPyayM4mODq0wTTDjdSLjykWi5VUKqXq6urwPI99+9uJurGqAfwrP5B7" "cpettwcp5l+RA9IpzbLV6Pb29l3T09OhiYmJhuy+Ac4fO0w0FqehMU79zkai9Y1o4OVvd1CO" "UNZZVpcsMwvKPk1F7lf9xuNXHwWO1gr7r2f/OT+av8UHU19Tl35NoCrJCvb6kfuVy38DHtEG" "lWyKINkAAAAASUVORK5CYII=") index.append('printer_delete') catalog['printer_delete'] = printer_delete #---------------------------------------------------------------------- printer_empty = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAbhJ" "REFUOI3FkbuqGlEUhr8dJUxARHCjiF0aUUyjEAw2aRI78RlMp00eQR9ASCMhYB4geAHbNKZO" "I4iVoCiIhU7h6Iw6zjg7RVA4iRxOlfzNgsW/vnWD/y3xZ6LVaikApRTXqJTC8zyUUlQqFXEX" "0Gg0Xpim+Toej//I5/Pouv4ALKVkMBgwHA7fbrfbn+12+3gD1Gq1D0KIT9FoNODz+e52vubW" "6zWTycS0bftjr9f7Kur1+rtYLPY9k8kQDoeftPdyuaTf7zMajd77lVKNXC5HJBKh2Ww+CVCt" "VimVSiwWi89+IUQilUoBUCwWSSQSjxaPx2OklEgp6XQ6L/2Xy+X55XIBYD6fI6X864BXSSmZ" "Tqdks1kADMMQftd1mc1mAOi6jm3bmKZ5FxAIBNhsNjf/bDbD7zgOy+USgMPhgOu6nM/nuwDX" "dbEs6+bfbDa/AdcCTdPodrsAnE4nLMtiv99jGAaGYaCUIp1O3/yO4+C3bdvb7XbPgsEguq6j" "adoNFgqFHkxwPB7pdDoUCgVWqxWe5yHK5fIXx3HeOI7zKplM3u283++xLIvT6QSAEAKl1Aj4" "9tjH/o1+AT4I/p9ln6obAAAAAElFTkSuQmCC") index.append('printer_empty') catalog['printer_empty'] = printer_empty #---------------------------------------------------------------------- printer_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvFJ" "REFUOI1tk11om2UUx3/P87xvPtZkdpp0W4uEZsT0A6Jju6hfYzJbmB2lVIq4IQyGN1VB2e0u" "2gvBIQVBpggDQdGrVoeieCHoVHTTrb0ZYmtN0tFNSN7MNnuX5P18vMg2GvHAH8458P9xzoEj" "2BajZy6ejD4QPaHQRxBCIGihBYHvRW/VeO/nt596lf+E2F4cffNH9+PXDppSCrRu97SGqu3y" "6ZVNbpaazRtrf+365t3nnHseuR0glfRNJSn9Y1DeVPxZE/xegf50F5MHe+nPxeNuIvZhh6dz" "HiHuNaUQ9/X3rSaZhMfLjz+EMozp/wXMz8/HNaHUGgwFhhIoKTCUYK0muHzdJ2oqMAmnp6fj" "HYDZ2dlTtm1XJCKiAUNIJGAqgSEE0YgiFlFoJErIiGEYlampqVMAcm5ubrS3t/f8+Ph4QkpJ" "CAjRXkFogakESWeJvspbBF4dKRUzMzOJbDZ7fmxsbNTQWs+PjIzQ09PDo/VzvHP2646zmCrk" "2GMbpIeP8dPiGQ600uRyrzA5Ocn6+vr7hhAiPzQ0BMDExAT5fL4DcOf6lxhqkJ179zOw+wJ7" "cqOkUilSqRQLCwtZIwiCSBAEAJTLZVKpFJZltQ/kW8QrX5F94jhB/QvSQ8exLn2O7x1FSMXW" "1paQvu9TLBYpFotYloXjONi2jW3fhup39AxMQWuJXz/6hER3kx1OibUrF+57DM/z2NjYAKDR" "aOD7Pq7rEvXKPNhlktzVIKiXQIcE9m/0Hz7NH99+gJ3ZSbVabQNc1wUgFouxuLiIFJon00t0" "P/sSYeMyOmxy4Pk8oXuTWNcqe/NHWCt9j+d5SMdxwnq9DoBlWQwOF3imkGTf8GF2JC20XwOh" "uPrZKhAStlZJP5JB3viBPUmNKhQKfSsrK5Hl5eXddwZP8MYLh9i8dJbModeRhkKYDyNjA/Tt" "fxoZG0BE9mF05YgmMnTXLl7r+MaT534JTKXki7dPo4IWOtR3Fd5VOxeB0yQMIdRX/wWFizbq" "aFYNDQAAAABJRU5ErkJggg==") index.append('printer_error') catalog['printer_error'] = printer_error #---------------------------------------------------------------------- rainbow = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnNJ" "REFUOI2Nkz9oE2EYxn/fd99dcynttZfDlCQtNFIcBKtkUQdBxLWFFKSCKIKgi4hOxb0uOnRz" "6uDsrKBopVPBDq04CMnYkhRtL2lSS8+Yex0u/isV/Ob3+fM+z/sp/vNVbW4J3FBwAvAEDKDU" "fwCfCpSBwLt+RevAR/U5KK0J5xcw/wJWbK4hPOornRp1L5zDGnQxww7UV7DcDs7py6QfcDRB" "1bAocNW7OevaxTy69RHHNLDQqHwyo2yFNkcQVA3PUUz7c3dtJ+uit9/gFGzQGhl0iYMBxEsj" "uRG+eaW/CaqGRRTT/sN7tlNIYbeW0FkbGUoT53wk0w/GSoaNBVr/JqjYXBO46s/dtZ1CCmf/" "HSqtiUczxAUfUjY73zu8bzRZ+9omlxljfn31DwfCI+/mrOtkXezWUgI+niUu+IhWvAy3ebUb" "UutEdEW4ONTlIO5l0KuqYI/n0DtL6GPWL+U9iXlWr7HcbtIRIWhdwts/Q949ydlKLwOB8vD9" "28rJOjgHVrJzT/lZvcbbVgM3GmcsnOF8cRKFohtLEkXvwgJr0EV/eQueJs4lO78Mt1luN3Gj" "cSajO0wU82x8blPdaLIV7kUi6oMRuOFdv6LNsINFUpVk+tn53uHVbkhHhLFwholintVPW1Q3" "G5ESpl48Kb8GMApO6MCH+goqD3EwAMbifaNJrRMRtC5xvjiZKG82ohePy6k/qzeAp/ocLLeT" "lOGlAVj72qYrgrd/BoWiutFECVOHD88IGKU1zunLKFshuREwFrnMGBeHuuTdk3RjYSvci37a" "PuxAhfMLpB+ANvDNK4HWzK+vchDD2UopcSbqw1H/5gfe6eb284OcNAAAAABJRU5ErkJggg==") index.append('rainbow') catalog['rainbow'] = rainbow #---------------------------------------------------------------------- report = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiZJ" "REFUOI2Nk7FrU1EUxn/vvoca24rE5NWhIYuDIDpk6VgQERXsJIhD0Q469T9wKYKTq6BLieBQ" "HFwetUVBWxdxMEIrtg8HX4m0pJVSlMSmyX3nOLzmpaEdeuAO53LOd777fec6AJVK5Vrjw7M5" "u7WG3Yi4Wg6HOVpsOpVK5ZKIfFK72+cS8/v5A65MfT9St+d5w14QBGGpVJo4sTxb7j8DKLTb" "7Z5CEUFVe/JMJpOAjI6OnheRp+qP4WL5+3H+wCRjDCKS5o7jpIApg2NLs+UBX0GSAoBHrzcQ" "AYWkQUCAyVu57jNSBvkxXMfy5/1CCiACFwqZPYDkLK42AIjjuJeBt/imfCqnqGoXQJVvq/8Q" "QEVRiRFNNHAcRwC6LrR3+1zHsvbkPtdfLaOqPe9WVay16b2INLLZ7EiXwdeZ8kA+4dkpejhd" "QyQmjpVY95xot5m87WOM6QPcfRrcxcWy/W4+VfrxnbPoHqDneSmbZrNJFEV4nmdMEATh+vr6" "xMbsC+pfXiIxqUUduzqCdZpXVlYYHBzEWitdBjfuYbBszc3vc0HS4zgOOzs7hGFIoVAgl8v1" "umA+B+V+X6A7LN3AOI5pNpuEYcjQ0BD5fP6QPbg5njCYWcB1XUQk3UBVpVqtUiwW8X2/Z0u9" "IAjCer1+sRS+/Xkym0EVoijCWou1NgUwxlCr1ahWqxhjaLVaiU4dpPFzp0cKA8cvrzVav6Z+" "bC8d+BCHx+Z/wS9vq4IrUroAAAAASUVORK5CYII=") index.append('report') catalog['report'] = report #---------------------------------------------------------------------- report_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAopJ" "REFUOI2Nk01IVFEUx3/3vZc1OVZMZim5qsAoLYaiD4KgLypoaFFEgZSL2lSrFgUtiiAI2kZF" "EFOboq/Ny5SEUiEiiYlGKYaCRhCn7AObcpSc+85pMfoma9OFu7iXc373f/7nXAOQSqW2F55e" "abffBrFDWbYlM2v4v/XZpFKpJhF5rvZXpUvAl6tH2HL9zX9le563xvN9PxOPx4/NeNuWjM4F" "FIrF4pRAEUFVp5wjkUgJkkgkGkTkktY042L50d35z0uO4yAi4dkYEwJDBRW9bcmqGgUpBQCc" "ezCECCiUEgQEOLunulxGqGBeM66x5J90hQARWFYfmQCUdrq/AEAQBFMVeOlHyVnViqqWAar0" "9Y8igIqiEiBa8sAYIwDlLhR/VbrGMnjxMDvuvEVVp9Stqlhrw3sRKcRisY1lBa9ak1XzSjon" "g07f/oRIQBAogU50oljk7L4aHMepBNw/PDiIi2W4ozN0+vz+BegEsKu3jc50K/niMCdvjNO0" "cB2e5zlubW3tcDQaHRjtvrvb5NOMvu9nyb6jIUREaH95n9cfO1gXX83m1dsZc4d4kW3HxIKI" "k0gkGurq6i7N33mIylXNqJRMnOy1iPCo5zYrG1YQOAErarcSmCJrG9cTme3udXzfz+RyuWND" "D5P87LkJwb8T+Dn/iWkmSmLpcQBObL7GopomMKai7MGuFhws31q7cF0XEQkn8Gchz5vcc9K5" "Z5zamuRCRwsz3OmgOu75vp8ZGRlpjGcef5gZi6AK2WwWay3WWkSETct386K3jfVNG3jYd5kK" "4/HsdTdj+eCemZTbsnjOxvqq6ZsGC+MD198N9/79HxoPVB+NzPH2GGNmquro2Hd7v+/W1zO/" "AS1efFm0I9riAAAAAElFTkSuQmCC") index.append('report_add') catalog['report_add'] = report_add #---------------------------------------------------------------------- report_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnFJ" "REFUOI2Nk0tIlFEUx3/fo3SasdR0chYSQUIkFbjQVQgRUlJSEViCiEEFGgRt20jRprZBEsks" "o9BF46uCfFCIRRNpKENSyojmM/Exkzb3O7fF6DdNbrpwF/dyzu/+z/+cawCEw+FTsZ5H3Wpx" "CjU7TkUwUsb/rTkjHA4fFZEBrTa8Fg7zzdc42TLyX9m2bZfZoVAoUlJSciNztCvo2wtoSCQS" "aYEigtY67ezxeJKQqqqqQyLyUPtrsVCs9Pdue8k0TUTEPRuG4QJdBTuHu4JZfg2SDAC40zaL" "CGhIJggI0HQxL1WGqyC/FstQLL/pcwEiUFzo2QQk99BEDADHcdIV2EOdwd15Gq11CqA1Xybi" "CKBFo8VBdNIDwzAEINWFxIbXMhRTD65y+tkoWuu0urXWKKXcexGJ5ebmlqcUfOoIZuUndW4F" "3X46g4iD42gcvdmJRIKmaj+maXoB6y8P6rBQLL3udZ2+d7kAvQmcf/mE6fZmYtExRgYCZJRe" "wLZt0woEAks+n28y3v/8nLE8RHxsgqLqRhciIvzoeMzqh1aKK2soqrnJvpwMfg71cFjNLad5" "YKKI3r3CmRcRd2CUUny8fozSmgY83/pg6h3syWbB3s9g99tp1wNzMBT0+QWc7ROoZqJkFhyA" "ylup/jcFyDSMQMqDs/WYKBY7+rAsCxFxJ9DKKyD+uRNvqIGNXzPEgdUVi3VYsEOhUGRtbe1I" "SeTV9125HrSG8fFxlFIopRARvMcvMfK+ncIcD7a1g9V5xcScRTSeaDW2JNUfzC4vzMo4MRX7" "PdnydWn43//QUuGvy1eL5z0YBevo+Whc2hoH9f0/dUZ/g0ic6yMAAAAASUVORK5CYII=") index.append('report_delete') catalog['report_delete'] = report_delete #---------------------------------------------------------------------- report_disk = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAodJ" "REFUOI2NkU1oU0EUhb9576UmMZWibbSIIiioiC0EbJeCiohoFXQn/nThH3brUhBxqeBCUBAb" "FEEEdRHF4m8rggoawYIaFE1tbaGNNTVtYl7evDsuXk1T3HRgFhfuOfPNOQognU5vKz671KPH" "h9GjWbYmM+3M7YypdDrdIiIvjXbn2/jkLh9hy9UPc1I7jtPupFKpTCKR6Ap/fJCMLQIMeJ43" "a1FEMMbMmiORSGDS0dGxRkQumvh+bDSF573/vWRZFiJSnZVSVcMqQV3/g2R93IAECwBn7owi" "AgYCgYAAp/c2znyjStC0H1tpfj/tqxqIwLplkWmD4L4fKALg+z4AdnNzcz4Wiw2VX93ebRX6" "KWcHWLXnBCe7vxBWFQZHf+OWXT59HWd4rEDYrtDbn+fOix98/+m/qiE4gK00+ScBwZ9SmU1t" "q9mViHH/9Q9O7Vs7K5frfTlEjnVbqVQqMzIy0pV7eI1i+gYYgzGGkuvxa1ID8PjtaFVY1lBw" "ITdRQSmpzeAgNpr8o97p5BW2Ac8Xzh9PIGIwgI0h6oDruhSKlZkWrDf3kgviBvGDxMMhi7Lr" "cfbWAJYC7Qviy0wjBqKhWoLth7DQjPf0opRCi8H1NbYVAgwKP+hfDMYIWntUKrqG4HUqGYsL" "BO0wWfIIKYfjO+rRUgEsMGCUEHbqOHdzkPFCsYZgZ2dAcL8P27bxxWATQvhD97ujNEaXo7DI" "lYY4vOECFmFK7nQGU1NT6xOZh9+iCyMYA9lsFsexWbEEFscm2dzaRkPdUrBgoryU+HxNtA4c" "pVD/6ulc1bBxWf28TcPFytDVz/n+1s67V9aubGppmNdA2FmAFg8lgjI+okpkBr8xVvD4C2WI" "bwozCYmtAAAAAElFTkSuQmCC") index.append('report_disk') catalog['report_disk'] = report_disk #---------------------------------------------------------------------- report_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsVJ" "REFUOI2Nk1tIk2EYx3/ft6XNTc1yS6205ajooLQbLyyKqCgpETrQTWU3QXS6qJuIIOqqm24K" "MjBGdNE5aB2sSO1ghsXCVjMVM9G25pzO6Rbbt8/362L1aUTQe/fA8/ze/3P4SwAej2djvOli" "gzrsRx38ygZXZwX/90KSx+MpE0K0amrSbGCCobp9rLvs+69qo9FYYXS73Z1Op/Pg9I5HLsss" "QINUKvVHohACTdP+iE0mUxpSXV29WAhxQbPtwoDK2Ivmv36SZRkhhB5LkqQDdQUZ3keubJsG" "Ip0AcPrOIEKABukCAQI4tS1/sg1dgXUXBkkl2vhcBwgBS+eZfgFgltKCI3yT743LiYdfcOlQ" "SZWhsLAwYrFYBhJvbtfIY14SX/twbD2AJEk0fhonFEkRHE2Rl2hgTY6XPPsWipybmJ41GzHY" "XzZFwW4Mkkrk2XO9x9M7CgBIhp4wEfNjzq5k5MtnMiSF7JwCcqzFlkkFLbdqpKiXRG8fjm0H" "EEJw4lqQnq5GluW1M8O+nlT0Hpo6RsDXwVCfj7NXm3ZOUbAHAyqRp836pE+u60aMtpNbWk3C" "X4ecoTLNUkKWGCBSuo8bL+u/6VuQ39135dg0xER64qGuBxiTb7EtqyHhv4g8TUUZsxNubSdS" "WstchxNVVcWkgqpaZFSGG5oZ6n5MLNjGwpWbUYL1GDI0EtESwq/fM7rkCEWOMvLz06uU3W53" "ZyAQODh438V42xWSZkF0oA1loojvH88jSBAfmUO47TOjSw5T5CjDarVOHpXuhVTSLKPS++oM" "2/dfpuv6MQJ9rWQWl0NckFt5FKu9HJvNNvUi016IxWLLnZ1PerNmmujO/IHie4C9fBXRoWEG" "PvRg33kOzVxIMBikv78fWZZRFCUN+U3b65ixel525toOi3J8xYLZcsWi+YyLuLf+ru/Mw/cj" "/n8YMvQT1+Fr/yFDRDAAAAAASUVORK5CYII=") index.append('report_edit') catalog['report_edit'] = report_edit #---------------------------------------------------------------------- report_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoZJ" "REFUOI2Nk0tIlFEUx3/fPNLxRUymERkURpkY4SKDMCnSHgtLqKXoLGoR7gskkIgIglZBD5BZ" "RbiwwMpKsRIqghrBicweqCmaD0y0GZ35vnvPbfHlTFObLtzFvZzzv79z/vdYAJFI5Ej82Y3H" "an4SNTNKXXi4iv9bs1YkEtklIq+NSuZ60czdPMOh9g//le3z+ap8XV1dw5WVlS3ZQ93hvHWA" "AcdxMgJFBGNMxjkQCLgi9fX1O0TkuilqxItiqf/5Py95PB5EJHW2LCslmCJYE+0O5xcZEDcA" "4GLnDCJgwE0QEKDtZGG6jBTB+ka8lmKx70VKQATKSwK/Bdw9OBYHQGudSeAbfBQuKDQYY9IC" "xvB+bBkBjBiMaMS4PbAsSwDSLjjJXK+lmLx6mqMdQxhjMuo+f+8w8eQSV0704LX8iEg8GAzW" "pAkGHobz17ucq8mtd6cR0WhtiPuTbC4s42xHNdeO95LlD+QC3j960IQXxUKP68K5zlqMX2GL" "wrYUG9eWUrahip+JOKGOPVzafx+fz+dJEXjePggXFBlEux1XYlNb3oQ2ghaNYJhanKBi0z5i" "9gotPQfI2qhy0gTHmvGgmH/8HMuySCgbbYRv819wRKHEwdEOS8mf7C6pJuYss9D8sjdN8KYr" "nFck4LpDQiVQWlFcsBklGm2E74vjBPM2MDDxio/fPzHdT1OGCx4UYxdCNPR85dTtbSRsG1ts" "Espma+FO9m6t4934a6JTUe4097G9uNydhVgsVlE5/HQkJxjAGBgdHeXygW6UUqk5CD3ai+UJ" "EB2P0lZ9ix8jS+63XvU5VLq2piQ/6+Bk3J5o/7wQ/XsetrTSr/Fmzz3RDSsRpn5fz/4CSoiM" "s/BB2HkAAAAASUVORK5CYII=") index.append('report_go') catalog['report_go'] = report_go #---------------------------------------------------------------------- report_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApdJ" "REFUOI2Nk1+IzFEUxz/3d2fXDrNjrTHZIi9is/EwZB8k8i/EkqQ8EJESz14o8iAvvFBImlKi" "LA/rz6LFbiHRiNHsjhUzzE7s2jXWzqyZ+f3mXA/Db1o8uHUebp3zvZ/zPecqgEgksjr34Ey7" "M5TG6U+wKhxv5v/OgIpEIvNE5IlxChM0Jb6c3cOKC7H/qvZ4PM2etra2eCgU2l/TfTvsmwwY" "sG17TKKIYIwZc/d6vWWRlpaWRhE5bYLb0Dh873r410uWZSEi7l0p5Qq6BNXR2+HaoAEpJwAc" "vdaPCBgoFwgIcGRzoNKGSzBlG1o5DN/vdAVEoGm695dAOV4lcwCUSqWxBJ5Xt8L+gMEYUxEw" "htfJUeSX2kLnIlv9aXK9S/HN3ih/EGxHK4dMR6fb49EtU13U4egltMkwcc5uhp6fI9PrLwIl" "3dDQkPH5fKn8o6sb1XCU/PskMzfvQ0Q4ePkzHdFh0i9aaax7zKSmxeRSz0BqGX37wBOwh1KV" "PbALEzQOfcd3saa1B2OMG18fHyYQmo/Jx8CaRr6/j+pJFsmb97OuB9bzG2F/0CAl3BEppRAR" "VE0DdiaJpQdRVo5q/yDkR8l9LuiKB2t3YOEw1P7QNTE/EGMkdh6r2kacApZ8A6sWYxd505rg" "StfHYxWCp21hX1CgPB2y79rJxq8RmL8IU7yHKo3QfecHVYUfVGlN/cojnDi07l6FYP3OMsHN" "TrTW5FN3CTYvpzh4Bo9nIj1dNjJjB3NWbEEp0DW+yh5ks9m5ofjd9+PrvRgDiUSCqpKD0mn0" "uCl0d2QZCWyifsYCXsbiWJZFsVgs+/R7zjtn1i2ZXjtuWTpXTF3ozUSvHGja2zhr6obsYK5w" "vevDqZPtnzr+8SEHfgKiA3BXN2U2fAAAAABJRU5ErkJggg==") index.append('report_key') catalog['report_key'] = report_key #---------------------------------------------------------------------- report_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArlJ" "REFUOI2NkT1om1cUhp+rT1R1PlmRnEi2ZIIwpHFJkAdjk8WQQSFKFpEhkHoIoT+ul1C6dwkd" "OrSLh0K7FBktdQL2oPwPkWOQ68F8JT9WcGxQbWpZViI3jWrZCH3fuR2USBVdcuEO53LOe5/z" "vgrAsqzztexP9+zdInb5D86lVk/zfuelsixrSER+03bdNHB49fOXnP0l/17Tbrf7tDuTyawO" "Dw9f+/D53ZT3CKCh0Wh0NIoIWuuOuqurqymSTCY/FpEfdegKBjbVhfn//eRyuRCRVq2Uagm2" "CD54ejfVHdIgzQaAb2fLiICG5oCAANcvHW2v0SIIXsFQNm8ePmoJiMCpY11vBZr3yUYNAMdx" "OgncT+6kfEc1Wuu2gNY829hHAC0aLQ6imx4opQSgnUKjbhrKpvjDBBduPEdr3bG31hrbtlvv" "IlLr6ek50yb4/XaqO9jkfNf0za87iDg4jsbRb5NoNLh+OYTL5TIB4z8eXMXA5uWDR2SzWfL5" "PKcCASq7FZLJJMFgkOnpaQKBAOn0X4RCIUzTNI1wOPza6/X+ub9w86K8fkyusE/9cJjx8XEi" "kQg+n49cLsf6+jqJRIKBgQH8fj+FQoFqtWp0ePDs6WNevFjjk88muH/rFktLS/T19RGLxSiV" "SlQqFUqlEqOjo8Tjcebm5vbaBNkbF5fzFofDxzlx8iQXEglmZmaYnJxkcHCQaDRKJBJheXmZ" "qakpdnZ22N7e7kxhYWGejcIGn3/1NZnZWRYXF1FKYZomALVaDa01Y2NjxONx0un0P+5MJrO6" "t7cXG159UPAd8vBm/wi5+XlisRhDQ0OUy2XW1tbweDxEo1F6e3sRESzLYmtra1e9y/nT4/4z" "kW5PfF28uhr+aKK/v9/v8XgMpZRaWVn57uDg4NXIyMj3gLterzvFYvHvzc3NL/4F9/KFsMtM" "o1IAAAAASUVORK5CYII=") index.append('report_link') catalog['report_link'] = report_link #---------------------------------------------------------------------- report_magnify = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmhJ" "REFUOI2Nk8trU1EQh7/7SNI0TS2aJoIU8YEIvqCCbkRBfCFSEMSdr40rly4rSP8GQTeSveIm" "aouiti4UrUSoolaptrSN2kqNNUnjzT13xsXVG6suOnAWAzO/883LAigWi4dqDy4PmLkSZmac" "A/nRnSzNZq1isbhVRB6r8VIOAV+unGXf1VdLynZdd6dbKBRGu7u7z7W87s+3rQAUfN9fFCgi" "qOoiP5lMhiI9PT0bReSSZk/gYPj+cPCfn2zbRkQi37KsSDAiiL/oz6ezChIGAPTdmEEEFMIE" "AQEuHss0y4gIOk/gWIb5+0ORgAhs6kr+EgjfyEQNgCAIFhO4I7fz7RlFVZsCqrycWEAAFUUl" "QDTsgWVZ8hfBSRzLUL43FNXYdzzH03ezfKl6VL0EiVicZUkh8OsYE6sDQZPg+a18ujPkVFVE" "hGuPplne0c62NRncmMPsfINyxWP4fYXta9tTgPMHwSkcDOW7g1GnW5Ip1uZaKXsWph6glsOq" "bJpXYzVKpRKu69oRgf3sZr49q0hANKJqvUE8HsN4BlHwjNLiOhh1yeVyGGOkSXD4NDaGuYHB" "qImtiRgNP8APwEgoqhYs1GpkMusWT8F+Usi3ZQWC5gKtTFtU6gHpZBwvUFzb4tNXH517y6eR" "D2Gp0S34XsrGMHHhDEfvjiEifKs2GPtcY7ocllCpefgzb9jV+ZEfk8NcL9zpdQuFwmi1Wt3S" "PXrnQ+vyJKowPj6OMQZjDCkRNqQ0XOc24VtlkoWpETpXb2b3jsle6zfumfUde7rSib2lWmPq" "6rvyi/+e3y87f6Rr/8HdOy4oQeInBYRwZXkQuaIAAAAASUVORK5CYII=") index.append('report_magnify') catalog['report_magnify'] = report_magnify #---------------------------------------------------------------------- report_picture = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnVJ" "REFUOI2Nk71PU1EYxn/n3tuWlvIRPkrUEAeVsKiRBaMDxhhiHEh0MQx+sLDo4uDgoInE0ZFE" "B0j/AgdQIRIVB2M0pCYQIEiUjypQiliEUrn3nHuOQ6UFYwzvdpLnPPmd9zyPAEgkEuc3Xz8a" "VKsLqOVZWuNTzext0iKRSBzTWr8zyi218Vl53Mm53ok93XYcp9np7++fampqulkyORCPVgMG" "pJS7hFprjDG7zuFwGIC/CBTp7k7O9Iwy9GGGuYUN0usSx7FxpU/IsYuuQuOvTnYVCIJjA/Gy" "mAENQgjmljZobz1EJBL9J37WlfT0iXtOW1tbo9a629RewRaKn6/eIIQgk9VEIlGmFtd5O3+b" "ivLv5DxJMl3Nqf0PONl4AIFNgcAZfR4vrzEYYxBC4EkfBSitiUbThANVaFx0cJ7lTA5tNJ5S" "7CC4ii0UmZd5gmDAxhjYyHlktrbwzSZZ6fIjt0UGF0xeUyT4+CxeVmvAmMLGjYGNLc384hF0" "aJyszLGWOUhDXaj4lUWCa9goMkPDALjSR2tY++VzvO4OJ+ZvMTGdZK3lIUoqDOBJXSSwRp7G" "y2MG7ZMnMAaBYezbDaSUjHge3r4A3vhlpJS0nx7BmJ0EF65joVgdHEYIQWU0gPE97l/q48+D" "2JElpJSUBKwdBO/749GYBj8vaKiv4MnwF5a+53CCDp7nEwzasG0iNGrlU1cxidIttVDM3e3g" "4tBntNb4vo9SCtd1SaVS1NTUEIvFimEUIt+FbDZ7tGnqxUykKowxMDs7i1IKpVShB5ZlkUql" "SCaTWJaF53l5k223jsOVLfVlobMLm97X3unM2P97WJj0b8jlfhbuyFekAAAAAElFTkSuQmCC") index.append('report_picture') catalog['report_picture'] = report_picture #---------------------------------------------------------------------- report_user = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAt1J" "REFUOI2Nk19oW1Ucxz/n5to0N7ezbmli69+OVTpMqwuyig8TRxGZGObLBo6qBdmDBmEg+iAD" "UdA9SBGczJcZQRQqOlxwmxs1rliEUW5dNiZhdk2XbDFraetiku7enpzjQzShbz1vB87vw+f3" "5XwFgOM4z1XTx87IpZvIWzmeTWaH2NhZEI7jDCqlftPSDfqos/j5QYaPX9nQtGmaQ2YqlcrG" "YrFE+x+nk/YWQMPa2tq6h0optNbr7oFAoAGJx+P9SqmjOjyCD0l58pd1w7Vaja8/eQ93Zpw7" "SlDdHGX08Gf0bt0KgJFKpbLFYjGxNPEVq5e+AQVCCIQQfHBigSNHPqV28Ttqug6mQTU/zbEP" "32mt0TToGsEnJLd/Po8Q4j9VENcmEJE+Hrqnk0wmgx2JsHjjMlI21mxmYGZOJTeFNFrrFkBr" "fJF+Xnv9BQKmwfMLeczQg6R/GEdrFIARj8f7e3p6jnYNv4y14wCqThPw/r57CffHyE6dQder" "2OH7WJ7L4Czdjeu6q0C9ZTDzY7KjS4NuWCilSHx0gr9+n2Bl507SX/yEfRfMrm7B8zRfJpNB" "wPSNjY09atv291ZvtM3fHaX860n69iWYmpqiUryC9Fa5cX2O6NAwvY/vIn3uNO3+Nsr/VPCZ" "bdLX3d29Ytt2oTb57V5xO0Ptz3n69r+B79RBOnt6WdRdWH6TzIyDM32Bjg4bYVo8s+N+3uzL" "xZoZRPa8SvCJEbRqhBjctotb2Qtcmy8QDkeIDgxgWRaDg48hNWSnJxH+TfMtg/T4Xv6+yJ2r" "13nkpQTtDz9JZPtTzM4VKBULLC8v43ke5XIZf8Di0Nvv8spbH+9vdWHNDRpI5g+P8uK5WZRS" "1Ot1pJS4rkupVCIUChEOh5ufSAjR6EKlUhmIZc/OWZsDaA25XA4pJVLKZg8Mw6BUKpHP5zEM" "A8/zGpD/aaPbOp9+oMO/+2bVKxy/unJpQ3WEhX8BK65hjrR8IxAAAAAASUVORK5CYII=") index.append('report_user') catalog['report_user'] = report_user #---------------------------------------------------------------------- report_word = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm5J" "REFUOI2Nk81LVGEUxn/vvaN5U2NIHWnhImohUS2GwIiokJIIEvoDLN20clOtgloXrYVaFPb9" "B8xCKSqrRbhwCI1i+kDDaBq1ZlJmnLlz3/ecFqOWEtHZHTjn8OM5z2MA0un08dKz66P2x1fs" "3Aw9w5ku/q/mTTqd3isir9SGjT6OhRtnOXrr7X9tx2Kxrlgqlcokk8nBhncjw00tgEIUResG" "RQRVXdcHQQDABgLL/NBZjtyc5NzDaepUKVfKBPUB4hQciAOxgo2UpenizzWC+qmR4eaEgoAx" "hhhwra+TmO/9FT+/WGXw4gSx3t7eThEZ0rY+fGNZfPocYww4pc73uHT7PYsVx65EwMdsmeY6" "n3iTz+T0MgBeKpXKZLPZwYUnd1l+/QBVxRiDiqJAJVTq1dDRHlAoCW3xGJXQodUVIX8TnMY3" "lsKTGoGu6NgAlEJlfPInUVXIzoXkC479uxt5+aL4B8GjO5TS90EVVcVVBYAoVL4tO77nI+LG" "8DHr8IzSc6B9I8EZfCyFx2MAaKSgUCoLXqgcO9jCZGaJJScc2reFlnj9eg3mRm5TnLiHOGoE" "EXg+uKqwvaWOk0e2oUCzWrr3J/A9s4HgRD8elh+jYxhjiCrC93zI1XOdoFCuWC7071h740I+" "rB1Y9YE3nhpuSgi4FbdFwvkrbygXywQNASKgIqiCiiJiMOucGIWNHpbPlwc49fgTIoJzDmst" "YRiSy+VobW0lkUisURhjalkoFot7kplH05u3BqjCzMwM1lqstWs58DyPXC7H7OwsnudRrdaM" "YFavDeyMH+5o3tT9tVT9cutDYepfKfyj5n8BSDyAkuHFahQAAAAASUVORK5CYII=") index.append('report_word') catalog['report_word'] = report_word #---------------------------------------------------------------------- resultset_first = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAadJ" "REFUOI3NkjtoVFEQhv8bN3t3SVAkEgJLbCIKYiVaCCIEJEFSKlgEfICttem0CAQFbe3SKBaK" "EEGxE9EuWogxytYikpCoe3fvnjNnHsdKvSeytU43/8x882CAf21Z1bnxaDMCgJnBi768Nd+a" "rsbP3m4vKePqysKh0V/aUMozHJtq4MBEHYEliczd/LTkOF4rJY5U9QTg2CBqYDWU4Y9+ZnH9" "zv59jYWZI3uyngvVEtSqDgUBawSxwTkFAMwuflyeHG9ePjjRgGpEl3QwoOSIIAZiQ0mM6etr" "9yfH8vnDrRzfeoy8NoTC2WCAcwYSQzPP0CE5cXRqd97aO4yNglGUgrHRGsRxAkhu0KeAwIa+" "VzgvvSAKzwYfDI4Nng22Y4IE0KUI4oiNDqPw9mHlzfbjF2vf0axnyBARJCJSGAzouQBiRZ8U" "hbP4+e7xc+vtzsPX735gpLELQQzR62BAlxTEBh/0965fH5w8336/dW/17TZI/l4hOWLhDF4M" "FDTptPn89AU79cyY5GLc8WAJQBxj+ekXRDKYpIlbr+YuWfmEUR++gv/KfgIuv/8gWElNBgAA" "AABJRU5ErkJggg==") index.append('resultset_first') catalog['resultset_first'] = resultset_first #---------------------------------------------------------------------- resultset_last = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAahJ" "REFUOI3Fkj1rVEEUhp+7evdukARRwcUihQgiWln5URh/gJ2FIAQU8gNSiB+NYCM2NoKFqKCS" "JkF/gRptLNUiV6KIkBRusNnN3pudO3NmzlhI5G5gt83pzgPz8M7Lgd2epL7cXdooY+DRvSvt" "23U+92RtWURnrChWPG9uHP//rrHDti9ovDn/cv1+nRsTODnd4uKpSQobhxIMCYwop4+2ksNT" "zVvXH/96uM23rGAl4EQpjRstsM6jwPTBJu392fylB6vPAUoXMS5iRSlsGBLsrS9bEnFe6ZvA" "sXZK12TXzt752iwHlsq1qNKEvtHRAmMU65XewNNI4MSRCVK4+jbv2qmJBlYC3showcA6nCiV" "C+xJoJFEKq+UVSyLKmQNQMclKGzESoQIWZbwId/ky8/+ayKH/nTdhQOTKdGOKbE0DiuBLE14" "t9Ln8/fu4u9nZy6rCdHagPNKrMaUWNiAFeVj3iP/UbzqLJyfBdBK8O5fPzu/MJSgb5TlvEe+" "uvmis3BudpvHKiCiSFCi+NEJvBG+rRRPN5Zm5uo8VoFP7ztEr8Q4fIm7P38B1/L29mMUPyUA" "AAAASUVORK5CYII=") index.append('resultset_last') catalog['resultset_last'] = resultset_last #---------------------------------------------------------------------- resultset_next = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAS1J" "REFUOI1jYBh0oH71iy91K160E6ueCV2AkYGJ+x/D//LiRY+IMgTDgJ9//jAYKnAwivCxVcRP" "vdNHsgFff/5h+P3/P4OMECuDGD97oXvLtXkkGfDl+3+Gn7/+Mbz/+ptBRZyNQUqYPVG78OwS" "og34+P0Xw49f/xjeff7N8OLDLwZNKXYGBXHOaMmko4+wGcCCLvDh22+G77/+Mnz5+ZeBmRFi" "x4/vfxkYvjFeJMqAT5//MHz/9Zfh37//DBwcTAz7zr9juHHzw9qXb/5HEGXAu++/Gb7//MvA" "zsrIcPDce4abN96serXRJRybZqwGfP/yh+H7738Mxy9+YLh19e3iV9td4nBpxmrAv++/GY6d" "e8tw8/KbhW/2eCTg04wViPkd+C/suG02yRoHDAAASER91U0dN2wAAAAASUVORK5CYII=") index.append('resultset_next') catalog['resultset_next'] = resultset_next #---------------------------------------------------------------------- resultset_previous = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAS9J" "REFUOI1jYBgSIHvWg/bUGQ++YJNjIaQ5Zea99u9/GMq///rLiE2eCZ/m+Kl3+sR42Sss1LkY" "P37/g1UNThdE9d+eJ8bPnigvysLw+88/hg9ffxNvQFDvzSXigqzRKuJsDG+//GFgZ2Zk+PCN" "SAMCOm48khRgl1WR4GB48eEXw8dvfxgEeVgYPn7+hdUAjDD4+OPvxS8//jB8+/2X4dvPvwxf" "f/5l+P7zH8O/73+JM+Df/1eBx298WLv30kcGVlZGhv///jN8//2X4d837C7A8MLBRsc/DAwM" "IZ9jjqz8+ulXmKEGL8OPX/8Y/n0l0gUw8HyJTfjNS28WnzzzhuHnr38M/3+SGI0MDAwMr7a7" "xP213PLv15ff8f9//sOnFD8Q0N8wW8h4y3/yTaAlAADYf4P5BP7YMAAAAABJRU5ErkJggg==") index.append('resultset_previous') catalog['resultset_previous'] = resultset_previous #---------------------------------------------------------------------- rosette = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAi5J" "REFUOI19kU1PU0EUhp+5H730VkmBNCC6sNiwEE1IWYFxYaIhujHRxAVbEn+B/ghd+APcunTh" "jp1ujInGjwRNpYbQBaRoC1iFUnrvnZnjoiDFCieZzHkz8z4z5xw4JuIwfBD7fpRMTe0lcPO4" "e163EEjrsbEtKpW0c2MW+rOQ8pBafUGfGcGUStWg1Tp3LEDDI2eymOb2XWjuQroPPB9mb6FO" "ZVDanN3+WrrfH0VPDzzqIEkymcfq/IWHauIy4qeIKhXiJEZZwfdcUmN5VBiiXzyPTaMxk4GP" "RwHj49q5c89lq0F7cRGsxRcBsYi1WKXwL00g39fZqa5uDi4t5QCcv/UvLzcpf0M26iQ6wbcG" "xxwuSWJUu40ZHqZdrUYHvkNAsQhjedRAFtdalLFgDRgD1qCMRfb2oLKCbbXe9wBYWzuN1qDA" "VQ5iDWLM/m47DRsdwRYKeIXCTA9Aw0LrzWvET+HnhjCANgZtDEaBV5xkt/aDrXdv2S6Xn/RM" "AeB3LvcquHL1mhekUQNZqNcRbWBoEJRi89MHml8+Xy8Y8/K/gE242HbdUjA9QxhmSOXzxMsr" "RI7QqtdI4ljny2Wfk0LC0Ox6nlQdR1anp2XJ82QjCKThOBKBOdkcBPPiumJAIpAmyL96G+a7" "PUdKEIgMpAydpxJYDwELo6bTaCzEWQh6piAwZyFlu8gePLPwrEvjQWoH5np+oOEn4Am0FAxb" "iH3I7p/9ogOvAaGA7oNBgD9A9Q6gr5WvHwAAAABJRU5ErkJggg==") index.append('rosette') catalog['rosette'] = rosette #---------------------------------------------------------------------- rss = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAadJ" "REFUOI3Fk8+LjVEYxz/nvO+bq5CFNElZmSRxlaT5B8RqGguaRMmShRUW1CxnpywoZWFjYdSd" "Dc1Ckx1lotgp5UcWVjR03fv8sjjvvWXYjXLqdJ7z4/nU8/0+J6VcsZ6R15X9LwApHnTj71cO" "4qAC6iBDUCtnBgwDBlADsHt2Ta7/Ps3BrMRibazw9H4LAFj9DO6EtQ9UCVMQJVTKXoRQBRWa" "7XugHyNAQAQcukpqNhOvbhNm5APnQfvY40vkYzdITQddnic+vgSRFqBaaguHZgvxbI505DrJ" "BviLW2BOPnwB5AeyeJFq/yn0/coYkBEpAA/INWzaBa7Et0/kqSvkg+fwt0ukbZPUJ+7gH56D" "lxIZBJn+z1Kfe7Fl31ni3RIMV7GHswRB3juD3D2Ov+lRH50rYqq1gIEWmju44Cs3SZPT8P0L" "1cw9Umcr9nqB5kyPqnsSfXStBSgIpJjfEXRPE3wtqqsSUpQOadUfuaAKZoQZGzbuhN4TavoB" "IiTrkEYWmhXvoxU3O1QGKaD24ti4Ey9PBBLjzsIChmtWpXSf/9m06b//xl+3YBRtpjmYigAA" "AABJRU5ErkJggg==") index.append('rss') catalog['rss'] = rss #---------------------------------------------------------------------- rss_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhZJ" "REFUOI3Vkk1IVVEQx3/n3PvqlR+VhFgWQWFkxEvBJCRoERJRGNimJIgkCiQX1cYIAqGFLoQg" "sLBF0KIWkaQgUlASiVQkWuQmgyjDpAiSV9x33/mYFvclGC3cNnCYOefM/OD/Z+C/DyX3auTf" "Xx6MB2vAejB5sC55c0BeIIYQgKqWv2b94uM8OJfUxhVqC0/vFgAA2VnwHnGFBmsRZ8FYxJrk" "bgxiLVhDqnwbRPIHICACdRdRqRJk8gbiHHrnKbARbvgc+sBVVCqNHelGZibAmALA2kSbeEiV" "Is87Ubsvo1yMf3UdnEfXnwXzCzPQTpA5iv04vgDQGJMAvIAOoXgTeIvMf0Y3dKBrW/HTD1Fr" "txIeuYn/9AJ8IpFYCIlyiT7vUYDacQJ5PwTFlbj7Lej9PejtzQz3NTPii5iPfmIiTWP8hWOx" "EBLbhOY9eIMfv4bedR55N0TQfBucYXCwk8myNeytrmNDWRUjUw8YePuMb6UBSrrXCzXHEX4k" "rluLmMRpMYn7Z+ZyHD54CAJNU3U7PY9PE6Dp7x9EEwkYg8ql0bkV6HglgSkisKWEsppQyvia" "/U5KFdNU3Q7AhX19bCnPkFcQEgk8ubOwWTiB/OKcrUwzNTvG69lROhpv0fXoJOlgOcsE1FL2" "vb5t3ZWNm1ddasjsoaqilum5CcbejDLzYb5nSYAEUtGFUm0KSgSyiPS+7J3r+A23vyFchU4N" "ywAAAABJRU5ErkJggg==") index.append('rss_add') catalog['rss_add'] = rss_add #---------------------------------------------------------------------- rss_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgNJ" "REFUOI3Vks1LlUEUxn/z3rmlaB8LiSxMXCRRUQYm0T8QtrRFIUEQRdAX5EoJRDeBiyBoYdGu" "RS0iqEAikTIyKkiSNkJflOlFsCA1vfd9Z+acFnMVjBZuGxjmzNcPnuc58N8Po/ea9N9XAk7A" "O/ACLgMf4lkAMoUULADb2//6KytnEAgh1i6Uaw/P75YBAPMFEEFD+YH3aPDgPOpd3DuHeg/e" "kd+0A4q6BFBQheYuTH4dOnYDDYFk7ynwRcLjSySt1zD5CvyzPvT7O3CuDPA+alOB/Hr0dS/m" "QDcmpMjbfghC0nIe3ALu4QVye47hv40uAxKciwBRSCxU14N4dHaS5GAnyb6TyMcnmJpG7JFb" "yMQbkCiRVLEUS1GfCAYwu0+gnwageivhfjvJoaskO9uY6G6h8GWGhekCtsqyrfE3DaliSX2k" "iYA4ZPQ6yf4O9MMAubbbEBwTN88xm1bS1H6RtQ27KL4fZHxkCFvKMNq3RWk6jvIruu496qLT" "6qL7rx4M03y6l8rPwzA1Ahs28sPWMz74EktRwTlMqMAsRRhCzF6judlciYrNDXC4Yzl121NL" "JloGPL2z3FkEhWzlmreGxbEBqh6dJS1OswjMz+WwuQSzmn5/cbS2Z0111eW6mmBtMsn8jOfr" "dC5kJeleFSBC6joXfxbOJGLqJdEpQftbh+TKH6KTMSLR3i+fAAAAAElFTkSuQmCC") index.append('rss_delete') catalog['rss_delete'] = rss_delete #---------------------------------------------------------------------- rss_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgRJ" "REFUOI3Vks9rz3Ecxx+fz76rWdtEi8VMVpOZHyNjWQ6Ict5tlyFHqdkBJSVzcJFQ/ANy4DAH" "pCYUWm0zrbSYWvthcnCYfef7+Xzerx8O3+8UOezqVa96/XzUs9cL/nuL/EGr/7tlEAwkgBiE" "DESLNQUyhxRyADR1/bVrf7oaqBbjoKVY4NX9EgBgYQ7McC0NiOAqEASXUMxDwEVAAuVrtkDB" "lwAO7rDnAlF5Nf7+Lq5KvPMUSAF92kN87AZReQXy4ho+MwohlAAiRW1uUF6DD14mar9EpCk2" "fAfUiPeepvdJF/k0z80dvcRTI78BMSEUAeYQ56BqI5jg87PE+88T7zqJTTwjUaG+tpnjQ31k" "JiACqZOjkBT1mREB0bZu/PNjekZv45aRuZKJsG5VE811+1hIFumcHaQ/rGdF6uRISzQzsICN" "3CJuO4uMXOdISzfqhppiOHPzM2yv7yCfFTg43c+AVZKj4JAGwLCBMyCCPjpBIhnqxtT3CYIJ" "YoGggR/pAq0bDpAPP2nb/boECIFIK4iWTqhKIgmiwtqaBsQUdePr/DSrq+p4N/OG8ckhHo6t" "JPJzdU7w35+FOmTQ2VFFkmVklpFIRmNtC+2NRxmefsvYhwHujVezOSkjWu7Pb70SLbY1HKp8" "+en5lxBxeK6Pj8DyAZsusqheVpmijd+uMrlU/wVIBEUx1B4tkAAAAABJRU5ErkJggg==") index.append('rss_go') catalog['rss_go'] = rss_go #---------------------------------------------------------------------- rss_valid = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAilJ" "REFUOI2tkU2IjWEUx3/ve+/NJRcjZnxcX8UkxJCGWBGNjxIjH42JkiULKyyI5eyUBTJZSNkY" "zZRGMyXZiDJRbKQ0zNCwmmnM3Hnf53xYvHcUG5J/nU6nzvk9z/mfiH/Uzvbth0TCzfhvmo91" "Hygfvt+8dbLe0b5tXwjpvYV182uiPw23dh1aHtKwOgnJgxCsKSQTxVS1c35tXa5/cGD0jz9I" "RWqSNOlYNLcchzTtTc26lpYX5foHB0Zd4g3Rw959DmDumBpqhqkipmgqaAj0S8yb4mxmlkp8" "Hx9n6MtndskYJTHye0c+wYqWX581+zXUeDb8lcsf35Iz5+6yRsr5Ajy9R/7n0OgXMMNVQRVE" "cBUIgktgkwjt02aAKHVD76B2JVR8EuDgDhsvEBVK+OsbuCrxulMgFfTRWeLdV1lcKCJP2vCB" "VxBCFSACouAGhRn48ytEmy8RaYK9vA5qxI2nIYwRus6QW3sU+dj3ExATQgYwhzgP05eACT4y" "SLzlPPH6k9j7HqI59eQP3sI+vQDLViRxYioT2b5mAERrTuAfeiAdRTtacJx4VTPh9h7sbSf5" "piuZsaJVQCIZzQwsYH3XiOr3w/dv5JrvEBVnoW/uUzjeSa7hCNJ9sQoQCBB52wKnoRVnOHNd" "BA8CEvAQsloms4AqrsqUqWXofEyeikMIRFokmjyhKqiBV82NDXIKkUPesotVFfm5eU5wSB0S" "QB3S37IASmb0/9YPixtZ9HWy7QkAAAAASUVORK5CYII=") index.append('rss_valid') catalog['rss_valid'] = rss_valid #---------------------------------------------------------------------- ruby = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAehJ" "REFUOI3V0k1LVGEYh/HrOefMjDo6OVa0EdsUgRKCYQQuJJ3Idq4icdGiL1AJ0keoVZBBi8BV" "Kwl0ZUaUUCBmNIwoZum8pVNqLzZN48w5z1sLIXqxD+AP7s29/V+w7wkAe+P6oMG5A9YFsMqA" "1lilsUphA7l7UmGDAHypdBBcbXgy9UDY4aGLxhGjztlElIYYRKNQVwdSYrY22S58wNEazxi0" "H/CjsgNft2mcflG2vhz0jCOGneMnogQSCgVobYVyGdJpmJ2lUirhKkWNtWjfZ6tYJNrVRbWj" "PXr4+cxdz7H6illeui8+f+oUzUehvh5aWqBYhGwWt1LBtRYX+FatUtfbS3g1Q/xVaoNADTni" "1u15x62eN+vrj8zKO0ilYGMDYjFEJELYWsJCYIzBJhLUrGZpmnudQfoXGt8kxxwAcfPetot7" "Sb1fm9QzM5DLQSgEtbV4UhJSCtXTg7uS4cBcMmP8oD++NJ8CcH7NMTLyPez7A0EmNynHJ3af" "8TieUniJBJW1ArGXyS2U7G96u7Dwx4y/s319sR3ch96pjnOhk23ofJ7Sx03E42dVAjUQTy9O" "/NPB38rd3c1a2unImdPHjDFUpp5WrdSXD6YXx/YMaS9f2jvbhNajNpBHrC+vHcovj/+/x33t" "J5W09M31esPXAAAAAElFTkSuQmCC") index.append('ruby') catalog['ruby'] = ruby #---------------------------------------------------------------------- ruby_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAm5J" "REFUOI3VkstLVHEAhb/fvXd0dHRSoydiRkiZlGH2oCAolcxFtIpACqqdEUSC+Ae0sCCiCIOC" "QgiCaCEtzAoSswYZTRxKszJHTc1X2cx45859/lpELRKhbR+c7Vmc88F/jwCQjRdrPZQbIFUA" "6XjgukjHRToO0rJ/xXaQlgWm7biWdSH7eft9IRvqj3uKuKscrAyQHYRAADIzwbbxZmdYmJxC" "cV00z8M1LRaNJHxfIKejS5emXat5imhQijYHsGyYnIStW0HX4fNn6O7GSCRQHQe/lLimyWws" "RmD/flJlpYFVL0M3NUW6Z72hwTtifm6XyN8AWVlQUACxGESjqIaBKiUq8COVIrOigrThEXJ7" "+qexnHpFXL4WUdTUYW9i4on36SP098P0NASDiPR00qQkTQg8z0NWVuIfjpIXfjOCbR7Jed/3" "UAEQTbcWVNQTzviXNjcUgtFR8PkgIwPNtvE5Ds6hQ6ifRlgR7hvxTOtY7mCk/88Lv5G1tUHD" "ch5oGwtrfKdOIltaSPb2otXU8Fj/QDgYl3FMEddjiYXFb1eeXn57SfAXsro6mER9pO0sq/Jt" "K8EdG6PVGGKwBHYWl5OfV0THQCvd77qIDs9fVZaI0d4ex1g8Y3Z0DtvhXpyvMzzRxtmxpRRX" "cSldV4UrbPZu2wfIc0sKAAKdnRO2bhzTn70IJ9uej80a3/GJLI4WnwegvuI2m1ZvRyD82nKK" "roz0DAB7APbG1hsDUyF/ZOoVjVX3aHp2Gr+ajkSm1H/QnfXlWRkJa+5A4ZpC5pMTxPRZXke6" "iP8wry8ZcTl2161tQog6AdkSEkjZHG6ebvwJPGYuElE4ldcAAAAASUVORK5CYII=") index.append('ruby_add') catalog['ruby_add'] = ruby_add #---------------------------------------------------------------------- ruby_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlpJ" "REFUOI3VkktIVGEAhb/73+uMOj6DyIUPhCzQRDCswEDSiXTXpoe4CVq4rSRx1yai2gQZuAha" "tYqwNpqPwNAQU5TRhVrqjK8xNUcdbZy5r/9vIYj0ALd9cDZncThwDvz3aACq5V6DRDwHpQMo" "R4LrohwX5Tgoy96X7aAsC0zbcS3rTnpv12tNNTddl0J7JS75faRngM8Hqalg28j1NbbCKwjX" "xZAS17T4Gd+DzS2y+gZiyrQbDCm0ZlF02odlQzgMxcUQi8HcHAwNEd/dRXcckpXCNU3Wo1F8" "lZUkyst8x/sHXxhCubfl9ORLbeNHhZZbAGlpkJ8P0SiEQujxOLpS6MB2IkFqTQ2e2SDZI4FV" "LKdJaE+ejQs9cUUuL3+QM98gEIDVVcjIQPN68SiFR9OQUqL8fpJnQxwbHg1im3VZU2NvBID2" "uG1LR7/pLC51uoODMD8PSUmQkoJh2yQ5Dk51NfpMkMzhsaA0ravZk+MBAHEwR2vrjsc0663g" "fKf97v2+mZ2N4TgYfj9rX/sIf293R09MFI7kTXZ0+UXLwYyHUbW1GXvob42z5ZeTSktwFxYI" "zfSTSI9Q5L+Gt7CE+EQPkwM97vb09N0/AgBiVVW5rq36vBfOnZRSMhRoU+fvP9RS5j5B+DNk" "ZrFhFDDaPRD658MiZRUlm2fKv0ROlc73VhtSjrarw2w9yFG91Yb8a4Pf6fbrS5X1t3J9ix2Y" "8VX2gN0dnak5wvpRAhorcjI311YuCo8ubD1GNKIIrgjXddTTIzUAGLiR17IXWWkUUiuQQoUl" "qq3uo3z0C3SsNh9uq7scAAAAAElFTkSuQmCC") index.append('ruby_delete') catalog['ruby_delete'] = ruby_delete #---------------------------------------------------------------------- ruby_gear = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoxJ" "REFUOI3Vkk1oFHcYxn/z3yXUmWwSCdmNsGqIKcVACe2iQnMqFARBsJekasBqWi9+UCKEXnMK" "PRUaL9IPQWrbOIKSpjWwQqEVMSglKcGEbHezIdllN24aZj9md2b+M/8eJIVE8N4fvJcX3oeH" "53nhf48GoD4fORsgvgIVAlAyAN9HSR8lJcr1Xo4nUa4Ljid91/0skpz5XlOj1wYCoX0n3v/A" "INIChgG6Dp5HsFFkK5dH+D7hIMB3XKp1G/7Zou23P2rK8c6GA6GNijffMnA9yOWgtxdqNUin" "4ckT6pUKISl5Qyl8x2HDsjD6+2m822d0/P74elgofzhYev61VnpxRIsfhOZmOHAALAtWVgjV" "64SU4tmlS7hKcWh+nqa/M+x9OlfAldeE9sWX8yLUOB6srz8IUsswNweFArS0sHbsGIuXL+PG" "YjQZBrqu421ZzB09Ih9e/PhR2+Kfd7TtNNWVKy1urfZjqKPjROjUKYhESObzdHV1kcvliMVi" "CCHIZrPE43Gmp6ep1+uG+K+OiYlyk+OcdjPZX7179wHYn07TaDQolUqYpsnU1BRSSmzbRtf1" "m2NjY7bY0ent2+U9Feu099dC8pdslkoiQTQaJZVKcfWne41Pb9z6cHV11e7s7KSnp+f8+Pi4" "2iEAoM3MlKlXL1iWxebmJo7jEI1GCVx5bm964b5SyqtUKqytrZHJZNB2C2yzODj4XrEzfnfP" "mYF91WqV5eVlW0rpdXd3t0YiEUzT/Na27dFXHGxzeHLycfadt/cBFAoFEomE3tfX11oqlRBC" "AAyXy2Ur/Lo/z+fz38zOzn7S3t5+0vf9n4vFIktLSx8lk8kffN9/aJqm/7r7HYyMjKihoSG1" "e/8v1uBEP8EJfOMAAAAASUVORK5CYII=") index.append('ruby_gear') catalog['ruby_gear'] = ruby_gear #---------------------------------------------------------------------- ruby_get = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAktJ" "REFUOI3VkU1LVGEAhZ9773zojJoKtbJxkRJYEilF5ULSkWwRuIrCpX8gEqI2LVpVBEJGLYIg" "aBWhEWVRkGlgYiQjhpWj46ijztjHNNn1frzvvW8LQQpcuO2BszmLhwMH/ns0AHXxfKePfhOU" "AaCkD56Hkh5KSpQrNiIkynXBEdJz3XOlr1480NSF7tO+rt3Tj8ejlJZBNAqRCAiBv5ojv7SM" "7nkEfB/PcfltrcOPPOWDb03liM6Ar2sX9Nq9UVwBS0tQVwemCbOzMDqKtbaGISVFSuE5DquF" "AtGmJuyGA9GdwyO3ArryuvzPU3e1b18PaVXVUFICsRgUCjA3h2FZGEphAD9tm0hrK6GZFBXv" "E1lc2a1r13omdMM+4Wcyz/3kNCQSkM1CWRlaOExIKUKahu/7qHicopk5Ksc+pBDOyfJP4w91" "AO3qnbyBcUYuLA54IyOQTkMwCMXFBIQgKCWypQUjmWLH2HjKd9yOiqmJBIC+eUdv76+Q45x1" "U+kB0f94o6yoICAlgXgca3GJ+8fy4tLlPYXKL5OT/9z4N6q9vWwd41GgsaEtWL8Pb36etZUc" "PXULStVUa1IIpjOzib6uZwe3FACYzc1VnlCD4SOHawQ+V/bPq2AsptXsqsX1BIlkgmR6ZnrZ" "/F6vbyWIDg1lhGl1mC9fj/XsTtorRb60bQdbutjSIRwqxlq3YhEn9GTLBVtx6nabam1sxfVc" "3rwbJpvLHR2/Pjka2K7AMm0s6SA8QXYly/iNj6MA2xbYpk3f036ELXBdsdn/AThoNNoF6L+Z" "AAAAAElFTkSuQmCC") index.append('ruby_get') catalog['ruby_get'] = ruby_get #---------------------------------------------------------------------- ruby_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAltJ" "REFUOI3V0ktIVHEUx/HvvXdGc0bHlOxplkZEChWREFhI2XvXogcMEdS2RRRJi6JFhbUKImoR" "tAqCaF3S27LJnkwbe/pIxxjfjTrOvf9ni7BFVvs+cDZnceDw+8F/zwGwx4/EDe5FsB6AVQa0" "xiqNVQor5M+RCisEBFJpIQ4X3Wu+7tjGo7uN61xzN2yKUhSDaBQiEZASM9DPaN83XK0JGYMO" "BBO5SRgZZeajp1kbyHjIuE6ju3RZFCGhrw+qqyGbhY4OaGsjNz6OpxQzrEUHAQOZDNG6OvzV" "K6NlTxKXQq7VB82H9qvO0GCtU74ICguhogIyGejqwsvl8KzFA777PpGGBvK+dFLyKplGqKOu" "c/7CO9fzt5pU6o75/AmSSUinIRbDyc8nz1ryHIdTu0Zo2jeK19lB6cs3nchg+8z3b2+6AM65" "K6Me3l7V03tbJxLQ3Q3hMBQUEJKSsFL4VlE+azknaxP0FAZ7StrfJX+lMMXG47GcUDdClYt3" "HFuZwBqB0AqhNfNLl7KifB0vux+STLUZGTbFLYcGJxx+Y7dti03i3WqMD23eXLMfbQ3aaAyW" "dCZFSXQ2zzvv86anxRgnKA1NK0Zz81i2vv6Ar0Svtoavw5+RRqGMRGrJWDDOqoXrmZCT7ouu" "1mH3T+2KtrSkfOWjtGJOrIK5sUXMK64i7BVQVrSAt73PaO1oHcxK1kx7YcrOy5XGFwJhBL4S" "LCmrcdZWbeF1T4L7H++mhaYh3UT7Xw/8rvq0k62t2Bh5/OlBn3Ro+HaGj9NS+JfKE2S19SIB" "uqr/LF1T+x/roThGhqNPmAAAAABJRU5ErkJggg==") index.append('ruby_go') catalog['ruby_go'] = ruby_go #---------------------------------------------------------------------- ruby_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAndJ" "REFUOI3V0ctLVGEcxvHv+57jbUZNy1LMsiIrkrB7koQIRQUtWpXpJioICiIKrFUkrVoFFbQI" "AskgrCgISrpTUdJFCryVd1PTaRqdy5lxzjnveVsELUr/gH7wbH48fDYP/PcnAPTpE7Ue8iJo" "A0C7HiiFdhXaddG28zuOi7ZtSDqusu3jWY+bG4WuO7nHk+KarNrqJysb/H7w+cBx8ALjTIyM" "IpXC9DxU0iaWiENogpznryyddGpNT4o6WbLcj+3AyAisXAmWBb290NJCIhrFcF3StUYlkwTC" "YfwVFUytLfPPffnmsim1Ouh1dVwVwR8bRFExZGbCwoUQDkN/P0YigaE1hoDQsglmby9Etb1l" "zovvY9juSSnOX/gsjant3vDwQ6/7K3z6BGNjkJ2NSEsjVWtShSC2YJKc6o0U7a7DvznFGy+P" "nMvpbG0yAOpff5iq31R+3wkGywiFSmRBAWRkwMePOKEQdrGFUbOEnNItWN/eIVLyhJ2pqnbO" "t/vlnzkuXYqkJpP77L6BB87de7+fubmYrou7Lp9Zq3ah4t2k5xVi+qCwcrVvcWnRFfH3rnrH" "juw4xm1z3dptKatKUYODjKkWcveWI41BhMxAqyA4cToah2L/AABWZWWRcvRzKlcsjZWMo9OU" "zlo/W5hyEiGz8Bybrptfpjq6wgemBQD6zq45JTLTz+Tv2e/T9iOEitL+MGwZERUzhKCtZ/xo" "bcPQHXMmwCidV51fUeOzg1cwzVl0PrXire8Dx/KjkVt5eVDb8DMKMCMgpbCFMYKRNpf25mDs" "c2vgyOEb/df/7s0IjA78eBIJP1tkTcQTPV8DdYcaepum6/0Ck8wjSNVpF28AAAAASUVORK5C" "YII=") index.append('ruby_key') catalog['ruby_key'] = ruby_key #---------------------------------------------------------------------- ruby_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArlJ" "REFUOI3V0c9rHGUAxvHvvO9sJskkm92yIXEIu7BgxcYgWgSh6mIaqfVURSSyF0EUKTlIC8Wb" "NzVgkYioIHjyVMGABxU9SKqEtpKSHmwk2ySbpDNms0uTtZnuzo/3fT2I0vwJPvBcP4fngf99" "LADzzrmqRnwMRgKYVINSmFRh0hQTJ/80STFxDFGSqjh+e/CnH76yzIXzr2hhfSmenXIZzILr" "Qn8/JAl6t8GeHyCUwtYaFcUcdO7BnT1yP/8Smiip2lpYF8SDD7nECfg+HDsGYQhra3DlCp27" "d5FpSq8xqChit93GPXGC7uOPusOXFz+xhVGv6z9ufmG1mk9YYyUYGIBiEdpt2NhAdjpIY5DA" "frdL/8mT9NxaJ//b8g5xel5Ysx/dELJ7St++/b2urcLyMuzsQDaL5Tj0GEOPZaG1xkxN0Xtr" "gyPXltZJotO5leuXBID1wWd7Ejmdbm1/pxYXoV6HTAb6+rCThEyakk5OImvrDF27vq6j+Ez+" "5o3l/174N6Zazbai+NLS2Nip370HyBcKtFZWODM0hGo0+TZjq+FHxmUQBHtBELxfq9U+lfcD" "Xytlrg4OPjZw/PiTr1areJ5HdnSUy2trbLf/0i/MnNXlclkWCoW+OI6fq9frGft+wHGc50tH" "j7729OQkn7919t5SEvWPeh4TExNsx7H48OJF4fu+ymazP87MzJze3Nx88xAAPJXL5RyAl/7c" "febXHnF1+ty0zOfzHBwc0Gw2mZub6wghXgbCXC7nHAKUUhu+73eB3ne94ffU/r6enZ2VrusC" "EIYhUkonk8nMA/i+3z004vj4+MPlcvmbSqUyWiwWtW3bRxqNBqurqziOQ6lUYmRkhDRN72xt" "bYmFhYWdQwAgK5XKhOu6857nDTuOI40xotVqvWFZll8oFOaBTBRFKgiCZhiGL/4N/BtBEDH6" "65MAAAAASUVORK5CYII=") index.append('ruby_link') catalog['ruby_link'] = ruby_link #---------------------------------------------------------------------- ruby_put = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAldJ" "REFUOI3VkctLVHEcxT/33plRZ3TSonf0ICsw8FFIgURoA5mLaFMYUov8Byoj+hOKiCCKFkEQ" "FFGLljUQIVaIqclMpIVOKuXkZA8bdbz397j31yKSHgRt+8B3c+AcvocD/z0WgDlzsi3AvgTG" "ATA6AN/HaB+jNUaq76c0RkoQSvtSHi97mLxpmdMdhwLbum43JmKUxSEWg2gUlCKY+sB09j22" "7xMKAnwhmXPn4cs05Z1PCkaotlBgW6ftTVtiSAXZLFRVQaEAb95ATw/u7CyO1hQbgy8EU/k8" "sYYGvG01saWPuy+HbOO3B6+HrlmfPtZba9ZBaSmsXQv5PIyN4bgujjE4wFfPI7pnD5HMKBV9" "qRxSd9jWuYtp2/H2BhMTD4KRYUilIJeDeByrqIiIMUQsiyAIMIkExZkxFvc+H0WJfeWvBu7a" "ANbZq9MOTqt+++6+390N4+MQDkNJCSGlCGuNbmrCGRllUe/AaCDkgYqhdGphhR+Ytra4K/Xt" "0Ib1LeGjRzA3bjDf30+opYVTdYMoqZFSoTzFzdZ7FoD9y6a3bs2UzOYPqxcvH8rbd2D7doqa" "m5nPTiI8xe71jTRubMKdFwueXwIArGRyBnfumOjsyqjefvTkB0g+8oQrEFrgao9iq5jEhYad" "f1T4mc819Vst379+pX119fDykLMsvjJcuWoz0peMZcfpS/V6wtNdob8FLEn3DQI7Dq7eGPHn" "CoNeRFQK5SF9SW4qh1sQb72ov/+vH/xO4vyu9IolK6qlVGRGMqmBCy/r/tW7QP2Z2me1J6qe" "/qx9A7BjLmT4K0wxAAAAAElFTkSuQmCC") index.append('ruby_put') catalog['ruby_put'] = ruby_put #---------------------------------------------------------------------- script = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAp9J" "REFUOI1V0z+IXFUUx/Hvuff9mTeTzJtsXDfIkiVWFkHRIrqCRPBPI9hZiCCWlmIK0TZ1IE0q" "S00TrSUkdkHQQBqbDRJMTHTZzc7sZP7Pu/fdeyxmdlwP3OoePvecH1xhWZ/eeHxBjF59sVNs" "T31k6iM+RqZ1HIjqSIWuIAGlD/Qw8bu8272VHAEa69dffv7E9qWL6xyviYvl1MWyPw+bzsOo" "Cjzqjvnpwfi9WXvtixUQ6nqjnQkAT54FUhESAZtAnhrO5gZrDKmFVzcLXihba9/+9s8VswKc" "b7cSqCOMnDDw8KyCwXxxejN4Og4AfH39MdvnWpxfz9ZXE0Tv105mhkkFk3nAGCEBrAVjwSJY" "gQhIGPLrn33u/TXYXQG1rzbKwjKY1UwrxRjFGjBBsAYsirWAWvaHFVdvPxii8tl/GVR+a6Od" "MpgrNYCCDYJRICyARA1RIaSBpIrnfrj05qE5NsHWmTJn4hQxYEUwgAFk2SMKqlBXFX0/CSzv" "+ejKjUJCneWpwQUwKBBRIgEloihgDPgQGE8m9c9fvTtcAf2njfVcwCxDQhevGgTRZRNCkUJv" "XFFXbh8RXQHeu2ZCJDFgjYAYUFlgAjEKKDQTw0F/RnBu92h1c/HL68/V9fzyhZfOsjdUHu0H" "DkeBiYOgioiSZVA0oN2E3nCKd9X+EZDMZ9U7RvWDezsP6c8SxpXig1J5wdWROkSiKmtlyefv" "n2GvNyVU/mAFRO9e+/DtV4pvPnnjf38gKPiguHqRybWbuzRTGI2nhNr1jgH+4V53wPe3d+ic" "KOi0G3RaOWUr52QzI88MeWL4+K0N8gQODkcE5/9eAbjqxzt372/eubuzJSKngdOgpxQ5hWpZ" "5FnaaKS0WwWddpPf7z/5Axt/OQL+BQBSS+DT6kQRAAAAAElFTkSuQmCC") index.append('script') catalog['script'] = script #---------------------------------------------------------------------- script_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuJJ" "REFUOI1Vk01oXGUUhp/zfffOj6kzTdoYI6FpRaGCNf5gbIpQpYYiSncuRBDFZTfFLJrqsi5c" "WKgIXejChWRTXYgRwVoo+EcUu6gaq1BrjRrTYdLJ/N2Ze7/7fcdFxlhfOHDgPTy8vHCEgZ4/" "uzItRk/fub08k7hA4gIuBJI8NEW1rUJdEI/SANYx4b1ivX4u+hegIX/kvtu2zcwdHOVmdbNQ" "TbJQbfT9ROagnXqu1Tt8cqUz26uMHNsC+DwfqxQEgD82PLEIkYCNoBgbdhUN1hhiCw9MlLmj" "OjTyzjd/nTJbgMxVhiLIA7QzoelgI4Vmf3PWe1DreABOLKwws2eIe0cLo1sJgnMjtxYM3RS6" "fY8xQgRYC8aCRbACARDfYulqg4u/N1e3ALlLx6plS7OXk6SKMYo1YLxgDVgUawG1XG+lnP7s" "SguVF/7rIHWTY5WYZl/JARSsF4wCfhMQqSEo+NgTpWHP+3MHbpibEkzeXi3SzRQxYEUwgAFk" "cCMKqpCnKQ3X9Qx8njl1tiw+LxRjQ+bBoEBACXiUgKKAMeC8p9Pt5uePP9ECiAAatdJopQpm" "UBIKImAQdLBf/nWRX65+TDtpMCyJPTx//NVP4bUIwLnsloiYyIA1gg8CqpuNC3z/8wesJ+d5" "/NGHmRi5mwvLH8rSj2snp4+ObzcHX17Ymef9k9N7d7HWUq5d99xoe7oZeFVElO+WF7h/7xTe" "eKbGZ/Hi2L/vAKBHo34vPWRUn7p4+TcavYhOqjivpE7I8kDuA+3m38SyjSfveQmAuUNvs/jD" "GYSPSlFw2YNHHpsqv/Lc/v/9gFdwXslyOHKiyfLq11xa/ZL52Xd5/dyLlGwRRft2fN/hu4ar" "Q0+vtx0rtS61Vp9W4nC5Yo2hEAvep3z+0yK7x3ZTT/6k2a3x1aUvaG2kb8pDz76x00t0DHRS" "RHYAO0CHFRlGtVouFuJSKUYKF+j5JYL2AUlUw1vfnlmb/weDE2uIg356XgAAAABJRU5ErkJg" "gg==") index.append('script_add') catalog['script_add'] = script_add #---------------------------------------------------------------------- script_code = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwFJ" "REFUOI1V00toXGUYxvH/951z5swlc2YyaYzU0NJs6iXU2mLrLErFWl0UXFukta6qC0F0Ibpx" "IS4L3Qhq3WlAiuBOxShog2BqiyDUCTaYmrFjJplk7pfzne/iQjPUB57tjxdeHsF/OX91/ZiQ" "7vJcMVMeJJZBYkmsZaBtWzjXdYKGQBgcTWAbaT8JG41v/F3AWX380H0T5TdOTnNv+soWBsoW" "miMzqxLoxoY7jR5frvZOD6PSa2PAaD0TpQQA1ZYhEAJfgOdDGEj2hRJPSgIPHpvNsLeQK11Z" "vntJjgGVRD4ObaGrBO0EWjG0R/92ewibPQPAWwvrlA/kmJ9OTY8vUErPXKsaljbqvHK0xEe3" "OgSJ48LhiIm0xEPgCbCAMB1++qPJzT/bNQnw8DvrpVgWni3lfUQMg9hhlSOfFVxZbrPZMfRj" "Sz+x4KDeibm8uNoxKrkgD7239vzh+fDuwQeyhZ0dzfkjERo4M5djY8eQz8HHN1r8cKvHSAus" "AxMY/Fgf+OLVxxflg3Phh/vzXvrvVsLFY3nClIeQUMr6nN6Xo97W7M0JlmsDjHY4BzqOaSZ9" "AyB/udG9eLsWj0qBxwfXWtRbGomj1U/4qtKm6Evu1BVH96RJBYLEGHr9vv72zac7APL2pYOf" "VX+rHF+pNEiFgoXvG+Dg6s8toqykvaV4qTxFeT4iE8B2L0bHqo4QDsAHSNuWmpQaOnmMcyAk" "Rhs6m4Zzp6bJpDxwkPUlW80hRqna7vf8k68v7NF69G75kYc4+9Qs31UUO13DiydmSAeOwAff" "g5QHURZWqwMSFdfHwGgYn5LOnblZWaM59OnFjsQ44kSgtEUbi3WOUqHAy8/cz8b2ABMnW2PA" "JurIc08+mnn7hSf+twHjIDEOpQEH739dIxtAtzfAaLV9D5CsbTTafLpYoTiRoRilKeZCCrmQ" "fDZFmJKEvuTsiRlCH7Z2uhiV/DUGUPHnS9dXZpeuV/YLIaaAKXCTDjGJc4VMmArS6YAol6EY" "Zfl1pfo7nv1xF/gH4At8dsrYI3UAAAAASUVORK5CYII=") index.append('script_code') catalog['script_code'] = script_code #---------------------------------------------------------------------- script_code_red = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAw9J" "REFUOI1V001oXFUYxvH/OXPv3MxMnJlOk6atQR0XdmGtVNCYRYyg1YXgVkuL1HShC4VQW4La" "nR+LFqEoSoIbwRaKFEQkRYwupBG1kAoumqih1U4bms6Mkzsf9+vcc46LmqE+8Gx/vPDyCP7L" "S19ce0xIe+r+cm48UIZAGZQxBKnxhbUdK2gIhMbSAppI87nXaHzrbALWpGN7tg2OvzE5zJ3p" "JaYUJKbUivRooqATa/5qdDm/2t0XFivTfUCn6UgxKwCobWhcIXAEZBzwXMk9niQjJW4G9o7m" "2FkqVD795cYHsg8kqlg2EamBTiLwFbTbEX4EfgTNEG51NQBvnrnGeLXA7uHscB8YDDdGnvhq" "jvTlQ/QiTfXEDEOffUTg9+jEhm5kCRMwgNBtfr7SYulvf00C2MOHKzNLZ58tOCFKOASxReHg" "0mH73EmiVodebOgpAxbW2zGnFlbbOlGHZHzw4Ithu3Njxza3ZGpNakffJQUu7Z8mue6TFT0e" "ODqFt/gDUSowFrSrceK0+uXrjy5IHUZzydjuAXNpBY7N0B6sICToYoU/X3gNfv0dNfYgd8+e" "QCqFtZDGMS3V0wCSKHxFnl+MTHUn4vjb2Ft1JJas36A6+x7pfTsQ84vUpqYRWRelNd1eL/1u" "5uk2gMzPz5+dHZ0cu7K6gRr0qB6ZAgu73j9GpugQtAyXZ8/hT+wj50KzG5PGyTpC2NsXAPND" "u5IPJw7gxJCp10FIZKNO4MPV4ydRhRJYyDuSeitEJ8na5vecySNnhtI0euehPXvpTp/m++WE" "Qkfz0ydfM+BaXAeymdst5mG1FqCSeL0PRGH8lLT2uaXlq7RCh25sUdoSK0GSGlJtMNZSKZV4" "9Znt3GwG6FjV+4BRySPPP/lw7q0Dj/9vA9qC0pYkBSx8/M0aeRc63QCdJs07AHX1ZsPn9MIy" "5cEc5eIA5YJHqeBxVz6Ll5V4jmT/xAieA/V/OuhEXe8DJPG5CxdXRi9cXL5XCLEV2Ap2i0Vs" "wdpSzsu6AwMuxUKOcjHPbyu1P8iYHzeBfwEwiol55ANRRAAAAABJRU5ErkJggg==") index.append('script_code_red') catalog['script_code_red'] = script_code_red #---------------------------------------------------------------------- script_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAtpJ" "REFUOI1Vk01oXGUUhp/zfffOZDp2xqSJaUtpGlEp+FNUqMZNCxrEKuJGoQgqFFy4qu2iKAiC" "4kIstEt1JdJNuxBFRdIsKl3YChVxoV3UtE0xNiHT6fzcmbn3+zkuMo71hbM6L885vJwjDPXa" "6eW9YvTEvXdX5nou0nMRFyM9H1ui2lFhXZCA0gQamPhleX19IfkXoNE/8cg9d80d3TfFncqK" "WO8Vsd4chB2Fg04euLbe5fsr3fl+beLwCBC8n66VBIAbtwOpCImATaCcGnaWDdYYUguP7qiw" "vV6d+PziX8fNCFC4WjUBH6FTCC0Ht3NoDTaq0Ye1bgDgnVPLzM1WeWiqNDXaIDo3sblkyHLI" "BgFjhASwFowFi2AFIiChzYWlJpeut1ZGAO/y6XrF0up7erlijGINmCBYAxbFWkAtq+2cE2ev" "tFF5478McjczXUtpDRQPoGCDYBQIG4BEDVEhpIEkj7Nnjj51y9yxwczWepmsUMSAFcEABpCh" "RxRUwec5TZcFhn1ePn66IsGXyqmhCGBQIKJEAkpEUcAYcCHQzTK/eOyZ9gjQXBubKguYYUjo" "xlSDIDo0/fgp/ff28NOBCm9eeF1+mLfHABIA54pNCSmJAWuEEAVUNxIX4Nxn1C6f4YFXDlGe" "fZD+bwv29/MLH57Vy5nZd+TUpPeDD/bu3snNtnJtNXCrE8gKCKqIKPniSe7f/xJjf55DvjjI" "pqWv2DUzaQP6djLo508b1ecv/XGVZj+hmysuKLkTCh/xIXJo9TpjW2fhwJHRiSfvb8Oq7Eqi" "Kx57cf+eyruvPvm/HwgKLiiFh18ubqf363dUv3mLvH+THtBpW4JlxW57+Nn7xuvVFxodx/Ja" "xlp7QLvncF6xxlBKhZJErp7/GpMKzma0GsrSignB68fy+MFPJoMkh0FnRGQLsAV0XJFxVOuV" "cikdG0uZDz+z++9v2Zw1yBNZs9GffG4xfvQPC9hhQ8GmkvkAAAAASUVORK5CYII=") index.append('script_delete') catalog['script_delete'] = script_delete #---------------------------------------------------------------------- script_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxVJ" "REFUOI1NkE9sk3Uch5/f733flq5dO7t1mwt2FlDJdJrNZGSKIRGVxBlOcvBPOHowMUE8GDkq" "R0lMSPQAiQecMVyUCEQc0ZhtiaiEIcpm1Q3WDja6tuv/99/v/XmAVT7J9/h98uQR3NvB08tj" "QupPtnVFxpteQNML8IKAph9UhNY1LVgXCIWmDBSRwanw+vr35iZAB/6uJ3tj4+/tSXH/Gm6Q" "aLpBomyrra4HNUdxY73O+X/qL7biyUNtgPL9vnhIAJDbUFhCYAowTAhbknRYYkiJZcDI1ggD" "iWjyxKWVY7INcL141AQ/gJorqHiw4UDFvnvFFtypKwA+mFxmPBPliVQo1TYIPC/ZGZI0HGjY" "CikFJmAYIA0wEBgCAkCoKj8vlrl8s3KrDfA9py8RMai0fJqORkqNIUEqgSHBQLOl+iN/T33O" "2z3DNGZ+4lW/f/L/Bo432Be3qNgaH0CDoQRSAwritW9Jln4hMvwmicwIG0uP0bxw8uD9BoP9" "iTDzawohQXL3WQIdte9IW38Qe+RZSv/OExIunfF+Yt3phAlw4NjpSNP2Q2FL4iqFRAMaDYQb" "s2TMX0lk9uHc/opQh+Dm3AJuyynaTv0ZCVC+syUVFiDvRUKDACK1aXaIiyS2v4x96wTCKmPF" "OnHrK0HQWHth1zvfZCWA57kdJgGmBEMKEBK1fI60ukhix37slc+QlodbfZi16ascz7+0MPLu" "1ByA3HN4ssf37Y/GdqZZrWpurCkq2XP0e5fofXwCd/UkRkjjVAcpzFwhN/wh8/XU4mY70245" "e6XWE5fnlyi3TKz8eQ4MF/CDAW5fO84DvSHs0kPkZq8j935KPmejHK+wCZCB546+snso8uWR" "CY6+/ihDnGVo91uEczNkz8wyd6HEXz9cZTr5PpGuAWr1Jsp3i22DwPOWVtcrfDE1T1csQnax" "gPvnWTJPPUelUGTl2iLPHznDg6HthE0olGoo18tvAsTTr33co4R5CPSgEKJ7W+7ovtFMSozt" "zIglJ6q/zo8K2+omHo3QFe/g94VcFiN448qpw78B/AdkdWZdteLv9QAAAABJRU5ErkJggg==") index.append('script_edit') catalog['script_edit'] = script_edit #---------------------------------------------------------------------- script_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAv5J" "REFUOI1N0kto3FUUx/Hvufc/r0xmJp1mnLTWhvRhY2uMMViNUFJQ6abqQlwUQdyLUCsiuhHR" "jWihC3eCCyUIxVBQVLBBsFR8NRWkUpRQ0/RhMpnJZN7/173Xhe3YA2f74fc7HOHWvHB65aAo" "d2rXUGamG1m6kSWylm5sG+JcywlVQQyOOlBD2U9T1eq33m3A2fiRB+4anHl1tsSd0wltoRva" "Qt03O8IIWoFhudrm66X2k7188XgfMHFczicFgGubhoQInoD2IJVQ7EwptFIkNEztyLC9kC1+" "9PONk6oPhFE+60FsoRUKjQg2A2j4/22tB5W2AeCNuRVmxrLcX0qW+glsFBVzSUUngI5vUErw" "AK1BadAIWsACYpr8dKXO4tXGzT4QR0G5kNE0ejHdwKGUQytQRtAKNA6tAadZawacOrvUxMmL" "/1cIotFyPkHDd8RA6CA0QmhAGhfIrrxLGLSwDkzC4AXx2JmXHz6r7kgwOlJI0QkdokCLoABt" "e+Rr85TKE2TWv8Q5iIOAetQxAArguZOnM2LiZCqhCA0oHGBxWDL1byiWp8hvm0KvLdCp/Um7" "04kXXn+i2QfqlXQpJaBuHQkHAiSDm6RXvyI3PIRpfsHIgWOs/T6HC/wKIq4PRFE44GHxFGgl" "IAocpFbnKe97BvyL/PLJHINDPXrXfmQyfal7u7qaPTE3HMf+OwfHd7LadCyvGTZaBlP7jaJs" "ktvSxQZ/g7OY9q+MHT7B44PnR86/91gOQI88ePQpTPxaL4wSS+vC1dVNrtyosXf9Q3ZPHkLb" "i7h4g+37h3G2S3IgRSa1L9m8fsH/eOGf7z0bhQ89fXgy8+bzj/b/f/2PM/Q2JhjIVTHtGohm" "cf4y08/eh/X/onTvEZbPhS+de2v/53rbxJE9WwrZo7VWxEqlQ6Xp0/7hbcZmX0F5Gkncg0qP" "c/fUIVR6HEnuxsvuJZnbk61c/q4s08c+GDbiHQc3KiJbga3vH/hsWrlY4Zw463DWgrNgwZjY" "aWdCrLFYt/gvZEhrVo+emp8AAAAASUVORK5CYII=") index.append('script_error') catalog['script_error'] = script_error #---------------------------------------------------------------------- script_gear = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwpJ" "REFUOI1Vkz1sW1UAhb9773PsZ7d+rpvYFjVNjDJAQEQtVSEsRaAyUIkJBhQJUXXoBFSNVKWs" "DFlaqStCiEDbpWGMGEgGFBYIqViCWpHIdpO6so2N67/nZ7/37mWghHKks376dKQjeJIP7+yd" "FtLceC5lz7m+xvU1vta4gW4LY7pG0BCIEEMLaCL1zWij8YP1L8Do4NWXM4fmFs5M8HT6I+24" "I+20vDA/8qE7DCk3eny/2zs7SKYvHQDCIMgmxwQA+49DIkJgCVAWRCOS41GJkpKIghN5m2ec" "RPrLXyrX5QFg5CcTFgQauiNB24fHQ2h7/7Q5gHovBODq7T3mCglemhibODDQvp8+PCbpD6Hv" "hUgpsAClQCpQCJQADYiww8/FFncftB8dAAJ/mHVsRXsQ4A4NUhqUBBkKlASFQSnAKGqdITfW" "djsY8dF/Gwz9yWwyQtszBAAGVCiQBghhsPsjgT/ixdw5wkiINdSFlYXX/5JPGUzmnCj9kUFI" "UEIgug8ZlX7CeB1i0THi8Th/1uu8ndrjnfHiNQAB8P71O7brOe53V86y+cBHYwDwixtMTU1R" "qVTIZrNIKSmXy+TzeVZXVxkMBgkLoFWPTSQdkE9GwoAQIA4fw/M8Go0GGxsb2LbNzMwMrusS" "j8e/XlxcdCWA74/iFhpLgpIChKR3fx1H9clkMuzs7PDm/FXeO7/Aw0qFXC7H9PT0+aWlJWOd" "uXx7PAi8z08//wLVjqFcC0nEwGu3UUqRzWbJZDLYMUjGwRhBt9tlf3+fYrGI5Q2Gb0ljzt29" "V6I1sOgNDX5o0MEsuV6FdLpKoVBgc/UbtoTh+LPHaDabbG9vf6W1vmJpf3Ty3Tdm7c/mX/vf" "B0IDt77dAlJUq1VOnZzF8zxKpRKO4wBc6HQ6Fy3t+6Vqo82ttXukDtmkkjFSiShOIkoqPc7y" "8jIff/IpW79uUqvVaJgs6+tfmCAI1lZWVkLxygfXxkNhXQIzKYQ4ChwFc8QgjmCMY0fHIrFY" "hBP2fer1Or/rU3+g9PxvNy9vAfwNFnVoEQ5qDTEAAAAASUVORK5CYII=") index.append('script_gear') catalog['script_gear'] = script_gear #---------------------------------------------------------------------- script_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvVJ" "REFUOI1Vk0toXGUYhp//P+fMJZPOJNOJCWVsaOjCaNWqmDaKpKDJRnBTXAlWRHArdlHstosq" "WIgLwSIiot1EQVcurFRrI7aRCCI0XtrmZmvaTjo5cz3nv7pIGusL3+qDh4f34xNs5eWZlTEh" "/fRIX368ox0d7dDO0TEuFt43vaAmEBZPHVhHuk+ztdo34V2Ad+bAI/f1jh+dGODetJUrdZQr" "1RNbVRqaqWWp1uLrK63JbrH8xjbAGjNYzAgAVjcskRCEAoIQspFkd1YSSEkUwGPVPLtKhfKH" "l66fktsApYuFEIyDphLEGjZSiJPNWe/CrZYF4K0zK4zvKbBvIDOwbeC0Lu/ISNoptBOLlIIQ" "CAKQAQQIAgEOELbBxWt15pfjG9sAo9PBUj4g7ho6qUdKTyBBWkEgIcATBIAPuNlImT57pYEX" "r/zXQaqHB4sRceIxAB4CK5AesJuA0EucBxtZwtTt+fzoU3fkPQbDQ6UsbeUREgIhkIAEBDBz" "cYqPzo2hTIpJU+q6bdna8+KpmbywJpONJMqCxAMOj8PicXhSo6hWRnn14/20Ohvm22PPNQBC" "gPqt3ECxBHKrJDx8NTeJdwblDMoadvXvZXToAM2kzZ3u6+HE+68VzkMrBNBa9YREhBICKbBO" "YJxi8qEjWO+wzuLw3IhXebj6NC3VZX7lfPzE25TDiTfPVIxJTow9MMpaw7N001LIQWIU1juW" "1/9CO4NxGm01jbTJ/vufoaU78tLi7HqYdNNnpffPzy8sUu+GtFKPtp6EBGMNg8XdGGex3vFP" "vEK5d4hfVn9k9ursbWWZCp1Wj79w6NH88ZcO/u8HDn+Q8slP76KcIjGKkcqDHByZ4uflWc79" "8UM7sRxaO8nl0Gm9uFaL+ezsAn29efqKOfoKWaYP/8aOngzZjCQbSp58pxch88xd+5We20fe" "Wzp9+vLmFVT6xYW536sX5haGhRA7gZ3g+z2iH+9L+WwmyuUi4ormuz+/p/j3scXIVb68a/ov" "UXB+NWjA4+IAAAAASUVORK5CYII=") index.append('script_go') catalog['script_go'] = script_go #---------------------------------------------------------------------- script_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAv9J" "REFUOI1Vk01sVFUYhp9zzp2/DswdC2NJWzu2aaJGo9VFsbioRDExJCw0rkyNK2KiCwNudOua" "hMRFF7jxh0iKaOJCFLSaoMZiiIkKLaROpwWEkoH5v3PvPfec46K04pt82+d98ySf4G5em1ub" "FNIdHSvmpgJtCbRFW0uQ2KZwru0ENYEwOOrAbaT9JFOrnfE2Ac4mux+/f9vU4ekS96YbWz+I" "rV8PzXCsoR0ZqrUOXy939vUK/W9vAUySDBTSAoCrDUNKCDwByoNMSjKSkSgpSSl4cjjHoJ/v" "P7Zw/YjcAsS6kPcgsdCOBU0NjQia4cbd7sGtjgHg3eNrTI3meayULm0tsFr3b09LuhF0Q4OU" "Ag9QCqQChUAJsIAwLX6t1Lmw2vxnC5DoaMDPKZq9hCBySOlQEqQRKAkKh1KAU6y3Io6eXW7h" "xOv/OYh0eaCQohk6EgAHygikAwwoZyhUZllfrDCRLvNb+MzoycN77sh7FpR3+Rm6sUNIUEIg" "AQkIIFf9jEF/ldLuGV4e+5ODvXf2AngArxyZywVhks6kJLExSBzg2CgX9F37kgdSP+I/tI/u" "6mn84oOMllsfn35rLO0B1G9lSwUf5F1JOBACJALnIN/+HX/PfkxwkezOYUJzjcHpib6kc2fW" "A9A67vNI4UlQUmCsAOc2jAuIvCF0vYpUNYTski7UIAzo3IiUN33o+M4kCd+ffPgRbrYc1XVD" "PgvZtKTQu8Su9Q9JZzU2CZG2AXI7TscsnbgcLl5pHvTCXvScdG7/hcUV6j2PTuTQxjGe/MRk" "6nuGXtiLi88gTJtL30a4ToCNwt7ySmNm5sTaKc/q+KkDzz6Re+/Vp//3Aze++4D+R18krs3i" "eT5//ZAQjrzBxXCEk98sHJv/6NApAM9qvXKz1uTTs4sUt+UoFrIU8xmKKIS6jsqUWJoPMONv" "Mj55gPkvfqGRpCqbRR5x9Pm580vD584vloUQO4Ad4O57abAx9Hyl0teqx8xVJ6j9HVBc+Io/" "lq5eQdmfNwH/ApjHYrODX5+hAAAAAElFTkSuQmCC") index.append('script_key') catalog['script_key'] = script_key #---------------------------------------------------------------------- script_lightning = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxxJ" "REFUOI1N0strXGUAhvHnO9fMTOaSmVxMTBssto1W1AqmVpGIly4sihRUqiKCioIo0gri2pVQ" "ISBu7EaQbGIXrtRaBTWINWKRttikhF5yY5LMZDKZmTNzzndzoQl9/oDf5n0F//fq1MKYcOzE" "nkLqcCQNkTRIY4iUqQtrG1ZQEQiNpQZUccxXYaXyg7cNWKMO3dvfffjkeB+31kpMPkpMvtbR" "w4mERqy5UWny7XzzqXau+P4OoJUayAUCgMVNjS8EngDXg9B32B06uI6D78LB4RRD+Uzx9B/L" "n+4Ah7K/HDgS/szGJYuXGIw2xNpgtQQyiP2nIOjn9rzLR5MLfPLyCL9fC/o8ADv1vPtT998H" "Sj2DuH4fXVJhpUInbdq1WeqlF7C2FzcBAwi9xflrNf66WV9xAMp713btT1/Z46dGMK1/EE4G" "oxWdzausdr9EPfs0rRha0oCF1a2YiXPzWzqRr3n28t3BWtO8kSve44KLaZfBi6ndPEel9A7N" "/HMgwcXiWQdjQfsaLzZ3fH3y4Q2v3CgeFEa9FWb3YlUb3EGQEm1cvPYC+aUJUB2MyKIGj2Ht" "blQcU5eJBnCENp91lR7sbVdniSpziPBOwKM09DgD8hJ90XnCG18inV5EWEBqTbPVUj9++OQW" "gGO0mlq+fvH0NxfS2GAfa/NnUXEL2dkkiSqs6RGqY2dJdr1IKpWm2oxRcbKKEBbAGxqfOTV+" "4szoQG/mzVeOP0J9bpJo7TL12ipbQ+/SGTqGNQLXQtpzWK+10Umysj2/N35islepzsdjo3ex" "NP0eQVhkuT1IZfQLglQWX1j8QBC4kEvD/GKETOLVHaDTjp9wrD3aWPiOzf55fo1fZ049RLxc" "JVHrKG0w1lLM53n7yG2UqxE6lus7gJHJA88+dl/qg6M9WJ7h/sK+/65tQWpLogALn3+/QtqH" "RjNCq6R6CyCvlyt1pv7MU+hOUciVKWRC8pmQbDogDBxCz+H4owOEHqxvNNCJXNoBSOIz0zOz" "w9MzV0aEECWgBLbHInqwNp8KA7+ryyeXSVHIpbk4u3gV1/y2DfwLYhCJbIhbPSoAAAAASUVO" "RK5CYII=") index.append('script_lightning') catalog['script_lightning'] = script_lightning #---------------------------------------------------------------------- script_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxNJ" "REFUOI1Nk89r22Ucx1/P8/0maZotv0yaVoth8+DBpWMKage6gfYkUwsKkTLdbQcvYxNE/4OK" "g52c4kXQHuygF2XoNnAocxmSgz9wWIdZuzZp0rRp2nyT76/neTy01r3hc3q/efHmA2/Bnt6e" "X35WSHPpcDo+2Q80/UATaE0/1F1hzI4RtAVCYegAG0j9Zazdvmb/BzA6fG5i5MDkhRN5Hpbj" "61Tf16mOq8b9AHY8xf12j6v3elODZPbcPkCFYSEZFQA82FJEhMAWYNkQi0gej0ksKYlYcGw8" "zqOpRPbzO6sX5T7AD5IJG0INO76gG8CWB1139zYG0OopAD6YW2byUIIj+Wh+v4EOguzBqMTx" "wHEVUgpswLJAWmAhsARoQKhtKv90qC516/uAMPAKqbhFdxDS9wxSGiwJUgksCRYGywKMRXPb" "49L1e9sYceb/H3hBsZCM0HUNIYABSwmkAdQuwDYSbUBFFLanD125cHxTPtSgOJqK4fgGIcES" "AglIQOxlhAFjIPQ8OoGj2PN58+J8XKgwGotIfAUSA2gMGoVBYzCAlBAoRc9xwhvvv7wNYAN0" "WkP5ZAqkANdzqf32M92VP8k/kqHe3OCpF1/nwMEst777gt9zGY7Llnzi3W/f+3tq6hMbIAj8" "YZsIRgXcuXaFlHR45/QMjuOwsrJCpXIVKzLE9GunsG2LRqMhq9XqR0tLS3lx4vxcLgzN5emT" "x944PNSi8uMNyjNl5r7+hr9+vc3Y6CilUolGo0G73aaxtkY0Pd46f3ZmZGFhoWu7A+8lacwr" "1bs1bi//wsT4MACdwil6/ZuUy2UymQy9Xo/19XUuf/oZm/Gj3wOn0+l0zNaB//SrJ4/GP5x5" "nvl5h0qlAkBxc4EH0jA7O0sikdjdheNgtCa7eesFOMLq6qpr6yCorbW7fHX9Lr49Rqfb46cf" "blKamKBUKtFsNllcXCQWi1EsFikUCgw8f6RSqWzV6/U18cxbH+eUsM+BKYLJWX5nPOf+8eRj" "o3k7Fo0KIaA2yDM0nGSMGsZo47sDt9FoNB3Hmf4Xnpl4Bo+No7IAAAAASUVORK5CYII=") index.append('script_link') catalog['script_link'] = script_link #---------------------------------------------------------------------- script_palette = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAzxJ" "REFUOI1N0clrnHUAxvHv7533zayZLclkaUzS2JRUi6V10hjRNrS0thSsF5daEb15EcTiQkH6" "FwhF8KIXsRahtiAIKsaDpUhtaypkwCRtkmZplklmycw727v9fh5sQp/LA8/hc3kEj/L2lcWD" "QlMX++PBkZojqTkSR0pqriwJpUwlyAmEh6II5NHkJX8u95u+BSjpDj+TioycO9zG46naMlaz" "ZazY8LptB0zLYz5X4eeZyrF6NPnBNuC5bnugusr1az9SXLwPQhHs2E1/+ijtT/TR49fwaRqG" "D/Z3B+mKhZNf31r+3LcFjO7tOr87f72/I2QzMOCjK5VEVIrM3x1jtWQRSg1QcyEa0Pjo0iLv" "HmpjNmuG9QsX0FLlV77dk7h3ZG+PQbJ/BV/LNNIOENHfomfnLuamb/Lv3ThP7htFAsIr89dc" "kfGF0oqeLJz6aiSdPvt0xybC+gdnUYNQhKoj+ca6TNANcnrHCVaX71B96hAoH9myxcWxmTJK" "vKN3xSJnBjNLuDfLiBMxVKCF8sMRljcz+KIZsOsYrknYK9BwBVKBZ3joltz5w7nnC3ogEA4p" "B2STTrX5JaZnJmj2T0FqkKsLw4Q9m9fj02heA6FAKXAti5JjewC6Eorc8WEihsTcLDBXcImo" "TRKJXdSJoqkKCAnKQ9PA8Twq1ar7+2cny3wK+kJ27fvNsZ9GopFw34FnhzjYF8PwJQiYs3yS" "v0VvZzemEWTdnyRlQL5i4Vp2FiEUgPb+F7+8eaU09Nq12gtkMuN0tO0gZObQSusc62ml1Wjw" "93qd5j2vEtI1Nop1PNte2bpfP/zh5daiqz4eTe9H1h2Ws/OkWnup2lUWixvM+nppG3qD1lQn" "0RDMLNVwbCu7DTTq1lFNqVPjkw/ItadZKy2Q1BeYMDuZV0ewI4PIP8okY4L3jnewlq/hWc7G" "NiAd+8DLo/uC588+92j6v08rcDyF7QIKvvx1hZABZqWG59r5xwDnwVquxHdjk8QjQeLRAPGw" "n1jYT3OoCX+Thl/XOPNiO34dNgomnu083Aawras3bk9137g92SuEaAFaQCUUIoFSsaC/yQgE" "DKLhIPFoiImppXv45J9bwH+TgXl1DBZKwAAAAABJRU5ErkJggg==") index.append('script_palette') catalog['script_palette'] = script_palette #---------------------------------------------------------------------- script_save = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAspJ" "REFUOI1VkU1onFUUhp9z7/3mPzPTNGmqLU0sSC0UixGjWVUsrhQFwYUUxI1Id0VXCkLBLhvI" "XnChFrFLERdmoQsXLdhuI1jamGpokomTmcl8f/fPhXVsX3iX5+HlOcLDvHt9c0lUXD3ZrS+n" "NpDagA2B1IWBxDiKQk8QT6QP7KHCV9Ve70fzHyAG9+KzR1rLH52b5dGMy9BJy9Dp5/54aWFU" "eDZ6B/xw5+DVrD19aQLwzs21KwLA/X1PIoIR0AaqieJEVaGVItHw3PE6T3aa05/f/GtFTQCl" "bTcNuACjUhhY2C9gkP/bvQx2DjwAH1/bZPmpJmdmK7OTBcHa6amKYlzAOPcoJRhAa1AaNIIW" "CID4ITfu9rn1x2BrAnC2mOvUNYPMkRYRpSJagfKCVqCJaA1EzfawYHXtzpAo7/3voLDzc+2E" "QR5xwHdrvzNVhbR0HGpV2NrJEAWthuaJRoX+MGv/dHtr8OiC+aOdKuvbHlGQpTmvLJ3izcUW" "39/4k08vnH7sO1/+vEsIclMBvL1yvS7eVaqJovSgiKSF5e+RA2Dt1+3JYe5gWMDufolIQAH0" "d2qzVQH1UBIRlBJ0BOsDKxcXCSHiQ0QTaJhAURQMxyUGwNqyYUgwCrQSfBBqiSIvLFe+3UAJ" "OB8IPhCBGCNEaCQBc+7DazPO5Z8tPXOaB8PIxranWQMXIoV3aJUAEcEjIsQQiTHgnKUsHSbP" "ivMqxtdurd+jnxkOioj1kVFqScRw8fUpXCgBBRGiBGqmwtVvNtkbjjHBlotvvHy2/smFlx6z" "/NblX9AkBDK+uP0BM40TCIrd9D7vv7CKokZalJhg7b0HvQFfr63TbdXptmt0m1WM0SwchbnW" "iPNnl+hWjoGC/fwYR5qORgWMCPL8O1dnvJhLEOdF5DBwGOIhVT+58PTCdNKtdqmZNi5YJAQk" "eoKk/LZ5l52h5R+2ulpJz2KIXwAAAABJRU5ErkJggg==") index.append('script_save') catalog['script_save'] = script_save #---------------------------------------------------------------------- server = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAbRJ" "REFUOI2lkz+LU1EQxc+a5UUNIa5m/RMloFa6LIgWfgIXZQsbAwrW6f0E0V6Cvcua0m+wbJ1O" "88BFCFqtjZWNxMjm3blzjsVLQlZfLPTCbS4zZ37nXAb4z7NS9Jim6ZsY41MzW40xwsxgZggh" "wMzetlqtJ7Pa1cXGwWBQA7BTq9UelcunkZkBJAQAEtbWzmB/f+8xgD8F0jS9T3KnXq9frlQq" "OPzyFTFGkAJFgIKTyLLsGO1cgORes9kEABwdTWAx4uNBCpLze2/rAUIIxQJmhiRJMBqN8snu" "uLlxCxSh6XRJywlCCHB3SIIEkMLBh/cgHSTh7ri0/fDvBHlWgruDFDY2b0PTDERBBRmcWCSY" "CUiC00HPvX+rHmL3+ytwoa7Qwrx52jibvvv5NX7+iBC1XCDLMkjKf0QEp8iU8Ozcc/AsIHFu" "tZAgSRKUSqV8shNSLpCT5OH+TjDPYDKZvOv3+xiPx6hWqzh5qgxhBXTCldNIWk7Qbrfvdrvd" "7eFw+KLRaNy5eu06zq9fgZnNrV28sI4Y4zGBwmXqdDpbIYSXZrY5W6YYI2KMcPdPvV7vRlHf" "P51fgatf/8BvOGcAAAAASUVORK5CYII=") index.append('server') catalog['server'] = server #---------------------------------------------------------------------- server_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkhJ" "REFUOI2lk0tIlFEUx3+fozPa9DUZU2qBIBY9xEfBhIgQJIoRZEJCQZs2LYxWbdrZooVFRSsX" "JbptGbkQW2q0UId8LSaKlCRSzMwZzZnvfvecFjoijbbpwIXL5Zz/63LgP8v5+yEej/f7vn/T" "GJPv+z7GGIwxeJ6HMeZVR0fHjZ39+dnL+Ph4BOiNRCLXQqF9ZIwBERRAleLigwwNDV4HcgHi" "8XiriPRGo9Fj4XCY2blv+L6PiCIqIIoVIZPJ5FjIBxCRwfLycgA2NtIY32d6Mo6IbJ/mlkt4" "nrc7gDGGYDBIMpncZLaWM1V1iAq6xa6qeyvwPA9rLaqKKogokxNjiFhEBGstZZfb/q1gMyvF" "WouIUlV9Dt3KQEXRPTLIyyrIAqgqVixiN70vubP0/XqO7Ojb1cL28NZglr3v40vWUz4Tc8Os" "Hv7M7WdtmlxfTa2sLT8eejT9MADQ3t7+oKKiAs/z8IxhNbmOiiCq1BddoMS6LDlTNMbqaYq1" "YkLLoR+/v14MHw+42xaCwSCBQGCT2cqOL1Rmvg9Td6oWm2epLWvGOob66gZA7+QBpNPp0ZGR" "EdbW1nBdl8KiEIqDWMGq8iO1SIGznyun7wJwr+kFlUdqcHAKAwADAwO9sVhsPJFInFxZ+Xk0" "Gj1EaUkprhsmcsDlzVg/xWX5DH95TWPlVbrf3iK1scx0IpHOWaaurq4Wz/OeGGOqs8s0LzMU" "VC7SUNPIidKzfFr4wPupd8zPrj7NAdirzneWduM4nQ64CilUe0Z7Fu7/AS+UeqJIlhZIAAAA" "AElFTkSuQmCC") index.append('server_add') catalog['server_add'] = server_add #---------------------------------------------------------------------- server_chart = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjdJ" "REFUOI2lk71Pk1EUxn/v2/K25cNKJCEKqQ66SEjQhcFZ/Ex0sEYTFhdMHDvqQNxdjCuJg4v/" "QEMYFSalKlFZOkCixrioKaX3fe/HOQ5FREAWT3Jzc4b7O8/z3Bz4z4p2No1G46n3fto5l/fe" "45zDOYe1Fufc82q1ens3IA+wvLxcBubK5fKNQqGXzDkQQQFUGRw8zMLC/C1gL6DRaFwUkbmh" "oaGRvr4+1ta/4L1HRBEVECWIkGXZvhbyIjJfqVQAMCbFec/7lQYisn3OT13CWrs/wDlHkiS0" "Wq3u5BA4PTaBqKBb01X13wqstYQQUFVUQURZefcakYCIEELg6JVrByvoZqWEEBBRxsbPolsZ" "qCh6QAbxb3JXgRIkIGHLf2xp6XcKX9e437+OPL6rrna5tQew/Tj8CS5I4EnzDPPmAg8+TUJP" "CY6MguZ67n2o9t/5WJ0GiLMsQ1UBEJXu90n3Hh4ucbIckRQTcB6sh07ARPGPXJQ8u/n2+rfY" "WkuSJORyua7vnSqs4C34jiLGo1mATU/qXb5MmSzLDsVpmr5aXFyk3W4zMDBAsVRAiZAguI7i" "MyVsKqQOjAPjSdMM6x3GZMV4ZmZmstlsXq3X642lpZcUkogTx0epVEYIHfBGCZuA8ZB61HlM" "mrJh2zjrurtQq9XqQH12dnZqdXX1kXNu3HtPOPYQ3weSCmoC9HrwgjEprXgDk5m/t3F3TdTW" "NVJQhXM/X2gpH0WfO7nszamQ15zJBVv0vwBPraeTe+8LXwAAAABJRU5ErkJggg==") index.append('server_chart') catalog['server_chart'] = server_chart #---------------------------------------------------------------------- server_compressed = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmlJ" "REFUOI2lk81rlFcUxn/3nTczGcfpVEz8iDKg7hpCq8GW7roxtIi4MVChf0P/AVvS4sJNyaIb" "DYhuuxe0WYSCIVloBowSocWPiKStiYTmJX3fee+595wuMn7E6soDZ3EW93ee81weeM9yrw+d" "TudqCOEbEUlDCIgIIoL3HhH5ZXx8/OybgBRgYWGhBVxutVpnarUdlCKgigGYsWvXh0xP3/ga" "+D+g0+l8qaqXBwYGDjQaDR4vrxBCQNVQU1AjqlKW5VtPSFX1RrvdBqAoukgI3FvsoKov+8TY" "V3jv3w4QEarVKlmWbW2OkY+GP0FNsd52M3u3Au89MUbMDDNQNRbv3EY1kpKDczx82KRWT7g4" "9bM655yZ2frzv/aeO3dhLRURtrwyYoyoGsMjx0iyGZrV66QNAYuUxSDPNr5wK1nrVOLctRh1" "H7CWvrhtS4ERNWJq7K7NcWD0IFHXwAU0y6k9+M1W1k9vkDqKojCAxHv/6nF8ZVylD5K0Trn6" "GcWfo9R31reMllS2eVCWJWYGgJqiapgqlkAlyekfXMS5nMT1AQmllq4aePkrifeearVKpVLB" "1NCeCucUiZ71R4e4O9cmxoyeBDQGRHqAbrd7a3Z2ls3NTZrNJv31GoZDg0GZ0Np/h4+PL0E3" "AcC52KfBWwi5QS8Lk5OTJ0Xkx6GhodFDh4/Qau2mWLtJpTtD1BQv/yJlwfzSwNMP9hw9WOYb" "4f6j1ZErly79vi1MExMTY977n0Rk5EWYQgg0Pv2OrAjU/zgfgQpAPPy9ZXm0bYB31fgP8/Gf" "v5dp26+fu5gdyaVvZ77326mNZ0/sP7Adj+jjshbKAAAAAElFTkSuQmCC") index.append('server_compressed') catalog['server_compressed'] = server_compressed #---------------------------------------------------------------------- server_connect = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAodJ" "REFUOI2lk89rXHUUxT/T92amM6l2Jplo00pchJbQUJqqEaG4USstLtz4Y+M/0a0rV4I794aK" "C0tJoejGEEESFLtJBgwtRYM2xkmsOHHyY+bNe+97v997XWS0ipYueuHuLuecew4HHnEKDzto" "Npsfe+/fEZHYe4+IICI45xCRaw8EWFlZOQrM1mq1N8rlKrkIqGIAZtTrNRYW5okfwHpRVWcb" "jcaJoaEh1n/ewnuPqqGmoEZQJc/z/wdQ1fnx8XEA0jRDvOfWahNV/XsvvHoJ59x/AT75pjPe" "ai3R6XSYnJw8YA6B01PTqCk2YDezfyuYu/lLpZcevpq31y89UakQRRHLy8tMT59D1Vj9bhnV" "gKoSQmDstdfvK1hctPjH5N7q4aKeLNaPcfvub0zU93HO4b0nBGXqzDPYwANTwwYeHAJY878e" "z/JwslqCqKDEI6e4uVFmbOIcS0uLzH/xGcF7VJX2Y+tc2f0QBZxzBwB7XXcid440c7TaCcVI" "KdWOM/t5ExFhZuY5rs99ig+eKz98xEb7HqZ2/4UkyUajCJLM6PUzft8RjlZjxp6e4NtbX3O2" "d5f68AhmcHnkPXQYzBQRGSjopaec5PQzYb+f000y1jY77HZzKk89y/xK4Pz5lwYRGqqK2eCF" "N+dul3Z66fvlYoHtvYQj5UM8Xo2pVUsUCsrmxjYvzpwmiiM0KMEODDQzRIQ4/mmnVxmKisF7" "kjSntbVHdych7WVkvZzhcs4rb5+l0RhFRDAzAI49OYr3nng36X8VUbp4Z7vLZqsjrp++G5ys" "0XftPIStC8//MfXlwuYHInLmrzJ57wfxhu8LL1yeq0S9wo2Q5i/v56Ujd66/5R7W0H/Ony8C" "qwi0F1TOAAAAAElFTkSuQmCC") index.append('server_connect') catalog['server_connect'] = server_connect #---------------------------------------------------------------------- server_database = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkNJ" "REFUOI2lkz1P01EUhx/+lNuWUirKJLZlk2gMxkU2Jo0mxkkSTRgNu58AP4DfQKOrYScNDiYI" "k9JE6qREdCGENGFAXnpfzjkOpeALTp7k5uYm9/7O+T3nHvjP6Pv10Gw2X6WUZmOMuZQSMUZi" "jIQQiDG+npmZefSnQA5gbW2tAryoVCoP8vlBfIygigGYMTJyjqWlxkPgb4Fms3lHVV+Mjo6O" "lUolvn3fIqWEqqGmoIao4r0/00JOVRu1Wg2Ao6MOMSU+rTdR1ZN16/ZdQghnC8QYcc6xt7fX" "zSzClavXUVPsOLuZ/buCEAIigplhBqrG+scPqAqqCsBweZpqtUqj0WiLSEFEvqrqGxF5nosx" "0mVliAiqxtVrN7AeA4uUhwaZnp5maGhoNMsyDg4OJnd2diZbrdb9rOetW4EhKqh0vbfL3+jI" "AePj4+Tz+ZOynXNUq1VE5HIWQjh9LKfgRIWXn58TUiClxNbWFu12m+3tbVqtFjFGRITMe4+Z" "AaCm3fZpd39y4SnFvkGcc2RZRqlUYnd3l0KhwPDwMCLSheico7+/v+tbFDNFzTA1MAE4aWOP" "GUBKiazT6bxfWVlhf3+fcrlMoZjH6ENFkWOwvcsi0vvWpwJzc3M3NzY27i0uLjZXV9+Rd32M" "1y9Rq41Rr14EjCzLcM5xeHjIwMAAxWIRAO/978M0Pz9/O4TwLMZ4rTdMExMTTE1NUa/XT1iE" "ENjc3GR5efnLbwJnxcLCgvPeP04pzarq+ZRSznv/w3v/1nv/7CeZlqCsKYlswwAAAABJRU5E" "rkJggg==") index.append('server_database') catalog['server_database'] = server_database #---------------------------------------------------------------------- server_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjZJ" "REFUOI2lk0tIlFEUx38z8zVjDsMkziINH1O0SYQwCGpTBJmTiwiSEtq1aG1tWqVBSIuQVrVI" "jHa2ahXiIwiGNulA9m5hSqhJYo8xZ+b77nfPaTGPpNE2HbhwuZzzf5zLH/6zAn8/ZDKZB77v" "XzTGOL7vY4zBGIPneRhjRnt6eno39zvly8zMTBwYjsfj5yKRWlxjQAQFUKWubhfj42MXgGqA" "TCbTJSLDiURiTzQaZX5hCd/3EVFEBUSxIriuW2XBARCRsebmZgDy+QLG93k9m0FEKudkZwrP" "87YGMMYQDofJZrNFZms50HYQUUFL7Kq6vQLP87DWoqqogogy+3IaEYuIYK2lofvMvxUUd6VY" "axFR2to70NIOVBTdZgfBsoIygKpixSK26H01Ns/IjzvIpr4tLVSGS4Nl9pGP99lY93Gfj3L0" "zTCTJxyRoC4qerdrSm45AK7roqoAiApSkiyq9NUPEPkyRmTtKccuXSWSbAvkX000vUtP3JzU" "DxsVC+FwmFAoVGS2sukLFZl+xP7jZ6mZe0bgYS+1nx7T2pIIWbTPASgUCi/S6fThZDJJLBaj" "ZudPcrkCYi0CON+/UrM7Caev/PE+0EBIA62VLAwNDXUbY240NjYeSu7dRzxejzEGVeXb4CmO" "pFJEPz/Bza+QA9azId7PsVQVpv7+/k7P824bY9rLYTrw6y0dO5ZpqTc4wUXWV30WVkLWK8j1" "KoDtKn2+6VpubflyUAItEtQlQe+lpmTwN3mMg/zQCue9AAAAAElFTkSuQmCC") index.append('server_delete') catalog['server_delete'] = server_delete #---------------------------------------------------------------------- server_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAo5J" "REFUOI2lk0tolFcUx3+ZxxfzciZmUEtgNI2tJCGlqUhEU3ChYmkKXRiIECgtNItCF3Xjwp0r" "6daFiwaaTcGV6CKESBaGaNrEDI4EMU3ajKXEJOShmWQ633fvd89xkWQsndJND1w4HO75/c/j" "XvifVvHPQCaT+TEMwz5rbSwMQ6y1WGsxxmCtvd3T03P57/dje8709HQCGEgkEpcqK6sJrAUR" "FECV+vokIyPDvUA5IJPJXBSRgVQq1VhTU0PuxSJhGCKiiAqI4kQIgqCshRiAiAyn02kAikUf" "G4bMPM0gIqVz/sInGGP+HWCtxfM88vn8jrJztLZ9iKigu+qqyoHoHLM/9Wq0tp3C2hj4i1/E" "AIwxOOdQVVRBRHmafYyIQ0RwzpE+u5+Pm+NUpfpINHXwOnec5yMD35cq2JmV4pxDRGlr/wjd" "nUGdmyJVs0ztO2fY+P05XoWhbv9hahvSiVIFewBVxYlDZdevGuV4vZJsukiwdBuvuoI/srOY" "YrDuB9unI3uAUrJ7O7h9NsupZEiy+VP8lz9QEX9FvLaOfYXfVqSwcq7z27tzMYAgCFBVAEQF" "EUXXJ3j/vU0Sxz7HX7xFJB5i8k2sPvh5y5q/ujuujGVLWzDG4Hke0Wh0p++1Xzja8IqDbZ9h" "lgeIeoq/eYSlsUmwhQ9arjx+sbfGCIDv+1Pj4+Nsb2+zlRvjaH2eUBtZmrmJ4FPYaGRl4hmD" "v6Zp+W6ylFwC9Pf3d87Pz3cPDQ1lFmfv0NrVT+WfD5m794jsyAbP7k9T1XWN9WKk7CGVfabr" "X7eGV7/6JkrEkR29y0IuxxOvi/WgEufc7ODgYMt/Ai51JYsnmg/FTra8i8aDiWB19cvuGzML" "ZdK79gZo53xaPfAJQgAAAABJRU5ErkJggg==") index.append('server_edit') catalog['server_edit'] = server_edit #---------------------------------------------------------------------- server_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAj1J" "REFUOI2lk89LVFEUxz/jjOP44/VmYKi0lBIqTAptcOPOICuSNiYYVNCfEC0jRFrVwn0gCEHQ" "IgkkEFcKuknnhWYRtdFNgRYJw+DMe/fec1pM/qjRVRcO3HO593O+33M58J8r9u9BEAQT1to7" "xpiEtRZjDMYYoijCGPNqaGjo9v77iZ1NPp/3gXHf92/V1TUQGgMiKIAqmUyamZnpYaAaEATB" "NREZz2azJxobG1lb/4a1FhFFVEAUJ0IYhlUWEgAiMt3W1gZAqVTGWMvqSoCI7MaV/utEUXQw" "wBhDMpmkUChUKjvH+c4uRAX9U11VD1cQRRHOOVQVVRBRVpaXEHGICM3+L07XWmKSPlxBpVeK" "cw4RpfPCJVQUtMxJfUOmuY/29FwVoGZHwQ5AVXHiEFfxnkjMkW3t5UhzN63eBquTAz0HAnYf" "u73Gxd0PvK2PeNk0rjBFa/d9NHSP889ztX8BwjBEVQEQlcr3icMrveNU510ov2fxxUua0iVs" "KRqI4d2sUpBMJonH46go4oS6aI2jfhIvs42Ea6CCKy7R3vcw5qLoycLTXm8XUC6XF+fn5ykW" "i3ieRyqVoKkwS7qtC9n+gEqJ3OA5JPpOKvWVYxeHO6D8APbNwtjY2A1jzGhLS0vuTHqTZj/G" "8bP1uOIiqhHB5Gdygx3E4j7UX2Vp/NFmzEpf1TCNjIz0X/Zn3/bcm6iN16yjdgsqE7HrOl5/" "jo1Py3yZGn1dBQBYeNb9U600qCgqUglV9nIFERANfgPzIWhOAAxL1wAAAABJRU5ErkJggg==") index.append('server_error') catalog['server_error'] = server_error #---------------------------------------------------------------------- server_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlFJ" "REFUOI2lk81L1HEQxj/t2prJtiUrlZrSBoGJIBUURHWIpPDQpY0CoUvH/gRBgqIOJR26JXWN" "uhdFQaFFL25YQWARlpG9SOHL6v5+3/l+ZzqsK5HapYGBYZh55nkGHvjPWPF3o1AoXPfed4tI" "lfceEUFEcM4hIjfy+fyJP+erKsXQ0FAG6M9kMkerq1cTi4AqBmDGunVruXv3znFgMUChUDik" "qv3ZbLaxtraW0Y9f8N6jaqgpqBFUieN4kYQqAFW909zcDECpFCHe8+ZVAVVdyIOdh3HOLQ0g" "IqRSKaanp8uXQ2BbWwdqis1fN7PlGTjnCCFgZpiBqvFq+AWqAVUlhMDGriP/ZlD+lRFCQNVo" "a9+Ozf/A1Lg6fIq5bJH8zd01t449LVUAEhUGFQAzI2hAQ1n7RHqUa5OXibzQlG0l8WtyLn+p" "qWaRhIXl+cXbP3owFeKvQq331NdtpXXDLmaiWYZLT4v7r9RnHp2eKFYBxHGMmQGgpqgaXh0H" "204STMuMMManPtPetIeiKyUKY4+mdlygboFBKpUimUyWdQcl8o5gyqef7xH1eBUkCNPxDB2b" "9lKUucSz0cGfCYAoip4PDAxQLBZJp9Osqqkm8hE+eNavaWbDmhY2ZnKsTNZQn27k5efHDH4Y" "nJgVdi54oa+vr0tEzjQ0NOzYnNtC3+tuIudw6oi8I5fdxu5cJ0NjT7g/cu+bCxz4dp63i8zU" "29vb6Zy7KCLtFTN573nSeI3tLft4+O7BF1nBgfGzjMASblwuNvcwGyy5Oibkvp9jtNL/DZZM" "jgMmGarkAAAAAElFTkSuQmCC") index.append('server_go') catalog['server_go'] = server_go #---------------------------------------------------------------------- server_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoBJ" "REFUOI2lk0tsTHEUxn8zc93Sml7lbgzKIISmIuq1EGwUaWIhmiDsxIZIbCxsyoKF0C3i1Vg1" "TSzEYtSKNILqJFTE1CMtST2HvrSde//3f45FdTxaKyf5Jycn3/873/clB/6zYn8PstnstSiK" "9hljnCiKMMZgjCEMQ4wxzfX19Xt+xzvjTUdHhwdc9jxvV0lJKYExIIICqFJRMYPW1sxuYCJB" "NpvdJiKXfd+fU1ZWRndPL1EUIaKICohiRQiCYIIFB0BEMpWVlQCMjhYwUcSzp1lEpPi21G4n" "DMPJCYwxuK7L4ODg2GZrWV61ElFBf25X1X8rCMMQay2qiiqIKE+fPEbEIiJYa5ldt4PF8XZ6" "Wmofh196Lyw59PzKHwrGslKstYgoVdWr0J8ZqCixt7dYt9bHW35kdf5B45ns6UJvzfE3t4sK" "xglUFSsWlbH+S3k377uus2rBXLylWxh+m2FKculMb15wI3NYD8THCYqf7a/grFiudl1iflTA" "q67Djrxiqp/CKYXUppWl6aq55x2AIAhQVQBEBRFFRRBVjs46gT/QiunrIZ7IE4sP45bnoTDC" "9w9BomjBdV0SicSYbyuoCm7wjnlyl5KZINFn4tIP8SRqQnLNXYUXLwcOOgCFQqG9ra1tbTqd" "JplMMnXaAE7+PrNGHzJ/81Y0vEPMDtF5awj3+/tPiViMXHf/of3N724Ub6GxsbHOGHMylUrV" "pBcuIvXtCqmajYT58ziOR+6eoaV9Guu/Piz3fdhw9esQTHJMDQ0NtWEYnt25LFe9Yusaov4H" "dGb6uNk5g4/i55qampb9jp9AMF6PztWcml5RcWC4b2T09ctPx/ZefNMyGe4HHtmCWuOXo0gA" "AAAASUVORK5CYII=") index.append('server_key') catalog['server_key'] = server_key #---------------------------------------------------------------------- server_lightning = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnlJ" "REFUOI2lk81vzWkUxz/3/n51X+TqrXFxS40xmJQQIiQSCyJEg8gMsysrGfFXNJYSaSaxHKkF" "C6kFK8JSQoQ2qZAq8R41V18yt3pfn/M851jcNmIx6cLZnM35fs/nnJwDPxiJhQqGh4cve+97" "RST23iMiiAjOOUTk2v8aDA0NtQOX8vn8iVQqS1MEVDEAMzo68ty5c5t4XjD5ZO9+E7toqpGG" "eLE0zq2IEsmYT4Gma2MqfRYhj5qCGkGVZrPZMrDBP6NJ//l4Zumu7qitgInHxBNcnfp/Y8xE" "+xh5+pqghqqiqhw42INzrmVQ2jDRlXTW25b5GT8zRDK9nRCmaZRfUlt8iNnaNro3g5pic93N" "rEVgzzYtmqjo6XTH1hxEaL0EcZPyh7to4STafgCtTPBk5DGqAVUlhEDx8LEWQWl26faE+jOp" "3AbM1yEqggimEVobx2YHWFIus7srQyWzB4k7MDVsbgfJRNCL6Z92LqtPj1GbekEitR6IyRf3" "k22+JVt/TmbqFi7k8IkMk7m3DJT/RqFFoMEPVscf3As+iIm2mb9/Kr/2j4JvlHG1KSq2lk/F" "8/h4OWrKwIt/qM56TA3n3PeH9PLW+iVRNf43096drc2UsGIvjfxePo5PYqqo2VyGNV1Frl65" "/O0OAKJqfGNRdlX2fSnwW88gX6qB+pcKGhSzeQNrZWuNkJwXv7q+sUedX1edfvf708aRR/cf" "jlCpVMjlcqQzKYwEGpQwR2FmiMg3goQw7oIe3XTqzTP462Z/f//h0dHRc52dnTt+Wfcrywur" "ERHMDICVKwp47xd+pr6+voPOuQsismX+mbz3eO8JIYwtpF8wvgKtSZIE47fYfgAAAABJRU5E" "rkJggg==") index.append('server_lightning') catalog['server_lightning'] = server_lightning #---------------------------------------------------------------------- server_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoBJ" "REFUOI2lk8FLXHcQxz/urvukb6NuWRUV1sOemmWh9NCejJe0VHIohQgmFpJLPfl/FBOi9ZJT" "sNfePAabEBDbEFofZC0kZD3Y1ezbykoMW5/ue7/fbyYHY0hj0ksHBoZh5jvf7xcG/md0vdsI" "guAna+13xpiMtRZjDMYYkiTBGPPz1NTUlbfnM6fFxsZGH3Cnr6/vsud9RGwMiKAAquTz/ayu" "3p0GzgIEQfC1iNwpFAqjvu+z/VcDay0iiqiAKE6EOI7PSMgAiMjdYrEIwPFxB2Mtf1YDRORN" "fvnVJEmSvB/AGEM2m6Xdbp9cdo7z5U8RFfT1dVX9MIMkSXDOoaqogohSffwHIg4RwTnH8KVv" "/pvBiVeKcw4RpVz5DH3tgYqiH/AgdcrgFEBVceIQd6K9dW6b5Zc/Im/NvVfC6fLR0TG1Z0/4" "p/2SwcEBnu48Yd9vc1SMcM6xvLysYRgehGH4w9bW1u0MQBzHqCrWWu7fv4fnZbl+/RpRFFF6" "XuLjhwM8evQrMzMzeJ5Hs9nMB0Fwo16vD7xhkM1mqVarHBy8YOrqVW7cvEXt2VOGh4epVCo0" "m00WFxdpNBqut7f3l7m5ucl6vT6bAeh0Or+vr69/vrm5SS6XA2D8wkU2q4+Znp4mn89zeHhI" "q9ViaWnpOJVKXQai/v5+LwMwOzv7xcLCwqXd3d3buVyuCPDwtweAMj8/j+/7AERRRDqd9rq7" "u1cAGo1G51/PVC6XPymVSqvj4+Mjo6Oj6Z6eHvb29qjVaniex9jYGENDQ1hrX+zs7KTW1tb+" "fvcb0xMTExXf91dGRkYGPM9Lq2pqf3//+66urkahUFgBuuM4dmEYtqIo+vYVliR7ixVwB5YA" "AAAASUVORK5CYII=") index.append('server_link') catalog['server_link'] = server_link #---------------------------------------------------------------------- server_uncompressed = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlFJ" "REFUOI2lk89LVFEUxz9vfr0pZxqVAaVgQBOCRIxAJHAnSS3aJRT0H/QPCC78B8JVm0Bo296F" "uBZc1Iw15EJwUQtDnKGnzRtn3nv33nNajDNk6aoDd3EP936/53zuPfCf4f25qdVq7621r4wx" "GWstxhiMMSRJgjHmw/Ly8su/BTIA1Wq1BGyUSqXnvn+T2BgQQQFUGRkZZnt76wXwr0CtVnsi" "IhvlcvnO0NAQ377/wFqLiCIqIIoTIY7jK1vIiMhWpVIBoNuNMNbytV5DRAbr8dJTkiS5WsAY" "Qy6Xo9Vq9Zyd4/70A0QFvXBX1esrSJIE5xyqiiqIKPUvnxBxOOc4Ojoin88DsLKyIhfgtVgs" "jq2urjZTxhh6rBTnHCLK9MxDbt0a5fDwkE6nQxAEhGHI5OSkV6lUngFet9sdH1TQF1BVnDhU" "lHp9j/n5ec7Pzwcs9vf3dWpq6lePV1cHAoPLrndQRUmlPHzfp1AoYIwhDMO+kbnEII5jVBUA" "UUFE0Qtw1lparRZ90ABxHHvOOfqtZ5IkIZfLkU6nUVHECaoCgDEG3/cJwxCRXs5ai3Nu8Kyp" "KIo+7uzs0G63KRaL5G/4KN6gqrOzM1KpFJ7X+/We52Wdc9rpdBQgvbm5uTE3N1c9ODi4d3oa" "3C6XRxkfG2d4eIS9z3u0222CIKDZbNBsNhsTExOvG42Gy2azb6vV6s9Lw7S2traUJMkbY8xM" "f5istSwuLhJFEbu7uw5IAywsLGgcx3pJ4LpYX193x8fHBEHwKIqiu6pamJ2dfXdycqK/AV3t" "nK1lkpzvAAAAAElFTkSuQmCC") index.append('server_uncompressed') catalog['server_uncompressed'] = server_uncompressed #---------------------------------------------------------------------- shading = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAK9J" "REFUOI3tkjHOAWEQQN+6hsI5HIErKHQkvlEp+BMa2WwcwF/M/PdwhJlep0S0/xHQrGiE7FLq" "3hQvMy8ZAMbmPVHfAYhFIRqnp6wxS+ZLymFUSbYoRP1Quh2Sxb6afGPPk/mGevKd35LFPKe+" "/KEr3kyI4pvwiYRkMa37zkn9p5HB/++g3RLznAv99bDdFIviJWssyLIzAKO/6IqFP9qW1I8l" "z8ViCyAaE1FfAVwBvumlx+9IHEYAAAAASUVORK5CYII=") index.append('shading') catalog['shading'] = shading #---------------------------------------------------------------------- shape_align_bottom = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAASRJ" "REFUOI2tk0FKBDEQRV+P4kpciDvBi3gLN17FO3gLdS14CvUA7kVxoeBGcHoyqfrfRXpGBqcZ" "QQMhJJV69aiQrpts8ZexvenC+c2zlxtDypydHHW/BgAc7u8gGwme3mYrsclvAItkpanpldjS" "4Pr+wwaUYMCG0+O9LtJkgGQyRS0jgBQc7E4QYMHrhwCIEJFCaUKi1FgPsCHdVhmi5VOriGjV" "Mz1uEAnSNyCznc+rlxaZpkSuB2gwkFYN5jWpIXKwqHWDQQMYZSPUkkRt1UOm1hGDUGuk7GYw" "3CvV1KG6BDH2jJki1X33wIsmZkvOBpY0YmB4eU9yeBEPgJibh8fPH4mL0f3LZ7q6vHAphb7v" "mc1mTKfTH7Pv+2W8lMLt3X33LwZfdNoagjeuI6oAAAAASUVORK5CYII=") index.append('shape_align_bottom') catalog['shape_align_bottom'] = shape_align_bottom #---------------------------------------------------------------------- shape_align_center = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAASBJ" "REFUOI2lk81NxDAUhMfJigsLBzjSA1VQQKqgBJpAAkqgAiTKoAGuIO1hbwgBK5H4vRkOdpaE" "/OxKPCmyI2e+N2PHIRQl/lPF3OLd7Y12AULXwcPTx1bgBCjAHTAClsfLi+PQBSz+Ek+XBdiK" "CXgeSWH15gMHPYAAkL9CMnUlld6H+j6gtUslywmmHmwWYA6s37nNS09zV4KO6IFQlJNPVVWa" "Ww9FmU7h+nE1OC4zwYyIRtTREWuijkRsiMYc91fnoRfh7OQgbaRy7g4gWgmLQjTCjHh+3Yzv" "ASXQAfMsjglgkYgmuBPmgpNDAJW7unI3h0WiyU7MBFKg+mkXbd6X9fdkXmsEc2Lsvw5zl+lo" "eajPr02Y/GAXYJ+avY371A9WAPaSrkR/nQAAAABJRU5ErkJggg==") index.append('shape_align_center') catalog['shape_align_center'] = shape_align_center #---------------------------------------------------------------------- shape_align_left = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAS9J" "REFUOI2lkTFOA0EMRd9uIhoCBZScgEPQcQoOQMlFkICOWyBxDE5AQQdCdAiRbBJm7G+K2WwS" "bYSAuBl7pP/8bVdVPWCbqAFurq/iv4AhwHw+B+Du4bMDuUAB7mACa9/z0/2qB5hOp93H4ahG" "C7HA21cKXt59s4OmaQAIQFoKpdJVilL39QUwmUyK7damolgusFiD/Qgwh7cPdfPKS+5RoBv0" "64Czk/UF/SaGAOPxGIDL+5feOd0DM5E9yClI2clZpCxuL46rNQDA0cEOAIpAvgIwYS7MaiyL" "x+dm6WBxBYCIdnEeuAuzIJvwHOS2dhfzL/V3sOhmHpi1uYnc5m7q4NIKYDabAZCSeHqdkZKT" "rcyZU7GfU+CxFC6iquoBe6PdGE+aP1+gA2wT9VZq4BubLxCQddwfWAAAAABJRU5ErkJggg==") index.append('shape_align_left') catalog['shape_align_left'] = shape_align_left #---------------------------------------------------------------------- shape_align_middle = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAATpJ" "REFUOI2lkzFKXkEUhb/5FSsRCXYBW80aXIDapcsSNLgB95AFGDchWEWXkBUYS5EUgdgIFs7c" "e06KeX9UfA+F/8IwDHPm49xzmVJmSyxSy28Jvp3f+vk5bY4/b5Z3AwA+fljBBtvc/K3jDs5+" "3tuAEgzY8GVnrQDIRgLLZNM4IAUbqzMEWPDnvgszjRIkkzI1JgA2pPsuw1wXITJNSmRCe8xx" "QCTd5gDIQdfSHSKT+drBDODr4YE1OAg9rf29XbdqWogWIkLUJj5tb/kF4OT7aZk76MsoxY+L" "y1JrEimyiRamVXH16/r1GEM9SNk9g6GFGiKa/7fQpkLMFKnylMFgsj12+1LXtOpxQBh+3yU5" "TMR+5iCN5T5KTwCOdtcLI9VakmHkOWSihamKMFc3D8gavS+L/sbZQq+Bf8dLDSqJzEhqAAAA" "AElFTkSuQmCC") index.append('shape_align_middle') catalog['shape_align_middle'] = shape_align_middle #---------------------------------------------------------------------- shape_align_right = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAS1J" "REFUOI2lkzFOAzEQRd8GRENIASUn4BB0nIIDUHIRJKDjFkgcgxNQ0IEQHUJskg32zB8K7yZs" "sjThNx7L/s/jb7mqRjv8R6Ntjbc31wGwu75w//gVXe0CBbiDCawdL84m1WKxYBAAcDQeoc4s" "8HaUgtcPB2A+nw8DApBWRqmcKkWZFz+z2WwY0LWrKC0XWPRgANPpdBhgDu+fWt5XXmqPAm39" "fwPOTyfVUC7r6gGuHl5jfYN7YCayBzkFKTs5i5TF3eVJVdd1v4Pjwz0AFIH8F8CEuTAbYVk8" "vZTwNgARbVgeuAuzIJvwHOR27i4W3yWF3it0p5kHZm1tIre1m5ZwSZsZpCSe3xpScrKVe+ZU" "2s8p8FgZOzVNA0C17Wc6GO9HPZ1VWwM6bf0bO/0ACSsQkFMOhc0AAAAASUVORK5CYII=") index.append('shape_align_right') catalog['shape_align_right'] = shape_align_right #---------------------------------------------------------------------- shape_align_top = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAATBJ" "REFUOI2tk0FK5VAQRU9UeiQi4kzojfQCnDtxEW7APbgLdSy4CnUBzpsWBwpOBH/+s17d6+Dl" "56P/p3tgF4RA6t1TJxXSdRubfKe2AC4vzl1Koe975vM5s9ls5er7fuyXUri5vesAuv9iAHB1" "92oDSjBgw/Gvne7s+sHjaUPKnB797FYAKdjf3kCABU+vGnMHez+QjQR/nufrDWxIt7sMdZkf" "w0oT6fWAmiAtAZmL5yYrSCZTRJkAaDCQPhvUKmoKpakSJerfDRrAKBshQtTapmd62qCqLVJ2" "Mxhe4T08WmSasmh8BWSKVLfcgReAJKrIwSJiysDw+JIkbZEezkVJarTpVSZiwuDkcLdjTZUw" "MUyX2ldZC5iqiGzhbLuR9Kn/T0B9N/e/31aCi/r2z/QBy7obR52UF9MAAAAASUVORK5CYII=") index.append('shape_align_top') catalog['shape_align_top'] = shape_align_top #---------------------------------------------------------------------- shape_flip_horizontal = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAASVJ" "REFUOI3l0L1KA1EQhuE32cTk+JMoQgrBIpC7CcTKzhuwFFnYwjuQwGIn2JhGyB1YBiS1YCVp" "gmgp2OjuZs/MWJgExART65TD8MzMB3+z+kNz13fpCODs5nl00n9yy2aLi5qJZqEYLQAza1Vz" "wpWB3iBp5qKRFwNAVREv0Wlv3FwJyLB4bztwM8Crsb9bdpL7+FfgapC2667YqVUKzAARxQWw" "s1HqHF8+tpcC3aG53Eu8VSmQefD61feivKdCNQCZaHzY/R7oHKh+JGGjFrTKAXgxRKcveCWZ" "KN4LjXq5tV58C38AF7dJU0SjzbUC+XS7TC8QEdKJkGQKaoi36Oj8fh5oCcCQWKzgHl5yxEAV" "1Gz+wvg1RUURNdTMiVgMHCwK9T/WJ3MRo14i65E1AAAAAElFTkSuQmCC") index.append('shape_flip_horizontal') catalog['shape_flip_horizontal'] = shape_flip_horizontal #---------------------------------------------------------------------- shape_flip_vertical = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAVtJ" "REFUOI29kL9LQlEUx7/Xpz0elg4VSlDw4EEFYfR3CG419A9E0FQILuHQ0NDyhiD6MQk1uDk4" "Nbk4hrRFg4lTidGiz3e959yGKNQ0i8DPds4938+59wKT5KLk2ae37UJvL/ibYL6srWbHS0vJ" "GcWw/iS4KnWSrx3PjUUCTsQMoFKXfecjBbmSZ/vQbsRCasY0EDKArtIg7p/7JsiXtdViP+0r" "zsSjhjU9JSBJQ3YB0gCx/lnQIv+eWDukBWpNgiINRR+biTUG8v9H9BaHN/WkFsIVAg6zBjGD" "SEMRgYihiNFVjMu91a9coFdwtL1YbBmcYOIsEXn2bAgbSybWFkysxE048yZo4Bf7btDLQe7J" "JqXcuXAwZYUEmBgdyXh8biG3nxBjBZ/snj8klWQ3Fg05YI1qo43r9PrwJwzjbGe5+CbDiVqj" "na2+tD1iHhcZzeZJxd46viuMn5wk7w8Yp+2Ujp5hAAAAAElFTkSuQmCC") index.append('shape_flip_vertical') catalog['shape_flip_vertical'] = shape_flip_vertical #---------------------------------------------------------------------- shape_group = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAbZJ" "REFUOI2NkbFuE0EQhv+zjChOsRSuoEBpqADRQKjNFUgu3PgJkK7xQ7iiNJXfAslV3NpCokph" "QlJAkSIUyEikDI111t38/1DsnXHCCXmk1eyuZj59OxuNx+MVgCNJl6PR6Bn2iOFw+MnMUpKX" "rSiKjvr9Pkg+2acZADabTZplGfI8f9omeTGbzV7cP3gYnZyt3QGIQJ0FQA6QwNvXcQQAeZ5/" "nEwmb8zsNKqpJ2drP4xbgIcmV2h0D/n6t5ClcXTXpl1vqFBcN9TLHZAAU/NztoC60Ctl6Q6E" "zYSt0vR07Q8OWnAHvq5ugpU7SMApmACZYAYYiffZ4+iWgTnAnSc8OrwXLOSgHGLIpOP7r7Jh" "BtzRpldnhyRQACmQAVCUagA4cH0jUArFcogCierur0lZ+r+A3S96N105TVtlSpB5mAMFswbA" "bpg5bEd5O4Nqb8b/A8qCMGtvG41eDVMQcdtgMBh8KYrimOT5fD5/BQClCVc/1ygF0AQjYEaI" "4Ws/fxgiSRI3syv0ej1fLBbe7Xa9yaYpkiTx6XTqcRx7lKbpeVmWL83sYrlcHu8D6HQ638zs" "uZn9+ANfUHo27JrAOgAAAABJRU5ErkJggg==") index.append('shape_group') catalog['shape_group'] = shape_group #---------------------------------------------------------------------- shape_handles = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAaVJ" "REFUOI2lkbGKE2EUhb+RUdBCXARB2DQ2IYEU8QlMJeQxolUeYRrbiEK2SBlIa5loJRY2ytpo" "6SRNJLOswtYmOOS/91hkMptgcAVv9cN/z8c558J/TgTQ6/UyoOLuaZIk9b8Jut3u+xDCo/V6" "nY5Go3oMEEVRpd1uM5lMai/ffJdLCDADBHLHBeaQvX1Gp9NhMBjUAGIAM/syHo8fxrfucv/o" "OnIQIBcu0A7k4s4x/X6fEMLHMgLA89fnOj66sRE4SEICl0qQu3AX8x+/ePHkQVQ6oLBrDki4" "F8Lt2/cha/OykxIg882iwN2RUwi8FG6BIRwABAc34cXSZnn79ksnAg/6E+DBMVeZUzuZVUTa" "OgmHACGAmZf59yGXjiQIfiiCGWZx0XohVHHKnQIlYXbQweajtOvgRfbdc6roajsRQKvVykII" "lZu37/G4c7LX+K51Sbw6ecq39BNmluZ5Xr8GkOd5JUkSLs7nzM6WzM5WTLMls8VPptmS6WJF" "uliSZivmX08ZDoeEEGqljWaz+bnRaHi1Wj3lionj+F0URQI+XLX7T/MbfsKOkD5N39gAAAAA" "SUVORK5CYII=") index.append('shape_handles') catalog['shape_handles'] = shape_handles #---------------------------------------------------------------------- shape_move_back = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAShJ" "REFUOI2NkjtOw0AQhr+1HSRKRBOEUlIAEi9xDCpuwCVoaWg4CA2XcRMkFxAkEFIuQJF4/xma" "xNjOJmSk1exoNN889IfpdOpmRvtJWvFn5xeBhBWSGA6HqRzuDsB4PE7mAQozA2Dp+8VZliFp" "PaCfXBa2/314coJ1xQCSeHieeDSIUTzdHTX3aCYIIRBC8k5I4mBvBzPn7TuurlBVVefq/b+Z" "EaMhObO6u3JxfHLatH18+fTD/QFmjsmROZIjsyaua+8C2kE0Q9GQgWSoBfoDaD2gro06Gia4" "vc4W4/viLda6HHB/8+rLuAuYixiLZvRtBNYBzOZG9fWDRbCrXeB/gYWQ5ckuH5N3H41GDaCv" "kTzPKcuSLFnd67xJYJ0V2ratwDYCthHYLwUaQQvlMyUqAAAAAElFTkSuQmCC") index.append('shape_move_back') catalog['shape_move_back'] = shape_move_back #---------------------------------------------------------------------- shape_move_backwards = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAPlJ" "REFUOI3FkjFOw1AQRJ8jC2pEF6i4gJUjcRJoOQniNlFKJApA5gY08c4sxY+tn9gRZUay9C1r" "3u78MVxaDUDf92mb8ZGEpNl5s9k0p4AWwDbr9frslMxku90ufmsBJDGClsyr1YqI+B9waqwl" "iee3r5QSCyLEy+NDMwOcGsd329zdXGEnUvLxE/MNavPSBhEuACfDoGPAmPWcShvFbCUReQzY" "7XaLFdbVRhi5xNnXgK7rpn6fXj/z/vZ6yjqu7PpsUB2hVgRHWa2cptpgF1Ac7n0G2A9Cahen" "WgdIJqGSYQYYwrx//xIGyUgc7qD0r0zSJmlmv/Vl9AdwNibDLwHECwAAAABJRU5ErkJggg==") index.append('shape_move_backwards') catalog['shape_move_backwards'] = shape_move_backwards #---------------------------------------------------------------------- shape_move_forwards = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAARVJ" "REFUOI3FkztOA0EQRN+OLXJSUosIOBW3gdNwDV/AGMkREjcg8G5XFcF6vWDsiICWShqN1K/6" "M9N1bcFfov0pG1gCPL+8Z7pQQgQKWEYOUrCgSjw93na/AAA311ckwYE42CAbG3yA7D7qfAVK" "sMdkO98EkkeAwzDoAkDMCSeuU7IVqnIBUKZ03tUKMtimr7B93cQ2trm7f+iWAFWe3U5cj2eD" "BrFa3ZKEzWYzV1A1Qs65Tu3YoQSSaK1hewb0g5CWZ12tAyRBnocoaQYMZd7eP6lD/+NQfdy/" "EmITIBkHOVVA1xa/tNvtIil93x+13++Pqqqs1+t0bTE/pO8hiSS0dvml/2jhNGyz3W6Z1nVJ" "AN2//8Yv4wFtllmhytIAAAAASUVORK5CYII=") index.append('shape_move_forwards') catalog['shape_move_forwards'] = shape_move_forwards #---------------------------------------------------------------------- shape_move_front = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAVVJ" "REFUOI19kz1u20AQhT9S9AHiSjAgqJGLxEDsK/kublLmGjmBb6FGtlk4CpDAgADXLmzue5Ni" "SYJ/yQCL2eVw3sybfVucTqewzXBJmvmv1zcFC1ZJYr1eL8WICAAOh8NiHKCyDUDnp8llWSLp" "3wDTYJc43E/Bh1Ycj8fYbrfY5vv9ax9QBBKEjA2SSYaUxLfby34efQdFkb9dfDojAmywAzmy" "V/bPL2lOoa7rPO04R4Zw5Ko2ElhGLch7M6Zcff5y1bdz9+N3dJWs6JNkY4EcNE2MAYaHZKNk" "1HLWAKjzzbSD4aFpTJPaamGcguSOQr6NlIKnx4foBDYG+BApVaOKPaV2JQW73Q7IAhsBvH+Y" "+s8bTi0d5WvLHQVhCLLcO4EVRbmaqwP4dfwZm82mF9FUYKvViv1+T7mYzVh9S+oE5jMY2lBg" "nciW/vkvQC+w9llP97b5C+9Wcbm7S7QeAAAAAElFTkSuQmCC") index.append('shape_move_front') catalog['shape_move_front'] = shape_move_front #---------------------------------------------------------------------- shape_rotate_anticlockwise = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAi9J" "REFUOI21kktoE3EQxr/dbJJdU/MybVKqSNqAxZMg9GJ7ErUQyEXqoeDFFhFsaYoEcxILChYR" "QitC1ZugEPWwUMVaiooPCurFoESRmofakkhBSDb7+D882IelTfTiwMAww/w+5gH8b+tL99ni" "z08m69XFvwHaQu4pYhj99epCo+bhJwOpVqV1hFgEn0sLZaIbb2s6mWG6dV89/bgIALZ6zUNz" "Jy6E5FCi3dMBr+xFyB1yNTndETDeu1heat/ZHcznn37/uiXg7K1cVLPPdig25YBH9mC5tgwI" "IqhA4HPvgCRKnfliMeDrCrzcBBhNFxRuUHXy2ECs7XBzoKJpXbIkI79UgENygIHDqcjQqlpn" "ebFUkDbJV0mCUBYBgNv96nB08mBTJpvZb+rWnKGbR3u6e3ZJTgkenxemYR7ZADhzPRc2iZVk" "jK/ltgX9gz8/5JIvzr++uC++Fw8fPIpbJgExCSihvRu3fuOTOn4vx09dy3IAuPvGVNPztXCD" "Q63/wdDUx6jfJcXsAkAoAwAIQAw28f2def1c+hVX6gJGrxQUwnjKKQJVna4BGAf2tIhKi1sc" "q1Lj3c1nenRLgCZrieB2e8SyGHSTga4AKONgHPA4Bez2CxG3gumrs5o6MbM+ljQ4kQ0TRpMC" "l1AzGQjlfwAAk3AQCthEAc0uASIQ+/LDOjQ+Xbkkaa7LEuc0RRlXFkraiiLH6hUI5ch8YyDs" "d7zqjAkKZXzMdFSON1rwP9kv7lAQ7RHLIS4AAAAASUVORK5CYII=") index.append('shape_rotate_anticlockwise') catalog['shape_rotate_anticlockwise'] = shape_rotate_anticlockwise #---------------------------------------------------------------------- shape_rotate_clockwise = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjVJ" "REFUOI21kU1oU0EUhU/ykjbPpClNtQ2BFoNBXbhzo2sXFQrtogRRFARFyEJsKbHZKFjoSoRI" "C1LRTQXBQNGKkFaxEtSCi9IfiGjaRWoV7SIi1vfezLy5My7SIJWGuvGshrn3fPfMXOB/6cLT" "05lkLmns1uetV+AWPwPbGd8N4KkdUtPnO1zX7RPc7ZKcH20Px/YJIbBSXr39fLDQXw9gAMCl" "/LnjritGYsHYlc6WzkS87UAwEoqgKRTGpvXrWOBIo//L66+zOz4hNX2qw2V86GDkUO/+1jh8" "fj+kktiwNsBdDsYYhMUarj1c794RYFu6L7on1tsa3AsmOTjjKK2tQDgS80sLKH1YGVvMvr+q" "PZ7sQO6T+TfA59isK9QaApMMP+1NzBRm1jkXk4KLE4K788XR0mUA0FonAi7SAIa3JeA2P/lm" "6S0ev3yC/Ks8HIdPvhtZGGCOeFT8VrpYa1RKgSRlBifK8V0W80d3C0587IU9BQDpibIeffZZ" "999fndqWYCdjbk6bd2bt60KoolS6BwCIFEwDaAn6elLjH7vrAu4VWPd35iy3h703Dkf9piQN" "AJCkYDFCwABIqGzyVvVDfTXjRMGJc+hs2ERPU6MBvwG4UoNUtS6lgiMUSCm0NfsTvPIjDWDY" "l5vTpqV4mkuViTYbZqjBA0EawgVIA6SqCYgITHhRS0RSZ87eXHzgs4gvk9IJ0h6sVQiSNCRV" "J5PS2PJDkkK5wqBIbd1rk0hn/3kj9fQb5EszJ0f4WWUAAAAASUVORK5CYII=") index.append('shape_rotate_clockwise') catalog['shape_rotate_clockwise'] = shape_rotate_clockwise #---------------------------------------------------------------------- shape_square = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAPRJ" "REFUOI3FkzFSwzAURJ9Dhp6WkntxHCpOw3FoaFJxgTTR7lL4y5Yn6lLg6s/4787blbQspyce" "+U4PqYFzHz6/LumzEwJIQCA2DsjrLMPH+9tyMAB4fXkmhBgCxMGBDCY2/Pxe7wmUkJTAkISk" "aMrIDnbQbRJBWhFJsEvYZx9NbvK9QeR1MWCbmBJ4E3bD1iYGzWAF19K63GfvJAG33Bu4GTlb" "zgyZU5E6SZsZtAaSt/xHk50ogeZZBAnpXK2XMHWUQ4FJkKYE648N1+DKPh5nqqsJQaqDY+Mj" "er8ng34kMN+X65bZNlEwYO3XOzaDnuXfX+Mf1G1fvcW0Vf0AAAAASUVORK5CYII=") index.append('shape_square') catalog['shape_square'] = shape_square #---------------------------------------------------------------------- shape_square_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAa1J" "REFUOI3Fk79LlWEYhq/PrM5QWA3hiSIohBrUgjiEtMWhrX+gqVURgoaE3HJwqNWhpX9BaAgk" "aBGRlihyCKGgg3ICMfPAITjvc98N349zRIm23ukenvv6rud9+eB/n6wMz19vu8yyMRABGCwh" "QyjPIVh4cDkDGB6kXTh7AmMsMGAZGTwAkeDrj27VqQBhYxcFgW3swqYASUYy0eMIQOSK2EhF" "scw6COmFDgMcygcNkrAoCqqKJTClIwBJoDAqhvLhMqtvYlDyYYCSCLna0wM7u1ipNEkDgKHK" "IEGEiDAhkyIHhkyS+bn/lu/teTZbs3S6j7j3ZHz+4AoRRAwXt1583flT7uy9oTayTvNWg4vn" "xni3scz6561njZn6mQEDE2GUyC0iN0phtnaWuXFtkhgKJutNIutxe3wK8EwfEH3dPIuI3GS3" "0+Z4dor712cBeHz3JVfPT5CR1forJPGl1a1uXhIOI2B3f4+N7TU+bq8y13zF4spDasdOYvy7" "+hf+dhrT9YVLV0aeTk3cYWz0JpvtD6x9WqX17deLfwLkkNFFsmw6g9OGDvbS+6X23B8J7G9T" "5jzkHgAAAABJRU5ErkJggg==") index.append('shape_square_add') catalog['shape_square_add'] = shape_square_add #---------------------------------------------------------------------- shape_square_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAaNJ" "REFUOI3Fk79rk2EUhZ98CbUkXYQqRihpQbDiXyE4qJsuIuKq4KZTQZAORRzcHZyK7oKiQ+0g" "dBcRsToYBGuoikMtpmrfe47D9yMJDeLmO53hnodz7uWF//1qpbjzuOdSy8ZABGCwhAyhXIdg" "6WKnBtAYph3eP4ExFhiwjAwegkjQ/dyvPBUgbOzCILCNXaQpQJKRTOwyBhB5RGykwlhqjUJ2" "Q3sBDuWDBklYFAZVxhKY0hhAEiiMiqF8uNQaJDEoeS9ASYRc9fRQZxeVyiRpHCAliFDVfxQC" "7fX7TL9eJvvS5UjrIOdOZgunVnV7AIggolFsvTA6P2V7/QHHtp4yf+ky++aOs/NqhTdrK0vP" "/PZHNkhgIowSRDi/SogUZurFPY6eOMvk++fUli/Q7D5ktjNdD3xtKIGLHYxu3DbNrQ0mD83B" "meuD7ott6q7NDu1AvPvYrzpLwmEEzDcP0H/5hNajq/za2aQPbH+vE3V61V/421s7316cmGrd" "mJmORiPbYPtr4sNmPX7/1M1/AuSQmYX+t96VTLWOMn8Svnt6Vbf+AP4kb/4CH0GtAAAAAElF" "TkSuQmCC") index.append('shape_square_delete') catalog['shape_square_delete'] = shape_square_delete #---------------------------------------------------------------------- shape_square_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiFJ" "REFUOI3Fk81LlFEUxn/zqiONH1M4iik4mkGgRLiSSojCSiL8BwxaFATthGrRJqI2RrsWtdBd" "CzdCFBRmQmRFEcVE2ThGU4ONX6DoMDpf7z2nxfvO6yjuO6uHy31+5zncc+F/l68o7j+b16IW" "VRQwBlBQEUTBiKONwN2BsA+gvJTWtM+PoqiAAiqKKGgJRATiS5uexwMYVVRdg4CqouqmcUEi" "iohiCuwCME5EVBFxjUUtDqTevKMzNUZv6DADI2eUbPKiB1AjzkUFEUEFt6sTvUlf0l0VZU/4" "AsG2LtZ+HyI6PnzPA9gCYhRxuzrdHb2fSXpa/1ATPM7qryh+X56a2kaq61qCHkBswYh6c6o7" "cz0fOdE2y94DZ8ktjOIP+EhEZshncivZXPrYVgIbjBFvfhElJB843f6ZYHs/2eQjLL9NRXUY" "s5FAMpne7sGJWcsDGIMxihFBjFK1OsHJ5k8ED/aTTT7EqiiQT7Uy/zrC49QVugYnIttewbYV" "Y5wdqFqfpLsxSkPnefKLw5T5lex6mMWpL7wI3Ca5FvCesSSBYkSx/j7laEMMo00sfHuAkGVj" "tZm5Nz94HrhFygphvJ3dlkCIzW1yKjNGR88IsdFrzE69p7LlCKnlJcbLr7O8Vo1KmhL/1l8o" "1p3LHYUbl66WYxkir56QiP9M14aCPX1D01933gUo23lQFyjcTMSnsdMrkqs0by2k79zQ95nd" "zAD/ADtfV0Dj5MLmAAAAAElFTkSuQmCC") index.append('shape_square_edit') catalog['shape_square_edit'] = shape_square_edit #---------------------------------------------------------------------- shape_square_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdNJ" "REFUOI3Fk81qU1EURld6q6TSSFos2FiTWMVixJ8iVXCir6AO8wiO9AVEcCI4ERw5LOhE6aCK" "gqCIdKISkYBCMtBCpVpQhKJJmnv2tx3cm7TWzN1w4DuDb7EOnA3/ezK9cOvRqvey3HHADHBw" "CTmYkmyCG9VSBmB4K60wthPHcYEDLkcOvgUiwae1Vr/TB5g77mlB4O64pzYpSHIkx2IGACxR" "xB0pLfay/obEpj5gqBfclNAFJiHzBGpiIlPn9I47RL6OyQlhACCItKTUJskZ63CQJ5TKs5T9" "BTJHwf8FKCgt9SBJ3u8vKRTn2D05y2RYYtSWCYMAIbBZlBNMjOgrU+E5uT15bH2RqeNVpsNj" "pHgAwCwtJ+93E8XuUwqVC9B5x5v5e4zm24y3a5Si+iCDRFkBzJx8/JFD4x1yYy208Rlc2K+3" "HDh/lblogaWbZ3PbDFJ1ObKYcusB+eJJ1KrjanPq0gzqrpLNNjly4hzQubLNQDRWWjRWfhN9" "e0Z5+ii7ct/x8AMyEbWFJiDUaTJxuIR1u5dfXatU+ruwdV7fPvPlWPX+vmhoGQ8/ST725quj" "kRnWPrynsXj94fAgQLzRzdbuXmy7HJeSk37p5J4uhXzvH8w7aW67Jx+vAAAAAElFTkSuQmCC") index.append('shape_square_error') catalog['shape_square_error'] = shape_square_error #---------------------------------------------------------------------- shape_square_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcdJ" "REFUOI3Fk8FqU0EUhr/UIlhKwVCxaK1YEWyLIIgoiAiKFfQFRBc+gD6COyu6cNnHcOdasBIF" "RQtuhDZoMcVoiVnEJO3t3Dn/cZF7byIGuvRs5mc4/8c/Z2bgf1cpF89e1D3XcscBM8DBJeRg" "6mkTLN09XgIYHaQdObgfx3GBAy5HDj4AkeDr1nbhKQDmjntmELg77lmaDCQ5kmMpQwDWi4g7" "UmbMtf6GpKZ/AW7qNTpIwkVmUGHMgTEOAUSBzFHW1GvOtVhr3SFJ25yeeI5iMW9GislHYXLM" "HDNla6YjJDEwPTnH+8Yt0pgMSRDBTMX5q63bSClBkRAjR8unmJu6QDvp8mnnBleWD42vPGh0" "+gAzzEazqUNU4PrCPcyFyRBOvbXJmelLdMIOH2srrXNPKQ8k6EX2LEESA+biW7NKqkhUSmop" "v3fbnD12mU66PfJuo9IcSOCY+teWxIRokcMTM0QZ5uJHq0Z5fIrVzTdUvlQawVgsnvL95XU3" "9SffPHCTJASCAkkMnJyc5+LsIh9qb3ldXaWT/lr4+YTPBWCvmn9U6p6fuTr2av3l97TEtfoS" "azDwmfaqEw/pmu8b28Vmtx6zke//ASWofK2eQSy5AAAAAElFTkSuQmCC") index.append('shape_square_go') catalog['shape_square_go'] = shape_square_go #---------------------------------------------------------------------- shape_square_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAedJ" "REFUOI3Fkb1rU2EUh598UKVoWkGrlFiVFgtKoaCgXSwImoK4uGpxsDg5+xdIJxenLg4Wl1qI" "i2BQ/AA3v6ZSNEVrbUulNpjGJtck955zOtw3yS0GV9/px+X8nvd5z4X/fWKNcPfJmjWymmGA" "CGBgqqiBaJhF4c7VIzGAZJTWu68DwzAFA0wNNbAIRBUW171mpwkQM8xcQcHMMHM2DqRqqBri" "0wYgoSJmqLpiI+tOiC/6N8BEw0EDVcUUV1BnpQyUHnBo1zKJYLgJiDdCoKBiiKizaWUVJV18" "zKmBDU5kbpA59o6Pk/1jOww0UMS9sWUS5nQ5x9m+D3QNXqDyPUequw89PJTN3bKJJiAIQESb" "749Cepine+gS4s2ze3+aqqzSOzrcGZR/TbUAIogk3dbd7Rb+ylLQg19cIp4oEItX6EgVoOpR" "/lFLRAwMEVd220/5eU4nZuk8IGjgE9dNiO/F/DqfZ/LVTwulmxEDczsIb0/XXnM8eMbg+VGs" "/pyYbDH3tIpVPExh8dvmtfGZ5WzEQMmveG5xcO7gG05ezFAvTJFMdjH30ufR6hUKe0Yw4OH0" "mSz/OivZsbe19Umr5C/b+3sjW/ev94+3m0u2+wiwtrTx4nfp1dFK0fvzZeHn7Ynpr7Pt5rYB" "L+Fue5kKDXMAAAAASUVORK5CYII=") index.append('shape_square_key') catalog['shape_square_key'] = shape_square_key #---------------------------------------------------------------------- shape_square_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhNJ" "REFUOI3Fkr9rU2EUhp+bpr1KqCba2jZDgtGCpcTRSQiOTlUQbaiii5OT+A84uFRcRUpxddJ0" "6OoSUTqU+ANEsK1KSm9uQ9IWaW9pkvud45B7k5R295ue4bwP7wsf/O9nhfBisaIhiyoKGAMo" "qAiiYKTNRuDZTNoCiPbakokBFEUFFFBRREF7JCLwu7rfyXQERhXVICCgqqgGbQKRiCKimBbH" "CEy7IqqIBMGQ5bCkZeSoQI20DxVEBBWCgHSCodD3jxH4AmIUCY7axyFLt4mC+HpUIL5gRDs7" "tWezBpPCJn6PoC+Eq1OPnw6ejNBsNNj6s0zL+UDCqlBZXULtsygWuz/fkjxRxdr5wsSl8f14" "PP6tO8EYWk1YXV7k4jnlzoN7eJ7HhY0Nip8+csAA+ds3GOiP4roupZL9vFwuD3c+0pP5X2rt" "fMXaKpG/m2fu9TuctRJjY6Nks1lc16Ver+O6mwyOXebR/esUCoW/PQ2U7fIPxkdjAJy/MsPq" "9yWmp6dJJBLs7e1Rq9V4+WqOU6lbgEc8Hre7Al/YNadx3DUAPr+fBzHMzs4Si7WlnuehIjTX" "3sC1KRzHOehMAJicnJzIZDKFXC43mkqlJBqNnqlWq6ysrGDbNul0mpGREXzf315fX48Ui8XN" "QwKgL5fLZWOx2EIymRy2bbtPVSP1ev2hZVnO0NDQAtDfaDRMpVKpeZ538x/K/GiUBySJYQAA" "AABJRU5ErkJggg==") index.append('shape_square_link') catalog['shape_square_link'] = shape_square_link #---------------------------------------------------------------------- shape_ungroup = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjpJ" "REFUOI2lkjFI1HEUxz//6zTtVNRCUrgEh0BHr6kh5GiTpsAEx6ghCCQS5JYmwSUcjBvEFgcj" "knBoa2jJvEhvkPTMKPM0tbDLobu/5+/3e6/hvKs7XaIHP3g/3vt93vu974P/NA9gdHQ0DYRF" "JBWLxboqk4aHh18ZY3pEJDU2NlYWDwB4nhfu7e1FRDqfv8vqTCKrzxJZfTqX1SdzWfV9v6ev" "r49cLtdZCQ8COOeSs7Oz3bUNLTSfCSCACoiCKjScu8DExATGmLkTvwAw8zarZ+sCqBYeFo8q" "iMD2vnArGvIqAcGiU0x88yJO5vsWwZp6Ll+7S1VNXSHmBIBoNLpgjIkYYxYTicSlQBEgrlBx" "bzdNf38/P75tsby5x9JGhqX1PXZ/7vNgekMPDg4isVgM3/cjZR1YBadQVdtIPB7nVHWIlvog" "p2urcKKIU5wooaY2hoaGODw8TJZmMDg4uGCMiYQaz3Pl+n3eb2Roa6pGRBERnIBzgnOKc8ra" "1xyP7lz0SjL6vh8ZGBhgJ73GdsYWkkVxTrAWrBWsVewRwBgt3wPf95Pj4+P4vp+8fbXeM05x" "VrBOsU6wTgp3qyVYmQpTU1ORv6UpVPvTcmkGR7617vgeFK27uzttjAnXN7dx495jxBVaF1Gc" "CNMPb/J5JYFzLpXP57sClYB8Ph8eGRlhJ/2RD5s5VtNZVtM5Vr78IrWe49PyPJOTk1hrj601" "AB0dHYvt7e3S2to6f1I8GAy+9DxPgdcnAv7VfgNKTWV7QDoMfwAAAABJRU5ErkJggg==") index.append('shape_ungroup') catalog['shape_ungroup'] = shape_ungroup #---------------------------------------------------------------------- shield = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlZJ" "REFUOI21krtrk2EUh5/3+76kV+ONopaCohKhVh29IFgcFIWiICIUEf8BEbGIIA4OLuLgXhBF" "HBx08IK26CBiEG9QbbBGDbWU1sa0sYmx3yXvOQ4h1Wpx8wdn+52Hh8OB/5mJ/m3pib6t+q+O" "BzD1pFNVFEU2i+hqU9HdCkfrW7tQVcbvWlWrd8TKfVWbEqsplMaVhwaMAZh8vEPrWruoFNI4" "dS14izZRv3wnuM2AoFEBfyKFn3tNOPWehrZOvr25wqrut8YDEDdK+GP9xcVbLoMKaktE08/w" "ElsxxiPM3SDW2EF83WFQS/75BWxFdwE4AC3bUyWJyqBClL9JlL+H+J9BBVAk+EIwdp0fH86C" "CsFUFs81L2dvAKCiVV0bgkRgBJlJYdwItX51KgGoxYkl8MuFFUDhF8AKqIKEqI0wjgVmwEQY" "DUB9kKBqZC1SceRvA60aqEagLuADAUqA2gi1AaoCYlAqsdkb1AxEApyGNSAhqAUnBKdqoRqC" "AirYoITrO4U5ABG5VHx3FW/hFkxsCcYzGC/CeCFOXMFENK2/yPSHfvzi18Hk8Y+jcwBt+1+d" "KA/3UczcIL7sAE5DE048wnhl3GaPpuR5/Fya6cxDbBAerO3NAgDc0G35nn3A92wfsaXdGG8t" "xikTW3oaP5+hMPQAPzdycGPP+FBtx/z528PX2tuJLUwnkntItO/FraunmHnE5MBdSiPpfZt6" "xm7/3v8LAPCpt2OZVf+YE2s+syDZSf7FrayE0ZENp8af/tmdF1DLYG/bEi2ZcyXVU9tOjs7M" "1/kJtIFGFRTTFAoAAAAASUVORK5CYII=") index.append('shield') catalog['shield'] = shield #---------------------------------------------------------------------- shield_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAolJ" "REFUOI21k0uIjXEYh5//933nzMWYBg2GkQmFXMaCzAwhctmMlIVyKRY2pEjJRrKTFRuJkgWL" "WcgCMWNDOAlDM4xCxiUOcxxnzv183/nO/30tTghl51fv7tfT01s/+J8Z6esaGunt1H91PIDU" "3VWqoiiyVERnmIquV9hZO6UbVeXzNatq9apYuaFqY2I1hlI/fcuAMQDf7qzUmindVEaHcGqa" "8ZraqZ28GtwGQNBwFH8khp94Qjn1krrWVaQHL9C29ZnxAMQNG/14X3Zcx3lQQW2OMPMAr7ET" "YzzKiR4i9fOJzt4Oakk+PIGt6DoAB6B5eSwnYQFUCJOXCZPXEf89qACKBF8I4pcovj4CKgSp" "YTzXPP75AwAVreraMkgIRpBSDOOGqPWrVwlALU6kEb8w2gKM/gJYAVWQMmpDjGOBEpgQowGo" "DxJUjaxFKo78baBVA9UQ1AV8IEAJUBuiNkBVQAxKJfI7wAoiAU7dTGx+EEwUnDI4VYvb8Rru" "fR5H5tEJyiWhWKzfARxyfwAObGlpkiDXUd/ajfhvMW6I21CH8XxuPI0zEIync3EXa5ZsoBRN" "8Sn/YdmYWe5Y5wegdVP/gcK7XrKveohO2oxTNwYnGmK8AlefZ1k0px3rWNpb1mJNSMeCLkD3" "/gQAuGW3OT98k/xwL5EJWzHeLIxTIJFJEjENbJy7D4CDa84yc+JCDKb2N8DUbf1JKWXmpYd6" "SA9exJangdlNLp9iKB7j+K1dABzv28WbxCCK+i5/5OSVr1/3rW86U4j3B5kXN1dUiilG3j9L" "P80matsmtZEsfiRTSHB/4C7ZdHDK/Gtpz8+1jtecOZZTPbT/TeUoxuwxMFYhh+rph6e/HP4O" "7Ydl+eYElaQAAAAASUVORK5CYII=") index.append('shield_add') catalog['shield_add'] = shield_add #---------------------------------------------------------------------- shield_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoFJ" "REFUOI21kktIFWEYhp9/Zk5eOo1aWBqGlaRkQS2KMoKkRTcQaqNgEe1qE1GLIKLbpkXroEUQ" "QbQIaVViRQsjOYSU0EUiQkvxrnmy42XmzPzf1+JQKkW7Xnh3Hw8PHy/8z4w+29U9+rRO/3Xj" "AUy+rFcVRZEdIrrexLpf4UT+6gZUleHHVtXqI7HSpmpTYjWFUljZ9NYYgG8v9mje6gbidDdO" "Xile8Rbyy/aCmwQEjdIEoymCsS6yk58oqKjn+7u7rG1+bzwAcSM/GHr2o2TnHVBBbYZo6hWe" "X4cxHtmxByQKN7Ok5hioZaLzBjbWfQAOQOnuVEaiGVAhmnhINNGKBH2gAigSjhAO3Wf28yVQ" "IZzsxXPN698/AFDRnK7NgkRgBJlLYdwItUGucQhqcRI+wUy6HEjPA6yAKkgWtRHGscAcmAij" "IWgAEuaMrEViR/400JyBagTqAgEQooSojVAboiogBiVOLAZYQSTEKajCTr8DswScLDg5i7HO" "McZfDTA7Uo9JeqjEzcAF9xfgbFN5sYSZnYUVDUjwBeNGuMkCjBcw3NbFTI/LpoZTbGg+Q9nK" "5WSmpuoa/cm0Wbiq/patmqw6gl/TiJ1+SKIkD5w0Hcdvsu3oFQp62mGwA4qKmfAqefP05Rdv" "IcDNuqXTvU/GnUQR/sZmjPMWaCc7Okd+2To4dG5+wlfLcdWsXWQA8PVebS2Jom6/+iB+7SHc" "vHzaG/ew/cBhlva3Es6NMAtkfrh87GHwDwBAz+3Nq6wGp51E8uKy6nr6WlrSOl3or1kRu54z" "QGY85uuIa7OBXP4r4Fc+3K5YrhlzLaN63naaM7Pfhk46YirF0UFBbx18Ltd/AvShVNG7c3/2" "AAAAAElFTkSuQmCC") index.append('shield_delete') catalog['shield_delete'] = shield_delete #---------------------------------------------------------------------- shield_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAohJ" "REFUOI21kl1ojnEYxn/P+7Ev887X2uhlmtCGyAE2ZClzpBwhKXbkSI0DJUkrR3KglJOVSA7Q" "nCAsivAmRhnDGot3a4zZu+3dx/M8////vh2svfKRM1ddZ1e/ruvuhv+p/tbajv47NfqvTAxg" "8GGdqiiKrBXRSs/qVoV9BfO2oap8vuFUnV4XJ7dUXUqcplCKKna+9DyA7w82af68bdhMB5H8" "UmIzVlJQvhmixYCgJoPfn8L/+oJwsJPCZB1D7edZuPuVFwOQqEn4fa0jM9edAxXUZTHDT4gl" "avC8GOHXy8SLlpO3dA+oY+DpSZzVeoAIQOmGVFbMGKhgBlowAzcR/xOoAIoEXwj6LjHedQxU" "CAa7iUW9ttwNAFR0sq4LQQx4gkyk8KIGdf6kbQDqiMQT+GOZuUDmJ8AJqIKEqDN4EQdMgGfw" "NOBEZx+ZIODsEkWcQ2xEchNyDXSygeqkwQfGUQJ8a0jOqWLPlQYQD8XGf53gBJGASOEi3Gg7" "R54+A71HKJbQWubOXExV+Vqy/hj7e59wKq946BeAiJweeXuhsaSqAQl6sRKyZdlenApOHILS" "N9zDiuR6RsMJGtIPulHycoDk9ucH01ddoxctIrF0B75twanw6XsXRixWDMYZRoIsq+ZvZNSM" "x4aOP/JzAIBoGC0d7b79LRIvwbc+1lnKEguw4nAqfB5OM6u4nBc9j3n8/tE7M8Zq7/ff/nix" "upp4ScehTD++CQklxLchlbOrWVdZT1s6xd3O1va8Yda8P0PwBwDgQ/PyMqf+gUi8+Oj0JXUM" "PLvWvWukZ/bqis0l9zvvPZ8Wp/ZNEyHAXwFTet2cnKVZrymrenh3pjctGp2Tjrk4TdipzA/2" "w3yW8vkCOgAAAABJRU5ErkJggg==") index.append('shield_go') catalog['shield_go'] = shield_go #---------------------------------------------------------------------- sitemap = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAPhJ" "REFUOI2dkrFqhDAch78UUecONzj5FPYxuhfcxLVwD3LQVZz7GM69p/DG4+QgIMQgkXQ5RIm1" "aX+QIV/Cx5/kJ9hOChwW+xtw+eGuEwFkxhhrjLFaawtkD6mTpz2TlJIgCDDGnB8TiT8J4jim" "7/vdcYO9wyiKCMPw/wIhBEI4U3slBbKiKO5lWd7ZecRZ3zTNqW3bNykl4zgyTRNJkrx3Xccw" "DB9KKQCUUmitP+u6Pq5EVVVdWb+yWKwVy/P8ugQpbmnwZBdwS/MCvHqwDEjnHixK8wU8W2t/" "Y2fgMAu2SuPD5h5slcaHzYKt0viwrV8ACIHRg92+AXh4kls+SBmJAAAAAElFTkSuQmCC") index.append('sitemap') catalog['sitemap'] = sitemap #---------------------------------------------------------------------- sitemap_color = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAATxJ" "REFUOI2dkjFLw0AYhp+TXNLZwaFTfkX8Ge5CB6F0Ffwhgmvp3H+gQoeInSwIbl06pA7a0lqJ" "BC8huRiXGnqkhugH33DPHQ8f732C/eUCRzvnFTD/5W2lBOBprQutdZEkSQF4W2mlDupMYRhi" "WRZa68l2IvEnQavVIoqi2nGtukvHcbBt+/8CIQRCVKZuVC7gdbvdTa/X21ATYqn3ff8yCILT" "MAxJ05Q8z2m32+fr9Zo4jq+UUgAopUiSZDgYDC4MUb/fX2KmLHbaYJ1OZ7kLXKpLQ0M2h+rS" "HAMnDZgHuOUejGcfLD4FWusH4LAoCtTTNdb73GA3m1teWZTLVQqklDy/KSNhS0rixcxgUkqm" "0bQ8l4LJyxejoDAF0xHO49BgfnbHfT42WJnBTwNnWZY1Yd6+XwCwgbQBW30DgrjTYaOKs0sA" "AAAASUVORK5CYII=") index.append('sitemap_color') catalog['sitemap_color'] = sitemap_color #---------------------------------------------------------------------- sound = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAf5J" "REFUOI3NUj1oU1EYPfflpbG2xpqHkdLSZBBdRAjUpVlcurg4SAZ1EX3SgtSgTqWLaFAKWYpU" "QYroIhinOnTQTXALWCgIEQ3vNbEo6JT37rv3vvu+66AoaSuuPeP3nfP9nQ/Ys1hcvHe+Vrv7" "5X88e3ug0WikPK99W2t9yxga3E3kzd50mZJrhSfLW3a9Xp/qS3rtZ47jHM3lclhff79D7M9U" "F4ZYXAsC0QRwymbMvEunB2AMwRjAcQ5jYGAfer0AUsj+zm71KgvlqqK4diBNk970uWs2UYJS" "qQQpFYgI3W4XnvcR2WwWSv0t4F2Zc4eZfhzKaF5FsprJWEuMizlb6wSdTge+vwkighACYRjC" "shhiHQMAvp698EkIOZNQDITifnHtBfOnzixByOO21hphGKDdbkMphSAIwDlHsTgBwAAAGHAI" "QQgwA3DxayQuAClhCRH93j2HkZGDIErAOQfnHEQJAODI6nOHReqYncRAGM17J09fHx5KAVy0" "bCklWq0P0FqDiDA2NgoAsCwLRPTnBoXXLx9tTk4zptTbNGgDysAI9cAiqcucq7JSqixEVBYi" "+jw+Pop83oExps+FieabhyYUlYwN9PzvzeK3jWW23edKpZLKZvffAdgNxjC4svJ0B8fPn5hF" "Er8q/Ght7fZoAADXvXzRdS/9m7Bn8BOxaQYGwKVnIQAAAABJRU5ErkJggg==") index.append('sound') catalog['sound'] = sound #---------------------------------------------------------------------- sound_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAndJ" "REFUOI3Nkk9sTFEUxn/3eW2nVBMzlNIwC0IXQpMS6ST+BAsSEZFGsBKVCpEGC4SF0FBJ/WlE" "FxISG4l2409igcQCXYhUkYoKk6kO6l/Sdt677943b+61IEERW9/ynPN953w5H/y3OHHi2Mbm" "5qNv/zXnji50dHSMyWTSh6Mo2mutKf0TKbN9T4MI9c0ZF8+9c1tbW+t+aWbSlxKJxMx4PE5P" "z+PfyP2NTQfHiXyz56lHwAJXCPugqKgYaw3WQiIxieLiGLmch1b6180NTduEr6+FJt88vsjU" "Zlau3+kaU6CmpgatQ4wxZLNZMpmXlJeXE4Y/BDJbdzWUiei8r4MDYaCbSkqcNiHVLjeKCgwM" "DNDf/wZjDEopfN/HcQT5KA/A4NpNr5TSjQWTB18dT968IvrrVreh9Gw3iiJ83yOdThOGIZ7n" "IaUkmZwOWAAETMDzQViQ6ttJUoHWuEoF373HCYKAkZFhpJRIKYnFigGYfO1y4syhDdezEwUj" "BjYvW6LuvFCs6NJ9rtaavr7nRFGEMYZp0yoBcBwHYwwAjafXHR6uGrtmaXUtVfFZ3O29WnKr" "/B73o6GsY3SUkjJMhWGYUipIKRW8rqqqpKIigbXfLPgqt2/+nHkUnALzKldSEHkWza2jtyKf" "ck+dPdv186vq6+tnW2uPSBnsFoJSgCHvS6xIlLGqeisAe5ef58azdgTXY87ooHR2dhYuXLh0" "UAhnG/Ae4PPwB9X7rouW21sAaLm1hdcfn2KxasyfogrQ3f34WXd3z0mAqbVlpbnw0+Lk5CSf" "ZZZh/yMPntxjZEi3ib8JjMbCHVNaEGKHgPEWcljb/rB9cP9Xu908cNSELwoAAAAASUVORK5C" "YII=") index.append('sound_add') catalog['sound_add'] = sound_add #---------------------------------------------------------------------- sound_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmRJ" "REFUOI3Nkk9IVFEUxn/3zXMc/2TlFCVajhS4CALJNrWsFrUJColatKgpowipFhZCSA1GJEFE" "BC2CWgTppoJaWItIalUkLQSjpmeOIoRG+t597765c28LA0uFWvYtzznfd77D+eC/xdWrPQdz" "ucvjf5tzFxb6+voSnpfv1lqfs9ZULEXyTpzNilg9a7x7a8Lt7e3d9kfTy99Lp9Mba2trGRp6" "v4g82t7RVSWKOd+P3gJbXSHs67KyJNYarIV0ejXJZIrZWR8VqT83ZzuOiUA9jk0xt6zMtHq7" "9p9yjSnR0tKCUjHGGAqFAp73kZqaGuJ4XsA7ejpbLfSdQIUX4lB1lJc7N4SMTrtalxgbG2N0" "9CvGGKIoIggCHEdQ1EUAJvce+hRFqr1kihBEVzLPHorRbXtuEKlmV2tNEPjk83niOMb3faSU" "ZDLrAQuAgJX4AQgLMpqzJCNQCjeKwl+31xKGITMzP5BSIqUklUoCsObxg/TbfZsfqeIk0pm2" "AzuT331doPrLshFXKcXIyDBaa4wx1NfXAeA4DsYYAAYPrO906yt3b9rRSXnTJhF+GFgx/Oo5" "M773wTVKbw+1BjRaF7GW+w0NdRsqKyuYmpoGIJgaP77lcEcy9fklvMpRuXwFmUwj70aGW93r" "N2+++f1VbW1tzdbaS1KGZ4SgAiBhRFNqbRPsOTufwO46ElZkFiWxv7+/BHRls0eGwVwDMI4d" "l0NPG6qenESFk0hgdiZBKcGEWCqqCzF4oK47WV3VtW5VyXWdArPfNN5kohRH5uI/CcyJrDsv" "pybaHSMajWPHDfb27hem5yevZTLG3MTlaQAAAABJRU5ErkJggg==") index.append('sound_delete') catalog['sound_delete'] = sound_delete #---------------------------------------------------------------------- sound_low = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAb5J" "REFUOI3NkT9oE2EYxn/fpQkm1FpzFKktbUERTHAIddLBSXBzyuCfQeqJk4gUd9FSLWZWkCLq" "4JC6OCk6i0vBTpUGCdcGiw41Qu4u3919930Oypm0Q8VBfMaH9/m9z8sL/60WFubPzc3d+bzb" "3MB2o16vZ1y3eUspNWuMzu8KqNVqJ3oN120+tW37cLFYZGXlw47Ax5mbe48+vt9JAUKYd9ls" "DmM0xoBtj5DL7aHT8Qhl2Bd2netXMt32KyAFWFonVCoVyuVjlEpl4jih0WjQbn8nin4D3MvX" "nEGhHukovrh5pjqSNlAqodVqsb6+gdYaKSW+72NZgljFAHw5e/6TlOHVRMfgy7sHXy/d6wEo" "fN+j2WwSRRGe5xEEAVNTE4ABQMB+PB+EgUD2nWVJ2f11e5Hh4X1onRAEAUEQoHUCwIGXz23R" "jY4MJDH4cvZr6dRg2iAMQ9bWVlFKobVmbGz0J9my0FqnmybfLD3cOH5axJH3YnL1vZcCdKhO" "dpUCFErFGMOz8fHRQ4VCnq2tb311J5bfPliens72emL7n6vVamZoqHAbxA0hyC8uPtkx80dy" "nJkLjnNp86/C/1Q/AIcGzXIH6B0gAAAAAElFTkSuQmCC") index.append('sound_low') catalog['sound_low'] = sound_low #---------------------------------------------------------------------- sound_mute = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYpJ" "REFUOI3VkDlIA2EUhGc3m8ubLIkHwUqwSWEsLCwEQbAKW6UQG5WQys7SRlACgdhZWIgSRIvY" "iYWNYKMitoKFuOZS1NzRZLNx9/22krsSnO4Nbz6GAf6NgsHAwtbW5kutL7QLRiIRQzQqb2ia" "tsYYWbMezyoYO7WdncUbAkKh0PTvOxqVw6IojtlsNpjPzwHAz1utx00bcBy7MhpNYIzAGCCK" "dphMFgzf3sH5kQY47n7g5CTbFECkw+12Q1WrICIkk0nYry8xmkohKwgwCoK/5QaapiORSCAW" "i4OIMBGLwZVKoWix4EDsx/bO7lcbgIZS6QuyLGO2WIRLUfDGGA77e1HVqfYdfK1RqShgDPAQ" "YaZaRZoD1j8/kVcUEOl1gLoGqqrCcXONyXwBOYOAo5FBdPE8eJ4HUQcNlp/je9OZXN6g00Ok" "r3uuqFaenM5hOBwiGGOtATlJmhj6/pYE4JE3m6c298MXhUJpvFwuB9LprFKXbqSMJM2/e709" "tb7Pt7Lo8y29dgT5U/0AEButCwo9mOMAAAAASUVORK5CYII=") index.append('sound_mute') catalog['sound_mute'] = sound_mute #---------------------------------------------------------------------- sound_none = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAATFJ" "REFUOI3Nz79Kw1AUBvDvpn+wHWJJcCgtUtAXyKrPkUFcRPICxRcQLUKhj9BBHfseznYS6hBS" "E93q0uQ2Nz0510EHqcMtDuI3fpzz4xzg32Y4vDkZDK5fTXPVzWIymVSiKLwkogutuWEERqPR" "0fciisI713UPHcfBdPpovLQqhH6o1erQmqE14Lp7qNd3sFymULkyA8wlPM+DUgWYGUmSIIqe" "Yds2imILgKhEHMeYz1/AzMjzHFmWwbIE1rTeBiBkWYowDFEUBdI0hZQSvd4+AG0ErDxfff3u" "oNXaBXMJKSWklGAuzRcopTCbPYGIwMzodNqfsmWBmc0AKzpeEQEgEK2hNe673fZBs9nAYvFu" "BMRm4ft+xbabV4DoC4HGeHz7Y2arBMH5aRCcvf1q+U/zAft7lJrTB8IUAAAAAElFTkSuQmCC") index.append('sound_none') catalog['sound_none'] = sound_none #---------------------------------------------------------------------- spellcheck = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjRJ" "REFUOI3FkV1IU3EYxp99MM9xDofLmiXpCMsJOsPS3FyR4kaZFxF1URezIL2pi0JS0BGEUdAH" "RBHsKsKb7rIGIZYsVI4f05KiRTkbQ2MjdR3X5s48579/V6lLA+um5/Z9fs/z8r7A/5YMAGrv" "1LjUGWy5+8LLKustiyOLYdoW+eggZDBwnV5b2UVjK5GkKiEhRUCA6e5AS1pA44P6UZGIi3FB" "aE9RlBKRmEec3hbL9Urfwly0Ts2q+iduvCvZcIO6uxaHRKk5RegUJakiKSlxykxVWzIqzC7x" "8cByQuJSEjVPP15tBYACxyMmmFFK5EqF8gylyCFiqojNZI6IAkEsxA96u97axCWSQxLkm1qj" "sabVOiYqggbzJKKKe0pCafZAK2cDgIr2MpcYF3NVGpV1V5PBpWJUO4WkOBmLRJ/tObu7j6Sk" "7ab8g/lDuuys+RjhSWj5mmzT5z45qodR67EXq4uH/PF4vHfOBK5metXQ+akJVz7XbwifGD+2" "7bZfOv5kliqcHyM4wO34NZKvmBKyMX0p60aHrxuXOBYAcJXKcXr8fnXDVnd1HqN4OvEjTHrD" "JRgxf135QlrT+fcdjUe3dL2YioXI6GIzClmn3aSpZOVy9IxFZvBqoRK+w+G1SHrAIY8S1jzv" "qb3a8pnvAky5DMK8iJ5hPoCBefPv8PoAALAPF+qsOn/zPq3iQyiB51zEjz7eiuB6+M/a//py" "7cMAxbk3X1Dg0W8eXCtj/81/h/9CPwECq/Qb3JwGugAAAABJRU5ErkJggg==") index.append('spellcheck') catalog['spellcheck'] = spellcheck #---------------------------------------------------------------------- sport_8ball = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuFJ" "REFUOI1lk89LK2cUhp87CYkmikZvCChCyCKaYGJcWbKMoBsXCuLWZa7QndvuKoVCF0IvlC6F" "7vwL7gUFFQIRzF1J4GJFEhAyan7MTGbyzffNpBsNtn3hwOHwnnPezfOB/+jg4GDD9/1NKWXR" "dd2MEALbtuuWZVUsy/pyc3Pz9b3/w1tTLpeTmqb96Pt+eXl5eWJycpLx8XGEEOi6TqPR4Pz8" "3DIM489er/e51+s9AAQA9vf3k5qm/ZzL5T7t7u6G1tbWmJubQ0pJIBCg1WqRSCRYXFwMeZ5X" "rNfrHz3P+wZ0AwC5XO6nlZWVT6VSiWw2S7fb5fj4mEajQTgcJhaLUavVUEq9Hc43m00P+Kpt" "b29v2LZdTiaTzMzMUK1WOTk5AeDw8JBqtUoqlUJKydPTE7qus7S0BFAGNjTbtjfz+fyEUop4" "PM7p6Sl7e3sUCgWOjo5YWFggm83i+z6e59FutwHIZDITwGbQNM3i1NQUrVaLRqNBoVDg7OyM" "SCTC+vo6W1tb3N7e4vv+qJ6fn4lGowBFzTTNzNjYGJ1Oh1qtxs7ODul0mtnZWUqlEkoprq+v" "Rwl838c0TYLBIEAmaJomjuPgOA6VSgWlFKurq6RSKe7u7qhWq1xcXKCUwvM8pJS4rott2wAE" "DcOoPzw8/BCNRhkMBlxdXXF5eTn6qJRCSolSCqUUruvi+z4vLy8Ada3b7Vbq9TqhUAjHcRgM" "BgghEELgui6u6yKlREqJEIJ+v4/runQ6HYBKAOD+/n4nnU6HfN/HcRw8zxvFfUsghMCyLBzH" "4fHxkU6nYwG/BIC/gVnXdYvT09NIKbFte7QshMBxHAzDwLZtdF2n3W7jed7vwB+BVxS+67r+" "0bKsvKZpBINBLMvCMAxM08S2bfr9Ps1mE9M0EUL8BfwKdN+DlQR+A8xYLDZMJBLD+fn5YTwe" "H0YikWE4HB4C5qsn+T8a32kD2ASKQOZ1VgcqwBfgXzj/AxjYvcEFVbiAAAAAAElFTkSuQmCC") index.append('sport_8ball') catalog['sport_8ball'] = sport_8ball #---------------------------------------------------------------------- sport_basketball = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA2FJ" "REFUOI1tk1tsU3UAh7//6el9a7t2l9Jd2LKtGW4hjl3QLegI4iKYaCLBR41R3jQk+qC+GGKC" "Eo2+Gd9UEmL0waFBCbIAGwkzQ2VsDRtbdyHr2q3r7fRGT3t6jq9A/L39ki/f2yd4Yko83p3P" "xI4XlNlntdxiY0UplnH1L7h8fRc6nh698yQvHj2JSPiN5OLnn3kCXXskk4OSZqNSKFEpKmxH" "1yNW/6tfeVt7vgkGg+pjgkQi4SpEwxfk6vmXq3dM1I2PU1VTiEqKXCKKSQQo5ZIkVv8mllOW" "OwfferH3yNsPAIRhGPLG/Pe3ZLE55GscIjl1g5peJ2pqgcxcFGdnHbWePcjufUhmL9GVf1kK" "bd4bOfXliNfbqYj41vLp6Ll3vg5+/AHVQhhl/SqZmztgETQfGcHQdIRRQUKnogrMjQfZnp8i" "Vqj7NnB4/LTp1ImWS+7hQUf6yhS1bRby8QhKKM3eY/2YTQKqVSRNR9fKGOUypUwRu38/K9cm" "DthL2pysq/d8rtaTJFM/sBtaJ7eUInhygK2/QpSUKsIiY6t3IFssOB0yVrNCtbYNuaFPuvjL" "5LicCEVo6arQ8tJhls//RlUHs62e9udGQSsjDMjG4+iqRiaepaKUMcdmaXDWUtjZ6JeL07MU" "n48iGzpmjwVfdz3//HiVA6+NYUJgCBPuhiYMTcXltiE0FWw+MhkY6XDmpMCJMbJraZYuXoMa" "Oy2dvbQOdjDz6wyp3RxCMjAQGEICE6BrSDYvaj7NdlrflDVNKlq7/Y6aRC/F3RXy6V0aW/zY" "3D7mby4hhIl9w+14akDSNYTNiZCdJB9skFfFdXH3p3Nn04X1jwK+vdjVedKxOMGnAiAEuiyj" "pEos3t4ETcfqkPAPHGNhcpqff78+EU473pT8vcNnM9HU/NytGXzdYzykjVKxAg/zSNkMHmuZ" "Zw41Mnq0h55Dx8nevU348uVs937fe7OpVFZq6jucdzf3v3J/bTU8N/kn9c2t5OxDFMzt6HIT" "wtqGqX4EbB2Y1iZRwpfWc62uo2cmtiKPxXTli/edG7Hwh95M6F1XXafb2xUkZdhxGllcxRil" "yJS6usV3S1vaJ2dmCvH/rRHg09cHxtx68gVLMnPQY8W567AkZsP6/Y3t9I3pneofAoxH+f8A" "LWaG7sbRkSgAAAAASUVORK5CYII=") index.append('sport_basketball') catalog['sport_basketball'] = sport_basketball #---------------------------------------------------------------------- sport_football = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAx9J" "REFUOI1901tsU3UcB/Dv/5zS1tPL1rXbWYUWBgmZsEwbMHELS8BLJBCMPqhvvpj4xosPvE55" "IjFqEB9MTNC4eEm8JIhAdBAZWWAqdKTbMKyj3fW0p/b0tp6d09Pz//19MBo3id/3z/fp+2X4" "n8yOjnp5rGPAG8LRcP/ACASp1dwcLVyZul8r6r/Wde1b9jCY/2TUb9rRlxjRmy7xlDeiyL6u" "ECL9KYC7KGam8ONb74h1w8jIW/H82bPdLaG8DaIziaPP7fBHFckbUmCVV9As5OHt7IES7YW6" "N85mxieCmwrmPnz3GEniS38scKJzX5/ErSZCu/ahmp1GYyWL9ZUcSrO/QFETCMaTIP22+Kcg" "896Z44JJHwQTkb2xJ4dgGzrCewaxcv0bJI+8jFLmJqq5OdSWsmjks4g+dgDeYAgyAEy/P9oJ" "zk4Hk5HhR9QeWMVlRAcPYfHKZyjdvYGNkoZw334sT14G5wLWeh2WUQaTGXnmT570NU06zVnr" "hVhqCI3cDCL7h7A2eRHx4eNomSby175G22mDcwFOBCIJNV3Dza+uOZ6q4jkGa+NE12BCaq4t" "IPbEYTy4+DH09HUUbk8g/tTzmzB3BQK929Gy2ig4ruVp2+ZwcLe6S8DFtlAE2q1L2D7yIhzL" "xvLEBej37mzCJADuEiZ+niOXifseLjkHmUSwKyUs/fQFzD80FNM3oB58Fq773WZMAgE1CafN" "4QqySeBzlr08VmwV8qqp59Far8KqGLCqZbgu/w/mJKCoCVwdzxAR7gQ66iMSGPN3H3gajm2h" "WVjFRqX0cMwJgd4kKuUmuBBmW+CjcwtoScbv0wQiJA6/Anh8f8EtWDAZgfhOlPQ6fks/WHUF" "e32sXD8PAPLj97Kv7TiU6vZ39aBzzwCM+Rk4tgUm++EJhOHriAG+APRCDXczi5pL4o2xcuPC" "3wOUnwn5X7WNpZ2Rvt1Quh9FrD+FurYGy3LRqDtYXasgnc5ZRb3+gyukU2PlxtV/z18+EvYu" "6quV6Oyl8Y5tpMkQJCThtG59P5Vb1KqTRs38lJh86nypfi6zYS9tPd+fP2nZzcl5CxkAAAAA" "SUVORK5CYII=") index.append('sport_football') catalog['sport_football'] = sport_football #---------------------------------------------------------------------- sport_golf = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwpJ" "REFUOI1Vk81LK2cUxn/vO/lyEkIGBTUhEsRK4S4sNCBCl9Iv6KJu7F0LpXRR1wX/gNuNq9vN" "3QhioYtKuyhc0CKEaiyCRERRxBQkGoOaGBMzk8nMvG8XJQEPHDgHznMezvNwBC9D7O7ufgF8" "6vv+nOu6HyqlcBzn4vn5+SCRSPy5sLDw/gWgXxwcHEyGw+Hv2+32d6lUKj46OsrQ0BCPj480" "m01isRhHR0edSqXyi2VZPy0tLf07WHB2dpar1Wpv0un04vj4OFprHMdBKYVpmgghuL29xXEc" "HMfh+Pj4V9d1V5aXl8shQLRarR8mJiYWE4kEvu8DEA6H0VoTBAFBEJBIJACYnJzEcZxvtra2" "2sC3olgsft5qtX6bnZ2NCyHwfR8hBFJKADzPo9frEYvFMAyDy8tLPM+jWCx2Op3OotRafzY2" "NhZXSqGUQkqJEP9Lo7XGMAwikQhaa2zbJpVKEY/HmZubiz89PX0lG43GJ5lMBtu28TwPIQRC" "CLTWaK2RUhIOh7Ftm2q1imma5HI56vU6Usp8SCk1bRjGC2CfvZ9KKSKRyEBQ27bJZrMopT6Q" "AOVyGdM0MQwDx3HwPA8p5aCv1+sIIUin09zd3VEqlcjlcti2LaTruhdSSoIgQCmF67r4vj9g" "7/V6uK4LQBAERCIRUqkU19fXaK0vZKPROIzH49zc3FCpVLAsi1gsRq1Wo1arkUwmyWQyPDw8" "UCqVsCyLV69eUSgU8H3/H5lMJv/Y29vrhEIhhBD03Wi327RaLQCklIOzgiDAtm0ODw87juNs" "G5ubm5f5fD5nWdbHMzMznJycUK/XmZ6eZnh4mHK5zNXVFVNTU2SzWc7Pz9nf3+fu7u7t2tra" "zyGAkZGRN6enp4lut/s6m83i+z5BEAzciEajAy2q1Srb29u/d7vdd0AweKbV1dXJSqXyo2VZ" "r+fn5+PNZpNQKEQ+n+fh4YGdnR0KhYJtmuY7z/Perq+vl198Yz9WVla+vL+//9o0zY+A6Xa7" "LTzPu4xGo3/btv3XxsbGe8Dvz/8HevGm8V+GQz4AAAAASUVORK5CYII=") index.append('sport_golf') catalog['sport_golf'] = sport_golf #---------------------------------------------------------------------- sport_raquet = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnFJ" "REFUOI2Vkl1IU2EYx9/znm1nOl2WQ1i0LEtBWo2okGQ3IUJEQQTZfVEgMULwIpAY0kAWycak" "IPCiq66CUExikE1w6ioQawRnJDZROcXaXPPsvN+nizAoD2a/24f/7/ngkcA/yGaz+3Rdv0Yp" "7SaEpMkv7Aihpz09PUVpp3Amk2kUQqQYYw8xxnbGWAVj7CSEdGGMOznnF+QdOtchhD4DAG7K" "sny2paWlyePxdPl8vo+apn2oVCrQMIy9lgLTNOHS0tIDxljKZrP5fT7fHtM0mx0Oxyxj7LLX" "611dXl7O6Lp+FVoJZmZmDlBKA4VCgTY0NKwJIQ5DCLOEkKAkSYumaV5sbW2tIoSaLAVfK8T/" "bNE8xjlXFUXpVBRlXAhxRpKkFcZYmyzLc7W1tR0IoQ1LQRXTmrUSryeEHLHb7TmE0HkI4XvO" "+VFZlj9hjE8mk8lNQsispeB7ha1WEZUYY3OqqiqSJK1QSv2KokxSSgO5XO5euVy+wxgbtVkJ" "5vOwQAmFlNIRVVXvFovFbrfb/VzX9YCmaY/y+XwKY3wlHo+vb/uD29HR/Qta0/jp9uZTC9lc" "QXBGGeWCUKF77D+kgPvLG875i1gs9goAAP6YIDocjxio1O8A9Ua5YgAHQOGDrlKjLPChKuaa" "TkSaELKSSCSyW5nfgqHocOR4e9uAy+UCGy9fO97l9JH0k+uPt+rhcNgJACCDgwmxbef7Q9HI" "xMSEWSqVzLGxMbM31D/f19dXY3Wfv4GRSMTrtMGBYDAIpqenwWQylXHa+LlYLGbsRiBPTU1t" "tp3oaP+2nven0m8zdU646/Af3LjVeykUCin/m/sJPBthMVp6NpcAAAAASUVORK5CYII=") index.append('sport_raquet') catalog['sport_raquet'] = sport_raquet #---------------------------------------------------------------------- sport_shuttlecock = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAo1J" "REFUOI2Nkk9IFHEUx99vZnbGmbZd17Sy2oouyWK2BxG7FGWHsotEdQqCCPp3KFKCoHMidOgU" "njsZiHTwFnbIjSIVTDNiZxu3RVjU2Fp2Z9nf/ua91yFXRKz8wDu8w/u+73t8ATbAzBozCwCA" "fD6/G7aBtqkXQgguFApRZh5cWloay+VyXdsSWNtMAABKqYfMXEXEj4j4xvO8d+l0+tJWAoKZ" "6yICADibzZqmaaZDodBApVI5QUQWAHhSyttE9JaZb7a3t9c2OuC1IgBgwzCuEFGzlPIOIvaE" "w+GXSqnziPgMEXcppaZmZmY61gWEEFwvANCI6K6u6xNKqW4iMgqFQj8RzcZisVlmbiKiCiI+" "3/KJuVzuNAC0MLMNAF8QsQkRe5h5bnV19SkAjEYikUEi6kilUg/qd6/jed4YM59CREvX9c+I" "GNU0zS2VSr3MPAoA01LKq4j4AhH7iej4uoNsNpsgog4hRAERhZTyqOM4k77vd9m2PaGU6lNK" "DTQ2Nt4XQpSJKGDmC+sOXNcdDoLgGgBIZi4FQeAgouU4Tsr3/WOWZbnlcrktCALHsqxPjuMM" "JRKJcQEAkE6nDzBzChFjQRCETdOcrVar+xAxysw10zQzlUplfygUmrZt+0kikXhfX2zwyEi3" "zLhDP4liPw4d1mzbnisWi0lN00oA8EsptQMAMg0NDZeTyeTi5iAZge/fMg3jZHPmG2hf3eX8" "2TNHAKCmlNINwxgnosednZ0rW6UQAMBAb7FPPxgH3TIh8mFqT5EoqPWeex2NRu/F43H3b4N1" "9EfhSJtWLic1KQGz3wHmFyZ33rh+sbW1Nf+/4T8nLK8M+/MLUPNLfaTUKyH04b0tLSVmFmvp" "/Ce/AeXVeytgOFHeAAAAAElFTkSuQmCC") index.append('sport_shuttlecock') catalog['sport_shuttlecock'] = sport_shuttlecock #---------------------------------------------------------------------- sport_soccer = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAx1J" "REFUOI1dk81LK2cYxc98JHWSQBlkiEwSJQqWdtGllLrSS7spXWsX1sUt5NKNuLBQ/DOEesWW" "KsV/oEhCF0FoS8FqkVjREI0KFhe2M4nz9U7e5513umlC2wMHnsWPs3nOUfA/XVxcvMM5/yRJ" "khee580GQfAGY6wfhuHPnuftra+v//BvXhkeR0dHummam1LK9WKx+GY+n4fv+6jX6zAMA+Vy" "Gd1uV3ie972u66/W1tb+HAWcnp5mMpnMN6ZprliWBVVVEccxwjDE4+MjWq0Wut0upqenUalU" "cH19/Wsmk/moVqv9pQOArutfmqa5MjExASEEiAhSSuRyOczMzMC2bTiOA845crkcCoXC3Pn5" "+Vdpmi4prVbrLSL6rVgs5pvNJhRFwdzcHKrVKhhjiKIIjDEMBgNwzuH7PvL5PO7v73F3d/ex" "SkQrlmXlt7e3cXh4iG63i9vbW0gpkSTJyHEcI4oiEBGenp5g2zaI6HNVCPGBlBKdTge5XA5B" "EODy8hL9fh+cc8RxjDiOkaYpHh4e0Gw24fs+NE0DEb2nE9GM7/twXRdRFOH5+RlpmiIMQ6iq" "CsYYhBBot9vY29uD53lwHAfLy8vgnGsqEamWZaFSqcBxHJimidXVVWSzWURRBM45rq6usLu7" "C9d1h12B67ogIuhE9Ec2mzU3NzfRaDSwsLAAy7IQBAGklACAfr+PKIqgqir++RrGxsaQJAlU" "Ivqx1+uhWCxiaWkJ4+PjGAwGEEJACIE4jlEul1EoFKAoCtI0RbVahWEYIKJzVQjx3dnZmQQA" "xhiIaNQFIgLnHIqiwLZtGIYB27axuLiIm5sbENFrBQAODg6+np2dfTk5OQnHcaBpGhhj8H0f" "YRgiCIJReKlUAuccjUbjlzAMX+gAEEXRF8fHx2+7rvt+p9NBr9fD1NQUSqUS0jSFpmkwTROm" "aaLX66Fer98nSfJyf38/Ho1pY2PD5px/Wy6XPxyChmFgfn4emqYhCAK0222cnJz8JKV8tbOz" "c/mfNQ5Vq9U+ZYx9JoR4V0qp27YtpJRSCPG7EGI/k8kcbG1tDYb83w7A3IKgPHOhAAAAAElF" "TkSuQmCC") index.append('sport_soccer') catalog['sport_soccer'] = sport_soccer #---------------------------------------------------------------------- sport_tennis = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwJJ" "REFUOI1dk09MXGUUxX/fe/MeMA4zUFuwZYNWE2mMK+sCEw2NQnVhYtXUJiRdwgITk26aNEZT" "Fy4FGRtxUxd0qavGCAubKEHThahEaI1NIbRV6AAD82bevO/fddG0Ac/qLs49yTknR/E/mMXT" "gyBDXqQfZ/q8bihffLWiotY/9drlSx0DC9/v5auHhywM9drcgTFx9ZGw+3TBh+CVQbxBBYch" "WSX7ezLxXk+Jr5c7X19feSQgC0O9Nsh/EnS/O+xji6tfw+tbiNnCywFanrhI/e4kcfE1Qp2R" "LF6YNk3z4eEz2UoABFrC94Oud4atuoHdmsCnc+DuASmYCkgOs7lEbW2Sul6lre/jYUw2BhBU" "fnnvFORHfVzH715F/A4gD/wFClSC3v6R4rGvcGlAc2MGGxWwhpHVLxgM2o+cHM09+UFeRU8h" "HEK83xdqEEXY6pdk69/ReWwcvbNJo/ITpRc/LZiEoUDWJgo+u4mtzRF3f4ToEET2xKxQcY5s" "82vEG3KPDdDcvoHEJWxGfyBeP+vDALN5BZeuoaIXEOceNCMgXgCFyoWk//5M1P48praNI8Qa" "+gJvU/AOLwq78wdB/jje+UfP3oN34KxgTYZ3IA681dgGBN6my6IdojoxyRJB23O4psUZj7Pg" "NNiGxSRtFI+eIflnHtXagdINsgbLgRg7T9ZAxU+ja78SPf4yPhgg20rROxlZtUFz9yDFvnGS" "u9fR1evEhWewyQbNOvOq+i2DzvNN6/FyoXbnEqIP0n70HCpswTbuE7Z0IcRUb89QvTVNVGqn" "1HuWvybOJ806b+c6TjG7cYUp2d04FxVP0Kz8wP3fR1GqB5EObFbF6nVwjqhUorXzJezGTepb" "TL1xldkAwGnK1bmL07FtJ98zQlvXCWhROL+KCneISkfI97xCqfcsYWr5bfzytAop7xvT7c/o" "lZQx5xk5dPJ8Qdq68GELYh2SJZjqPRY/LyfZLlMupvzWDCv7BB5i6QKDWY0hMfTrJn06hazB" "ctZk3htm3rzG7F7+f6qOqPqwcmBcAAAAAElFTkSuQmCC") index.append('sport_tennis') catalog['sport_tennis'] = sport_tennis #---------------------------------------------------------------------- star = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAi9J" "REFUOI2dk7trVFEQxr9z7p69N7ub3WyiiSRI0MTE1YCFhUR8YOMfIEhArYS0YmGloOktLbSx" "sNM0lrZaqBAQBJcUYmJhkmWz2ez77n2cmbFI1ASSoA4cZuCb7zcH5hzggKh8unC2vHDp2kE9" "+iCRLF4K2ef/BSh9PD9jTGbcJLN9pXfn5v4ZoESeGi+LZE8eTHK/OH8q+deA0vvpOeP15bXj" "AgCM22tyWe/FnoPKxcsZ+LgOsVdBOCMsoyaVS7npfnC0AQ5aUIkRdOtlBJ1aVyxWhekLSN6S" "jV6r9YWLRZPuO+24aTg6CUBDsYCCMmxnFRJbCDLQZgQSW1AUwoYB4tBH6Dc2FACUPkwvuZmB" "415uCNxZBocNsLWQ2IK3j8QEIQUnNYmgXYPf2qxHfjCmAaCabRSCWmWlWy1BmaMQZggxhGgr" "263ayRQQtOvoNqsdR9HJqdmVTQ0AU1OLkcOtgr+5vk5RDOUMQuy2mRjCBMBAiNBpbgSIUBi7" "8b28awtDVxbbEtOToFEBdP7PLSwBxFDmMGK/DY7ozYnbSz9++RI7VyJMk1obSNQEVArazUMl" "E6DWGjioQzmD4DA+ttOzG0A8rnUC0C60GUXYrIPiFpLeMJwEg8IINoiP7A+wMqyUg3Z5Fd1a" "JSKWeRBXOVyZTfb0prx0DhxEuX0BzDRQXV7ssOVnEze/3dsh3f38+NCdpl17aEPbv9eLBAB8" "fTVxa19xOxYeeDPFR/j9L34Cf98zkPlcMmoAAAAASUVORK5CYII=") index.append('star') catalog['star'] = star #---------------------------------------------------------------------- status_away = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArpJ" "REFUOI2Fkd9LU2EYx7/nnHm2nR23ZvPHNOc0FZyIWUpEF0rQjUoXEQVeBbsIwroWQoq60Iug" "PyCCbiqCoECE0Cy8UTNaHTLKqbOhLpdu/tiPc3bec963C3PUFHquHl4+z5eXz5fDIdN9V7ka" "8LmCXrfUmiMUX6Nx5c3swqP480uPC1nhsONzbZXDve3uQKDKbm2otFmba474CJPOfMoENll0" "9PPfPF8Y0ORzBbsCjnKXJEAlFFmdwikJuHjWW97WVBss5A8ElDptrbYiAbtZCmICxGDYSpuQ" "bRx8/mOthbyl8EHTAdNkIAYDoQyGCRgmwPOAqhkHfB34gRKOKcksgVXkkCMMGmGQrBziOwYm" "p+aU/wZMzMyPP3wd1XZVClWnUHUT6RzF8BPFUD+8DxXy/7TQ1j995UJXw42uerFiK6UiEieI" "JzVkU0l0+EU+VXa8IRqptyH9dnL/httfmq9NtHae9D3t6/QGjsoWZHQGRvdcJMJjcGQ+wu6S" "oWVVLIamw5Evsf6hkbnxvER3sdTf21EWcEsCNnZNSFYeAIetxQnUeTawW3sdOdMKQih81X2N" "vHjzVTDJevIOGipLOl0OHr+2CcAYKGOglIHFJ5CQutHk92Dq2QOcb/egpbEG8ulByXOUv5MP" "kGVbtcjxWI2roAwwTcCgDLxFRJqIcMlFeVelxRbk7NXw+uUT+YAcMTjCAJ7nYFIGgzLohCGz" "s4FUzgD7ww0NDILnBexkVJCcwfIOlld31pZizjqnfc+rSSl0k2ElqqG8Poy17VIMDN8DB+BH" "woCQmEFE2Qrla4yQnoWxRZJ2CKy9qUaGtYiHIDDoQgU2393COi3BtzUDynwM88oooi/uby+n" "+GC+xv2pujy2XlHmNjxO0aEakGPJLEhM0U5tv7S01CWLLExLrSxlZn/q4u2R0PeZ37zsQhF4" "VZscAAAAAElFTkSuQmCC") index.append('status_away') catalog['status_away'] = status_away #---------------------------------------------------------------------- status_busy = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAphJ" "REFUOI2Fkd1LU3EYx7/nnHl2drY2pzmd5tRylvNiWXrRCyheRJRESRR0FXhRF3bdRRAlBP4J" "QQTdGBUIEfSCZSBCLzasQQpqLka6mov5NnfOzu+c39PF2sgp9Fw9PM/3+fDw/QrYoU4NRi+H" "Ap5+v1cN5xjHdDwZfTM5fz/5+PyDUq2003FPe+1Qb4c3FKpz2IO1ir2toTzASD3yeTP0m+LP" "v/yrF0sBrQFPf3fIWe1RJWiMI2twuFUJfcf81e2tTf2l+m2AKrcSVsokrGc5mAUwk7CSseBS" "BAQa94RL9bbSgW4AlkVgJoFxgmkBpgWIIqDp5ja/tn0QnUtE01kGuywgxwg6I6h2Ack1E+Pv" "vkb/Cxj7MPv63qu4vq5xaAaHZljI5DiGhqOm9unjVKl+SwrtA+8vnukOXutulmtWNjTEkgzJ" "tI7sRhqdjbK44dsXjMeaFWTejhduhELTdmUs3HUo8PBSlz9U6bJh0yAQz3shjAyj6tYAiBkA" "ABOCLoD6DgAviyZ6d6kDvZ2+kFeVkFq3oNpFAALszx7Bd/cm5OMHYfN6ACLkfqYUfeHHi5lU" "+kQREKyt6PI4RSyvMkiSCE4E4oD3xlXIR8OQFAVGZBZEBLljPzhxaKn0kyLA5VLqZUFELJlB" "vd8Jy0IewgzYKstRMTK6xbzU2R5YgKcIyDFTYASIogCLE0xOME3KL4lgRCIAURFQaIuA74tr" "SwsJ9163I++rxTkMi8AdTuQSy+B3riMXmQMAlB1ugb6UhACsFmOMsdPzo99YxilRR2uDC/Yy" "EZJEyLSE4Xg6DNgk2FvqIforoS8msTY1QwScLMZYqLoLo79qfF5zt1t2aiZciXQWTdMT+uDk" "bdVpZcW/z6cJOBcGJv4ABxEnLygfJvsAAAAASUVORK5CYII=") index.append('status_busy') catalog['status_busy'] = status_busy #---------------------------------------------------------------------- status_offline = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAj9J" "REFUOI2FUj1r21AUPdaXJVkK8kewFdQSAjXYxjUp1dCpgf6IroWs7ZjNc+iaLplK+h8ydgpk" "jajwYiiysYOpsZuoyHKw/J6eOkUkViAX7vI457x7z7k5PFGnp6efTNM8NAyjQynFeDx2Xdf9" "fnJy8mMTyz9FbjabX1utVrNWq+W3t7fzlmW95DjunSRJf3u93q+HeG5TwDTNw729vaosyyCE" "gBACWZaxv79frdfrh5t4YfNB1/WOKIqIogiMMcRxjPV6DUmSsLOz03lWII5jJEmCOI7BGEs7" "l8uBEJLxK7PCcDh0l8slBEEApRSUUkiShDAM4TiO+6yA4zg/Ly8vV1EUgRCC9XqNKIpwfn5O" "r6+vnU38oxSOj48/2rb9ZXd3txaGIW5vbxEEAYIggGVZnKqqrwqFgtzv9y8yAt1ut9NoNL7Z" "tt2oVqvQdR2VSgWlUgmapqFYLMKyLGU6nb5WFMUdDAbeoxW2trY+t9vtpqIoWC6X6VT3ht7c" "3EAURRwcHJRLpVI344Fpmu9lWcZisQAAMMaQJEmaAgDMZjMYhgFN01oZAVVVX/A8D9/3kSRJ" "Sr6PM0kSrFYrCIKAfD6v3/PSOyCE5Bhj4Dgu/TWOY1BK09t4uFZmgtlsNpnP55AkCQBSMiEE" "jDHwPA/DMDCZTHB3d7fIpGBZ1m/P80JRFN+apglBEMBxXOoHIQRXV1dwHCcYjUYfPM/7AwA5" "bNTR0dG0XC5TXdcLlFLN930EQRCGYegTQv6dnZ29eYj/D0mLKIadWHVKAAAAAElFTkSuQmCC") index.append('status_offline') catalog['status_offline'] = status_offline #---------------------------------------------------------------------- status_online = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnVJ" "REFUOI2Fks9PE0EUx7+7a9vt9hcVaWnBApEaW6IVAwejUaI3RQ/ESLyZkOgF/wNPnjh7NSZe" "jDHxamJQjHhQVCLWaKIikCpWq9BCW3a7OzNvPFQNtCS+ZJLJ5PO+b+b7HQXb1Klr2YvpRGgs" "FjYyNiO8zxWyj17O3yzcPXerkdW2az7RH58YHgin0x1eTzKue/q6WhJMGofnNtIrMnf/zWZe" "bRRIJUJjQ2lfNGRosBjBdAhBQ8PIkVi0P9Uz1sg3CbQF9Yzu0lA2CUwAjEuUqgJ+XUGiuzPT" "yO9oPKg5gBASjEswkuAC4AJQVcCq8Sa/mm6Q/ZTPFk0Gj1uBzSRqTMLwKCisc0w/e5f9r8DU" "zMeHNx7kamWLYDkEyxGo2oSJ21luvXrxupHfkkL/+PPRs0PJK0O97vZSxcJigaFQrMGsFDHY" "7VYrkT3J3GKvjurj6SaBvstTmaMHY9cvHIulejtDaAn50BP1oiviRTDgQ3s0iP09Ld7ZVRwo" "vQ1kgdmFLU8IB4zx4cFIOmxo+FUWgAQABSQBh0ss5G14XBounUm2Yt/eq00eJOM7j4d8Kn6u" "MUBKkJQgkuBU30upYP6LiXirDlc01tck4Pfru92KiuWCBZKAEACnepycA0RAucLh1jS4dW/g" "b9+/f2AzrjAJqKoC8Wcy5xI2IzAiEJT6UlQQbRPj0vL6t4W8Cb9XAQAIIjiCYDMCF4BLAxJt" "LswtbcAqrlWaUlhkp+cnP7OqT5MDqS4/PC4VmiahABAkYTmEe1N53Hm6UqbpJyeBme91mxuq" "4/zkj/ZImO8Kun0Whz9fNJFfdarm13IJVXMNH0YPbeZ/A/ACJMrOgl8GAAAAAElFTkSuQmCC") index.append('status_online') catalog['status_online'] = status_online #---------------------------------------------------------------------- stop = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkhJ" "REFUOI2lk1tLVFEUx3/OGRXJW2kqjk3ekkDF6E0i7CnI/B69FD0UvttDgdBNwpL6CD1V9Al6" "kkytmDEmm1ScZEzHuZzL3vvsfXo402hKL7VgsRab9b+w2Av+M6oOP2RfzF2tqoneI2LF0b7A" "BJjAr8WT67rkTO3a3uuhqSn5ez56EJx5+mS8prVprr6vM2ZZASgfjIHAoKUZzifXXjYUv98C" "HhxxkJmduVLb1jLbdPZ0t7Wbhp0t8A34CoSExhb8k33kFpNf7fTGzZ6HM28BrFD50XhdW+vz" "xjNdcWvnG2Q3QekQKCRIBTvbRLwStT39J6RtX7re27vyeGExFQGIRqqnG3raY1Y2BZk18BS4" "bpiOB44bEqVTRL+8p7WvK0Z1ZLqyA2N03MKHzTXQAfh+qKrKKf1yFbCaJNreTZUx8QpBIISH" "KxrwRGj9D6As9yrshQDXw3iut+9AyAApwXbL6geAFbJyCgFSoj0R7DuQXh1aQaEAAQcUDxEo" "CY4DRoMSdQARgKBU3NCuD82tUNgD2w4HHQfscnUdKOSh4xRKavxCcaNCIHO5yexiMuPHh+B4" "B+zlQxK7DHRcTD6P6YzjjlxgY34xo37uTFb+wczCcupaW0tKFEujdYPDzVYxBz82QQkCV+A7" "DqarF3H+Ilvv5leLnz7eGFlaeXPkFhKXxyYaB/qftQ0OxKqNQiuFMQYdgDKw/eEzxeWl2+cS" "6ft/PabE2OiEVX/sLpYVD7QSRmuqAlOrHW9d7+XuWLrm1VAiIQ/j/jl+AS8ObQPjMCNvAAAA" "AElFTkSuQmCC") index.append('stop') catalog['stop'] = stop #---------------------------------------------------------------------- style = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAshJ" "REFUOI2lkltIU3Ecx3//nbOz7bg5tzmdznJ5wQsqmBpdDM3UtJcu4IMRXaiHeqiIVhEkkhTW" "Q9CDPUS9lJSUWBAJveQlUpESZ0xzqOH9Mm3TTc92Lju/3sRSK+j79oHf9/Pw5QfwnyFrIb3O" "qc03hzdZjEyehVXoBQklT0DmJuaDwy3OxYqxe9mjfzUm3h8sq+pccHVOcdgxwWHho+FX8Zd6" "0gCQbHSv+IUQiZaC8iQdbbG/nqxv6Fv8GvSKQdEjuQEIbiSg10L8rf5TNZVbz994Pv5wyR18" "WZikrdepiRH1bGpqjeu0PoxOlkQUIIRAATJ+rzi1Kki42Z98dJfJPusTfb65QANZQS6GVUZo" "KEpLZF4trGAgMk653WZitLII8LHb+8YzKzhWBREqsBds0aTM+0LLVyrj36oBlGkWlbF7UKHF" "cd+QNjc6TokYNjC08t0Wq0pYmA70mwTmAQ3VrbR1LqzyclnMscet7vbPbe4nKEgCIlqrLqZW" "qwmo0MQezEoKOzw6HnS6vvnt0QbmPY3ADjRmCLR1Mjz9UHnUVe+yFPjS4rbPNO3pBQAwHfiQ" "0jPsP8MQhT4r11DrXuDdLqfvHITkaCLJoGFIDACA4kJFbHeGWZW5uCKy5cXmOwAAkaUtOQXF" "sc9K0g1ZyzyJtxqYCEeXp27+RXYHysjLkgwMRcLXPdLviTrRe7xkX2S9miLACyFY8oWAVQLo" "WAo627zNE37+JL1ZObqyd0eSjb3u+cEH+nv8TzmOd8kySGYtU5RfaDxCK1DHcJJ5U4HRQF1L" "tmkympunb9M8XbvwbicHAADln2bGRjVFIAFKIVlYJ4is6MlBxMKtVk3xzCzPhXh0zM+ACACg" "L2nfFpIwkyAqwyOoRHlW3rtug9K7Iz4VAzqQEVACmB5Z7nIvcvsnG3cH8s46+swWVSYAIYAA" "kigLf9rwn/ITdDg+KiZyvO4AAAAASUVORK5CYII=") index.append('style') catalog['style'] = style #---------------------------------------------------------------------- style_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwZJ" "REFUOI2NkV1MW3UYxp9/T3tOW05pS8toKRuE0QwIYzI+4tgiGOgEbzQmxECMGeFmkqgxVDPj" "FiJxEU1IdsFIpkYTiS5qcGbeLBphmq2EDcLHYK6BbAgMSqmllNKP09Pz7sKMoAP1d/ck7/O7" "eF6GHRT3TosnMtMHbBl8pU2vMkoyycGYEl1ci88NToea/viobB7/xcGeew3nPAGv52GUbi5G" "qfbS3Le5b44VAcR2u1f9LRExkUNjgUFtc3+/1H95MjQVX0/Gk0HZDzDaTaDeGXLfnznV1Xzg" "tXe/Wri44Y9/U1sg9hu0LIOM+sLCLm+rMU3tlJMkIUXgQPzmevLhtiD/7IzzpWMWty+cDIdX" "Y5fZFkXteo1Jx3EiUxJaaYti1hzN0TwLLypJ4LeR9StBnzSxLTAJcNfs1x1aC6ciHc25V7WA" "psgmZIzcU4m0EJ4VK7JyNERpd2e37udlC/mB5diMReIvqNE5pHaspjW/1WBv+XTI/+vt6/7P" "SJIlInKce6OwU8sgkEX/fGlB2ovzC/Fp7++b7iwzf01N0N/9rkRSO5bSi19o3Pf2ekSOjQ76" "3SsDx8cBwPLcL4fG5jbbeKYyllaYP/QHEn7vdPg0UkoWkxXoeGYHANXrTdkjJZnC4dBWUt9Y" "n3keAKwnB8tr6rO/dBWbSyMJlusw86aJ4WDv2tdlN0mhhCIr4DmWDgC7/vYx+14df8X1rLVf" "yzGooj9DkK9DkkKIxBJYWCn2Ti69fJzbq5zVPF7lPKj/WFEUQ3Tp88mi/DvZz1RWoq6yARK/" "irA8ZGXxHzJVewkyzNw7zjxdyehwoMckekqeKjyClCqFI3YXUiyJpw9Xg+OCLep/Fq1NY+VE" "VHvAoatf8SWiqQRNhCJ/ajVMRGNRGwCgo+4T/HinD4xdFZ4QHC03DQk8DFAIJAN5dl1HYGM1" "PrPs0U4u38AZ1xfo/qkVWk4AA//vIz6mqt3+wf5843vVpSfgtJVh1jcOz9QNLD7Y6Plfgr8k" "tm4w1s4AAwGbIOq71ec78wjT9EFd5EwuWgAAAABJRU5ErkJggg==") index.append('style_add') catalog['style_add'] = style_add #---------------------------------------------------------------------- style_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwZJ" "REFUOI2Nkl1oU3cYxp//OacnJydJ23w0H01ram1oDbVQ6yZjgnXUzXijjpWRTYpjF5tjU9Qo" "G87pZB9MEIQ5ZGwgtWyiooIg7GK23UYtRbt20mozO+1qW2Ma25q0+Tg5+b+7EJ1zdfN398D7" "/C7e92V4hMDhAfOKksLTbpv8jFsVijSd9Kk0T92azAy3D8w0//lF/Qj+j0UHh9bsuRiPXBxP" "UdetFDV+PXzSt7V3MUBsvnnhH4mImUUEqyySO3xmrO34bzNXMtO5TG5KjwGM5hNIjwbfx4Ob" "9ocWbP7gu9Gv7sUyJxqrzG0WhdmoSK2p2R95o8gk+fUcacgTRJCcnM6NPxRUfjjof/k5ezia" "yCUSd9LH2RylPGpBsVEUzYxnFW2O0o6ygqUVdtnMc8DPPdNnp6Ja/0NBsQHhleXG6slEfnZH" "yHdOAQoWuw22niHBTKOJ6+ZlrrICItPV63M3KkoNlfGJ9KBdkw9J2Nshee+YQtvWeF77piP2" "06XO2Lek6RoRefdsqdmrMBjIrq6tqzKtHxnNDESuJcMuq/yDRFCvnqrVJO9YYWBd0LlzelZP" "X26PhW+ffr4PAOwvXajuHU6+KTOhqG6Z9fNYPBuLDCTeRp67mM5hlJkHAIT3mkt7aksMS2bm" "cmqwqeRTAHC82N6wsqn02OqAtW42y3xeq1zc3z11ePL7+i7ilOU6hyyyQgCY97YPcLb0bVy9" "ytGmiAyB31vhj7RCvXsTSYsLl7Bq6Ev27grxSWVXqO9Z/yL1AOfcEuj85Neg2uVZvqFF8L++" "FT6nAttMt71+4oQuPElgs4q7/BXG2svd8YPL40ed1S+8Iip/dIK1hqDeOItKn415MNoiPV50" "NPc2EFHjAq+x6XY0m8pnqV8itltxLwTWbv/7A/d5IBMv+5dgaUNxh0GGBZxAOlDhMe7Ij2Ai" "1X/eazr3DrLpKFIAkgkR9xTnfy/xAb+86tknm027yx15SRLGkJzUMRIV81qGf/RUgvuS8vdT" "dyfeEjjzcYHGOehI8Ef+2V/6r0CKd7Q5OwAAAABJRU5ErkJggg==") index.append('style_delete') catalog['style_delete'] = style_delete #---------------------------------------------------------------------- style_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwxJ" "REFUOI19kltIUwEcxv/nsrOj29zmzG22zUteptPKSyRlYRfS7KJgVoiVYRQVFFoUaVSGPRQF" "QXSliErNoIcKIqILal4qu8zMSiUvqenO1LTtbOecnbPTS4ap+D19D9/v4//BH4G/Cr7ZRSZJ" "kFPLIuRbtSQufdvr7KlrcVxoPBJ9DWYQOm56tocyP2nBLkpQgmJ45n0H3dRL/bozEwwAgIwb" "c9mX5MxE1dUnjSO3TbPJ+RwtwLcfnpuBRp9UCYDUywEwtIdvLjOXTLlAe8AqW27xOxmilgah" "jNCTMIs0aXxQNefyaEgc2xYb6ntIr8R3DQ2wxLQTwhSSHUaFJKGlZfSDRUvkGZS4hRC8oo/o" "1SoIRNXeQTc4HbydHWUrp0wI2/9h9ZY0fcVH66+ql09txwRWkK7L0l1Uz5LFt40K4hjFPxwa" "cNdHRsjP56rOXlnsP1aKyeOAHqoBYPq3ofkrtXsDZCil9sNpZ2r1iDaYtAT6y9UEgRvlOKYi" "QKzV6wjTkoDn/hkWVakuLg/Cl+dD8IKd4HIZz+Bmd1DmxnWIAKKIAFIqdudYXjx6rzTGxymS" "edpDYSAeXhVSH7knxSZVqhbDyPevQCAcKPx0INeYlMjkTdqN1ti4ebIHtkG3ta+TOXE3u3hu" "UlJyuTo8HWEHqsA9jADV5gLOzQ4zrHMR/o88LqL6duv6AA26z1eKzhkeZC81FeQY/SNyK5Th" "a4DpvwIowYNEHgwk/cnGuIn0hYXP2v8V5EArbjfLNvmSqFbkvR0bDPeWyIybzynD1wPTfxlQ" "CQ/c71CwVzc6PJxrbXxRjfW/R5qox2W67NCk3MqopVkEZ7sFCMYBM2YAqvatW+CcMdGFb7rH" "s9hk+MZuQ0Fsan45D0GY4LgPpEwE96gB7LWvKeAcieaipq6JeXxygSIk6npMyk5oqzoI7a8a" "QGqaBx6q7acKg7T5Je86J+enXDA3xOdoskGJqvVGGOkbgt7Wr05Mgq1IOdncMt3cKQUaX09x" "T2cr8M5hLysV6lDwpmec/vxtOhgA4A+g3THKMJ68SgAAAABJRU5ErkJggg==") index.append('style_edit') catalog['style_edit'] = style_edit #---------------------------------------------------------------------- style_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAulJ" "REFUOI2FkV1MU2cYx/+n5/QU2vJVirS0WgIYKSLxa4kGDahA1BuNGRdsMejlskxjrBdbNESX" "xe3CxIt5YfRGjSFK2KLRqDf1I4GMCUYWYCDMQAuKraPQz9P3vOd9vNKoQPzd/Z88+SXP85fw" "ETW/D9m3leR3uxzqVy6rqYBx4nMZkQ5HtYng0Hzr1G8bJvElKs+N7j7V+3asdyZNPeE0NV6c" "uOk7OuAHSFpq3/RJIpLsMvZU5SmuwB/T1zoH5//RYrqmz/EIINFSAuXj4Ds9fOhM26rvfrwe" "urAQ0W40Vtmv5eVIDiqwVlefGTtcYFNWc50YDIIMUhMxfeaDoOLk8OoDW4sDs3E9Hn+T6ZRS" "lHZbzYW5smyXRDaHpSjj9Jo3lherdqEDT/pif87NsucfBIUWBBpW5q6Jxo3k8Tbf7RzA7HdZ" "HH2jJjuF4uP2zaVeM5FtZDz1srzMUvH2VWa4mKnnFXQ8VDxvbG3Hdru/ufQw8vjpo8hlYpwR" "kefUkeqOHAkWKrburauy7Z8MaUNj/yYCpUXqfYVgHemqZSbPdH7Nvib3iViSZ/qDkcDrrvrO" "2VsN3TxrPBiYSEzLhLy6zUVnbeKg8Lu/rgUzbBIXyFUlNwCYfmgt66stsaybT+nWPU0lvwCA" "syW4qaGp7GpzTVFdMiv5PEVqocZSmtfpx84d33YLLqDKUj4ALNktABy9vp2EwQxGJDPO4XFU" "os67DX9PBjE4/RQzz+7cDSf0dmU5ARcMzbXtskEChjAgQHi1EMY6bz2SLIN5f/1ec/DeimUF" "GmcwSGDq/3HogoMLHbqhI55NYP3K7UjqaSlWv2NwkcDZOrCJiBo1fhDc4CjNXwUuDBgk8Hoh" "BIfdhWfhHvz1IsSj/d3fL/pBy6//xS0q8pTcZmhMBxNZaDwrKp1rTVsqWtAf6kXPiylUiC4Y" "usKWu2ARa3+Wou1XdpHvJ/TXdEB9P1+2hc8pP4moINkZUgwzToO/n78DBLdd65xGcs0AAAAA" "SUVORK5CYII=") index.append('style_go') catalog['style_go'] = style_go #---------------------------------------------------------------------- sum = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAV1J" "REFUOI3VUrtqAlEQnWwCthZ2FtoEQowgRLBI4eYLFMHa5B/sxQ9IEYJVkOAXSDoLwQ1Css2i" "gihkmy1NEbBRd+6ci2kUNouPMuTAFHPmzGFm7iX6a5wEk1qtZhqG0dNaEwBHa80AIgCuRCTC" "zO/NZvMm2GMEk3q9bgEYmqZJIkIi8qGUspj52ff9B6XUZ3iCszChtb53HGcQj8evXdetNhoN" "a1srl8u9sP40TPT7/VkqlaJEImF6nmem0+nWaDTyiYgmk0nrqAERkW3bb7FYrJjL5S5c1/0a" "j8f2Lh1R6AZBMPNjt9udK6Uu92mIQq+wRaVSiS6XywEAtNvt80MGOydYLBYvzPy9Wq1eg3w2" "m10fNSiVSnfMnGTmdafTqRIR5fP5KBGRUmp+cIVCoZAB0AOgmfkJAIlIVESKAJIiYk2n09tg" "z69/ICIZERmKCDGzCYA24W1iuP8a/xY/06XOh7WO7+4AAAAASUVORK5CYII=") index.append('sum') catalog['sum'] = sum #---------------------------------------------------------------------- tab = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAANtJ" "REFUOI3tkUFqAkEQRV9V9T6gAy4kINmJoEsP4FXmAjmEJwjZztwh13Ah8QBDo6sgOYHMVBaN" "PRlDwAP4N78L+r8qquAhAajreuPuW2B9Z67puu61LMuPAODub6vVfD6ZFIkqmY1I7+ktnM/f" "L7vd5zuQAEAxGj1xPH5xubQAqGoOiUiuQwhMp2PcvQAIeSgEM6NtPX/+DekBhqrlVAaoKmaB" "EBgEbt1MEdG/ABHFTHEP/3ZPTYYAqarKZ7NnlstFXl6/sGs9dID9/kDTxDRBjCdiPN15wYdu" "9QN94TRuVAbP1wAAAABJRU5ErkJggg==") index.append('tab') catalog['tab'] = tab #---------------------------------------------------------------------- table = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAc5J" "REFUOI2lk79rVEEQxz/vRxJjTKHcJWDEJqAY4y+Q40QLBQsrxR8IWtiIpb2VpDH/hwiKQgKH" "dqYQNXhEBAOCHBEtDtTcHdE7lITszKzFO997JykSHFiGmWU/853ZXfhPCwAevFy5az64Zd72" "mBlqIGaoGmoeUcstRcWjam+nb+wrxQDq/e0rpeHCVipPPV46DBADmPkCQOXzfcQEUcGZ4NRl" "XiXdu3PiHs7ZQApQ8wBcn7i5qeq/1wQnSgZQA+DR68amAOeP72I9D5AuAODaqRGezC9z9eRo" "mpupLnO5nMWtzlqvAqeGeU8cwcybBlEUMlttEIQQdg9VFhrgPX0xHBjbzrr7pwUPxFHAxVKR" "ykKTC6WRHgX5+NPXDiLWq8AbxCE8e9ckihIPSe4vJA7AgInd2/DkAWJ47+mL4NyxInOLLc4e" "yZ7F8/dNyvt3MjwYA1CrtxkaiHNDtIQWhQFziy2A1IcBOINXH3+kwPFif3pzCUAkmUEIZw4V" "ePGhxenJTMFstcmlcjGNa/U2Ube1bAbeM7l3B99WVhkfHeTL91/pXzg41k+t3iZvaons5BbE" "5qceLh11ZkNOFCeKiuHUEBU2sp+d1acbbmzV/gDX7wklmbL0IwAAAABJRU5ErkJggg==") index.append('table') catalog['table'] = table #---------------------------------------------------------------------- table_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAixJ" "REFUOI2lk0FIlEEUx3/zfZ9ppRdZNUm6SJFRuxbxYWaXVKiLEUVQhyCii+Kpi6fwUngIgiAP" "HYoQiiJLq1OsRbHWYkSt5SWjDoHp+iG1Jup+M286rOyuHcLowfDnvWF+782bN/CfpgAGXs5d" "EKvOiZU6EcEIaBGMEYxYtJGiZTDaYoy8uXR6m+8BGGu7j/sVkX/J3Ht3MgrgAYjYCMDwl1to" "0WijCUUTmrCgRuf3evZdJAylNA8wYgE4tePsmrIvLGlCbSgAjABwJ5FeE6BjbyXZYoBeAQCc" "bKnm3ugMJ/bX5GODyRmONRX8ILO0uoLQCGItnguDr9O4rsODZBrlgLNyaHgsDdZS4kHD5g1k" "wz+uYAHPVRz1qxgem+WIX72qgmL/81QGrWV1BVbAc+DJ21lcN6eQiwFceTjAt5kRFhZ/sBxm" "yS7vKQJowVpLiQuHdlcRTwW0xQpjcXXoBvMmQesBn7rKrTyfGCL58RF+V+1lB3JTB+A6ingq" "ACCeCoinAp6NB7z7dJ/G7TGMY4jVtmNUSNOuZsB25QBa53rgQFssgufmtC0W4WA0QpCZpkSV" "09HQDcD51uvUV0dRqLJCD6xl55Zyvs8tUl+znq/Tv/J/IbPwk4mpV6SmEvS036Tv6RnK3FIs" "din3ClpGe29PNoYiG0NtCLXBaCE0gjaadaWHSY6P0Bxt4fGHftYpj8T7F4C6pv4+cwXzOzf1" "oVSnggoL81jbP9Y/3fMbyWYvT8Y6XUwAAAAASUVORK5CYII=") index.append('table_add') catalog['table_add'] = table_add #---------------------------------------------------------------------- table_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAihJ" "REFUOI2lk0tIlUEUx3/fQ3wliV5f9LhJD6gsC+KW1KKoRQ8opDByUYuQoHBRK1fholxEy8h2" "EUFRYWAYVFzpokkXQ8hoEZi2kEyvVxdaas7MmRaffFeLwOjAcDhnmN/5z5kz8J/mANzvmrwq" "1mkQK6tFBCOgRTBGMGLRRhYtg9EWY+Rdy9lNMR/AWNt4KlYQ+ZfKzY8GtgP4ACI2AtA+dA8t" "Gm00SjTKqIw3OtxrqrmOUpIdAoxYAOq3nF9W9R9zGqUNGYARAB6+SS0LcHxXEfOLAXoBAHBm" "XymPe8ao21sW5tqSY5zck4nTU3NLFSgjiLX4HrS9TeF5Lk+TKRwX3IVD7b0psJYsHzavymNe" "/XYFC/ieQ22shPbecU7ESpcoWBx/HplCa1mqwAr4LnT0jeN5gYcgB/Di1g2yk3eR0UGcSAXV" "hcd4EgK0YK0ly4PDO0uI96c5VJ0Zi8SdmxQPd7CxvoHsyq3MfnhFQXcnuw/6jUETJZDjuQ7x" "/jRA6F0H1OtWNpy7RM5gArqukbeykMpolL5P9nIA0DrogQsHtkVIfEyzvyqjoHNimJzySjh6" "Jcz5zRV41lmX6YG1VK1dwbfJWdaX5fJl9Hv4FyguZ+b9c/KfXeTn7CgzwPSUh/EYCV5BS0/z" "g4EdSiRfaYPSBqMFZQRtNDVlteQnXxItysX3spge1wyNudZac9v5Y8z+Yt2n1zTNTIxccMWJ" "imu/Crb1SFxafgE3iSsdZ+L6uQAAAABJRU5ErkJggg==") index.append('table_delete') catalog['table_delete'] = table_delete #---------------------------------------------------------------------- table_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnlJ" "REFUOI2lk0tIlGEUhp//MmOXMW0qC7PU7G52wTQiW0slRRBBEUJE7tpHi2pRIW0jWuimgq4Y" "WS4SpOtMlqFpQ2kNGjGUl9FJp4vj/3+XFr+NbYqiAx8Hzsf3nvc95/3gP8MAuPw4cVxp47DS" "Kk8phVQglEJKhVQaIdUvRyKFRkr14kz18nIbQGp9ZE955tx/6XzyenQtgA2glJ4L0Nh3EaEE" "QgpcJXClO5WlSN8d3Xwa11UZaQCpNAD7Vx/6q+7fUgJXSKYApALgamjojw+DToiCgZtYgRJq" "/I+oOV9cbQOISQCAfRU53AgPsnfL/HSt4dkg2/Kfk+xpY3rJAbIKNzD6fgXdzfVnbQBXKpTW" "2BY0tA5hWSa3ng1hmGACQec+qc9Rgsu2kOjtxm84ZM5aQGDO4qy0BA3YlsHu8nk0tsXZVZ4D" "QGr4Md8Hu8kurGSi/xr+GQYfOntIfjfBia8zfzLQCmwTmtrjWJaXH4YbGR+4R3bRdlKf6jB8" "n/EFMsmQI1xKVLLpyO13HoBQaK3xWVBVOo9ptsHGGa2szGgla+lOUh8vYPpcnGQBw6FXOOuP" "8dWfB3gSEcobomUatHQNo/pbSMTC5BTvwBmox/JrJpL5DD7pIFpcC8Hl6c15WxDCm4EJC7+0" "IHQEoXLpj5xjdo6fVGIRo+09FOyrY1nWQt7GxrBMphi40pOwZnGArlA9qytqyIiFeNcYprM5" "wZuWlzhlJ+hLBngbG8Mzn0fb24JQ4ZNXoutdpWbm9sZxXjdRuG4rY/ERejuiPMg7xcidL0Ak" "7Y3R5PhdmPyNv8aeiuzx0qL5dtmqJWjfxNOJePxgVW2k73fu/AH4lkPwKTXiiAAAAABJRU5E" "rkJggg==") index.append('table_edit') catalog['table_edit'] = table_edit #---------------------------------------------------------------------- table_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkNJ" "REFUOI2l0ktIlFEUwPH/9ygndURtnKEMe5GvwkeKKLYoaClhDwIT2kTLNq6iRY9FLdq3jF6E" "FCYo0aLMyLSHZpSgkEG1qjQ1EJsZ/e49p8WUM0ULowuHw70Xfufecy/853AAbgzMnRZ1jovK" "BhHBChgRrBWsKMZKRlisUayVkQtHSxt8AKt64lBDOPIvlc/eelcF4AOIaASg5/01jBiMNQRi" "CGyQztYs751sOk8QSNYyYEUBOFJ5bEXVvycNgbGkASsAdA5OrwjYV1/IUiZgfgIAbbui3B6a" "4nBzbHmtf+gB5VlDxKo68FbnMTOf/P0EgRVEFd+DO8+m8TyX7ufTOC74mmRr8h6hWDMvhzqZ" "zWulojibpSAFuL+uoIDvORxsiuK7cKAxyv6GKM1rh4kW15O3rpbC+CB7tsynntZIGgisoAK+" "C3dHv+J5qXz/xRhfJnoIR/Kx871EKtoYG7iCNQYlEzCCqrLKg5a6IkK+Q8vOCNudPmLlrZB8" "xfD1m+TmJ8iaG8FOD5OT5acBIynNcx363swA8OTpI4KFOcIFcWTxA6hgF0bYvLuDxMRVPJvI" "AIxJ9cCFvdURfNcQm+0iv6QGiY+hkqDuYBmy9IlQaJKiTc1UO/1/9ECVHSW5fJ5LsD7+mFDB" "NrLDM6iZBcdjtHsSECQ5SVHpRsoXHzJwprLSAei4PD4YBFITiOQExtKup2hsv4TnfkTNN0Az" "vpGLt6aMqfHXvO091+X87acNXqydUSPZKoqKpEKV9FxBBERHfwAjJkXpNa22tAAAAABJRU5E" "rkJggg==") index.append('table_error') catalog['table_error'] = table_error #---------------------------------------------------------------------- table_gear = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmRJ" "REFUOI2lkk1IlFEUhp/vp2ymMsjxOqn9WBImYUUhCa6idhFUbgwZCInatBEEV9qmXLZ2ERVB" "EW4qIoJcSS3MrEQXwoBlMvqZn8ZozQx+957bYsqsTUYHDu/5gfec83LgP825N7jYLda5JFaq" "RQQjoEUwRjBi0UbWuMFoizEyfCO1vxHAN9ZebWncmviXqdcepht+xr6ITQA8nryLFo02mkg0" "kYl+odGrva6m60SRlKwSGLEAXKhvX9f0bwVNpM1q7hsjADx4+XldBGeObWdlDYGrfxAAtDYr" "PMfS2qxWfaNfzBP5UUqzw+RXft/Aufk0Y9tPlPP8/RdcAMfBweK4EItCvHxAPr6XbdEUIkLZ" "jr2MvBnGt/m+VCp1xTVGsIDvOZxvUvgunDuuONuo8HIZ9uzeSenKR5RSVFZWMjs1QeORA8zM" "zFzu6emJ+5ERrIDvwtOReTyviABeSYJCoUAYhgwODhKLxaivryeXyxGPx293dXXl3EgL1lo2" "eHD6aDmbfIfTR8txgtckYhqlFOl0mu7ubjo7O8lkZkgmk9TW1l7s7e21vpaiiJ7rMDAaAjAw" "GpLNZvE8j4qKCpRSPHs7/0M1WF5eZnp6msnJSVytdVEDF04eSuB7RWxpaUEpRRAE1NTUMPvu" "CZmRR1RXVbGwsMD4+PgtESlzI1M84eCuLcwu5tlXEeND8JVP8wXGxsYACIKAhoYG6urqCMMQ" "13UB2peWlrK+0fLq2v304Uhkc6QNkTYYLURGqLaWoaE7fEuewpgJ5ubmGFlMsmGgz2qtX/T3" "9/96iL9ZR0eHbWtrs3/WvwPvJEpbKbVHAgAAAABJRU5ErkJggg==") index.append('table_gear') catalog['table_gear'] = table_gear #---------------------------------------------------------------------- table_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjxJ" "REFUOI2lk81LlUEUh5/7vtfiVirJ9WqlRoaBH6WRmGIfm7I2FmUEFdQiWkYuCyLcGC1atOkP" "EFEp0IpaugovWqJltBMUUwpNBb/y9Z0zZ1pcP3dGBw7DnGGe85sfZ+A/IwLQ+nH2ibrIPXWa" "p6pYBVHFWsWqQ6xuSosVh7Xa//T2kaoogHXu/rWq9Pi/dG56NXwMIAqg6uIA70ZaEBXECkYF" "Y83GamX97GFNM8boznWAVQfAzZK72+q+FAhGLBsAqwB09ExtC3CpMotwM0BWAQA3TiV4nZzk" "em3Oeq2zb5KG6o399HywVYGxijpH1IfO3il836Orb4qIB97qpQdtZ1k2C9SXvqUsfy+hSQG8" "tSc4IOpHaKhJEPXganWCK1UJLlclADDOkBcvpm3wAoEJENGtCpxC1IMPA7/xfWhsP4NTQ6hC" "KML+rCKKc0+yECzR2FVOOq2bAKI450jz4eLxbLqHphENOV96B+sUqxbF8XNunKN5tSyGywz8" "qOfEMzJTJmpKju9F6B6aBiCQEOuUsZlhjAqiBmMN8ysLVOSfZtH84dNoz4wHICIpDzw4Vx4n" "6kMgAWKFnIwCcjMOsi+zkDQ/Rnb6AQbHk3we+c6SoXLDA+coK9jDr9llDufEWJYVWnqfE2pI" "ICGF8RKqC+voH+thcGKI0thLffPo1tfUIIkmm9qHK4zqbiMWI5aYdBC1ilghA/gyUUfEi5Ec" "/kbRjhfMLWa/h9XfuJ049Jgl6/xdK9jCyWZG1+p/AcoCRvg7fAlOAAAAAElFTkSuQmCC") index.append('table_go') catalog['table_go'] = table_go #---------------------------------------------------------------------- table_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAntJ" "REFUOI2VkltI1FEQh7//JctKK7O1GxEJBaFlEFuSdKOLECVaBEU36AJBvUZP4Uv2HAS9BCHR" "FTYwMMosRIoyCVISMy0vSbXrYtZe3N3/OXN60FaFCjswzJk5P74zM4x1o3HwghjrpBhZLCJo" "ASWC1oIWg9IyzjRaGbSW5qojy/0Arjbm7D5/Vi7/cSrvdq76fXdFTC5AzadqlCiUVnii8LQ3" "5rVKv50vvojnydQ0QIsB4ODK45P6PZZQeEqnY1drAeD289CkAHvW5pAaD1CjAIADJT7uvQiy" "f0NeOhd4FWTv+rE4/DMxsQJPC2IMrgOBlyEcx+b+qxCWDfaoqOZ1CIywIHidvIzPFLAsDbC1" "FgzgOhZ7i324NlSs91Hu91Hm9wFQ5vexcWod+fODLCo5RsWKd7ypyi8FsC7d7zWndyygsX0I" "y5rYr2tDLCnkhB9SkN3AnNXbifV/REWEoa7WeGdT6wnXU4IxhikOlK6ZR31LmG2rx9biydsB" "lmd2MKtwFzrexrTcxSR0Pws3FU1X0cGrrpKRITq2RX1LGCDtbQs8gf74XGZ/78F2wlh2jIzs" "MCTiRL8mHVcpNTIDG7YU5tLwLszmgpEKEqE2ul9eIWeOQdQwtgyBnYXxUry/05Fo//DjlOvp" "kRYKlszk6+Aw+XmZdH+LovseYfU9YOm6EkyqDktHaH+cxEkkGE5qPnUPHTp8py/gaiUvKm91" "FnkiMzyl8ZRGK+HMwlrWbN1GKnwV151F69MUN3t3EspeSzQSq62tLg/8c+M+B0qbksEqE+vY" "bZovF0euHc0//Ced+zfAl56B+p8/ni2NfY8Pd30InTtR/fHen3S/AHXxV9/UPuBjAAAAAElF" "TkSuQmCC") index.append('table_key') catalog['table_key'] = table_key #---------------------------------------------------------------------- table_lightning = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnBJ" "REFUOI2lk0tsjFEYhp+Z+aczHZ2IMaNouxCduIsmLpXYYIW4s7CyQGyIYMFCRIillTUbGyqI" "hU1XbqGCuNMOQl3bMZ3OTMs/nfOd71hI/5LYiDc5yflykuf9cvK+8J8KjV7O3SweVRfapU6b" "VRWrIKpYq1h1iNXfjsWKw1q9740CrHN7tyxOpv/F/diF1/MDQCr8NF19e5bhahG1ioqiVnBi" "GbFhbtQvoeyiiApihcNLT2KMxjwA17E1cj9yl1iikcT4uTgjOCPYmo8/2E1DdgfzmlZDKBy4" "f68KRiweQF8239I8cp1o/Vqk/IBwvA1rB6iWcrww6+l/vxjeF/5Yf93CFDWxeO757Lr8sO6M" "T8gCEdTvA2+EYm8nqRn7WDFtGwCXuvrZ3N4YAAqV6q8N+oZSbSGV3bFkFic+RKaAMYhEeJnr" "RnMnCMsIGTeOa7fXINFGoh7MakpQMxYvZPV0PL0o7Q90o6LUJVpBPTLNK2kYyGFNjUr/Yz5N" "OsSqJa2EowkA3nypIKJ4aqXj++c7N5/5Gw4uaIkxmLtKumU5Ui1R+1Hgq8ykMusI5dBUrjwc" "wgsNocDsqXEcOvYpxzveueJg0b251Oa+dG50r84vdaWei25UnY/yrvLDBHP3h5LbfqrLBTkQ" "VYYf7ScWT5GvZhjInuKTn4QnBcIhMAq3Xg0GhtMzdVirBIDJeg9T6SU/cQ/tyzZz/XmBFXPH" "gnm56xub2jPB3POxTCTMGKAsE0guPE2yoZWvRZ/pjfW86xsOujCnqY6ej+U/smBVNSjTgTMv" "bhujC4zqOCMWIxYrirGKWPlrF0oV/+pfH/5FPwEIK2nIBiYClQAAAABJRU5ErkJggg==") index.append('table_lightning') catalog['table_lightning'] = table_lightning #---------------------------------------------------------------------- table_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmlJ" "REFUOI2lkktIlFEUx3/ffKNDfpki4yOncFWQMGFU9hJsoahBD0l8lEgQumvTIlqZUAliq9oF" "BVEgFSpuayGJofighQk2aTE24zjjKKV94fjdR4sRXyujA5fDuZf7+//P4cB/hgHwcmCpVWmj" "WWl1QCmFVCCUQkqFVBoh1ZYjkUIjpRptbzpc7AaQWt+qKU73/oty2+uvRwHcAEppL0DftxcI" "JRBS4CiBI53NLMXG290zD3Ec5dkASKUBuFZ4c1fq9qrAEZJNgFQAdA3GdgW4dCKLta0AsQ4A" "aCjJ4c3HKLXncjfuuoejXD29WceXV7c7cKRCaY3bhO6hGKbpomc4huEC1/qnvpEYaE2KG474" "0lhzdrSgAbdpUF2cTd/IApeLc7Y52FpPzy0jhNruQCtwu6B3KEToyxgdH2bI8WYRnl/A5y+j" "q/83M8M9+PK8LC4usWclg/LycisJEAqtNS4t+Dn1Hr2ywo2mRmzbJhQKMTQyQEa6RV3NFUzT" "JBKJkDo+zrvU1HvJIaqknenJMSKBaequN/Do8VOmJkbZn5eH3+9nNvidzs5RIvPzHDt+ioqy" "8wSDwRYXgBACDcxOT5Kxby8AD1rvIByH+vp6SkpKqKqqorKyEuE41Da2AJCZmenZnIHWFB46" "yMSnMQDa7rcjhKCjowPLspILZNsopXj1/AkXL1QQDodXDYDbzyYHHUcV/Yr/sJY/v+XsySLy" "fT7SUl1Eo1ECgQAej4eCggJyc3P5k1CEQ7PO4ED/jLFjyczS0lK/ZVm9+fn52R6Px9Rau+Lx" "eLNhGGGv19sLpCQSCTk3N7dg23b1X5NJR+brKXThAAAAAElFTkSuQmCC") index.append('table_link') catalog['table_link'] = table_link #---------------------------------------------------------------------- table_multiple = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgtJ" "REFUOI2lkktLlGEYhq9v5htnPGSiqJgty2iEaGFl0LpFRGEtoiAXST9BaCOMi2rpX0jI1IUL" "KfoBUSRJYBBJjbUUtOgwOiff59BizNQUFz3Ll5frvp4D/GdFAI9f/LhrzoC4dbgZpYpQDYKY" "I6oEMUwdNf3w4PaJwe2AGEDNblw719xyUFpuaunY7rcYQNxbAGbfv+m0SneraCqlZpSqQjUo" "YkZdIkNTfYqRifyyqC88HOy5tAUwdQAavLftYl9DvFe6OxQrSmN9ktHpz9ldLSgAv9ZDXA3O" "848LCSsfTZhlIttuooaodTXV1zEyseSqNh8DBKkZqDnpVEQq9CQvn2k6aCTkpvOnagBT3B01" "oxqcUrVmNPtlHDGhUFmjFMoEFcQEUeHe+fuEYOmtGTggaqRTEWo1o1vZoX3TixUhiLLZguEK" "Yk4lGKoGwOTL1X0BV/pa2fgD+L5eQl2JgGQiQjYBADcvdDAzt8L1/s4dgG+Fyl8DEX+Xm8z3" "dLY1UyorQQ1zJ07CzOtViGBmboU4EYE7qRhOdjewETYBY0O1ZocfLS5n6hKoWpcDcTJi4Gz7" "ngZLywVEjB1HI+bzo1OfervaD+MGcQKevf0K1AwA4ggMyB7J4OwCjN3JXgUYHl90NaP/+CFE" "nWI5bG1me2VibM+zVbFXuSf508GsMYiyVqwiKv/8+1koP/0N1yhARSwy8TkAAAAASUVORK5C" "YII=") index.append('table_multiple') catalog['table_multiple'] = table_multiple #---------------------------------------------------------------------- table_refresh = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAq5J" "REFUOI2Vkm9o1XUUxj+/P/fOu3vvGOzuTu1qiTrccFMWiUG9CDX2oihYCgpaKL4SDSsIRUQK" "jALpTRQEFeYLixi05gsrX8xQknKM+Xe4ucvAmq4xp+5u7n7POd9eLG+9kdGBA4fnOTzn8JwT" "nPhl4rD5YLd5K5gZaiBmqBpqHlH7TyoqHlX7/eiOxnUAsXq/97V12Rz/I458O9j6qI7NfA6g" "a/g4YoKo4Exw6nAmLM4UyFXnqUvlOD3yA3taDuKcVVUE1DwA25p3zTv51M1OPuv7ECevVLBY" "1QA4eW6sAjbUJklmb9F79zTFewOIKOKUJ9IFSvKA+9VfV3pD+UcAYOtzeaLA8+TSMX6720Um" "SrFhcTsbl7Tz4rJ2VuWaaGpoZmHdLC9/umkIIHZqmPfEEXT+OkYUhZwZPk811dRX5em/08fw" "+E1c2VGoWYKIMFhUuvf9vAIgVDU8EEcBHc/miUP4c/oa/Xf66L7xPeWHIV+++g0ntnQyU5rF" "ZiKSU9tZf2x9qrKBN4hDONX7F1EEbzz1HpkFEUEAEw/KDI1OI2qkyLF/0wH2DPVx4e0LMwCh" "E8N7TyKCl56uZ0EcsCyfor4mSS6bpC6b5LtLx1hVyPBBx/uEQUi6Kv73CmJzJkZhwJn+cQAG" "R0tkU5AIExz96V0mpya5MVoC4KOuvVy5fZHWN5u8lGUkFJE5D0LYuCZHHMHKRWkW1qb5uOcQ" "D+0+UULZ+fkLbP/keUpMsq1jM8+0tVF28uOcB96zemmG0YkZljekKN6e4mD369Rma1jT2IKa" "srqxGfWKeWWwOMzZs+d7nbqTwVtfXD3nnK11ZmknihNFxXBqJLJfEaUmEVGuDlxHyoI4JWTR" "+PRscfPI8T965n3ftndaelr3NV16HB/OJ7B85PKGspOBx/F/A8q0UTTL9gFSAAAAAElFTkSu" "QmCC") index.append('table_refresh') catalog['table_refresh'] = table_refresh #---------------------------------------------------------------------- table_relationship = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAj9J" "REFUOI2lkktIlGEUht9//s8hzSwDNbCkCDKxi0WIQdtgqJiSDCqjVm5atxAXUQurhdsoaBGm" "GRgKU0Ik2sXyNjXpJGmWuSjJnNFJbeyf+S7ntBgammlWdeBsznl4Pg7fC/xnWU0PZlgbQqIN" "jGYYQ6+unN1WmQ639EUuElt1xLSRiGAIQNRRnN4Xbo9Tptean0VW0llxfeQqlNHQpKGNRv3+" "RihNViaBYcoBAN90c5IHp1XUUXz+RpAzCW71hjnqqBRe3HsZSoG8+9ZDapMyq22rrpFK3++a" "OoPeTznwlt1M7oRbMI5XFSUH88sxqD8EtW3empgj23dtroA7y43hN8MAgFMHCtHePwcBAD5/" "CGBGlgDKinMgVUJwssVb8zOq2stKyq3x6XeY/TaLbDsXwgY6BkOwbVdCcLSyMPni1NdlaE04" "0XzktLMSby3dtN0aGhlkGZOHju3tfFR3sAi9Y4uoriyAzx9OCDqG5iAsgAA8nqkHbQhjnTv/" "bl7+WvhH/Syl9AxcDnQf7iQwAcIFdAXCsG1A5K1yoao0H2uyBQDA90Fi55bdWFhaQGD0Ncfi" "2uNvDHQDgNIEZkaWDXj2FKAnOA+hCHgx8T15QtyJo2/4OWRMQsakx38t2P17pymRL9tloSc4" "nxh2DIZS/vX950U+1zSQMQcNrZMc+RHnJ2/DzMz8dCzMorzYjckvSymgIcoYZWUSJ+woycVs" "xMHWomyIhjtjf4GLy87DTAKjqf9S28cKRbRaaZOSl3+uX3oGddsHQvSaAAAAAElFTkSuQmCC") index.append('table_relationship') catalog['table_relationship'] = table_relationship #---------------------------------------------------------------------- table_row_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAglJ" "REFUOI2lk89LVFEUxz9vfKllQZQlZdRCiLIIg9Ai/4OggkTQRfQDlwUtMmkRbiqCNlFtgyiK" "IoekqF1BKJpRi2qRCEVJpGMM86aZeTPz7jmnhePogITSFy7nnnvP/X7vPXwv/Ce8e2+Sl9S8" "HjXdoqqIglNFRBE1nOiCIYgzRPTdlePbWwF8MTvT0bqmfjmq/Y8m9szNfVWrBxj8ehenDieO" "SB2RRPNRXHmv78BlokhrygSiBkB38+klqWfzjshJOfdFFICHQ4klERzet47iQgJXIgDoat/I" "4+FpOg82lNcGRqc5tn8+/53OV94gEkXN8KtgYCRBVVWM+GgCLwaxUtHgWALMWOHDzsZVFKN5" "Aq4PTlqQK1r8bcLMzJ6W4hyejExV5BM/AyuePGFz572r8e92YewmABoW0EwWCTJIkEZSaSTI" "oJksQ/FhFGjeXMu2cz1oLqTu5XPPj9xsD6zzKIgQyxfwciF+Jotlc1gYEvRd40hbA4WubjQX" "klpfi1TXkNrbZr5TnVW+fWdRZQ0LALz4MAPnb9C0oZpNHYfQXJ61n997XLw/bsk/BXv1ccbM" "zF5/mql488BIZU++/EhZckdLuQd+JIqZsXvran4lQ5oaVvJtKlP+C7saqxmfDCq8cPbULaW3" "vWQkp8P9DyZaItW6yAmRE8QpkShO3KJmSqXDZ//w2vLwF9LmhO5ToissAAAAAElFTkSuQmCC") index.append('table_row_delete') catalog['table_row_delete'] = table_row_delete #---------------------------------------------------------------------- table_row_insert = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhRJ" "REFUOI2lkk1IlFEUhp+Z+Sr624jNBEmbIOgHKZQpqWWryoYwgiQK+llKtAjChbUoF9GyZUGR" "ZEZGktWuQPqRTILcJP0sCglnQmzU8fu+e885LdTRgQilFy73nHMv73s454X/ROJu31ibWuKs" "mtaoKqLgVRFRRA0vuuAI4g0RHWg/sTkLEIhZy5Hs2uqlqF7u+lw7FweqVg3Q8+0OXj1ePE49" "Ttz8Lb78drHhKs7pijKBqAHQvPX0otSnQo/zUs4DEQWg81V+UQSH6quIFxL4WQKAY3vTPHg9" "ytE9mXKtu3+Upt3z+a9iWNmBE0XNCFLQ/TZPKpXkUX+eRBKSs5963uXBjGUBbNmwitjNEyRF" "FAOCVIKmhjRBEm5/OM7hbJpcNg1ALpsmtyvD/rrMzGq9VnZgCkESegcL3HzfjI89vYMFHo+c" "w8WOhx2OKIyIpmPCUkQYRtRdqLUojAicV8yMxvp1HLyxj/VVGWLnuPasEe88V061IyqUXIlJ" "N8lEVGQiLjLpprjf0UWi7f5XO3+ghoGvRRJA+/McLvZcyj3l1tCZSuXSTByFEXHocLGD1o5h" "G5uI7MXHgpmZvRwq2K7WnTaH7rd5W4hP38ft5PU3VjkDM7ZvXMPPsWk2ZVbS2dLHl5Eiosa2" "DcsZ/vG7wguiWp5iIF5fX773eYdTXe284LwgXnGiePF/NdN4cfrJP922FPwBwlFsl/CN1kMA" "AAAASUVORK5CYII=") index.append('table_row_insert') catalog['table_row_insert'] = table_row_insert #---------------------------------------------------------------------- table_save = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmVJ" "REFUOI2Vkslr1EEQhb/uX08yjhOJkkVwQRAUF1SijltO0WNQxAVU8BKCePDuRRFcTm5/gaCC" "ouBByEFUcMGIO8lNEFTimkyMMjGTmenqag8TxwgK2lC8qmrqVb2izMX7I4c1mm6NOltVCQqi" "SghK0IgEnWSBIJEQ9OmJvQtyAC7EeGB7rqGJ/3hHrrxa9tN3qrEJ4Prr84gKEgSvgg/+Fwap" "/R1cdxzvtb5GEDQCsHtx1z91HysJXkItdiEoAJcfDP0TweZVM6hMJpAJAoBd7S1c7R1k54bW" "Wu7ao0G2rf0VDxdKv01gzvR8iF0dzdzo+4oFMAZD5F5fnoZ6KFaE6dk6Pg6NYyxkMwkaDV8L" "49x58XGNC0GJgEsMW3PNXH+SZ0uuhRsP39GRW8iWtiw9j95zaM+i36RcuJtH1Ty2PihRwVno" "eZ4nSapYLHtGRgWAW88Ga4UlgUIZ8t8qGKNYL0qMkVQCnSubSTtD58pmrDUkEXxQTu1vQzUS" "NJKgZJxSLpcpjFVwotUlJtZwu38YgNv9w6RTllLZc+zKW6wBCYpOyI0xQoRMSrEiUt2BhU3L" "m3BJFUUj5SAkNoUxDkOCMQlES4wGL0KlIjgfqhKWzs3yaWSc+a1TePP5O6NFT8o49nc2IFoB" "LESIRkm7Ok5eHuBLYQwXRHuPXHq1wqtO9RLwEgiiE3pTKOOce7GPpsxcDJZ88R3dq89iSVMs" "V3Cnu5a0/+nidhx9GOfNhNbsKBuX52ismwUWvpVm0TJVyNSBMwbzt5Nt23ezd8GcKesb6xtJ" "u2mIeowqJgbUFHk58JqhgucHYBNXRLWe4GkAAAAASUVORK5CYII=") index.append('table_save') catalog['table_save'] = table_save #---------------------------------------------------------------------- table_sort = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkJJ" "REFUOI2Vkk1IlFEUhp/5vjup08/Cxi9SaxMlldhEIPSzshZFbYJa1KJNtGwfCOGmlrpwFbiJ" "oChoIRS0sE0kQWmSEJZCIfRDGhLMj+N3zzm3xeQ0pEEduLzn3MN533NfbubOs6XrFjJXLFin" "maEGYoaqoRYQtYajqARU7dXNS3t6AZyGcPVc7+Y8/xED9+d6VnNnFvIAox9uIyaICt4Er/43" "qtR71w7fwHtrqhOoBQAu7rv8T+rlquBF67VTNQDuPV/465DTEk3FWaotOzh9tIu0kUB+EQBc" "OJbwYPwb548klEolAMbeLNJcec/+nv1MT0/z6fNmmkOZkZGRg8Vi8aPzalgIuBgevlggjiMe" "P3/HVvcDVSUfAjv27qW9vR0zY3b2HX2dZUS2vK5UKk+dqhEAF2c429vG6MtFWtIvdBd6yeVy" "mBlmhveeJElIkqS2unMMDw8fd16NYOAieDS5SBzD8vIyuVwOEcHMCCGswRACaZoSealdZGM4" "c6iNZpepD6rqXzGEgPceJ1YzMY4yjL35DoBYhpWVFYA16o15mqZEIlLzIIITB/K4GJqyEdVq" "lRDCGvVGEu89kdda0b1zE1+Xltm1rYVypUocx0RRRBRF9TevmpfNZnHOISLqVGx84O5cwZtt" "9KJ4UXZvgPzkZF25q6uL1tZW5ufnmZqaolwuIyJ4729l1vt5g4OD20MIJ733qGrU0dExUigU" "mJiYYGZm5oyq/hAR4jh+uy7Bn9Hf398nIk/TND01NDT0pLH3E0UOq5y1dIFFAAAAAElFTkSu" "QmCC") index.append('table_sort') catalog['table_sort'] = table_sort #---------------------------------------------------------------------- tab_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYlJ" "REFUOI3tkb9Lm2EQgJ9733cp1AoxkForBEFoKDWUipYOLuJQ2sn/QMikk1uhs5C1FJ1KsuvS" "Kjj4AxFrEF2MmG5KSEQ0idA01NqEL9fhgy+2tcQ/oLfce/A+zx138D8EIJ1Oj6rqDDB8S+64" "2WxOJxKJRQegqu/j8VgsEgn7VgnciLSy/xbK5Yu+vb3sLOALgHAo1EmhcE6j4QFgjAkgEQlq" "5xw9PV2oahjABUMhWGvxPA0+X5e0BBZjbEAFAmMM1jqc4zfgz2ytQcT8LRAxWGtQdTd23y9k" "yBYz1H5UqTfqdJleByCpVEqj0V4GBh4Hy2stzK/X95fIVT7zLDbIw1A/G7mP7Bxuca/2yJ8g" "ny+Szxf/ebPN0jzjr17iGY949xhrXxZ4/uQFC5+Wb3VzXr99qsuHH/R6LB7M6vBUt5r2OFSq" "51e50wzJ1QkAkisTHJUOUPTKtmEBeDB4906tXh6JRqJULk+ofi+xnd3i29ef76Q97sfQ5P0k" "IpMCHQo1VOd2587e/AJW5Y2HqlBqCQAAAABJRU5ErkJggg==") index.append('tab_add') catalog['tab_add'] = tab_add #---------------------------------------------------------------------- tab_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYNJ" "REFUOI3tkT+LU0EUR8/cGRRZJLJGEoxhV2GLEEwqSSOIa2Vp5ReIBOwsBLGx0mLbRewSrGxE" "MGCT7IJg0CIE1EIroyzk4ZJEUTHBjW/uFg9e4h94fgB/zZ0Lc84d7sD/GIBGo3FBVW8DlX/k" "+t77a9VqtekAVHWzXC4UMpl0ZDWxG2PmNTobhsPxqW731V0gEgDp5eUUOzu7zGYhACISQ8aY" "uHfOkcsdRVXTAC5+FAZrLWGo8eVFyVxgEbExFQtEBGsdzvEL8Hu1VjBG/hQYI1grqLq/Tt97" "8ZBJ5wF7wQeGx7IcPl5xAKZer+vqap5SqRgvb76wqB+17jPtPWbt3CUOniwyfd3iTWeb90un" "I0HSn2WaNzl/5TqH3j2FQQdSRxi5FbrP3yahUdrrzvveI13M51tZba8775Jx8KKDycsnJ5aa" "V/kx/cgE+PbVEloCm0gDtTPZ1Kfd4KwcsDKz3/kyVvqBhOFP3TDJeJRnl/M3JuOgJt6seNGB" "R+9d3PJ39gEDH4vqmpPceQAAAABJRU5ErkJggg==") index.append('tab_delete') catalog['tab_delete'] = tab_delete #---------------------------------------------------------------------- tab_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeVJ" "REFUOI3dkrFrU2EUxX/ve1/S15iY2qQ+sbVJU4uEYqNGKYjiIA6iFkRdCiJO4uCigv4DBfcO" "OtRkrSC4OLgIVSGIUCIppamQ8JoaYxJTNBiTvNfkOVhioR10EjzzPffcc+6Bfw3lb4Yzzw5f" "sn4ceKq6D1L78goa+Wvqn5JzL0KT2o6JJ7uGLrD3yFk0l04hnTkuAeLx+GnbtqeA8e3IuraE" "a8CFxxtlLbOEUzHx7NyD2zfolQC2bU9HIuGwrvt/+VI2ufs+T7el4Q2doVmYxelSWHmfpt5o" "ta3G14jcEPH39nrJ5YpYVgsAIQSalWK47yPe/RM08o8QznUc7gDdrRWS9qn1yVt3PojNeaqq" "ihACKSXtylsGPLkN8kOEw8KsBim+TtI1fpu62tMG6CwQQqCqEiklrco7+rQSu0fPYX6eQXXa" "NKsBSm/mMaP3kP6RjmxngaIIVFVQzc7hk2Usu5/CwjRtGtTW+ikmFjGP3kf16CjK78OVWCxm" "B4P7GBsbRVHg5cxVrtx8zPLsXT4ZCboGIyi1NiMXp3D6Ap1wk8kU2ayBBDCMVQxjFYB8poS5" "+JyhyEm+lSsYyWXMQzdIz6WA1JYXb2ni5RM99eiwLo+FQ9iOZqJZLl8//2Ahu10//hP8BMAB" "pj8cpFRfAAAAAElFTkSuQmCC") index.append('tab_edit') catalog['tab_edit'] = tab_edit #---------------------------------------------------------------------- tab_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcBJ" "REFUOI3tkb1rU1EYh5/zYZFGEeOFVtpibKcYJCJoBXEqOoqLIIh0CdRJ6KqCqNTBtYjgR4KI" "k5uTqHMdWhAdrEUpMQFFQofYVpNz7zmvw9XbFi30D/AHh/MBz/Pynhf+RwHUarUxEZkCRrfI" "LYYQJiuVyjMLICLT5XKx2NcXpVaVuVFqbU/PilZraXh29u0dIBUAUT6/i0bjG3HsAdBaZ5BS" "KrtbaxkY2IOIRAB6fTfGGLTWWGsxxmCtzdbTxSs8eH8Raw1am4zKBFprjLEb4PWSrncMRkVu" "vT6HUmt1bVZfaYzRiFiUUjxemARJcCHBJZ69u0co9o+y3FnlwpMjnN15IxVUq1UpFIbo7c2R" "y+WAtOdk3nGyNI6XgA+egPCl3eTg4HFW3E/uNS9tr1YfigWo15vU680Nc+ooh5fA56WPxCEh" "CTGxj/neXebQ0AlW4h/crk/8ntU/cv5+UU6XJ0iCJwkeL4Gv7Qb5Hf28ac7wcv75h3iVw5sK" "ztzd7zvO4YKjmzhGopI+NnyKucYMrxZevOtpc/TTNN3N+L9Suqla44/GZN9l5g5coyf7/K0K" "CldpBTFRw/ptXCf58/4L7TCsEQqMTJ8AAAAASUVORK5CYII=") index.append('tab_go') catalog['tab_go'] = tab_go #---------------------------------------------------------------------- tag = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAUxJ" "REFUOI1jYBgFWIFxx11+YtUyYdMsJsaxPWLVsw8wsdhNrz54LX52DJvBKAZo1T8SEhXi2K4p" "wWb5/fO/dzDxbz/+v9ORYLMUFeLYrlX/SAirAXqt9yMMdNifakqzWt55/PP+tStfbWFyd279" "tL317Od9TWlWS1011qeqhTcjYHKMEJuvsOloCL1WFmTju//m55/Tpz5Z3J2keRbZJo2KO8YG" "OpwnZPlYWO48//Xp5p6PotdW6/xiYmBgYLjWqPPr/JnP6bef/fwhxMbMoqrAsVom7rw0TLNq" "4U1pJVm21UJszCx3nv38ce7w2/Rrq3V+oXjhdq/6ihNH30tfuvrluKwom6KGGu9hmJyKAudh" "OWFWxUtXvxw/vfeT9MMlBiuwBuKTuTrvnl374Hn58ufj7KxM8MBiZfovdOXK1+PPrn3wfLJa" "5x3DKEABACjqhjbxXCaZAAAAAElFTkSuQmCC") index.append('tag') catalog['tag'] = tag #---------------------------------------------------------------------- tag_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAihJ" "REFUOI2NkM1LW1EQR8+9+epru7CEZ4x5qVghpSJKsxKzKqUUXHTpqov+Z4UuhUAtGJBAWgIN" "uLBFgljl+Vo1EUxiFOJHNHlzuyimWjX0BwMXhnPuzKi1tTVjjEFEMMZw9a2UGkyn03X6pVwu" "G9/3b1SlUjErKyumWCza/XhtjAGgWq2yurrK7u4uAPF4HNu2sSyr1k+iRQSAer1OOp1W+/v7" "305PTxEREokEtm0TCoXulPQE0WiU5eXlcxGxg8EgB234sgfJZJJYLIZS6lZJ8HKFZDKJ4zjh" "TqeTbEmYD67i3FcYI7wYGUFEqFQqtVwuNzg7O1u/OsFZs9kEQEQ46gZ5v6F4GFLELPh+oPlc" "hdHRUYaHh4lEIrVcLtebRPu+/9p13bNGo0EgEKDRhgtRaCCoYSDyVzI2NobjOAQCgZ5EAZRK" "pUy3282nUinLtm02DoVP25qBe5qwBt9Asw3Po8JLBzY3N/E8j5OTk0ENMDMz8xV4tb6+flar" "1Xj6SPNmRDhqCxfy55eQhnL9AjGgtb6s++rqRQuFQsb3/fz4+Lg1NDTExqHwcVsT1poHusPb" "lGFv5xee59FqtZ7Mzc39vCYAWFpayhhj8hMTE1Y8HufHoVDc07x7Bjueew3u3eDfLC4uZowx" "+cnJSSuRSADgui5bW1scHx/34DsFAAsLC9NAYWpqymq323iedwPuKwDIZrPTQMGyLOs2+L+S" "zWan5+fnH9/V/w2LODSct0nVfgAAAABJRU5ErkJggg==") index.append('tag_blue') catalog['tag_blue'] = tag_blue #---------------------------------------------------------------------- tag_blue_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoZJ" "REFUOI19z91Lk2EYx/Hv/ezZ5sBAs2e+bahJtqSyVoTkUTMRFPJv8NSok076EzyowzzoJPA0" "JDEYlKC2cmiwfFk7UKZh2zTdfMm3Td193x1pii8/uOA6uT78LhGLxbTWGqUUWmuO70IIt9/v" "T3NRotGollKemmQyqSORiA6FQtZF94bWGoBUKsXU1BSJRAKA8vJyLMvC5XKtXIQYSikA0uk0" "fr9fLC8v/9jd3UUpRWVlJZZlYbfbz0WOgJKSEsbHx/eUUpZpmqzmYGQRvF4vpaWlCCHORMzD" "F7xeLx6Px3FwcODdUg5644I9KdBa8aiqCqUUyWRyJRgMutva2tLHG2TX1tYAUEqxkTd5NyMo" "tAtKXTCxajCcgpqaGioqKnA6nSvBYPCoiSGlbI3H49lMJoPNZiOTg30lMADTgCLnf6S2thaP" "x4PNZjtCBEA4HG7K5/ODdXV1LsuymFlXDCwYFBUYOAyQGtZycLdE0eyB2dlZ5ufn2dnZcYvD" "KqFQqElKOejz+Vxut/sEYgpIzH3gb3KA3ew6+/t7XC26Sf2VxuojAGBoaKhJSjlYX1/vKisr" "Y2Zd0b9gsP37Pc78J+7duI/n8jWGY/2M/fzKr3jmtXEcCAQCo0qplmg0ml1aWuJ6sUFHlSI1" "28sdXwPSkDSUtyDFAY23HgL66QkAoLW1dVRK2TI5OZlNpVL4ig1WN5ewi0Ke3HgGwIvmt9S6" "byMQBacAgPb29lEpZWBiYiKbSCTY3N4gthime7ATgO7PncytTKPRuTMBgI6OjrF8Ph+IRCLZ" "B9WPGZsO48DkY7QHhzD5NvkFEG/EecBh+vr6GqWUi69GnnchRJeASxq20Lrne8+fl/8AfHtX" "hCSe/DcAAAAASUVORK5CYII=") index.append('tag_blue_add') catalog['tag_blue_add'] = tag_blue_add #---------------------------------------------------------------------- tag_blue_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAndJ" "REFUOI190s9L03Ecx/Hn5/v9zvVFocH4TqcbKoKZCtJO0i6lB9NT5w5dIzpFdK1bf0EUnYIu" "nYwMHehkyRTBYIWJpTJn6mbq5g8yt+n2+Xw6aYo/XvCGz+X94PWGj5idndVaa5RSaK05+RZC" "+EKhUJbLMjMzo6WUZyadTutEIqHj8bhz2b6htQYgk8kwPT3N6uoqAH6/H8dxsG178zLEUEoB" "kM1mCYVCYmNj42s+n0cpRV1dHY7j4HK5LkSOAa/Xy9TU1IFSyrEsi60ijK1BMBikuroaIcS5" "iHV0QjAYJBAIVJRKpeCequBdUnAgBVorbtfXo5QinU5vRiIRX19fX/Zkg8L29jYASil2yxZv" "5wVVLkG1Dd+2DD5noLGxkdraWtxu92YkEjluYkgpe5LJZCGXy2GaJrkiHCqBAVgGeNz/kaam" "JgKBAKZpHiMCYHJyMlwul6PNzc224zjM7yg+LRt4rhhUGCA1bBfhhlfRHYCFhQVSqRT7+/s+" "cVQlHo+HpZTRlpYW2+fznUIsAZXxV3gnXmL8TiK8PkptPfxt62s4BgBisVhYShltbW21a2pq" "mN9RfFw2aPjyhtbUe67duou7sY3C9xF+jI/I3bm5x6cAgOHh4bDWOtre3m77/X7mdhRLj67T" "df8h9uIYZCbgqoecVU9ieHzp3N81NDQUHhwczK+srGgppR7tdmmV+KBPZud5jY52WepMg6MM" "DAx0ArGOjg47+fQmnXd6qVwZ4qCwTh7Y+2Pyc5HMhQBAf39/JxDzzEftqlRMBr0l0zLS7GXL" "/Fo35WFRPbsUOEKklGv+/if38ltrDwwl6pWhMwr9undUvfgHwE5gtTciUQwAAAAASUVORK5C" "YII=") index.append('tag_blue_delete') catalog['tag_blue_delete'] = tag_blue_delete #---------------------------------------------------------------------- tag_blue_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAphJ" "REFUOI19kN9LU3EUwD/fux86dbW2rqbbnBq5kELaU7kkehAhIoLgIlT4EPQPVC/9Cb320EO9" "JAQ+RkQkhpWZYWFiYyxLUnNT3E/F8t5t935vT0Wt8sCBw+F8PpxzRDKZtG3bRkqJbdv8Xgsh" "mmOxWI7dIpFI2JZl/ZXpdNqenZ21Jycn1d14xbZtADKZDPPz86yurgLQ2tqKqqp4PJ7sbhJF" "SglALpcjFouJjY2N9zs7O0gpCQaDqKqKy+X6r+SXIBAIMDMzU5ZSqk6nk4IBL9YgHA7T0tKC" "EOKfEufPE8LhMKFQyF2tVsPb0s3IoqBsCWxbcjoSQUpJcelJ9uODIRxNR/mefwlGZtgppdSL" "xaLH7/cjpWTTdDLyWeB1C3xumCsogOR4fYJGRwbP0Uvs7TzG5lKU1Ni9W4plWYOLi4t6Pp/H" "4XCQN6AiBQrgVMBXB/n0U8pbH/AfiqMXU+jLM3j3HKAp0L5XAExPT8dN0xzv7u72qKrKQkny" "aEXBV6/QVp4k7n6Gr2uQ8vooekGQXdihXBGULM8JBaCvr+81MJBKpfRsNkt0n8K5iKS+9JyT" "rqf4Dp7BWLuLcJVwNXmpM3Pk/P0U/KfWxe8fnZiYiFuWNd7T0+Oh9A5Ff0PzkfMYmTsoLpPK" "die5qTm+Nl8gb3q7NE1bEtTE2NhYXObfTkT2b7uj/WepbNxHOCoYWyFyU3MsB4cpGY4uTdOW" "AJRaQfrhlcPt+3R3VbaxnriNxOB7MUj2TZLltst/wADOWoG3I3qv5+RVFkav8+nVNHXtvcjt" "LMbBi5TKrj/gf26w8HndrCQf09nbT2NjlMzcJ751DFEyG/6CARy1jUBD9ebKlyTmt4Is11lT" "Vmjgmt7QcUPTtJXaWYAfMZtW2aJUT1cAAAAASUVORK5CYII=") index.append('tag_blue_edit') catalog['tag_blue_edit'] = tag_blue_edit #---------------------------------------------------------------------- tag_green = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlBJ" "REFUOI2NkUtrE2EUhp+Z3JwWrBAnbXNRYrGLIAlkVRoFNyJk40IoLv0L/gLXLvwHIi4EIZBF" "hKSthSxiLRRJIZQ2tE3HSyetTWKqNFeT+T5XDZW0wQMHDpzzPuembG1tSSklQgiklJyPFUXx" "RKPRKqNsc3NTWpY15KZpynw+L3O5nD5Kr0opASiXyxQKBQ4ODgCYnp5G13U0TauMgqhCCACq" "1SrRaFQ5Pj7eaLVaCCHw+Xzouo7D4bgUMgC43W7W19e7QgjdbrdTb/xgdfs9gUCAyclJFEW5" "EGI/WyEQCOD3+529Xi/Q+HPCu9WXdHttJJJ7oUcIITBNs5LJZDzxeLx6foJ2vV4HQAjB73aN" "t7kXjF+5iuean8LXHB+3UwSDQbxeLy6Xq5LJZAaTqJZlPSyVSu1arYbNZqPeOKLX76AqKnbV" "wcT49QFkZmYGv9+PzWYbQBSAtbW1WL/fX5mdndV0XWfvsEBm4w3Xxt047C4s0eekUSF88y73" "7zxmd3cXwzBoNpseFWB+fv4T8KBYLLYrlQq3vRHi0af8av6k1++iKCoOu5Ptb58R0kJV1TMf" "U85fNJvNxizLWgmFQtrU1BR7hwXS+dc47E7GnBM8iT2jbB5hGAanp6e3FhYWvgz9dXl5Oba0" "tNQyTVNaliWL3/Py1Yfnst1tyZ2dHbm4uCgTiUTwrF4ZIgDpdDompVwJh8Oaz+cDoFQqsb+/" "T6PR+KfzhQCAVCo1B2QjkYjW6XQwDGNIPBIAkEwm54CspmnaReL/smQyOZdIJG5clv8Ly4ZK" "eEm+RpsAAAAASUVORK5CYII=") index.append('tag_green') catalog['tag_green'] = tag_green #---------------------------------------------------------------------- tag_orange = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAitJ" "REFUOI2NkFFLU2EYx3/ve842jhQhcnTH7RQmSAzRGATmrivyOvwE3fSFuukbjHbhhQNb7EJQ" "NLAaMpVxPImbpZsp5DbXtvO+Xbk0dfSHB154+f34P48oFotaa41SCq01l99CiOFkMlmjXzY3" "N3UQBNemUqnojY0Nvby8bPfjpdYagIODAwqFAuVyGQDHcbBtG8uyqv0kUikFQK1WI5lMiqOj" "o8/NZhOlFLFYDNu2CYVCt0p6gqGhIdbX138rpWzTNKFeQ+3kcF2XkZERhBA3SsyLFVzXJR6P" "hzudjhtu/0KvvYNOC4XmwaPnKKWoVCrVbDY7PDc3V7vc4Pzk5AQApRRm6xS98hYRuYO45yD3" "P6F2PjA2Nsbo6CiRSKSazWZ7TWQQBC88zzs/Pj7GMAx0vQrdNggJ0oSBwZ5kfHyceDyOYRg9" "iQBYXV1Ndbvd3MTEhGXbNsHhFuLre+TAIJhhUF1o/ES5T5CJl5RKJXzfp9FoDEuA2dnZFeDZ" "9vb2ebVaxYgm0I9foZqnf9sYYdr7BdAKKeXFDIjLF83n86kgCHKJRMKKRqMEh1vwJY1hhmiH" "7iKfvmav/B3f9zk7O3s4Pz//7YoAYGlpKaW1zk1OTlqO4xD8KCJKH5GpN3h7+1fg3g3+zeLi" "YkprnZuamrJisRgAnuexu7tLvV7vwbcKABYWFmaA/PT0tNVqtfB9/xrcVwCQyWRmgLxlWdZN" "8H8lk8nMpNPp+7f9/wHoTjgbPHXtFQAAAABJRU5ErkJggg==") index.append('tag_orange') catalog['tag_orange'] = tag_orange #---------------------------------------------------------------------- tag_pink = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAiVJ" "REFUOI2NkEFLG1EURs+byZC+QFw0jBqjpVaQImIkUAhm1UUp2EV3/kgh0CwUJJCCUEHaEUQk" "YJNJxWRhImnrJDOxyXuvi9KgVUM/uHDhcg4fV5yenhpjDFprjDHc3oUQ07lcrsOknJycGKXU" "vWk2m8bzPLO/v+9O4i1jDACtVovj42MuLi4ASKfTuK6LlLI9SWJprQHodDrkcjlxeXl5FIYh" "WmsymQyu6+I4zqOSsSCVSnF4eHijtXZjsRj6hyL6ErCwsMDMzAxCiAclwvM8s76+DoAxhuFw" "SCy0CEpdzBDiWYl8laTRaNBsNgnDcHpzc7Nzu0HU7XYB0Fpj9QTBhy5WwsZOxfhVHRB9Dlhc" "XGRubo54PN7e3d0dN7GUUm9rtVp0dXWFbduo70PMCLAEwhbYSXssWVpaYn5+Htu2xxIBcHBw" "UBiNRuXl5WXpui433yLCjwGxqRjCEaAM6qfCefmERD7J2dkZvu/T7/enLYCNjY1PwJtqtRq1" "223izyWJ10lG1yPM0IAQCEfQ/xqABsuy/k5C3P5opVIpKKXKKysrcnZ29k+TyjWWY6GkJvnu" "Keetc3zfJwiCF1tbW407AoC9vb2CMaa8uroq0+k0N42Igddn6n2K+nn9Djz+wb/Z2dkpGGPK" "a2trMpPJAFCr1ajX6/R6vTH8qACgVCrlgUo2m5WDwQDf9+/BEwUAxWIxD1SklPIh+L9SLBbz" "29vbzx67/wYW5z2+cym52QAAAABJRU5ErkJggg==") index.append('tag_pink') catalog['tag_pink'] = tag_pink #---------------------------------------------------------------------- tag_purple = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjZJ" "REFUOI2NkE9LG2EQh5/dzSasrYLIGtfsWlQQKkEhULDmLIK3Usi9p36mHvoFQvfgwUBIm4NQ" "qxQLwdqAJFtqktL8aSyJ0Zhk37cng1YN/cHAwPA8zIxyfHwspZQIIZBScrNXFGU6FovVGZWj" "oyPp+/6dKpfL8vDwUO7u7pqjeFVKCUClUiGXy1EqlQCwLAvTNDEMozZKogohAKjX68RiMaVa" "rX65uLhACEEkEsE0TXRdf1AyFExNTXFwcHAlhDADgQBn9R777xs4jkM4HEZRlHslgesTHMfB" "tu1gv993Oi1w31bodSVSwvONJwghKJfLtVQqNb21tVW/ucFls9kEQAhB+0yQfFPi0eMAphXi" "6+cWnzIN5ufnmZ2dJRQK1VKp1HAT1ff9zUKhcNloNNA0jWa9R/9KoqgKWkBhYlIfShYXF7Ft" "G03ThhIFYG9vLz4YDDJLS0uGaZp4+TYZt8rEZBA9qOIPJH9+94g+myC+aXJycoLneXQ6nWkV" "YH19/SOwkc/nL2u1GgtPx9l4GaZ11qPfEygq6EGVfK6JEBJVVa9rTLn50Ww2G/d9P7O8vGzM" "zMzg5duk3/1C1zXGxuHFK5vKz1M8z6Pdbi8kEonvtwQA6XQ6LqXMRKNRw7Isit9a7H9okng9" "x49T7xY8/MG/2dnZiUspMysrK0YkEgGgUChQLBY5Pz8fwg8KALa3t9eA7OrqqtHtdvE87w48" "UgDguu4akDUMw7gP/q+4rruWTCbnHpr/BfAgQTR/VpGYAAAAAElFTkSuQmCC") index.append('tag_purple') catalog['tag_purple'] = tag_purple #---------------------------------------------------------------------- tag_red = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAixJ" "REFUOI2NkN9Lk1EYxz/n/aG8GijIO53bChO9GDJjV+KI6iKC0bUU0T8XRSDswmgvyGDQUsEL" "oyFLmq9voVvgpitx/pznnC7EoamjLzxw4PD58H0eUSqVtNYapRRaay6/hRChZDJZp1NWV1e1" "lPLaVCoVvbKyoguFgtuJN7TWAFSrVYrFIltbWwCEw2Fc18VxnFoniaGUAqBer5NMJsX29vaX" "w8NDlFJEIhFc18W27VslbcHAwADLy8snSinXsixo7CIXCsRiMQYHBxFC3CixLlaIxWJEo9Gu" "VqsVs5tN1Pt3cHKK1Jp7Dx+hlKJSqdQ8zwul0+n65QZHjUYDAKUU1t4e6u0bRO8dRCgExa/I" "z58YGRlheHiY7u7umud57SaGlPKZ7/tHOzs7mKaJbuxC6xQMAywL0dffloyOjhKNRjFNsy0R" "AEtLS6mzs7Pc+Pi447oucn0d7X3E6O8DuwukRP9uQOIB5uMnlMtlgiDg4OAgZABMT08vAk/X" "1taOarUa5tgYIv0c9WfvvI0QYHdx8q0ESmEYxsX0iMsXzefzKSllLh6PO0NDQ+dNsh8Qtk2r" "pxfrxUt+Vn8RBAH7+/v3Z2ZmflwRAMzPz6e01rmJiQknHA4jy9/RiwtYr17jb25egds3+DfZ" "bDaltc4lEgknEokA4Ps+GxsbNJvNNnyrAGBubm4KyE9OTjrHx8cEQXAN7igAyGQyU0DecRzn" "Jvi/kslkpmZnZ+/e9v8XZxo6vzFHBpoAAAAASUVORK5CYII=") index.append('tag_red') catalog['tag_red'] = tag_red #---------------------------------------------------------------------- tag_yellow = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAihJ" "REFUOI2NkE1LG1EUhp87k0mYUhdiJzrOTMUKQkUUAgUxaxHcFtx31d/URf+AdBYuDEjaLIQK" "UiwEsQEZp8UkBWfUgPEjcTL3dlODVg194cCFy/PwniP29/eVUgopJUop7r6FEPlCoRAzKHt7" "eypN0wfTaDTU7u6u2trasgbxmlIKgGazSbVapV6vA2DbNpZlYZpmNEiiSSkBiOOYQqEgjo+P" "v19dXSGlxHEcLMvCMIwnJX3ByMgIOzs7XSmllclkUElMcvoZz/MYHR1FCPGoJHO7gud5uK6b" "TZLEM8Q53eZHkB1AMTGxhJSSRqMRlUql/MrKSny3wfXZ2RkAUkp02aJb/4DQn6PlbNLzbySn" "ZSYnJxkfHyeXy0WlUqnfREvTdDkIguuTkxN0XUfexCjVBaGByKAZw33J1NQUruui63pfIgC2" "t7eLvV6vPD09bVqWRdKu0Yt89OwwaFlQPWRyijb0huyLZQ4ODgjDkMvLy7wGsLi4+BVYqtVq" "11EUYQy9JpN/S3rTAnkDaAiRpdOqgpJomnY7z8Tdi1YqlWKapuWZmRlzbGzsb5NPCN0gVUPk" "nHf8OvpNGIa02+1Xq6urP+8JADY3N4tKqfLs7Kxp2zZJ+we91hdM9z1BeHQP7t/g32xsbBSV" "UuW5uTnTcRwAgiDg8PCQi4uLPvykAGB9fX0BqMzPz5udTocwDB/AAwUAvu8vABXTNM3H4P+K" "7/sLa2trL5/6/wOgaz2SgApH4wAAAABJRU5ErkJggg==") index.append('tag_yellow') catalog['tag_yellow'] = tag_yellow #---------------------------------------------------------------------- telephone = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqZJ" "REFUOI2lk81rnFUUh5/7zjtvZzJN5iOTxOgkTUqxEymiLUjbnaA7objowoV/gP4BbrqoSxe2" "KzeuBUEQCn4sIwpFgrFNcdJ2SExJiU1qk0nzMZl533vvOddF20DpQsHf5sBZPIfDww/+Z8yF" "y9cqE+OVX4YGkgYhgiBoCIj1pNbhnSVLLTZN8alF+j2yNGPn0fb62sryO/H0y7XWuVMTjemx" "GgAaAgCiAdWAhICIIhoQEUQDToSbt+7Ufr62fzd+pV5qjAzkWLr/EC/CjdYqZ880mV9Y4o1T" "k3inLCyuMjMzxfXrLSamRhFRXm2UGRkfr8bGPLmazxm2u0rPG3qSZ7vn+GluGRFFQ4SlSGYS" "Olt7HGtU8aoYYzCffvVriHyfSAMmynHu9Eke2wRRffoGeFG8KkNxj9nZebJuB28dmw/2iOcW" "Vz9sjoTP6uVSrj7aGMslRbO+fJf1hx2sF7wXRBQn8O7bb3HitWldWdxvbezt6p/t366aZzo+" "uvL912dfn/6gefwY5aMDnByNntP15Q9/UBgosrn1N7/Pt3785vOP3wOIAC5e/m5yuFx6f2xk" "GCtw9MiLvuuVQdr3O1QrwySl+vln+wiCOdjd/nbm+EsFTAwmYqhgXgCM1QZ5vNslLpSYbAxV" "3zz/yaWnABOaM1NnqpUqGzsOUaWYfx4QQqBUzJP2+3T2hWJ1ksFa5SJADJDZEG1s7bCycUCa" "1Zmdu00/tXhRMic458jSDJtmLLWXKOWVKNqPDwHeOZwo1nva9/5CNOC9ovJkihiIEqIkx96B" "pVzLEyfJiUNAai39vmWifgTxMRoCKor3nhDyeBFUAiEookqv28dbyyHg3sJiu/dos5kvlFDx" "qCrqhOAt6gMEQZyHoKgqabfL5traF/+lrf+afwAcuH1jx9F3LQAAAABJRU5ErkJggg==") index.append('telephone') catalog['telephone'] = telephone #---------------------------------------------------------------------- telephone_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAulJ" "REFUOI2lkU1sVFUAhb/75s10fko7005bRqfA4A8zBquRpCmNC4mUuCAYE124YGFcWeLKDa5w" "2QW6s4nGxBgTo9EEFdyoVYhNnbRqkWmhUgol6Eyh7bS00zfv3Xd/XCgL0rjyLM/inJzzwf+U" "eP7UmXRvLn2hLRnLYx2wGmMtWip8GaJCSeBLpO+jfIluegR+wPqdevXWwvxht/BAR+Xg/t58" "oacDAGMtANpYjLFoa9HaoI1Fa402llBrfrt4ueP8mc0r7oPZVL4rGeHqzSWU1vxaWWTgQJGp" "6as8uX8XKjRMzyxSKu1hfLxC755utDY8mm+nK5fLuEL80xqNCOoNg6cEno5S90J+KM+jtcFY" "B0mCQMRYXdlgdz6DMgYhBOKtjyeso5o4xiKcCAef2seajKGN+XcGKG1QxtDmeoyNTRE0VlEy" "ZPmvDdzyzOLxYpcdybanItnufE8klhDV+StUl1aRSqOURmtDqGHoUD8PP1YwCzObldrGXXNt" "bvIdcQ/Ha2+f/WSgr/Byce9u2luT7Ot27sP13rlLxJMJlldu88tU5ZvPTg8fBXAAXjr19a7O" "9tQLPV2dSA2tLdt5Z9M7mLu5SibdSSyVHbznO2DF1t36F6W9O+MIF4RDW1xsC6hvTOB5o0zO" "vomJfZA59OqR7wBcELZYOn8gk85QWw8pxA2J6P0B537+lJo3xpFnBsh3PMKPs19STv50uP9E" "7rQLEEjr1FbWWaht4QdZxsqzNH2J0oYg1DS8j3jx6HNoR/NEbojvL3/OwOOD3Lj21QkHQIUh" "oTZIpZi7/idrWyGNwOAFlkAa1hq3iYpWjpVeB+CNZ9/noe4+BCLuAvhS0mxKerMtaOVirMVo" "g1IKa6P8cWuN2eoEv1fHOTn0ISPfvkI80oLF+i7A9emZOe/OcjEaT2G0whiDCTVWSYyyJEQ/" "5UsTDPY9zdnKKDHhMn7xAiDe3X73f6h/eOcIQgwL2GFhE2tHJ0eXTv4NA6N/JyfhwKUAAAAA" "SUVORK5CYII=") index.append('telephone_add') catalog['telephone_add'] = telephone_add #---------------------------------------------------------------------- telephone_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuRJ" "REFUOI2lkU9oXGUUxX/fmzeTyUybmclMMo3OdDJBbKJBxYq0LqSCARVBXBQRKbgrVhTsyl27" "kFJBXVZcC4KglFaLqI1EGzQYa0InmtA0IaXtJE0yMU3S+fPed+/nolYowZVnc+Auzj33/uB/" "yrx07HS62JP+sSMRK+A8cII6hwSWZhBiw4BWMyBoNrHNAGnUaTVbrC+vVa/NzT7rl+/rrOwf" "LBbK+U4A1DkARB2qDnEOEUXUISKIOkIRfp/8s3Pk9Oa0f38uWehKRLh8dQkrwsXKAvv29jM+" "cZnHBndjQ2ViaoGBgV5GRysUe7sRUR4spOjq6cn4xtzZGo0Y1raUujXUJcpaPeSHsVlEFHUe" "Ae20TIza6galQgarijEGc/zTn51nG3jqMF6E/Y/v4a8ghqj+cwZYUawqHX6d4eFxWls1bBCy" "cmMDf2xq4VB/lzuZSyUjue5CPhJrN9XZaapLNQIrWCuIKKHA0DNP8sBDZZ2b2qwsbtzSKzO/" "fmTu4njjw68+2/dI+dX+vhKpHQn2dHv34Prk60vEE+2srN7kt/HKuc8/OPIigAdw8NjZ3dlU" "8uV8V5ZAYEfbdt659E5mrtbIpLPEkrmn7s49cOb2rbUvBvp2xTE+GI+OuNkWkJ/+kqe/eY3e" "9x/l4OTbmZMHBr8F8MG4/oGRvZl0hsX1kHJcaY/eG3D9zCk6rpzhidffpK38MI1L35G/cH7o" "+4j/lg/QCpy3uLrO3OJtmq0cw2N/0GgGWFFaoTA0fILnDh8lPjcCP71HIpWmr1QyF2fcOz6A" "DUNCUQJrmZm/jqjDWkXljndsLRPfVYYXjv7byj/eQ8SZXh+gGQQ0GgHFXBtifdQ5VBRrLc5F" "aezMUp88R/LsEVqNJerA5kYEiVD1AeYnpmbqyyv90XgSFYuqoqHgbIBaRzR9gNwvo5Sy7fiR" "KJsrlvmbnnNOTm1/93/owivFd+u16mFPTUk9d0NxHz9/Xk/8DZ7dfrtbjJCQAAAAAElFTkSu" "QmCC") index.append('telephone_delete') catalog['telephone_delete'] = telephone_delete #---------------------------------------------------------------------- telephone_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwlJ" "REFUOI2lk89rm2UAxz/Pmzdpk6ZN06apXdM2aYdJdHO6Im5S8TIZiD8Q9CDMwzwICt68z+Mu" "XnTgwYrgQAoKkzlkeOhaHaWwaoup69qSraOapE2a/lh+vO+T93keD9MKgie/f8D3Bx++8D8l" "Xr1wpXtooHu2KxRIYCwwCm0MSno4soXXkriORDoOniNRzQau47K3XS1s5tfP2KkjPbnTx4YS" "qf4eALQxACht0NqgjEEpjdIGpRRKG1pK8cvS7Z6ZKw9W7MFYR6Iv5GPtfglPKX7ObXBqPMOt" "xTWePDaM19IsLm+QzSa5eTPHUDKOUppHExH6BgaithAPU/0+QbWmaXiChvJTbbSYnl9HKY02" "FpIgrgiwUzlgJBHF0xohBOLDy3PG8ppY2iAsH6dPptmVAZTWf80AT2k8rRlRN0iUruELH6de" "meXrxUHs+eWNtzJ95mIs0uGLxRP9vkBQFNZXKJR2kJ7C8xRKadJdizyeVgSPnyOSeoq9e2nO" "Vib3xd843v3ou69OPZF6MzM6QiQcIh23DlE1it/TrN6iM3KSan6VSO8Ygc44t6e/dGyANy5c" "He6NdLzW39eLVBBu+4ezU/kRtzpPdPQsbnGKQEhwf+kOsunuOG7tWQuMqO9Xv8mOPtKOsEFY" "dLU/LNbYmqFZuk5k7EWcwmcI/y7+cCemUeLjH4JTz7z/7ZoFwmSyyfFod5TiXgulNUG/oLRy" "lYPN60SOvoLzx6dY/hbyIElhdokb4fdYd1ITADaAK41VrOyRL9Zx3BhL05OcSRbIPv8ysjSJ" "L2Bw9kcozC7whXMeJQWW9cAGsAC8VouW0kjPY2vhMi+MlFEMUsx9gsahXh3k3syvXNo9x+/1" "ELYlsAOBo4cNHClpNiVDsTYGKjM8NvE5q1MfsPbTHG3DJ6jvFMn1vUPsSJyo1jRqTTwpOTS4" "u7h8p7FdzvjbO8iUt5G/XSN14jn2yzvkF1aZDrzNdr4MZgutNU6tRnlz8xKA4F96faK7OT7W" "bz+dHcX43Tm3XD7/0sXc3f+685/FLYbA143qzAAAAABJRU5ErkJggg==") index.append('telephone_edit') catalog['telephone_edit'] = telephone_edit #---------------------------------------------------------------------- telephone_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwRJ" "REFUOI2lktFPm2UUxn/v11JKW0pb+hVxLW2ntDC3ScfFxpIZE7k0mcYscRf7A/TSxN2YiNdG" "773WaNQYl2DmlSxqyCSrjGVVwVY2NrpVR1sKlPbr933v+3rBxrz3Sc7FyUmec57nOfA/Ic7P" "XYmkRiM/hQO+JNoALVFaI20Xy3ZwHZueZWNbFq5lI7sdelaP1qPmw831yqw3+2ysNHM8lcyO" "xABQWgMglUYpjdQaKRVSaaSUSKVxpOTmrT9iP17ZW/UeiQeTZsBD+d7fuFKyXNrgzPQExZUy" "U8fHcB3Fym8bTE5mWFwskcokkFKRSw5hjo5GvUIcbO3zCJptRccVdGQfzY7DtaUKUiqUNrAZ" "oCd8NOq7pJNRXKUQQiA++Oy6NtwuhtIIw8PMqTzbtg+p1GMZ4EqFqxRhb4eFhSK9dgPXdth6" "sIvHn3tlPSjapwP9dMyEGUyYCfFX5U8q5Qqbm/fZvH+PQPsXTnjn6YUK4A+ove367UZrp7a2" "snRZPInjrY+/++LMyezFiaNphkIB8gnjwFS3y4Mb7xNMnKZ0p0axVeDXYunqVx+9/SqAAXBh" "bn5seCj4+og5jC0h1P8059bGVQZiU4RHC0T3r5MKd/EF42efzA3QYn+n+c3k0Wf8CC8Ig7D/" "4DB7r0qjPM9gPILcnSf14iWS3QUyyVC0cPbye48JhJ6YzExHI1FqLQepFAN9ArRma/VrYs+f" "B+smNz79nFCkS7C1TDrYYjAWuQDgBejZ2qjVW6zX9rF6cRaWfifmrvFapomZNZG7d0ErZLtI" "9uV3aHz/CQFfznfoges4OFJhuy5rd6rs7Fu8oH8gMjaF6txGqy7Tb+RR9kP8/jLjJ2Y5l6yO" "HxJYtk23a5OK95M2/cyEb5HPnSIwWEe7DRAelr8tAwpllTFzaQrRiufnuWPHPADh4ZNvbrfa" "8do/e1SrW7wkviQ/+y6G14PoS2H4JzhSOIfhn0D4nsMbHCc0lBWPVq+NHP7Bf7H4YaGuXRXQ" "SqOVOiitedprUAqUXv4XxuR95xML+oIAAAAASUVORK5CYII=") index.append('telephone_error') catalog['telephone_error'] = telephone_error #---------------------------------------------------------------------- telephone_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAu5J" "REFUOI2lkU1onFUYRs+d+ZJOJnGSSSdJUydpJwY7U6sUI5pSrBRs3RTEhQsR0a1FpNBtMboQ" "XLTd6E4XilgQhYLiMlohqdHYSSXRhPy0ibFJbTppfme+7373fa8LzULqzrM8m4eHA/8T8/zA" "5ZauzpbvM+n6PD4BXlDvEesIbYyLLVFosWGICy1SqxKFEWt3VpcW52aeDQp7W8ePHOrKFzpa" "AVDvARD1qHrEe0QUUY+IIOqJRShf/631yuXNyeDBXGO+LZ1keuE2ToRr4/P09xUZHZvm8KFu" "XKyMTcxTKu1naGicrv3tiCgP55tp6+zMBsb8vVqXNKxuKVVnqEodq9WYb0dmEFHUJ7A0EJl6" "Knc32JfP4lQxxmDe/vSqT7gaCfWYRJIjjx/gnq1HVP+5AU4Up0omqDI4OEq0VcHZmJVbGwQj" "E/OvFNv8e7nmxmSuPd+RrG8wSzOTLN2uYJ3gnCCixAInjj9J78GCzk1sji9vrOvs1E8XzU6O" "1y98fan/scJLxZ59NDelOdCe+FeuNz87Rhhv0Zu+QHl06pvPz58+BZAAeHHgq+7dzY0vdLTt" "xgo07bq/d+Ri8rkS5XunCR5oPrrjA/Bme/2TL0vP9KYwAZgEmZThzKVjeO+w6rDOsTfbS2nP" "U2yG2/xSO9vSd/yNd65998FAAMYXS1f6si1ZltdiCimloc7g1HLikVcRr4gKimdpfZFH80fZ" "sjXWTn70Vt9zXAwAIusTy3fXmFveJoxyDI78SqgW8cpCZYZYHU5jYonZiDY53PU0W3GVH28O" "VQIAF8fEoljnmLrxB6KesC7EiaMj041TQbyyvP47rU17KC8OMzJd9lV4IgAIraVWs3TldiEu" "QL3n1krExz+cx6oldJaHcgfp7znJ6MIQw7OjtM+8HF/94sPrAcCNsYmp6p2VYl2qERWHqpKM" "B0g7S8p5Ml4o185gEg0MT/5M58JrrM5W3gcw9wf7bwrn2BafTEdIz5/vcnPH/wW6uKEQL6cq" "4wAAAABJRU5ErkJggg==") index.append('telephone_go') catalog['telephone_go'] = telephone_go #---------------------------------------------------------------------- telephone_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvVJ" "REFUOI2lkUtoXGUYhp//nDOTyaWZmTBJmvRMbCq1kzYtpUEwSFHwgiIiCC4UuhPRlTu37aat" "m7pSii4Er4VSKGhVUFJaqJKkpKlmbIaZJh2ZNmmayX3mzJn//BcXSjHizmf9fc/L973wPxGv" "HL+Yyvalrna2xX2sA1ZjrEVLRSgjVCRphhIZhqhQohsBzbDJ+oPVhcpc6VlvsL9rZnQ46w/2" "dgFgrAVAG4sxFm0tWhu0sWit0cYSac2Nm7e6rlzcmvV2Zdr97jaX4h/3UVozNVPmiZEc16eL" "HB4eQEWG6XyZoaHdXLs2Q3Z3D1obHvOTdPf1pT0h/kqNuYLVmiFQgkDHWA0iLo+X0NpgrIOk" "laaIs1Ld5BE/jTIGIQTixBe/WEc1cIxFOC6jR/axJuNoY/4+A5Q2KGPo9ALGxq7TrK2gZMTy" "vU288Xz5WK7bvp9JtruZHr/XjbeKhdIsC/dXkEqjlEZrg9KWY7kCb++/w+R8S+X7eb96uzD5" "wcM63jnz7def/ZS3E3NbtrCk7b+59OVpW51410ZbE7b83ety6tSjLwC4AK8d/2Yg29Px0f69" "A57rxelNxuhMiIfyjVsX2Bn7mdSBo9Qrk3hul4vm1Rd3yTsOWFHfWL0wtGdnAuGBcLYtA4RL" "UyQPvoQOSiQy/Xht0P/U4bbBA/5ZD4TNDV0ZSafSLK5HDCYMrbHtArfdJ1or47hVhFMn3lmF" "MKC22HQ9gKa0zmJ1nbnFOmEzw9j47zRCSVqXeSY5RscOw0BK4Jh1cHZgI8nMuZItFdfe8gBU" "FBFpg1SKwvxdtLHsNZM83jLOoaPPYeWPCL3Fr5cCdG2TuOPw6ewh9cn5z895AKGUNBqSbKYF" "rTyMtTxt8+x78mVk9SyelyR/WXK1/jxB5giNoEExvGEAPID56XwheLCciyXaMVphjGF0OEK4" "93Bburn5wwZf/XaQik1iSiXCWo3lSuVDgO3f+gcTZ0ZOdqTTb9bXgsbt4tJ7b3w8d/6/5v4E" "vIOfwckDC74AAAAASUVORK5CYII=") index.append('telephone_key') catalog['telephone_key'] = telephone_key #---------------------------------------------------------------------- telephone_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxxJ" "REFUOI2l0t9PW2Ucx/H3c1p6Rs+AFk4plLKCWaQsw6gYBY1BjT9uNIZEM5Ttcib6F3iHiTcj" "cXhhjPHaxMQrMpxZgsHMyAgRJ8biaIpE6voD1hY3Rss5p+d5Hi8UE+Ol38vPzSefvL7wP0+8" "OjMf6e+NfNseDiXRBmiJ0hrp+TheE7/p4ToenuPgOx7yqIHruNy9s1+6vb31fHAw0ZkZP9uf" "HIx3AqC0BkAqjVIaqTVSKqTSSCmRStOUkh9/utV5ff7+ZrDPtpKxcIBcfhdfSm5mdhgbTbO2" "nuPhs6fwm4r1jR2GhwdYXs7QP9CNlIoHkx3EenujQSH+am0JCPYPFQ1f0JAt7DeafLO6hZQK" "pQ08WnFFiFr1gFQyiq8UQgjEe5+taMM/wlAaYQQYf3SIP7wQUqm/Z4AvFb5StAcbLC2t4R7W" "8L0mleIBwdWNnQvpmL5kd1gBuzsZD4RaRWlrk9JuDc+X+L5ESkVTwgvPPs7pM4Nqe+N+pnxw" "T/2a/X5OHHO8ffnLz8ceGnwj/UCKjpNhhrqNf3F9evVnToRbqVT3+GEt89UXH7zzMoAB8PrM" "wqmuDmsyHuvCk3DS/K+3HWkjm68RjXQRsuwnj/MAaDHwyOrXz40NpcLhNtCKwi83uLpwhWw2" "y9LSEolEgoYn2Fm7gm3cw3QKrV32mfG+RPt8EIROD18fjUaiFGpHFNevEQk6TE9PU6/XKRQK" "LCwsoIwQF6Zewwy1UC6XabNuvrS4uD0TBHA9bZSrd1m9sULU2eGV82/y7vtzVPK3SPT2MjIy" "wp3S73w4d5lSuYydHOLi+Uny+fxbQQC/2aQpFdVCjv6BNgDM0y/SyK4zNTVFNBrl8PCQSqXC" "Rx9/wnD6GQAikYgZBHA8j6Mjj56eGLu7eQC8rWsINLOzs1iWBUC9XscQmnJmER47R7FYdATA" "0+cubfb0xdOy2UCWV3jqiVESfX2ET7Swt7dHLpfDNE1SqRTxeJx6w6VUvO0uL3/32z9/cKwy" "MTExYlnWfCKRiJmmGdBaG9Vq9aIQomjb9jzQ4rquLJVKlXq9PvkndcWCA1tFUygAAAAASUVO" "RK5CYII=") index.append('telephone_link') catalog['telephone_link'] = telephone_link #---------------------------------------------------------------------- television = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjFJ" "REFUOI11kkFLVFEUgL/zZhrNoghCJCireURZUUgt3PcXpqA/4D6EgpChRYL9hBatXDk/oUVJ" "kBSMpKggjAhZgbbQ0dEZ333nnBbPmRytC4d74Nzvu+dcrgCUytOFh1cvruZzUe/s0mZcmXxc" "5x/rUen5+Vt3btZ2d/ZbX79/LC5XKom0i92SlbgyOVo/Dsc3irW9/b1W9cfn4nKlkgDI0UOl" "8nTh3qVzq4L3fqvOx5W3L+pt+Mr1y7X9Rqu18OFLcXk5g08IAEqlcuHag9s1s/T0t7n5eGtr" "i7v3b9f2dpvNpU/V+CjcEYyNjb0SkZfuDoC709/fnwNQVcyMjY0NdXfcHVWl0Wi8npqaKucP" "RePFJxMnunEHdTBzrKm5nzuBpoID2++ejgPlCKCvr0/6zwiRnIRTdX7VA+v1QGpCTiACQggC" "WY6705uHgbNCPvoLtxJlfTthNzFyIuSiDIhEUFU6ghACQTPwQq8gksG/GyluHMJChBCJEDkd" "QR4gSRISAw5vLohTbykgiDgRYE6WO5gcE6gqQbNDasZuMPoKEUGdKAJVQBxxwQ/fqEuQpikH" "6rhBM3XUsjlP5Zw0SBfcDjPrHmHvwAkGzeCkCuqOuuCS9Wx+BMa7BT09PWy/f8Pa2hoTKys8" "GxwkhMDQ0BCLc3MMDw8zOzvLyMgIMzMzxHHcGUEARkdHfWBgAFX9b5hZZzczFhYWqFarkgfY" "3NxkcXGxUzQz3P1E3v7K7b8D8AdMxYa9jH7pkgAAAABJRU5ErkJggg==") index.append('television') catalog['television'] = television #---------------------------------------------------------------------- television_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqxJ" "REFUOI1tj01onGUQgJ95v+3uZrOJVHQ1pTHRXaVNrWnQinjoRXsVclgFb548SC8asCBl9WCx" "4sVrD3oJCF0QQURQsEK1tYXERkwksCVg0y1Ztbvf/n77vfu+42GTtDUODAzMPM/MCECxdCF5" "fPqhG4nApK+s1grlc6+G/E+8XHz3gcNPH6q0mt3o2p8/5tfK5Vh2mvdL1gvlc2+G/4ULT+Ur" "nW4nWtq8nF8rl2MAuXeoWLqQnD0wfkPQ9PWllUL5/OlwB37siclKtx1Fv128ml9bG8J7BADF" "Yin5+HNHKt4PRq4vrxTq9TpHjx2pdFq93uqlpcK98K5gYWHhAxF5T1UBUFVyuVwA4JzDe8/W" "1pZTVVQV5xztdvvDxcXFUmJbdCb/2tk916iCU/Be8T0X3Gpaeg4UaHz2+hmgZAAymYzkRgUj" "e+GBU6qh5WZoGXghEDCAtVZgWKOqpBPwaFZImLtwFDtuNmJasScQITBDwIjgnGNXYK3FuiG4" "Py2IDOG/2gPUsw0LBsGIYJRdQQIgjmNiD2xvTooSRg4QRBQDaOMbgua3RFGdXhRjJjp3Bc45" "rAOv4LynZT2ZpME6xRjo177k4ZEfePbEcQ4++CQXV7/il5FNnt8/8YkBGAwG9J0SD5R2rDg/" "/HNfAKpCs/oFxw7N4oxjduIkTiwvHH0R0LfMzgudvhL2lTBS2n3oWsWpoAJ3WrfZJ1leOXwK" "gHdeOk8+9wyCpBMAqVSKxvcfs7Gxwdn1dd6emsJay8zMDL8vL1Of+ofV6mVWqj9x+uTnfPTd" "G6SDFIpGAcDc3Nz7mUyG0dFRrkxOks1mGRsbo9frMT4+zsBbqvEfTD8yzd/dTcJOjZ9XLtFs" "9D8VgPn5ea3Vanjvd1NV76uDqRaJAxESKOoEeyvFr19vyL/7g3f+eDV0LgAAAABJRU5ErkJg" "gg==") index.append('television_add') catalog['television_add'] = television_add #---------------------------------------------------------------------- television_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqZJ" "REFUOI1tkU9oXFUUh7/z3utkMq1WbRkyFZ2kM7Q1URTaQpcFdeMui1EUl4IguLAEFEoZXVio" "K+nCRRVByKqDCIVu2kVLi5YUEpLaBgKTBppanBTNTOZv3n3nHheTjK3xwoUD937fOT+OAJTK" "F1PHR/cvR2GQvnVvrVg5926D/zlvlT7f+8qrR6rNjU7v9oPrhcVKJZbtx6clS8XKuY8b/4WL" "hwrVdqfdm334W2GxUokB5MlPpfLF1OsHnl0WLD0/u1CsXPiisQ2/fPClaqfV6925NlNYXOzD" "OwQApVI5NXZsoup9Mjw/t1BcX1/ntTcmqu1mt3vv5mzxSXggmJqa+kpETpsZAGZGNpsNAVQV" "7z21Wk3NDDNDVWm1Wl9PT0+Xoy3RmcJ7Z3dMYwZq4L3huxr+seHoKhhQ//GDM0A5AMhkMpLd" "LQSyE07UeNRwrDYciRdCgQBwzgn0a8yMdAQje4Qo+BfuxcpqPaYZe0IRwqAPBCKoKgOBcw6n" "ffD5tCDShx+3EsyzBQsBQiBCYAwEEUAcx8Qe2OqcEqPRU0AQMQLg8N3vGVu4QKpWpbk3xwwR" "17YFqopT8AbqPU3nyaQCnBpBAMWFHzjx188c+fAjhsYm6N65woEbV3kziD4NAJIkYVONODFa" "saG+n3NXCGbCyO3zHD45SXr5OvLT+2Tu/8LB0X0o9tkgQnvTcB66zkgU1Aw1wcR4Zv0B6ZEx" "eOfUYEvRlzlCk9EIYGhoiPrVb1hZWeHs0hKn8nmcc4yPj3N3bo6Tw3vozF9m96VP2Oz+SQdo" "boRoyKNosAXnyOVyfJvN8qIqqkq9Xiefz/Ow2eL3WzfJ7xsmCnfRfJxwvxZgpt8JwOTkpK2t" "reG9H1wze6p++4UOR2WV/ST8Tciv7ec4P1OTfwBTGHa++mjbRAAAAABJRU5ErkJggg==") index.append('television_delete') catalog['television_delete'] = television_delete #---------------------------------------------------------------------- textfield = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAEdJ" "REFUOI1jZGRiZqAEMFGke1AYwHjy5Mn/lBjAwsDAwGBsbEyW5jdv3iC8cPbsWbIMGfhApJ4B" "5AYk44sXLyiKRsbRvMAAANspDZm9HlJmAAAAAElFTkSuQmCC") index.append('textfield') catalog['textfield'] = textfield #---------------------------------------------------------------------- textfield_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAQxJ" "REFUOI1jYBgFjCdPnvxPiQEsDAwMDMbGxmRpfvPmDQMTjHP27FmyDGEirITGBrAQq3D32Y0M" "+y5sZvj49T3D7z+/GVyM/BicdQIQBuALyG0nVzGcf7abwd7alEFGSJVh/9UNDJsuT2V49Pwe" "A4u8vDzDmzdv8Nq+/uhihgBPd4a/TH8Z9CVdGfZcW81goWvFsG7zSuKc71Nt+H/blTn/kcGm" "S1P/m2dL/icqEN98fPnj6rNjDB27ExkYGBgYOnYlMtx9dYnhP8P/H8zEGCBlwsP5+ddrOwVx" "BYY3354wfPz6iuHoxcMMnz78nMhInCcYGMyyJDoYGBmzGBkYeP8zMHxm+P9/2qlpLyoAzMZs" "4ud3QFIAAAAASUVORK5CYII=") index.append('textfield_add') catalog['textfield_add'] = textfield_add #---------------------------------------------------------------------- textfield_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAQhJ" "REFUOI1jYBgFjCdPnvxPiQEsDAwMDMbGxmRpfvPmDQMTjHP27FmyDGEirITGBrAQq/DZ5hkM" "TzdPY/j68DYDq7gUg7RPBgOPUyLCAHwB+WzzDIYPx1cyGAQnM7ArajN8v7SL4frRFQw/fjMw" "ML548YJgNF4vsmIwj85m4Lx7gIHh6REGBn4Bhjcs8gxXzj8kzvm7nVj+/Tu77j8yeF8v8X+3" "E8s/osLgH9P/p98ubJXh3pTF8PP7C4ZvDAwMnz8xM/xlZnjGTIwB6aYS/O9ePrNhYmNm+s38" "leHj2/8M954x/f37538XI3GeYGA4HC5b8e3ts3Smf4zy/5j+P/3H8H+6555/bQChU21fH0/9" "swAAAABJRU5ErkJggg==") index.append('textfield_delete') catalog['textfield_delete'] = textfield_delete #---------------------------------------------------------------------- textfield_key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWVJ" "REFUOI3tkb9LAmEcxp/3fQ8VwxwytFzaoiEqLmiosa3/IKOWICgwKOgfachVQoekGo1+Q5OY" "QpFYZnkFlenVqedpnp02REHRidTas32/PM9neB7gXyQUCtX/AuAAgOf5X4VFUQT9OCKRSGN3" "vYbn8DKyh/OQzzc/37RB5Itypz5QKsA2NIlKdgvy9VHzgEJ8A7XiAazdg1BuguBMTkjHHkix" "neYAlWwU1t4xaKVLmGyd4MyAY6QHTPC/lwg0LpKZnahKAigTQagCQ6sIvJRQfCiDpNNp3Rk1" "KQFN8IMZX2FxquBoDoRaUKuquAikQHk3iF444embYIaWhY7RqYG6ug2iyYgF8woraEVGCM6S" "j3Mu7+06pwcwtjkW7cPj/aq4Ao6zIr6nlKLhjNsuFwI2G+DyPskAoAuglKiE3YEZ2xHbEosn" "0czsjC+1+t2nC7gXsruF/H6XIpXKyURmadp7tfaT7w2cf4zJeRr/BgAAAABJRU5ErkJggg==") index.append('textfield_key') catalog['textfield_key'] = textfield_key #---------------------------------------------------------------------- textfield_rename = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAALpJ" "REFUOI3tk8EJwkAQRd/fRLEBK0gJOdlHujDifYsQwQ7SjGwJqSCLHoU9hOB6UVASE8GLBz/M" "YYaZ94eBkUzCNzJfTf8EQM65ONZQVRVZltE0DUVR9Bucc7HrutEoy3Kw7r2P6QO0PRyRBDEi" "AQIBu/WKEMLbDdPnZL5YgiLGXJmlIlzOkzd4ASgBuGIMGHPf5FOAgDacENAp0grE6H1fAfvN" "atpuQPLej9pYa8nznLqusdb2Af9f4AaXc2bmFfhk/wAAAABJRU5ErkJggg==") index.append('textfield_rename') catalog['textfield_rename'] = textfield_rename #---------------------------------------------------------------------- text_align_center = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAJVJ" "REFUOI3VkrENwyAQRc87MQUdO9BBzSTOOrQMQcsINMdHkCZGjhVbimKKnPQEFf/uHUR/X8t2" "cc711hrVWgcABqWUcZZSyHu/XD38fQdERMYYA2A9Jh+wIYTHLelvHWit+9m8n4gxTnCglDIA" "1rNUAMTMNqU0wYGUsl/NvN8MAMo5T3AghBgO9tvYeP1Qy8z3Ofi5nlmEzwc0b3d0AAAAAElF" "TkSuQmCC") index.append('text_align_center') catalog['text_align_center'] = text_align_center #---------------------------------------------------------------------- text_align_justify = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAJlJ" "REFUOI1jZGRiZqAEMFGkmxoGsMAYpSXF///9+8fw588fOP79+zcc//r1C07/+vWLYf+Bg4wM" "DAwMjJSGAdwFebk5/9FtRbYRHZ87f4HKLkhOSvyPy7/Y8J2796jsgvCw0P/4bER21e/fvxle" "vnpNZRd4erjjdQF67Hz99p3KLrC2svz/8+dPrP6FYeRU+u8/A3VcQHFmAgBNc91QW4SyWgAA" "AABJRU5ErkJggg==") index.append('text_align_justify') catalog['text_align_justify'] = text_align_justify #---------------------------------------------------------------------- text_align_left = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAJtJ" "REFUOI1jZGRiZqAEMFGkmxoGsMAYpSXF///9+8fw588fOP79+zcc//r1C07/+vWLYf+Bg4wM" "DAwMjJSGAdwFebk5/9FtRbbx169fDHv27mNEN4B6LkhOSvyPy7/Y8J2796gcBuFhof/x2fjr" "1y+Gm7du0zAMPD3c8boAPXa+fvtO5TCwtrL8//PnTxQb0W3+9PkL9cOA4swEAHvZw1Apyj7R" "AAAAAElFTkSuQmCC") index.append('text_align_left') catalog['text_align_left'] = text_align_left #---------------------------------------------------------------------- text_align_right = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAJFJ" "REFUOI1jZGRiZqAEMFGkmxoGsMAYpSXF///9+8fw588fOP79+zcc//r1C07/+vWLYf+Bg4wM" "DAwMjJSGAQs2wYT4uP/INmPD585foLILkpMS/+PyLzZ85+49GoaBq4vzf2y2Irvu5avXVHaB" "p4c7VluRbUfGX799p2EYaKir/Uf2Lwwjp9J//xmo4wKKMxMA7qbCUM9Hpb8AAAAASUVORK5C" "YII=") index.append('text_align_right') catalog['text_align_right'] = text_align_right #---------------------------------------------------------------------- text_allcaps = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAARpJ" "REFUOI3tkC9Sw2AQR1+AA0R1po6ZXqA3AIXmCBwhrgJT38oqFLZVERwAUYGsi60LgyqC/fe1" "DabptIQbwHO78+3b/X3wTwYwGo1eAZqmWWVZNkwprSMid/c7d/8ws9LMhqq6UdWNiNyqalFV" "VXlxGMx3u12RZVnp7jcppfVsNruPiC8ze1ksFoWqIiL5crl8UNVnERkCtILxdDpdbbdbIgIz" "A8DMHt19CiAiqCoAVVWNI2IFcAUwmUzKwwARQUoJgPl8/tRmVdWjAKCu6/IoaGkvcPfOZx0i" "dPpnAjPDzM42tYjIMdopFz8F7v7rQ3fPI6LTvzwtBoPBWFU/RSTv9XrvdV2vAfr9fuHu1+5O" "0zT5fr9/65j+MN+tntPu0Kg4hQAAAABJRU5ErkJggg==") index.append('text_allcaps') catalog['text_allcaps'] = text_allcaps #---------------------------------------------------------------------- text_bold = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAATtJ" "REFUOI3VkjFuwmAMhV8gEmxlZ4CJOT0AEgdASnuD9AQtE2PFyNYuTAz0BiAxIrU7Q+EGLKyQ" "Jf5t/47UpYrSDJQVb/70/PxkGbj5CsrNeDxOADzneR6ZWaqqb6oamdmAmZfOudFqtUrLM7Vy" "M51OF977ZZZlEJHdbDabzOfzR2Zemlmiqp/VBGEVqCrMDHmeF4yIDgDAzNFVBqoK7z0AII7j" "FhElQRDAObe42kBVu8Ph8DXLsgcA3TRNv7bb7VNVX6sCZoaqgogO6/V6stls7s/n86Jerw96" "vd53p9NpXTQgIqgqmLlgZjY6nU5oNBqRcy75N4GIwDlXsP1+nxIRzAyqenfxBkSEMAxBREXU" "drv90mw2cTweUxH5KOv/PFK/30+cc7GItH6T7H4PGqnqznv/LiKH6tIbrx9Fo9UIgywWcwAA" "AABJRU5ErkJggg==") index.append('text_bold') catalog['text_bold'] = text_bold #---------------------------------------------------------------------- text_columns = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAOBJ" "REFUOI2tk78yQ1EQh78NL0BqPAB5AIleopdo0UYaPEyo0aMn9BK9RI1azN09c1d17iRzy3vO" "zG/mNLu/b/+J1Fao8mqVolMkWI2fy4tzz/OcEEKh4dW1ABz1uq6qmBmqiqry9DwSAKnag4Jg" "cNb3EAJmVujm9k4ADjptj85Rb+NJYoLTk2OPzrHe+4dHAdhrNUsEH9NZYoJe97DkMnp5FYDG" "zvbSFMyMr++fxASd9n6JYDx5F4CtzQ1fnI6Z8Tv/S0zQau56lmWFu5kxnX0KQH19zc1saUtz" "Jw1B5WP6B1hcv1A97M5SAAAAAElFTkSuQmCC") index.append('text_columns') catalog['text_columns'] = text_columns #---------------------------------------------------------------------- text_dropcaps = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAPFJ" "REFUOI3NkTFug0AQRf84nIQrJCV0uDC4NQYfgCtYVupocwVfIIVrKzSIG3ACJNccgIZddifV" "WsJYNlIo/KXXjFbz32iBl8tW/GaxyIOp753RhOlIzAWAwo7SNGUpJZRSkFJCSomyLAkA6Lad" "Db0TIWPC8nRYFXiSoYHB5vS5WsZfeUDMe2sRRRHbZktVVUODrcg3bBDQgi9syJ1q4QDATpxd" "bXjvLEz8c1hfduLsan7LyPA3gA/f90cGdV3To8WTc92SJMmo5Rb7C0opNE0zs0EYhg8NlFID" "2rad2cDzPO667u69lr7vr2it5zH4d/4AKhPTo8oe71AAAAAASUVORK5CYII=") index.append('text_dropcaps') catalog['text_dropcaps'] = text_dropcaps #---------------------------------------------------------------------- text_heading_1 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAQpJ" "REFUOI3tkDFOw1AQRCeYE7ih+lU6+wIJRdxYAtcRzjkQB0A5AAdBWD6B6yAfwHSuIqUgHU00" "u/sdKiMbww2y1Wg081a7wGVmAJDn+fZ8PscA4L1/K8vyNcuyjZk9kATJpq7r5yiK7knetW37" "OCHleX5Yr9fF0FutVsVisTgAQBzHt/P5vHDOHYaZq15476GqI6iIgCQAoGmanZm9i8goc90L" "VYWqujRNn/oiSTcsnE4n/AswM5jZvqqql96LomhJ0g2XmNnfABGZ0EmOPBGZnPnzA1WdAH5D" "VRXe+1EmAIAkSbYkKSIIw3B2PB4b59xGRGKS+yAIYgA3XdctvfefAJYAPgB84TL4Bnfkq2tk" "Ef9+AAAAAElFTkSuQmCC") index.append('text_heading_1') catalog['text_heading_1'] = text_heading_1 #---------------------------------------------------------------------- text_heading_2 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAVFJ" "REFUOI3tjz1uGlEUhT9DmmkiDRLlbIBZgJUpoEGKqEPwPuIVeAFWNpANOAFqS6HOCjLpqAal" "oUAYPc27PzOkMQT24NPdo3M/nQNvugGYzWYPx+MxB2ia5sdyuXyaTCZ37v5ZRBCRMsb43d3v" "Y4zvReTbZrN5PgNeIX+bpvm1WCymJ284HM4Ph0PR7XZv67qexxifzayo6zp399vdble9O4Wb" "psHMruqpKvv9niRJihjjdL1eV/1+v1DVedu2GfAfYGaYWTYej+9VldfqWZIklGX5dJH74u4v" "IYTfAGeAu+Pu1Wq1ejx5g8Hgg4hkpztN06+qiqp+Al4AOpd1ReRqgoigqudnM/sTQpiaWQVk" "VwAzO4cvoSEE0jQtVHViZh87nc4c+AnkAF2A0Wj0ICKiqvR6vZvtdltmWXanqrm7V2aWu/ve" "zGjbFmADPPImAP4BbzLjumPfTwkAAAAASUVORK5CYII=") index.append('text_heading_2') catalog['text_heading_2'] = text_heading_2 #---------------------------------------------------------------------- text_heading_3 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAVpJ" "REFUOI3tkDFOQlEQRa9gCAUx+RT8hORXdLwdUEBMIBFqhd7EFbACF6ArcAMqUJtQ2CEboKSC" "kBAKYvN4M2/mfRu/0eAO9HYzuXNy5wL/OgGAfr9/m6apAQBVfZ5MJo/dbncgIldEBCJaOOee" "RGTonDsjoof1ev3yBfiEbFR1Nh6PL7Nds9kcMXNjPp9XjTFT59zMe98gIrPdbqsAcJqZVRXe" "+x/xmBlEBABwzl0vl8tVpVK5YeZ+5vkCeO/hvU/a7fYwOySihJkBAIfDAXEcj6y1jRDC3VEZ" "vV5v0+l0Rt939Xp9VKvVNtkcRVFSKpWmhUJhk8/nLwAg91vcTEQEay3iODZRFN3s9/uViFyH" "EKCq5uiFLO53qLUWuVzugpmHxWJxoarvIQQAeAOAPAC0Wq1bIiJmRrlcPtntdoskSQbMbFR1" "JSIQkTcRORcRk6bpPYDXox7+qD4A7D3Wyfcs+jsAAAAASUVORK5CYII=") index.append('text_heading_3') catalog['text_heading_3'] = text_heading_3 #---------------------------------------------------------------------- text_heading_4 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAATtJ" "REFUOI3tkD1Ow0AQhZ8BxV26lFttOlOlgyZVClep7PSIE8ABohwAwQG4ADh9Cpqk4QSkTGUp" "ikRlqp2f7FJgW/YdmGrmaebTmwf8VwQAeZ6vQghJrRVFUbzN5/OFiGQiAmbe73a7JQAkSWKc" "c/eHw2HZI+V5fsyybN3VZrPZejqdHpt5PB4PrbUfxph276J74L3vQYkIRNTOIYQXERkyc6td" "Nc35fIaImDRNH2vbICLTLFtrn0XklYgeutAWICJQ1XKz2Tw12mQyuamqylhrb5k5ZWZDRNci" "gjiOV0S0bAGqChHpveCc+0s6ir6cc3eqClVdiQhCCO89B8yM7m9NBiKCsix/AHwCQBzHlarC" "e78HgMs67RUzEzNjNBpFp9Npb61dMHPCzOVgMEicc9uam3jvvwFs8V8AgF+rOMLw4q6WQgAA" "AABJRU5ErkJggg==") index.append('text_heading_4') catalog['text_heading_4'] = text_heading_4 #---------------------------------------------------------------------- text_heading_5 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAVNJ" "REFUOI3tkjFuGlEQhr9dUiJF0CBF3guwXVKFhoYCDhB8jogDWBzAJ3AusETaIg0ukNLZ5gCc" "YCu0LfvEzJv3Ng1rYUs5QfKXo/m/mX808F8JwHK5XLdtmwOEEH6WZVksFotbM/smIojIQVUR" "kVxEUFXO5/OPuq4fU4DNZnOXJMkkxkhZlgXAdrstLs2T/X5/d21WVUIITwAfulVCCHjv36x3" "mQqAiHz03m9CCI/H47Hqel4B3nu899lsNlt1RhHJVLWD5c65tZmt+/1+cTqdvr8BmBlmVu12" "u/uuNh6Pv4pIBlBV1afBYJCb2dx7v0rT9CXGWLwCumzXEhGcc4xGo1xV50mSPDRNc9/r9W5i" "jDcA6XWE9wBVxTmHqs5VddU0zeRyrwx4BugBTKfTtYiIqjIcDpO6rg9Zlt2qah5CqC7xDmb2" "pW3bz8Av4PfffuNf0x+W8PTdnUuQdwAAAABJRU5ErkJggg==") index.append('text_heading_5') catalog['text_heading_5'] = text_heading_5 #---------------------------------------------------------------------- text_heading_6 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAWBJ" "REFUOI3tjz1OAlEUhc+AJENDyBR2Q/OomA0gBTQUUhOHyoYVmLgAY2OnnZWJvRGpSSSxNCyA" "FUwyBRREw9/9mfesmKBr8FQ395775RzgXx4AxHF865yLACDLstfxePzS6/UGqnpBRCCi+Ww2" "uwEAY0xLRC5U9SFN0yQnxXGc9vv90TG93W6Pms1mCgD1er1ijBnVarXnIAgqB8/JYciyDCLy" "Kx4zg4gAAM65N2b+SpJkeOzJASICEQm73e714ZGIwtVqBWPM+Xq9jpxzk2q1+i4iyWazuQLw" "nQNUFaqaTKfT+8Ou0WicbbfbsFwuRwCwWCyGvu+H1tpZoVAYWGufcgAzg5l/VSAiqCp2u11+" "2+/3SbFYhLW2AgCF4wp/AcwMz/MgIhMRge/7rVKpFDnnAOATAIoA0Ol0bomImBlBEHjL5XIe" "huGAmSMRSUTkVFUfVfVSVVvOuTsAH/gXAOAHTeTQkL/zUegAAAAASUVORK5CYII=") index.append('text_heading_6') catalog['text_heading_6'] = text_heading_6 #---------------------------------------------------------------------- text_horizontalrule = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAM5J" "REFUOI3tkCtOxGAUhb8mnZEIMkGQjGIZuLKN7gHTpCtgLUhWMOPxuDoMQWH6P+h/H6iOmQYS" "0gTDUSc399zv5MJfq5pN3/c+e1VlmiZyzsQYiTESQiCEwDiOhBAYhqFaPvnbBl3X+U/UeZ5z" "JqW0coO2bf0bquacn1NKt6tQzxo8PL0f9rtNs7Sg6ogZRZ1SoKjyKfDyGo+P9zd3NcB+t2mu" "LupTyMxRc8QckQoxKApSG2I1qs715bYBOKXePsoiqYhRDEQMsdU/8C+AL75qqm1gUtFiAAAA" "AElFTkSuQmCC") index.append('text_horizontalrule') catalog['text_horizontalrule'] = text_horizontalrule #---------------------------------------------------------------------- text_indent = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAPxJ" "REFUOI1jYBjygBHGKCsr+//v3z+GP3/+wPHv37/h+NevX3D6169fDPv27WPEZzDpLmjf/OZK" "pa+IDowfExNzHWYbOv79+zfD2bNnNRkYGBhYYBp+/P7HkLHg8dU7d76F7GlRv/7r1y9FmIaf" "P3+iaP716xeqC5o3Pf8vws3G8On7b4bTd76eeXzzW9zJ6brXSfJC9qJnV16+/85099KH4PNz" "ja97eHhcgdn648cPuAv+/PnD8OvXL4ZHjx7poHjh289/DGvylbVg/O/fv6ughzyyN6gG4F7w" "8vL6jyvUYbYi4y9fvlA5HdjY2PzHFl3Itn78+JE6tlIVAADBzPR3LZGHeAAAAABJRU5ErkJg" "gg==") index.append('text_indent') catalog['text_indent'] = text_indent #---------------------------------------------------------------------- text_indent_remove = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAQdJ" "REFUOI3VUr9rwkAYfakVi7NYJBRb6BJJt47BOWTStWbr/5CpY4fSwY5OLs5K/4MM3TM14CgG" "R5dAMMl3Z9LpzlRULGTpg8fd8r0f3x3w76GIi+M4eZZl4JxLMsYkiUieRATXdZVTwn9PAACv" "n2v/pd/QAcC27blw2ydjDJ7naQBwCQC9j4XWblanG7bNhRgR3YmBNE1/DRPRLoH1ttDU68qk" "06o9XigVLNcxhoObs/spANB1vjX1tj6r166y8bOqA4Bpmr5wTZJEJuCcg4gQBIEuK3y9P8wB" "dJ5GK18ox3F8v7/5Yo3SILtalpUf27pwLTKKopL/gWEY+aHnKrqGYViOa6n4AWfK4w4JuTZk" "AAAAAElFTkSuQmCC") index.append('text_indent_remove') catalog['text_indent_remove'] = text_indent_remove #---------------------------------------------------------------------- text_italic = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAM5J" "REFUOI3VkTEOgkAURAdjrzfwCiYUtNRU1BREaxqPwFE8AREuYEWtJaUlpYTk7/5dlvUAsquW" "TjuT92fygb9X4DOLoiiZ+TRN04aZB2a+V1UVfw0AgDzPH1rrHREd67o+/9Qgy7K9MeYmhBia" "ptkuZdY+ADMfrLWQUl5cmU+A1BgDInICnBOSJNlrrW9ENLRtu1gfAFYuQwhxsNZ6rwOeCUSU" "BkHg3Q84JkRRFM/zfB3HEV3XeT/1ZoZhWCqlYmaGlBJKqWff96kP8ud6ARGbclrX87iQAAAA" "AElFTkSuQmCC") index.append('text_italic') catalog['text_italic'] = text_italic #---------------------------------------------------------------------- text_kerning = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdBJ" "REFUOI3lkjFsElEYxz97cq0lxLMhojhwynAXLwKSJhgYuMnBqQtORDQkrkcTJE1sgk5OTTwH" "46IyOJSptYOj0gE2lZoGc2Eo16Qrlnv3Hu/xMNepF5zsrP/t+/LPL1/+/w/g31Rh4/BCob4v" "nsUrzA61Wq3ebrd3l+9X3rDzget3FfiZSCReaJq2pijKuV6v1wUAyOfzcjgcfi9JEvMB1Wo1" "5XneZjabtY/ml5vJWPDdV3b7lWB/2ptMJi8JIR/7/X4XAMC27eNQKHTVsqzGnH+KIKQ8z2tQ" "Sus7qzesH4d4R+C/nzSbzYHjOA2EkHHqjcfjOmNsGwDAB1BKB9Pp9DljTC4WiysjxOuqvPD4" "zqp1zXVdk3Oe0jRNBwAghEi2bQ98gGEYKwDQNU1zgDFuEUKMz+vK0fd99HZhnj/tdDrd4XDY" "QgiVIpGITAg5/iPEZDKpYowlVVXl8Xhsc84r0Wh0d3L53pYcX3wtXHmw5Vgffomi+Gw0GkmO" "45h+8uVyWS+VSvpsG7lc7iCdTn8BAEg8+raWq+xtAgAEg8GDQCDwcNY7RylNIYSk00Umk5Ex" "xg3XdVuxWExfdKl58ZJ462ahs8QYMznn23//jv9LJyLx0dohdTGEAAAAAElFTkSuQmCC") index.append('text_kerning') catalog['text_kerning'] = text_kerning #---------------------------------------------------------------------- text_letterspacing = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAeVJ" "REFUOI3VkM+LEnEYxh/XGGy9mIehTjMHAwcNBcMOepjjHr2sQodmbyFCuwcROol/QIeIDp7q" "FC0S5F9QHqTEAreYNkva2QUtOy3jfH/MjDPbSVEJ9hg9t/d53/fDwwP8awU3jVqtVu92ux0A" "qFQqajqdfpZMJtV4PH6k6/o5AORyuQNRFO+LothZA1Sr1bTneS+z2expr9cb9Pt9Q1EUlTGm" "tlqtxuIuGo1ep5Qe6rr+a2sV4Pt+2nXd54yx+sKzLKtBKZXz+Xxh4VFKI8Ph0ACANYBt24bj" "OA3OuVwsFgsA0G63DdM0X1NK9wFAkiSZEDJY/CwB5XK5YFnWoNlsGpZlvZ3NZvsrKR7btq1K" "kiRzztXJZLIELDtIJBJxznkkFovJjLFT13UPRFHsjMdjYzqdGoIg7DHGVM75keM4SwAAQNM0" "tVQqqateJpM5URTlzUpxe+Fw+AQbCmqaFjFNc4cQwkej0VcASKVSMiEEjDEjFAoFCCGGIAgG" "Y8z2ff/9JgQAsPvoLPrw1eTTX5cruvv0RL9T/qws5gAA7D45u3U7Fnp3bTsYpo4Pz7uA6wPu" "3MPv8/lPe36Bq1cCN+y5j21hC/o38uHHkNz7fpg5Xkvw4MX40gQ79eMvN0sflcvu/iP9Aevx" "7+Qv4TQsAAAAAElFTkSuQmCC") index.append('text_letterspacing') catalog['text_letterspacing'] = text_letterspacing #---------------------------------------------------------------------- text_letter_omega = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdRJ" "REFUOI3FkctrE2EUxU9eH5qk8TMhUsVoR6iPhTURuhMyXbhyMbgQwY3ZuRTBjYJocOEyBARX" "QvIHSOvCQkGYEVG0VAwUsUHMjNJVtZnpxLRJ5nu4kImQYdY9q8u59/zg3gvstyKTxvVn5swh" "Qh4Wcgl1MBIOF0A8FqXft4bGrsuqL+8pVijgxtPNYukU0YUAVr8Nr764UzAAQHtiqqXTyUXB" "Jda+7C0sV5VWAKDVTHppNmWmD8Tp6/X+gh/2deWxqZZLaX27x5wPGwPlTVVxACDqDyQQrdBU" "gna2Rq3JMAC8eqAYG5t7rWw6RtH3Kr4/BhzNJjQpJdo/B0thB+t0BktcANk80QIAxiW4BAQT" "YXkwBnABcPnfGwN+u54FKXFwKlYMA2QysWIEEu72yAoAXFs2nV2Bk3mihgGmp4na7XP0usNm" "ALBSVYx3627jcDJKy3fblcnw/K2vldxUnK6uuY1Pz88bAcC1+g+9Z7P629afxtlz6Vr5tkn9" "3oWbn+nsXKr2/uNOo2ez+uX7bT0AmMkT1WNSs+1R85ftWdlCZDx04kxGd7ue5ex4TY8L7djx" "5HjNuF9wKTF/MfOIcwmJf9f2dSRHigJALk90KYDwP+2H/gJpusl9UMNGdAAAAABJRU5ErkJg" "gg==") index.append('text_letter_omega') catalog['text_letter_omega'] = text_letter_omega #---------------------------------------------------------------------- text_linespacing = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAQ5J" "REFUOI2tkTFLw0AcxZ+aQdrJfoIgcQiiUz6EWwYp3RxcsrhnEvsFCoJ0cO1YzAcwLt1c4lod" "LNQDdZAMLu3d/+4Sp14NJcMZHxy85f2493/Af6p7w45sM9smPGCdwNt97A5YxwbgrIznOpO9" "1k7bc50JgOM4jkutNZRSkFKCiCClhBACRHSRJMlwg3b98FX+uQIAFNo6v64AAFytAVEUlUQE" "IoIQwrw0TbdqaZd3H80qvH/LT1tApcJyqYwPw7D8/XXOufFENGaM9TZo57fzZhWEKmzzMBc9" "uXqe7rstf/a2mN73/cMgCCoVVovkeV5Zwdxg9rI41aoYzV/5GQBkWVY/V50Oek++daipfgAi" "kJFquB2fPgAAAABJRU5ErkJggg==") index.append('text_linespacing') catalog['text_linespacing'] = text_linespacing #---------------------------------------------------------------------- text_list_bullets = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAPVJ" "REFUOI3Vkj9Lw3AQhp9CsQ7dBAVFWl0EN7OKm7uLY3ByC9IbhPgRilOGRNwK7hkc/QCugS4K" "wUK0k4KbQ+73B1y06iJYOtQXjrvljnsfXpgLRYOxZDcvVTQYy193mwDbqy3pLrc6gABJHMcR" "kHrvcc5hrcUYg7UWVcUYQ57njZl8MCc6vnyU/vVzdXj+MB3EzZUFWV9qdl7XFgVIwjCMnHOp" "qvK96rqezGVZfkE86JdyevVU7Z/d/VeIe72hHF2Mqt2T4XQQN7bastNtdwC5hSQIgkhV08/U" "qeqPNDrn8N43JgdG928JIB+doigyIJuZxd/0DtpKiFISOyozAAAAAElFTkSuQmCC") index.append('text_list_bullets') catalog['text_list_bullets'] = text_list_bullets #---------------------------------------------------------------------- text_list_numbers = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAASBJ" "REFUOI3Fkr1KA1EQhb8bUgaENBaSbhesFwtBgi9gGwuJeQDTucW+gAQt0m0nNgnYSLCxs7AI" "AauA2GWtTCEWBtPt3ftntYlitVHxwMBpZubjzMBv6Oj82esNZ26V3hLA9mYlWXW5yE1vOHOt" "elUARFHUBmJjDFprlFJkWYZSCiklWZYxGAzEYsAC30Jrtyq+7/lDCYCLuzdnjOX24d2/Cv2n" "lSY1uonXvXktfIkyQKOTeFt+JQn31gVAs9lsa61jKSWfK03ThZ9MJssQO9cvThmLsnCyv/EP" "IUaXU2cdWAvdw1ohghLA2UFNWAuj8dwvSlDOzWg893eCteQeRBAEbSllnH+dlPLLN2qtMcYs" "ScP+1IX9qasfP54WJfixPgBnfJga0E9QowAAAABJRU5ErkJggg==") index.append('text_list_numbers') catalog['text_list_numbers'] = text_list_numbers #---------------------------------------------------------------------- text_lowercase = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmlJ" "REFUOI2V0ltIU3EcB/DvOTvnbHpUXM5LF9a8YRGklPRQBmHzIYIegggiyHwwjB5CQQ2hl6AU" "CqSHArtBQkKDolcNeigtqhWJy0SNXK15weacZ+fyv/Uac5T9Hn/8fh/4XSRkRMfQN0GEDGpz" "EMtcutO2sySz5s+QMxOOUJ9szQUK8jywpPzLf2vOClgp4/jkPBtMmC6kGcb/C2i5GxWWyV7a" "kta+surANvj+DQPN9+PXNbIGyzDfmD/mdslgIJTVbgg4fW+hVlpLdiwuphtDPXs6A40PWlTf" "EChj1f8CpFO3Y7cIYW00lQLVi8oq63p6A3p1MyEEYxMcSuGEkvqpRB2p9yYXUpBSgAskBBXP" "X1/aPiBliueHz9zw6+Xtu0vrMDYzirdfyoiinVRL8xVMzzsIFCko0l2IrxBMLTjnXJnAu8FP" "wyVBr75qJA8UFxzGYrLJVZLnQiTm9I11+Q9q9RdyCnPkBkaB+DIZXXdGAHh06mnnh+mPTnRZ" "Q44qY3x2QihC9AGAQ+CFANIOBeFIrBsBAI70H4qlDXuLZVggOAYiipnsOfqCMQSrfAr2lXvw" "8FUSaUndlBUAgIZrc16b8cflPi3IGDAZs8KM8q8NNfqJXLeMZ++T4Wh/TX3WEQBgjbCRqmJ3" "UAiBSMzo/ny1st5mIryQIJiJ22BEhIAsrwwAdVdmgz5d2Vu7TcPkdwtp7h7wX5yq4JS3Vpep" "WEoQCEcKA4CSDXBMUeHJEyBUoKLUjUjU/KUqEgI+NwSXsGOzG4JYIzgbacq6A3/3nNdF7V5O" "RSvjgGAizDlCYAA47wIDILGQaonu3wQfKHoHnz1MAAAAAElFTkSuQmCC") index.append('text_lowercase') catalog['text_lowercase'] = text_lowercase #---------------------------------------------------------------------- text_padding_bottom = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAALhJ" "REFUOI21U9sNwjAQcwojdQraIYAJAAG7ASOEANOQ3EWq+UrU11/K/ZxPOp8tRzGmWqGkqiL2" "EgfWCVwvZwIAScQYEWOEiEBEEEKA9x7e+4xf748BAFOaQXZwOh6oqlDVrDpWtk9nxgeWc7Df" "bTmn2schBIgIVBU+yMIZtM2GY9U0p9f4+vDHDB73G+cWSOZOEl3XAQA2TWsGBwCgruvBciL0" "O0k456YOSMJaO1HqE+eqOIPiz/QDTFTBeLeMVGUAAAAASUVORK5CYII=") index.append('text_padding_bottom') catalog['text_padding_bottom'] = text_padding_bottom #---------------------------------------------------------------------- text_padding_left = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAN9J" "REFUOI3VkjGqhEAQREvY23gGM3Ov4AE09iCyuVcQDM08gJHgMQwE7Wmne4P/R0Zx+W7yYTsq" "hu5XRTHA10/gRNu26nQcx0FRFGqtxbZtYGYYY8DMICIYY0BEWdM0T/iAaZrUB92Zx/lB9ec+" "z3Nl5rMr6roO3gLcMQCUZXlY/DOBqkJEICIAgDRN1XcmIqzrumsiysZxfL4FVFX1WQIRgbV2" "ByRJop7b7j4Mw3UHzt0BzmXdSuCXGEXRIYHfx++/yJZlOXbgA7qu+ywBAPR9v+swDPXCFfM8" "3wL/37wAgDXeZxh2DhoAAAAASUVORK5CYII=") index.append('text_padding_left') catalog['text_padding_left'] = text_padding_left #---------------------------------------------------------------------- text_padding_right = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAOBJ" "REFUOI3VkjEOgzAMRV2pp+AMlbgBEyMn4ADMnIcDcAIGhky5AFNWVtZMSHGM3aEKgpJWmSrV" "khVLkd//sQPw93ELRdu2QkRAROC93xMRw7mM45gppST0lGV5i2O/hFJKrLUSQPdw0TSNvCsj" "IjjnDCKC1vpxBIm8jOyAruuS7YTmE6Cuazm8N5aLMSYTEWBmYOYzoO/7JAcfAVVVSUzZOWe8" "9zDP8wMAgJlh27YrYBiGJAdB/QIoiiLq4LCVxVqbMXN8iFrr5BlEAXmen7ZwUDZEBOu67v9g" "mqYUrR/FE4sG85SQxTXFAAAAAElFTkSuQmCC") index.append('text_padding_right') catalog['text_padding_right'] = text_padding_right #---------------------------------------------------------------------- text_padding_top = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAALRJ" "REFUOI2tU9sNwjAMvBRG6hRthwAmAATsBowQAkxDYkfq8ZWor7/GP75IvodsxZhqgzVVrWKX" "ENgm8HzcuTRAMneS6PseANC0nRkJAEBd16PhRBh2knDOzROQhLV25jQkLpVZe4Wc4Ha9MCWJ" "MSLGCBGBiCCEAO89vPcZvz9fUzbB+XSkqkJVs+vU2b6cmQqUS3DY77jkOsQhBIgIVBU+SOEd" "dG3DqWt6p2v8fCi/g9Wf6Q+x38F4u/hMiAAAAABJRU5ErkJggg==") index.append('text_padding_top') catalog['text_padding_top'] = text_padding_top #---------------------------------------------------------------------- text_replace = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn5J" "REFUOI2Vkl9IU3Ecxc+d9+5qS9ZNbZayuakZhE2a1EOCCdcggqAHCeqpF321qFyvCqVRJBGB" "vhXkg3uQ3gINX/oj4Sy0Zf7ZajP/ETZX27y7v/v7fXvxIWQknvfz4ZzDkQDg3NOVdokwoCpA" "Js2qX9/wxLBXtfQnqPlhIrpXnwQALQ/iAUehPLmRtsYYF0luQbM4Dc50+0K7AWwAYHDoxSpg" "5ARMAzGPJuuKRMO1nXO+3QAyABiG0CNLJqa7va0AkLk5r7uccmDNgg/Af/eQ64NxTXCu5wwe" "AgB3MK75j48EhMiYFXWfxkNPdklgwtQrihRE0zwGAGdOPps47bWDMWGf+s5etA23Xf2zIidM" "qfexIEm3LEAQkmTR2Ps7nkHJc31+wLKETkQAl3z++lepZv+m84SrAe8W3+LD13Im2y8rrmIZ" "C2smqkpklDgKsLrJMLdudsjxR0c7/o20AkAbunT/dyp165CzFU5Hg3KgyIaZH2bfRNAdNHq+" "9dZXql02ksAModny9Rq6MnJ7auGjmdiwo0ixYTr6mWSiPgAwGTQQkDUtMIGklA9wvv/scjaT" "O2JkDDBcBKMybiu8MM459JpSGae8hXj+JoWspBzMCwCApntxLcfFsLfUrnMOzC4bYW6JWFOd" "o22fasPLyVQ40V/XmLcCAKQZH60pU3UiQmQ5E/xyt7oxxym8nmRYXM2BMwoB20/cqYaeqF7q" "kAP+SjtmlwxkhTro7pzzCUu015Yr+JlkIFMKA9tP3Clzi3yF+wnMIvhcKiKJrV+KLKGqVAUJ" "CccOqyBmjOJapDXvBu5gXCuwcr3ConYuAOIUFgIhcABCdIEDkHhIMSj4F/Y8NFPrW6azAAAA" "AElFTkSuQmCC") index.append('text_replace') catalog['text_replace'] = text_replace #---------------------------------------------------------------------- text_signature = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdBJ" "REFUOI3Fjk1rE1EYhc9NJxPy0QjWxBFRgxKxlBYXNdqodCO4kEA3/gLFLwIiteRHiD8hK6lg" "u3MlaGoLxUhbVIiVjKa7ZLRpMm87M2SS6dwZVwmtTqTiwrO6cN/nOQf432HdRy6Xc/d+tFot" "aJoGIoKqqmg2myAidBwB3BeA9mOD7RMcJDfzSszP+BKAo8zlV2dvJb78tuBPzZcfPsO11AiY" "w7FYpoZptScPtKDbPH5cGB6TROzoNlYqKpY/V18K3aNsNjuj6zqICESERqMBVVWBUDzcodr9" "1PCx+JgkYk3WEI+K+L5J2N5qGn0XGG8h1Y3E9ZJx6akSujeUTIz24DerFaysbxTanDIDXnD7" "NW74BqQPkSMXppKnU6Fk/Q5K9VMIRM/hVbGM9x/LBYvpmer8tOnzEvBdiO7gBMSzjyBEDyEy" "nsek/QDy2nO8W10v2P5Wpjo/bQKAp8BxEXQRhGuW4BpFCAELwTN3IdLCN4R3e3BfAbcRcVgE" "phmG459Ae4fD2q5gKrH8eC8MAIKXwLZxfrP2FYdrSyBV/sQtlLiNrUEHxV9ve4J0Ov2CMSYx" "gC3IysUrJxbznQ6enLwN2aukb5Q5xJQ5xP4K+pf8BGwM4uQn6YtfAAAAAElFTkSuQmCC") index.append('text_signature') catalog['text_signature'] = text_signature #---------------------------------------------------------------------- text_smallcaps = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAP1J" "REFUOI3tkL1thDAYht/8dBTQ0yQlXTYIEgOEEW6E62hvAMQOlHSMcAuAbgTTHaUlY3+fZUMq" "0CnhkgGSR7L06isePTLwz8M6iqI4A4Bz7sLMb9ZawcwREaVN00T3BI/rWJYl8t4fiahl5ndm" "FnVd58YYkWVZ+qvAOXcqy/LinIO1FkQEAGDm3Dkn7gme11FVVQsARARmhtYaADBN01Fr/ZIk" "yYfWuiYijON4+FawQkTbAwBjzLnv+9wYg2EYDkTU7hbcCm4Luq7bygBASvmzQCkF7/0mWGHm" "3T94+nqI4/iklJLGmCgIgquUUoRhmFprX+d5FsuyiF3TH+YTYf2ses9MUS0AAAAASUVORK5C" "YII=") index.append('text_smallcaps') catalog['text_smallcaps'] = text_smallcaps #---------------------------------------------------------------------- text_strikethrough = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAATRJ" "REFUOI3VkT1uwkAQhYckF9iCJiAXLiiQcOE6ckVouICrlJR0yD4CRGndIA5gK0cgRzAnACO5" "wh0FwvPjRVBFCmtLqXndfvP09s0uwMOr1QTDMFSIONdab5hZaa1tIrLjOH43vU9NAWVZZiKy" "j6JouVqtFoi4Z+Zhk7cWMJ1OJ0SkRET9siRJFoj40xTwbALHcVRVVR8i8tbr9V5t2z5st9tD" "p9M55Hm+N/2Nb+D7/vpyuQy11oCIcD6fN4gYpmlaa9ECAAiCYAYAn+awKArIsgx2ux0URWGO" "ZwDwVbt9PB6rv2fXdSf9fj9zXfdqWVba1PhOo9Fo4nleYPJut3ttt9uZyWu/UJYlMPN8MBjc" "NSGio4gsTf+LCYgImPlIRGvLsr6rqjqKiGLm5el0Wvy7wuPpBrFJm4cFonY1AAAAAElFTkSu" "QmCC") index.append('text_strikethrough') catalog['text_strikethrough'] = text_strikethrough #---------------------------------------------------------------------- text_subscript = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAXxJ" "REFUOI3VkT9IgmEQxs9PCSpIa2sohSDHipaGQAeFltCtUWlxTCNwTGhq+5qCaNC1SVodcrFN" "+iAcKixdokVI8733vXs/temL/mi1NPRMdwfP747nAP69XE6RzWbLtm0DEQEzAxEllVJ5KSVI" "KaFUKoWHAQyn0FqbzLyslAoRkVUoFBqIWEbEBjMnf7wAACCVSoWVUhfMDN1uN6OUio/a7Mj9" "vqlWq41gMDjNzGtSyg1mXmk2m+o7gPF5QEQ5IQT0+33odDq578xDAYhYFEJkpJQwGAx2/H5/" "GABg6/ghsHf2aB2cPz1vHtZzXwCxWMwXiUTyiFisVCpmq9U6MgwDiKjo9XqXJ8c85l2d4pfX" "bXN1cWLf8b2FGI1Gy4gIiGgRUV4IYSqlnJeC1jqttbaSJ03L43H5TrfnAwAAHgcwJO3PPYSy" "tZyQNjRuZHxkBqO0vluLG24I3N53wkzat5S4+njBT5qacafnZsdDdm+QeMFe+yy94Put92/1" "CsIW07PD9Y7BAAAAAElFTkSuQmCC") index.append('text_subscript') catalog['text_subscript'] = text_subscript #---------------------------------------------------------------------- text_superscript = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAYFJ" "REFUOI3VkTtPAlEQhUfW4INCxMpigcTEVhMbCxO2NDZgg6UUJpSIzZZS+AO201gYaa1MbEy2" "EAosbCQxxFdUsKLjIffOndl1sTBYiEFjYzzVmWTmy8wZgH+voZ82ru0+RfWpkeOJUV/04lpY" "J+ZMDgDA91NAwD9s3T9Q4vyqZS3Mjm//Ytl3pfZr5Y2D52qvHu4Z0zQLrusCEQEzAxGllFKH" "iAiICLZtGzGzkhPoQvUWE725jxMcx7GYeV4pFSOicj6fr0opC1LKKjOnlrYqCZ8G0bvHtsHk" "BOfWL6MAn0JMp9OGUuqMmaHT6WSVUgnbtg0AgJWdm4I+PRZzX7vwIl9bR5szwT4AAEAymbQc" "x8kIIYCIJovFYnNQJn1fIKKcEAI8z4N2u537LtQ+gJTyWAiRRUTodruZSCRiDAJoPROPx4O6" "ru8hYqFUKlmBQGDS7/cvNpvNVU3TTomoPhAQDodPETEopVShUKgupUw1Go0aM9eZeRkAyp7n" "fQn5W70BAIHMJSEYEtgAAAAASUVORK5CYII=") index.append('text_superscript') catalog['text_superscript'] = text_superscript #---------------------------------------------------------------------- text_underline = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAPxJ" "REFUOI3FkTFug0AQRcdRDuAjIFFSUFKSI1hcAHMESwhKH4DC9hHokXKEHCHcgwYJaXf/DOBU" "idAuiCKFfzdvd5++ZolencNyKMvyTEQ3IjrO83yvqurye5Zl2ScznwBcmqa5bxqLovjK8/xp" "8zRNj0mSfNv8zQbjOBIzO+K6rnutdW/zdxuICInIajtjjMMcAYBNgdZ6X8DMBGBVoJTaFxhj" "NgVrDZwlKqVaZqY4jk9L7vv+B4B2VwDgMQxDb4y5hmHoLR7fADzs+wcbEBFFUeRpra/M7AEg" "AK2I1F3XOQ3+HadBEARPAH+/ISLEzCQiNI4jTdO02vp1+QGqkZcZ5hauXwAAAABJRU5ErkJg" "gg==") index.append('text_underline') catalog['text_underline'] = text_underline #---------------------------------------------------------------------- text_uppercase = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApBJ" "REFUOI2NkU9IVFEUxr/35jp/1JkaBcOmEkcNZhPCJARBCBrUJgiaAjHaxIAgEUQZRJtWo1Ro" "lKuCNmOlUGKLKIZs1UpLatGAqIySpjOl85x58959997Taoi00N/qwuH++L5zNAA4NbwSk1Im" "CBQOeFzIFwR+FmX/zO3Gm9gBvWP4R9it0yjnClZB1Sxm7f6DQQZektGdPgMAg2Xjl9JS0qGU" "JWVccnTatoLNaXo3At0UiNqWCHsrkLBNip1o8UUzqxwlS6V2lcDHMJorYH2z4BwVksJ5z9ho" "XcMmD0VmJsce7kJQ63FhybJh2+hsa5u4FW0UcBzl/piuTsVGY52bK9n51v3JF0TkUaR3EBAQ" "gkBCTAxdauhl0wuleSEoLAXFSFhpi4u2I/takTeM9qn0gmEWLbeSdFEB/kO1rEojgskVFtfo" "HIBeNn+3pakc5yUA78jZASOfvx4NtyESilQOPXsgOWPHwWV6btmSh0PVrlxRQLm83QCgb+00" "0vXqxqfZz7zIi7BkCbbJBXH1VnBJXOG9YRGkJAhRPuMWTg+2fzcLtvvR82FYpo1QXbfLz1Rz" "zpRfiHknDVOeZDrgSBkFkNomeHP1Q6j8vpLMRhnxqVyeO1Lz3CGBZi4IRH8SbKtQpie5EeSO" "Mx5wKwhbvN4I1I8/vlzfv5YXYJoGJWT4nxXKKGH21VQ4BzKr3ISkvb7l2Xdd975hj4vDpTE4" "Cv8XxJ8sxwOM+tY3BYiLY0+vRb6WZxcGlyjgB5REcJugJ5kJOiV33O/VEmtZgxTpY7ruXQKA" "rvuZsKPpsWClDp9bQ5VHj54ZyHT+tQPLrIhJRYmsISGYV5PMc97U9SYAsDWtTylKrBoS03MW" "DFNBhxb7DShrajqA1qzYAAAAAElFTkSuQmCC") index.append('text_uppercase') catalog['text_uppercase'] = text_uppercase #---------------------------------------------------------------------- thumb_down = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAitJ" "REFUOI19kk9IFFEcxz9vZnd0d1B3S6tLtkbhpaiDJyOkU4egoEuHICLo0iUPXbrUvSBKOhV1" "rEC6FiJBBEEIkWtKopuVkZasO6Puv9mZeb8Oo+66Wj/48Q7vfT7f34MfNJWIKBExRcSSubkD" "IqKa3zTWlksRUWTd47R492nxT2KIwqtCqKuEkkXJKOiXVKtTAKqvz1cNsMHE8nkShWG6uqA1" "CaJBCwQ+1AJYXBAsS1EOV/BMR/X39sQ248e8Q3QWh8l9A8eBTAba2iMJBlgx6N4fBfphB+8+" "xgHqgvL0Q1yB/hMQBKBUlK4F0CACGkDAAHQpSaQGmRSLpDFAqQgTWVjOg2mAhKA3YInOxm9t" "TuDMnyNlWBztg5oHeSeaKtRRohYQ6jI0hEGDQLvX+foDnALs3QdtbREcSiTYSBXA96FUAq/W" "IEgnD3NsIIJWV2DhF3RnwDCjNL0ucV3IzcL42mcqUqkLiuYUfxb2kNoF6XTUoY56Y+SlJfiU" "g7e1QWxjlI5Ovy5wg6vMli5iLp/Bjh0kYSY40mMTB7wqZGfhw/caRX2Zp1deKJRs28T1lTWZ" "zieYL9wgE97CTkFuBl7/foyTHFSPzpabV9nYNCklSqmAuXIvtnsTOwX5PLxfHKeSHtoJ3iIA" "kJFFm1jlGrvb45TKMDpWxDXuqKHTkzvB2wQYTiusniJuwas3Hj+te+ruhef/grcLHL3GjH7A" "sxH4Enuihi7d/h8M8Bf4FxIZsGak/wAAAABJRU5ErkJggg==") index.append('thumb_down') catalog['thumb_down'] = thumb_down #---------------------------------------------------------------------- thumb_up = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhpJ" "REFUOI2Vkr9rU2EUhp/v3uSWpFVCksYmxSrqoK1inZwEncVRQVzcXESKg7s4OIhQBx38CwRx" "0LVgqaJQqgStxkqqxWr91VzSkib33tx833G4sUmtUD3bgfM+57yHF7pK3ogjxcqYvFsQeb10" "m/8tKX3JyOzigqysipTmfSl+vrqVxtrQNW0f40ziNaDQ34MVXJaZpbP/DFCj+Tq+fYdqLUQb" "yKf60N4Vmfx2cEuAiCgRibE9+5564jreGjhxKDijOP4lebSU/BtAAciLH3tBn8ORk9h6D7qV" "oJDpxZZo6mcVlv0moZzn+IF7SinZCHi5+Ji8OkFyG9gxMAJGgwEQEAONBrhr8Ikx0BPYKlSn" "RsoxAOLBCMkcaAPVCrgVGNoNlg2YCNjTAxlAueN81bO0Wh5wNAK49TIfp3KkU7BjAAYKYNsR" "UKQDicUgm4M+7xBPn3c90fTeYucQHD4C2X7wPbBUZNIY0BLBjES940Ct1gVw9z2k7jcpFmGu" "1PYvYAmIjkTSFhuJgEGrA1BnVJM1NUU8DvuHIZUGrX//OIKsg3S0QId/BGl18CKWBdPT8KEM" "gd+2QHt720aowfNhRRoAsXXA3OA8gXuaTHifdBoSiehU0eAF4Lrw5JkQhoqFYJWGqtK5sZNG" "bs6MYr6Pk1o5RlBTLC9Dre7jBa/QTCDqAdbwWwB190K4KZrtSNsi4si1G7tERG0a6qpfhdsa" "9E8WVZwAAAAASUVORK5CYII=") index.append('thumb_up') catalog['thumb_up'] = thumb_up #---------------------------------------------------------------------- tick = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAc5J" "REFUOI3VzM9r02Acx/FP2qZdkqrsSZMyV5rW7R8YvYkHYSBo46Woh4F6UnFgQPRe+icET4NR" "9CTsKAj+OAW8eBD04JosaddOFAQVfzTbmid5Hk8dulHYvPm5feH7egP/3a48umg3Vi80x3f6" "qLhIdEueks5qp0kUPOu/OnTg0sO6XSS6NWdUIE3JGEXR4vGFfCwcCrfrtk40a86ogoFh3fWw" "2RuAR1kpNX5afnF98dbTpRv7caNdt7XpglUpG4h5gvcdF/5GL+FRVnJazm4aAJZfXj0TU/ZY" "VcjSKdP4/m5t/TUANFbP2/p0waoaBhgYOq6HwN9MMlzOOy1nFwCE28+vnYvjuF0tGLM5MYc3" "nbcJpewepbRUJOp9w6iA8wSu56Pr9xMRyh4GAOHu2mXpZzazrR4jOKnNINzZxsfPn5BOpaFr" "GngK2HB99PwBEwVF+RMDgAAAN5+Y8nAohuoJgtLMLBhLEDEKcMDzAvSDLS4Kirwf7wUAwFwx" "ZVFIQpUQlMslxCyB73bR727xbOqL7LQGB/BfgXGEhsNQ0wqgMcWg+4Hn0l8n4gMBADCbNflH" "JhOOdkbxt1/DfPAgGE3CE1dr1uT5O/O5I8N/2W+EYMInVfR1CwAAAABJRU5ErkJggg==") index.append('tick') catalog['tick'] = tick #---------------------------------------------------------------------- time = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsxJ" "REFUOI2lk0toVHcUxn9zMzd3MvcxjyTGWsdEtGlNrKjU8UEq1rrSjXHTVReii0KhEBdSnyii" "JgQEQayKCBZpRVwKrQk1xEUTtSVqNCY+m6eZZJzMZGbunZt75/67EKIorvyWH5zf+Th8Bz5S" "vneNv35r3VgmT+9TFGd5iVyiF12BaVopM0t33lVatv3Q3PVBQOeVY6fD4cyOaHVjqWJUogQj" "COGRS4+RGulj9FFHfjort3y369SR9wAdl4+ejC2O/hSt3sykqdP7LMPElIlbFET0APWLNCLi" "OY9u/koi4e7evv986yyg/WJzQySSvFGz+ke5b0whmbZZtjhK2JAQ+Ehlitzun0RTJJYYA/xz" "7aJZ8Icbdu450yO93j+1NxT7Vp60DMZTBRo31BDVBalcDs1QWRAz2LppEYmsR1Kqo2rhp0En" "l9kFIAFIPnOFGp3PvwMpltaWY7oCWZZpv/4n05kMjm3T1t5BXW0FXX1p5tbG8TPTMAsQQoQD" "aoSxpEl5eRl2UVAaDDIyNET7jU6OHm9B11Uic4K8TBUIVdYgQdUswCk4eJ6NNeNhF8HxYCKT" "RdU0eu/dZcvWRlasimO74DgewisgPAGAH8DMWy8ziccLQ+o8XoybfDY/BFKAlV+t4YsvlxIM" "GeRsGB7PY6gSU6P3KLhecjZB1qJzuK+T+OdldPUkkBVQAzINX6+jImKgAFoA7vRMsL5eYvD+" "37iev/utG2gnB/tfWFGnm5ie48LVAQZH0/hsB5/lMDSc5tyVfhaUTVBp/cHQ03yBoPamBwBn" "D2//WVdyx5dv+IaEFKfroUs6W6ToCfQgrK0TVNht3Gm7jUX0cFPL74feq/Kp/d8fKHWmd1fV" "qFqstp7wJ9UgXF6NPOG/3gckRr2841dPNLVePvjBZ/pl7474jDPVJBXddX7JqwRwPWnSlUq6" "8asnmpov3Xp35qP0Py0JNKULsDJ5AAAAAElFTkSuQmCC") index.append('time') catalog['time'] = time #---------------------------------------------------------------------- timeline_marker = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAVJJ" "REFUOI2tkT1uwkAQhT9bCAmEZCmcgFSk4QLkAtAjrkDPITgXUi5AQxlbYBAglM5aC83OpojW" "stf5abLVzt97b95EBG+73b6JyFNZlhhjno0x70VRUBTFx3q9fg37O2FCRKb9fp9ut8tgMMAY" "85IkCbvdLmz9AkjT1PlgNBpFZVnyeDzo9XoYYwDI8xwRAWC/3ztVRVWZTCZRDJAkSYU4Ho+5" "3++cz2estaRpyu12Y7lcAqCqDIdDVBWA2A/6hKoym824XC5kWcb1emW1WlV1EUFVK0WxquKc" "qxr8fz6fczqdWCwWOOeqAd/vnGsC+ISPRYTNZhOFBNbapoI6ax0glGyt/bYeW2tbAHWGcKAF" "4AfqjKEnoaIWwG8mha57Mr9S6wqhSb5eP3c9jv8yKVQYrtRS8NMVwjP7esdaS57nlSQR4Xg8" "Nkw8HA4NgizL+Lf3CZ8UxJX3VnmLAAAAAElFTkSuQmCC") index.append('timeline_marker') catalog['timeline_marker'] = timeline_marker #---------------------------------------------------------------------- time_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAw1J" "REFUOI2l011MW3UYx/FvT3sotD19QxzTlXXACMPxJqMSbIxzM9GpCXjj9TIvli0xcRdGp/HG" "TCGLF0sMemFM8MK4aeJLFqIQW/demWSbTF5mHFkFVtZ6oLQ97enpOX8vVC4ku/J3+Vx8fsmT" "54H/Gdt/Bz98dvKpGnn9TafT6LLLdsWsCDStqGo5EoWKc/jFw0NX7gucO/PuiN+fPRTcPljl" "9NbhdAUQwiK/toy6OMPSbLywnpOHXzr2wTubgPjnJ06FmoOvBLcfIK0pTP+e5d6qRsUUBJRq" "HmnyEBC3mT3/KSsrldcOvvXxyQ1gYnQoGghkYuHHjsozy04yazodzUH8XgmBDTVrMjmXxuOU" "2OWd5+ezo1rJ4Y++/MZH16S/+1eP+0L75HTRS0otMfhkmKAiUPN5PF43DSEvA/ubWMlZZKQ2" "tux42GXks8cAJADJpnW7g9uYmlfZ3VKLVhHIsszE99+xns1i6DrjE3HaWh7gyswa9S0RHJSj" "G4AQwl/tDrCc0aitrUE3BVUuF4vJJBOxc5x4bxhFcRN40MVdtYSvLowEWzYAo2RgWTrFsoVu" "gmHBvWwOt8fD9I3rPDcwSHdvBL0ChmEhrBLCEgA4ALRC8W525dYOn/shFlIaO7f5QKrm0T19" "tLbvxuXzEpv8isSNb9GtVd4+U8Bn6WUAO8CBJzq7JFPtamiNcOlmnj0dtTglO+FwCFeNk1ji" "NLPLYzze08u+3mcoyWnmtVvV7ma78s8OPKfuzC0Ug0aCkJLnky/nubO0hk03sBUNxi6N0tXa" "iSmZdG59GtNm0NfeD4ijdoBvYldTz+6NmGry5v7uXTL+QB3xq2nGE4vEp5ZIql/Q1x7l+bbD" "APQ3vkC6kOTC1AWH/d9LPPvj9Yt7+3qspV9neuXiVFVPY55opyDSmOH05TECW2XO3/6aaNMA" "Q+MHyRX/ZHpurrTpmT48fihSNlZflcxKv0Oy6gB+Ki8auYaSt78jys76bn5LXePyLxf5YyH7" "/ibgfokcqR/CZjtiA0VADiFGJkdSr/8FdXJM1olHsnMAAAAASUVORK5CYII=") index.append('time_add') catalog['time_add'] = time_add #---------------------------------------------------------------------- time_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwRJ" "REFUOI2l00toHAUcx/HvzO5kktnd2VceTe12t6QJsa1NWur6CtJGL31gGwULFpVSQUHw0UOp" "tRVF2jTkIGJpFLzUg1QvQlBQo41pkKhUrNQmVllNQ3aT7a6Tfc4+5uVBWNDQk7/j//D5XX5/" "+J8R/nv4+sPRwRap8KosG/0uyeWzTAddr2h6ke/Kpjzy6HNnZ24LTH185nwgkD8Sig41yWob" "shLEcWxKuRTa4izJuclyoSiNHDx67s1VwOTF029HNoZeCEX3kNF9XEvkubWiY1oOQV8zm7u8" "BJ0/mLv8Aem0eezwyfdHG8DEhbMDwWD2Uuye56XZlEw2V2PrxhABVcRBQMtb/PBrBq8scqd6" "gyufXtCr7sDAM6+8+5P4T//KCX/kISlTUVnWqgztjBHyOWilEl7Vw/qIyoGHu0gXbbLiJjo2" "3KEYpfxRABFAFPRtntA6fryhsaUnjG46SJLExBefU8jnMWo1vpyYZFNPKzOzOdb0xHFTH2gA" "juMEmj1BUlmdcLiFmuXQpCgsLiwwcWmK08Mj+Hwegu0KS1oVf1sMEToagFE1sO0albpNzQLD" "hlv5Ih6vl2s/X2XvgSG23R2nZoJh2Dh2Fcd2AHAD6OXKUj792wa/Zy1/Lut0r/OD2Mz2HffS" "e9cWFL/K0ifnKYy/w/5kgt+nVRSlvQ7gAtjzYF+/aGn963vjfPtLiR1bw8iii1gsgtIio42P" "YX5/kb59h+g+9CJrWn1Y6Xn5cVXTXAD7Bx+4Wciknu7uUqSyGWDqaoFWn5twswvBsLk+/AR9" "jzxFS+IbhOm3kCrzyKFOIZm42dsY0ntvHD7uk0vD/Tt3kRbjzFw3yRUtLNth9/guBkc/Qtg+" "1Fht7vVOrkxnnX9N+dzJJ081GYVjHTGPN9KzmUBnFByTxKmXuG/vY3gWPqNWWUYHigUXcwmS" "q55p7MSReN1YeVm0zPvdot0G0L6SrK8Vymo0bAhucZFixmR+2WXVq/Zrq4DbZfpg5Lj+V+pZ" "0RaitugkbZyx3V/ZZ/4GIqZAzm5rq3oAAAAASUVORK5CYII=") index.append('time_delete') catalog['time_delete'] = time_delete #---------------------------------------------------------------------- time_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAw5J" "REFUOI2lk09om3Ucxj95kzdp8z9parvZbOmyFduqrOpSmRWczoJ6WT24k0ydB0EQHDhwVmTo" "tGWn4VAPTpgHlaFgQcGtrl2HdMV1RK1kTf0zls6uWWraN0nfvP9/nhaUoRef2/M9fHjg+T7w" "P+X6uzn7ydGHm+XKaz6fud0tu0O2JVDVelmtMrNu+UaffGHkwr8Cpk69/V40quyPbx7y+sKt" "+PwxhHCorS1Rvpbjj8uT65WqPLr3wPE3bwFMfnbkWHJr/KX45scpqSHmflO4sapi2YJYqIne" "dJCY+J3L5z+mWLQOPjv84dEGYPzkyEAstjKR6n9Rzi35WFnTuXtrnGhYQuCirNh8P18i6JPo" "DueZ/eqkqnmiA8+/+kEWQILVQ5HkI3KpHma5rDH0UIp4SFCu1QiGA2xKhtmzO02x6rAi9dDW" "ebvfrCkHbiaQJJfaF4h3cClf5s6uFlRLIMsy46e/oaIomLrOmfFJeroSXMit0d6VwYMx0AAI" "IaJNgRhLKyotLc3otsDr93OtUGB8Yooj74wSCgUYyz7FgvYMkdYUErQ1AKZm4jg6dcNBt8F0" "4IZSJRAMMvfjDzyxZ4i+HRk0y6Qj0c0rp/chHNFowaOu168rxYXOSGAjV5ZVtnVEQGqitOFL" "aLf5dO5rjKzFhlia7vZ+qto6p+rTzQhcuBCeap2pxdxUZ+aO5zifLdKTjtDklrEcg0d792EL" "B9uxcRAsKYvc1fEANaPOfSOrxqzQvR4hgseuzl/Z25+eaU6Gevno8zyDO9rQLANbOFz98xdM" "x8JyTEzbpKJX2Z58kJqpetbe+E5zj01cXH5sV8YuF37e3dctE421MnmxxHXrC7bddg9+bxi/" "N0zAF0U1VBKhjWQXpzm3MDFv1OhsvPLx4adf95qVg22pQDDZ1ctbCyfQTAPDNtAsgy2JHu7f" "MshsYZpv82d+8ipkfn0X/R9jev/Q/oxhrr4s2dZOj+S0AliOVLIk98yJyNjgvZt2Rc/lz14K" "yOzMHca4ZY3/pdQwJUe4EwWPLXMY6+b9LwuxX59HbYpaAAAAAElFTkSuQmCC") index.append('time_go') catalog['time_go'] = time_go #---------------------------------------------------------------------- transmit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAupJ" "REFUOI1tkk1oXGUUhp/v3nQyN0lJ0tLUIlEHweIiEskm1UqKlTISpN1MwS4mSMGhEhCLC6UW" "DA1oij8tUsQi7kR0kFLIwiwiLZYEjMUgXVSqbYzmZzpTk5mbe7+fe797XRRDOnp25/Ce9xzO" "eQRNkV77fC/WvopNhnBtP1EENprHRlcx8qI4Mv7rVr14oPnKxZNYO05Ht0fWAxxILQQ+RA2o" "LUgS8444ev6jBwzSG99kqK1dJtueJ5OFRhXCOggLWkFiwG2F7V1Qr0F14Tu6osPiaNk4AFRq" "Z/Ha8wBUb1uC2kE2Km3ixVNCHDkjiE0b9eWD3Jm3WAteZ57l4D0AkV75pI80+Rlvl8vagiWw" "j5PE9xDhW6TR82gNqf6ehv8+WbuT0PzOQ0+43PnJEidPtRCZ43jdLuFdMMEhWtMYJX+hbUcO" "/x64ApzOfbh/H6MePUcSHqJya5qdj7is3jjuEKk8Tgbqd0GHszTq58h25Vi9VaZeOcDa8gFW" "b5bp6Mlh/XM4cpa1Zchuh1DmHXSQgxSiEPjLEMth1lcglhfmnn6j84e+k1W0vMD6EqhgmN5e" "gw5AtADRww6xvH9lHcCfZJCBx8ZKle491hjzrdZ6nvZdHutLi1jjMTubIY3vf0gkrkO4sUjl" "Jkhf0sAi/SFx4nLPtT2F0rMdQcsLuXRbuadwTJyefxQT9BHsjnHsEos/ghCLIv305dcRsUTw" "tSiV6wAzMzM7giD4Q0rZLqVEKbXi+/7e0dHRjU3oTj82RCJ6WsSJr8434xyG4bhSyntpX68g" "ifns0vXdURSdAt7eJPDMwtX/oAwwNTXVb4y5Hoah0FrPSCkJguAZpVSote4fGxv7baveaTYw" "xnwgpTRKqS+KxeL+Uqm0Xyn1pVIq1Vqfbda7W5PJyclhKeUrSqmPR0ZG3vy3Pj09fWlwcLBV" "a/3kwMDA0tzc3O3/3SAMw8Na69eKxeJ486SJiYl3rbUfxnG8rVAobA7+B/p8jDS81iXxAAAA" "AElFTkSuQmCC") index.append('transmit') catalog['transmit'] = transmit #---------------------------------------------------------------------- transmit_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxFJ" "REFUOI1lkltoXFUUhr99zjiZk0nIpVZTbKTBG3moVCzivcXQMiGiRbDQQhhLJAWhSqsPAftm" "wSBeWqQRotCHImIGL22DGkm1Ok0iKpraFFqLJsZ2mrkkc8s5+9z2bB9KoYn/42J9P4v/X4JV" "0mc/ug+l+lG1LZhqE0EAKphGBT/gy2Gx49Clm/fFCvjM8AGUOkRDi0XMAgzQCuwqBBUozElq" "/kGx88i7Kwz0zEiUQvEEsXiCaAwqeXDKIBR4LtR8MOugsRnKBcjPfUNz8KzYmfINALKFt7Di" "CQDyfyvsQhfL2XrR/boQO94QhH495UwXs9MKpcBqSpCx3wQQ+sz7G9G137HWmhTnFLa6i1q4" "iHAG0MFTeB5o7zsq1UFiag2O/xdt95rM/qoIa/dHCPw+rBYTJwe+vZ06HeLKP6hv7aC6CKYA" "o+kRzKXdlIMnqDnbyV4+zZo7TRZm+gwCN4ERhXIOPGeKSvkwseYOFi6nKGe3UsxsZeFiiobb" "OlDVwxhyimIGYo3gyISBZ3eAhsABrviEsofSNQjl0V8e2N+U3nggjyePUroKrt1De7uPZ4OI" "AMEdBqG8nrJnw79EkbbF8rU8LeuU7/ufeZ43TXytRenqPMq3mJqKosPrDYmaGcFZnid78W5k" "VVJBYVS3iP1f/ZhOp48/3mBHaBOkis/vnuDzDzV6wG1yncAu6W1/ToldQswL/cGuVxChRPCp" "2JsqA0xOTrbatv2PlDIupeTS0m/L+tZc44Odm1nfeg/fX/iSn2bS1M8unVrxiTc0Pj4+JKXs" "f/rh9Sa1kBeOHeS5nm4wDZ7p3Mc7p/sxMfjkixNuZDU8Nja2SUq513Eccfzr8xNSSharucdu" "EQ10d/YB8GrXMKfODyE4Gfufge/7b0spfdd1P04mky8CPLqvPbyQmTTPZc4ysO0Yg9/uIWbW" "odGueTM8OjraI6Xc47rue8lk8rUb83Wb49Gqn39yw+0bKDhXKNs5Js6lqZS8IysyGBkZGfY8" "b7S3t/fk6sseeqltUCBeRmBpqKL10M9DCwP/AQ6xjxZxBq+LAAAAAElFTkSuQmCC") index.append('transmit_add') catalog['transmit_add'] = transmit_add #---------------------------------------------------------------------- transmit_blue = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxFJ" "REFUOI1tkk9o22Ucxp/3ffOnyUo7qquypYwScTpdaE9uOuhwMKJFduoOCoIOGiaFFVF01INg" "YTLUzkMQBvYiO7gSReihXsSV4XaRhSLKmNtostKmSWOW5vf+/+OpUqPf2/Plw/M8h4eg6765" "UT9EAiY9yJi1fsQEwDtfViZcV8Rd+eCVzJ3dPNktrt7Yetf6MLt3D0slGQVjgHcBkXFoRx6V" "phbGho8+OZP54l8G134LCd1q/JBOsHyCUTQjg23pYC2gnYexAfEYRV8Pw1/c4uGWXqr1dk4v" "nHleUwAQzcaldJzlAwgqTela2/akbOn0+VefJO+/tp/UjUtvbKuTf6xFzoeAvjTNJxs9FwGA" "zP+8ccR5entfX4xVG8pJG7IdzrZizH5oHF5WzkEb/KTayU9lT/SY0/7e8GCKrVQiZx1yVBty" "ti9FWf2RhVQ4pbi1IGalt4fNEBKOMZBj/Wk6I+n2ijXGcotTD+oSmYEEk9qdpUqHfDxG0ewY" "UGVuco/L/Wk2vFoXC5ttfWK9bU7c3ZQLj/cnhiOOyzCJm7W2RW+SQjmfp9L54RCASAG3MKSl" "CuO1tkWkQvHNw7X+N7L361r44nrLgBs/jqEhLZUFYwTahANUqABtAoR2yKCa4NanGi1df25f" "2wkhSkqp8ujAamqzZSraIlWtVhPWAc4B3hFGO9pW7tUEOtKIh2i7tghjX5/LDub2Ngv7D2Ri" "2aeejg/FNl7/ceaZg9yEI+bOpjU2rN1+wEEIKuTc/Op555yAD99eKWQfAcDS0tKAc25VCLGH" "cw4hxLox5tDU1FRnZ0BHL/w+RmgYjH319sEvu+fsnJuVUqZeOPoS8d7ju9K1J4QQMwAu7DC3" "Lh6+/p8pA8Di4uKIUurXKIqIEOIXIQSiKHpRSsk7nc7I3Nzcn7t52m2glPqMc66FEPOFQuH4" "9PT0cSnlVSFEMMZc6ubZblEqlcY5528JIeYKhcJ7O//l5eXvR0dHk0qpZ3O53Fq5XL7/vw2i" "KDrNOX9ncnJytjupWCx+bK39XCkVn5iY+Cf4byqX3k1e3/gzAAAAAElFTkSuQmCC") index.append('transmit_blue') catalog['transmit_blue'] = transmit_blue #---------------------------------------------------------------------- transmit_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAw9J" "REFUOI1lkk1sVGUUhp/v3st0bqelLVjTRqlOMGBiMLjTKAFtQqaWBDZgYNEuMCVhIWlNjIku" "SMSfqDEYA02IG0Nc4MSFWJBqNZXBdqGGhmLEALbUdtrpDJ3OTO/33b/vXhcE0+K7PHmfNyfn" "PYIHFF/5fCta96GjnZh6O0EAOphABz/jqzNi34m/VvvFGnj0zABan6ChxSZpAwbEGpwaBFUo" "TSsi/21x4NNP1gTE179KUCp/QzKVIZGEahFkBYQGz4XIB7MOGpuhUoLi9CWag73iQNY3ACiU" "PsROZQAo/q1xSp2sFOpF11tC7HtHEPr1VPKdTE1otAa7KUPeeR9AxKOfbSOOrmK3mpSnNY7e" "TBTeRcg3iYOX8DyIvZ+o1j4gqTci/du0bTGZ+k0TRk9bBP5h7BYTuQi+s5u6OMRV16jfkKZ2" "F0wBRtNzmEuHqAQ7iORuCjd/ZGOHycL1wwaBm8FIQGURPDlOtXKSZHOahZtZKoVdlPO7WLiR" "peHhNLp2EkONU85DshGkyhh4ThpiCCQw6xOqbpbnIVSnfn2mvym3baCIp06xPAeu082mTT6e" "A8ICgkcMQnXvyp4D/5BAOTYr80Va2rXv+197njdBqtVmeW4G7duMjyeIw3sNici0kCszFG48" "gaopqmiM2k7Rf/FyLpc7+0KDY9EmyJb3H2rPvT6oZfW1wHGcdUlDdyx9a6YfsmZEPHjwGCJU" "CM6JI9kKwNjY2AbHce4opVJKKezJS7UO+Wdya+f+RF36KdS17/nj8g+RVZz6Ys0n3tfIyMhp" "pVTfnmcfNYlCLvbt4cW+N7Bvj8LcFWhqpmQ9xu/DuSnrQXh4eHi7UuqIlFKc/W7yF6UUm2tL" "zyfb0vDywH8+63g7Ziwe/1+A7/sfK6V813W/7O3tfRXgQleDIycu1KfOH8VTC0igVjXRJnlj" "NTw0NNStlHrSdd1378MA69c3fjQ5lovmXZuquY7ykuDWrNBxHJ9es4GUcq/neUd7enrOr57v" "ODd/PPeK5V6dXexPBHFrZBhzEdFg10j03r+cvZTgwlNAUAAAAABJRU5ErkJggg==") index.append('transmit_delete') catalog['transmit_delete'] = transmit_delete #---------------------------------------------------------------------- transmit_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwJJ" "REFUOI11k11om3UUxn//vM2bpEnaZLPBi6qLrdQhY05Qt4sRmToLRbebFq86UBHqjSiDiqid" "UC+i+MWMH7O98Wprr4Qi4nCsGO0m4oofW0vdlnZLW5P0K8n7/f7z92Iga9Bz+ZzneTjP4RxB" "U6n8WA9SvohsZNDkg3geSG8W6U3jWqfE0dH52/lim/j8qVeRcpRYMkI4AgRASTBq4FWhUrBo" "uG+IgY8/2Gag/pjQqWx8TTjaix6GahnMLRASHBsaLmghiCdgqwLlwrckvCNiYNK9ZfD9px8R" "a3sZBWwtS3znMMb6jBj40AJQE69EsGsH6oHy2aKIBLTYHozKNNjFY0KdP7kH1bhEpENjoyAx" "ZBcNfw1hvobyDuE4oJxzxeSP17To0fHIHQdpT+9j8/oMc9+NrbXguc8TSWqYJXCNw4SUj239" "RuuONLU10ASmbhyI7BpQscTDrF+9gi5c4m13Et/Z2d6CZ/cS1WGrBJ41g+d+RVsqzerCJL6X" "W08uPEJPbzbR9ZRwVk6jtwoWZ+doOB7pxdlCAMdIgwLPBG66+FYfmyvgW7nL9yYPid1Pvpvo" "7hP28peI4AbBWJxobYF0S4hWWe8I4Fu3tuwYcAMdy4hQXylfMq9ndiTib7V3P4Nd/IxA0MOt" "7qJ07kKtY7VERA+CaGgBzPoSf8+BVbOoIrFqmW/WLg6FdmdGUg/04a6OoekKp3oPpekZR1XN" "h8INp8jSzyDEUgtm/ROsTQvBGfH2pDs+1Hnf/qefG/NVipXfT5JM6djrd1HJXyjj1vb3vP7L" "NaBTvakyKJHadokAE9nHVf/QOPOnj7Nc+InQ3XuxKwY3w4+OHzv+3gvN/EAzMPfXqnT/nCK9" "9yDRaA83fr0i5/WMKrrJZ0dGRrqb+Voz0BFnZPHqZSHrlYYdkj9oyn9iMbhvp23b97uu25XP" "58/87zNNTU31mab5hW3bnw8ODo7e3hseHj7hOM5jnue9k8vlzv5nBNM0jziO81KzGCCbzZ6Q" "Ur7v+36wv7//38n/AckbeJ21St6/AAAAAElFTkSuQmCC") index.append('transmit_edit') catalog['transmit_edit'] = transmit_edit #---------------------------------------------------------------------- transmit_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAxtJ" "REFUOI1dkl9olXUYxz+/9309e8+2s505N52yrW2mJiZb0R8h0RRkJuKolPAuJMW6si40CiIc" "FBGRVAQjuouoUbBY0C4SM9tgzjqIUG3k1hgnt521nT/v+zvv7z2/36+LdeH2hQeei+fzwPN9" "voJ1sjc+24nWZ9HmAK7uJo5Bxxl0/BNKDoi+/j/vnxdr4GsDr6J1P7UNSfwk4IDVEBQhLkBu" "RmLUm+LUlQ/WLLB3vk6QWx7Cr+kl4UNhEcI8CA1RGYwCtwpSacjnYHHmB9LxCXFqUDkAzOfe" "I1nTC8DiXU2QO0xpvlocfUOIvsuCiqomnz3MdEajNSTre8kG7wAIe+2jh7HmN5JNLsszmkB3" "YSpLiPASNj5EFIGNrlIovouvGwnVX2zZ4TI9oamYvR6xOkOywSVcABUcocpWKMvbVG/soLgE" "rgCnfh/uv6fJx/sx4RHmp36ksc3l3p0zDnG5FycB+QWIwjEK+Q/x0x3cmxokP3+Q5ezBfPz3" "WPaBuo7YDT/FkWMsZ8FPQSh7HaKgAyzEITCnqMhjrPwDFfnJzZ4L9RN7Tsulpg1b/e3HWalP" "HKW1VREFIDwg3uZRkasuRwEskKAmSGKXFmls10qpb/zyXVHXftyta+lhOuV7xai4r9NWVj8k" "jOsQlmaZ/wNkUVJAI4sHxPmh5hstJ889VjXn1UUZN7UpjS58x6aes0grLhnHZJkdByFmPcLS" "x8gVieAr8fagAq6Pjo5uDIJSX2ZhnK49z0P5V8a/GOLJl15HReqZTGvbyUfmZnJY0eyJ819e" "WR/nMAz7RWmqujmdJNUQogvTYA26dJPOp18Tk9/3X/6ldusTT10cLTrr4ZGRke6yLJ2rzf/s" "pNu6MeFtrJE8+txOjMri+5Ns3vvCQ1C+wGrY10op9b63MqFbOh+nOpXDVpZAuNz6dhIwmPIk" "TTva0Uq9cv2t3bvd++Hh4eFjUsoXm3KDTtehi1WO5yI2tOL4u9jWsx/H34VIdOHVPEgitb1m" "4ferm711t5+IouhlUy5+fmvgWWmNxRqzWtZitXX/7zXGgLFb/gNae4v5uZfK/AAAAABJRU5E" "rkJggg==") index.append('transmit_error') catalog['transmit_error'] = transmit_error #---------------------------------------------------------------------- transmit_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAwhJ" "REFUOI1lkk1oXFUYhp8zM0xmJqn5qdFUm0KsPy0lEgWtIqHF0jCli3YhRVxEoVCxG0ndFHRT" "GlFUpCV2UwQXUooOIkoIRvxJ6yQRUzS0paTG5lcmmc6k0zsz95x7z7nnXhfdNPHbft/78PG+" "r2DDRPnPn8LaY9hwD3HbgzFgzTTWXEKr8+Lw4M3778U68dj5E1g7SFNrmlQaiEFkwa2BqUJ5" "QRHq98SRs5+uA0TXv05SrnxHqjFLMgXVEkgHhAXfg1BDvAE2tYBThtLCD7SYQ+JITscAKJY/" "It2YBaA0Z3HL+6gXM+LAu0IcPi0IdAansI/5aYu1kG7OUnA/ABDR2FA3UfgX6fY4lQWLa7cT" "BmsIeZLIvIzvQ+T/QrX2ISm7Galv0fFknPkrliB8OoHRR0m3xpG3Qbt9NEQBnrpKpq2L2hrE" "BcSaXyR+5zUc00so+yjO/szmbXFWrx+NYbwssSQ4t8GXk1SdM6RaulidzeEU91Ip7GV1JkfT" "Q13Y2hliapJKAVKbQKpsDN/tggiMBP7VBOogd1cgUOemnhlo/q37RAlfnTsZXeNYe+0VOjs1" "vgsiAZhHYwTqnsu+C8skUW6a+kqJ1i1Wa/2N7/vTNLanpfHCrQ/u5NU71wKi4F5CIownkPUl" "ijOPo2qKKpZYbY8YGLn89oXeiIUpdBhwMWVGHml7Quzs2E3Nczmgfmdk6Q+EEEsJZP0z1F2F" "4CtxKqeByxMTE20Xbg2wf9fr2CjEhlaERBScZbq3vkRdK3YvXrKTbDmVEG9dPLuxzlLKQS/Q" "2ChkcW0WEwYEocFYQ9Wv0dPZS93I+I65/JeJjeLR0dEepdSbXuAR2ICHH9hGEFpsFLLiLNHW" "1MGfy+OM/5OfMS7P/g+gtf5EKaWl8Ru+mPw40qHGN1psb98lXnisj6nFPD/d/PFq0uH5+SH8" "dYDh4eGDUsodnue9/+3xucH7d9XTV1wRS2fGZ/KzTUmeuzGEBlgHkFIe8n3/eH9///cbP6v5" "Wv7691hm/9ob71QrVXuDHAD/ATGEpWtenhLsAAAAAElFTkSuQmCC") index.append('transmit_go') catalog['transmit_go'] = transmit_go #---------------------------------------------------------------------- tux = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnpJ" "REFUOI2NkF1IU2EYx//vOTvjTM8q2VcudRdn25nFnBbJwBGlJZmQRGJ2Vd11ZYJXRSBBBHWV" "BEF1ZXShXYgXUVTQh4vCC9FopX1cWDA1J2ZtfmznnPfpIlsZM/xfPu+f3/N7XmCdBALabVX1" "Z0Oh0EJ1dV3Xej2x0DAYDB4k4pcZg0UQBNlqZY2KUjI5P596/W9XKARgTNzldLqYVbbB6XJD" "1w0Q5doLdQsCJKlorsJbgoH+m+g+3wWn0wEiKt4wQNf1qbMnk/DLpxGr6EZ9JA0mKJt9Pp+8" "IYAocuc3Yy+SSQ/S2UMw7AdgV6QqSZKbC/XXRNM0raPjzGQ6s0RTyWkyONHQ0HMKh8Okquq7" "QCCw7X8Ggmma1xsa6n1KsQ1ujxvgJiKRCFwuNxhjlUTCDQCs4Ha/3x9taztmpNPfiYiTaRpk" "mgYRcYrHhygajZKmaVxVtX0FDYjoREvLYVFRNiGXy4KI8m+xWAylpaUwTc4Aqv89t/zZHi6z" "K8Jxr7ccAMA5QRRp1ZYACFAUOwACY0LJGsBwb8gxm2KN5d6skng/gOnKMDwuO4h4XpSPtUJc" "+QBARFNMsl779Jf6+N2dgyuvwkSjVTTc66ejR5op8XaCfoVTziRaelJLX+5oNNwTosV7lXM/" "Bre35v/AynSLxcKQXSLsDlrRVDODzOLyKp7hwf3HeDlqonwrQ+0OBpsMh66zi/kTMhkqm58F" "bDJgLRLRUmOgp+8q+vs89HUmiZGRMXZqj46GGguWF4HEOD1LzUmX8oDEm9z+uCHWZnWq824R" "mqYWco6H8Rfts2ljFABkWZY+zlg6Hz3l55Ip3Prsmei8cAUcAH4CCaAGFxdJc4MAAAAASUVO" "RK5CYII=") index.append('tux') catalog['tux'] = tux #---------------------------------------------------------------------- user = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApFJ" "REFUOI2lkl1IU2EYx//v+djZOdu0baY5lBINmuRFmSSJWGQh2MUMDLQisChaCNKNkXYRFHiR" "RSSRCUWFCdpFQVRiiUkXUjm9EZfaLIOUdH7M7cxz9m5vF4ms9XFRDzw3D7/nBw//B/jPIr8b" "ugtSLmTbo/U8z0x6lCGgEdW3JF576JltTGT5xMHJfGt9noNdUizEIEgEHE8AMJGAFtuTzNz4" "t3BfPM8lCrZtiDUpCiELgSjml6MIrgAxzgCBF4hVjNQl8r8IFpejSC9xo7q2AXsqajAdEuBf" "EaAK66DIvHy9tkyK54VEgX2jfb6k4qhN/9iLTEHA8dNuJJkVJOeWorupMpxXbGG48RdBOKaM" "hqcGi6iUAquJwrregSDlgfkxBHTT+NZDXfqfT8hvFVs+7fZ1P7iKJCyBCEYQQYKZ19HX0YyW" "iaLPGYXNcvzKWow5Zc+kBSzUyEi7+eJ2IUZaq8HAViECx+F2VNW9g0p9dZISbZt+ekqNEzBi" "2dd1zCY57j6/tR0eyPAsAuEQoIcBqgJZJmB/ahhVZ4fgV73uIKba8Poi5QHAeXCTyyl/7Th/" "rhLeiAFDfgYtANAQEFntmTkGPzVghzMDdKKnXDZIk7NjPcMEADyNW2jGThffOVuE9+kHwDMg" "RhmoDlAN0DWGiEYQUglKuFc44+zHh5edkV1XvAYOADhCOEFS8GZgDjmCihUV0FRAV3+cwIkc" "OCNBQZaGgaEZcIIInueEtRS4zaUNk733qVGfpk/a38JgYTBaAVMakJwJmFMZrA6GR23dyBZH" "VF9/lybn7r38Uwqjj2ss9wZyDB3evMtYnCvnBcXGOF5EjAHRCI1SLSja7MOu9MEjJ8q+hJ2u" "O8uJP/RP9R3UJfuHVrSClQAAAABJRU5ErkJggg==") index.append('user') catalog['user'] = user #---------------------------------------------------------------------- user_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqhJ" "REFUOI2lk1uITHEcxz//c87MmTmzs8yOy+5GlBUr67atNksItaWEopBkFRltbXkglxeR8bAk" "2lwehNYmyiVZl5IHaXNZUi5Z1q12F7Mzu3M5M3PmnP17IG1jefF7/PX5ferbtx/854ihlqGq" "EXsnBJ0dqip9liOJZ4XZ2e86cqH9+558Vs1fbK4M7KgolfsNv3BrukBRBSBdAntesLBA6fiW" "vj+YV/IFM4sHwoYhRCzuEE04JDMwoLjRVE0EXLmGfP4PQV/CoWR+iLX1u1m4oo7ulEZvRsPU" "hmN4Ve/R+lp9MK/lC4LjgtH5K9YXWe/vMVbT2LQ1RGGBwbApi7kdXpWumOeXHPuHID1gvE5/" "flpj6yMI+GwCI0tJ2ipE3xK3fB1TV1+y/h6h8qTr+McFnbfPH6aQfoTmQWg6BarF/ZZGjr+r" "+TSmutE7+OR3jWW1N/UYsTovo5tunarm5cm1SOQvSFC6rpk1DY8x7c4G3XBOd9/YYg4SSOFf" "cmlDkV56pvXELNrx0t4H6RRYabBNKEldwYpcJ5mO0ZdKZOLJ6MFbh57vUwHKV45fXu7tatm1" "cxVvcm6e9UqycbBTkEuB2nORkZ5WaiqrWFRVi61HtIj5caGvTPUrAM1TDl2+sCHK11ettHWB" "GRNkE5BNQC4Jdu95ZkyejqM4TC9ZgiNyVFfMAeQ2BUARQtF0gwdtEco0k4wJWRMs82eEWKIb" "lyhgWXk9ANsXnWLCqGkIhOenYOLi3R/unbM9Vrd9rfkRbr/EEwDfaBg2FqKJfl52PSR8dyMA" "4Tsbef/tBRKZ+d3C66t1/rNtZe6WNxUH6IssVTWjSCqqiwGJL3hNTKp6os2ZNpeJxTPp6HnG" "wxcP+PKhv3HIbxxqZoeKwwgREuCXkEDKpkdNPTt/AFkgBSn4N8XjAAAAAElFTkSuQmCC") index.append('user_add') catalog['user_add'] = user_add #---------------------------------------------------------------------- user_comment = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAArhJ" "REFUOI1t0l1IU2EcBvDnPec0pzPn5pwzFcUzvfEzCrVMVCjBzMjSoksJ6eOmoG4USkTwJiSq" "iwoEETOaGQWhRULGQkczU1Pygyzz25Ri6nbOztk5bxdLE917+z7/H+/78CcIcCoa3xhZL70P" "QsoBaAJlKKXdKsgVLtAlI6G5LJc/eTqXB8cygSLodE4fe/xu/PUuoKK2J5RQb0l5nhXrIuD1" "UcgKoFBAUQFFpSAASrIS4Bhbsu5+QbDPaNqrZRlC4JYoFBV+QKXbEH80LESD3YDA/V5VRUWl" "lOUYQPIBPtUPbQIEFACwIcpgN+dq88Htt0TUZrietq+HJu4RtBbmYJIRhhCCCB2BKAMeLxCt" "J0g0Meh0TuP9l7lvW0BOnPEqb/Q0eKmkNblHmMFlDm2fvXje+x1rbgkFqWZYwghkWcKTnkm8" "dEyNKpSUbn3BwnmKIlMLERlpwMf+AbCORgTLLKJj9rV207uHj2cl8F3OabwdnBFB0WCrKa4H" "8L8Dzqj7lXOqEnothTEhBcKGC5pwC1qH1IzCzFj+2kO7mxDmpq26+M72yrYAu1QwcvRHPzVl" "HiFp6WnwKgyGPjnoPJsdszg8W2WrKW4KtA9+oKKdfTa1ai1fWgHn7ILChYKDF2OLZrR3/LTR" "5KjmQMP/AErYhY6665VFVfrzPGnqc0ASCWQByCzKIZd9kxcfvHCuUNA6gNCdAHuoTHfjXF50" "/YET2cS+TODi4rDOxMJFYzG9RMFbI5h4eSo/xNQmzE5+6N0JkPnbKXQ+/hJacBZunRmKh0IS" "AFkGfAqBZm0F1YkdCB+9B/7WONkJMIIuoW9iwIkZxwQYDtDoCUJMBPo4gjAz8OdrP2aGeyEZ" "kuwBOxBNyaXR0lrsQt/cmbFHry5otUEGBoRVFUURRFkwMCst4elBzUqUdSEQ8Bc9GiTs9oOu" "KgAAAABJRU5ErkJggg==") index.append('user_comment') catalog['user_comment'] = user_comment #---------------------------------------------------------------------- user_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAqtJ" "REFUOI2lk1tIFHEUh7//zOzO7uiaq4a5JSZd6OZDRdCFKKmg8qWUihKJDJKEQCIw6EIPFT10" "IZKuD1HRBXqooPsNqR7ESCoSu2kamZXp6moz6zgz/x6Kks166TwevvNxDj8O/GeJwZrl0zK2" "jUp3K1VVJtmuJNYnzKZu34Fzde1bE1k1sbFuargyLyJ3GiHh13SBogpA+gTO7PSUZOXNF6t6" "IK8kCiYP8/YYhhDRmEtnj0tvHDzFj6ZqIuzrr0jk/xB09bhkzSln1YYt5C8tpe2bRkdcw9RS" "MYJq8OCGhfpAXksUpOekd85ZWpJmN94nW9NYu76clGSDIRPmc2vPMitvdkhy6B8CyzMarPdP" "Zjl6BuEkh/DQCL2OCp2vidlJbyYtv2j//YSpx3xVzXObbp3ZTwrdCC2A0HSSVZvq8/uoejur" "ZcT0fcGBI79iHL3wuh4lWhok8/DN49OpP7YKifwJCSLFZ1lZ8RjTaarQDfdE29Uyc4BAitCC" "i6vT9MjJG0enUEeQui6wvoFtgWNC/uvD5D6pwm59S6/ii/qx9xbcdXYLgPGFJ5cMV9ovlW3a" "SEdQpd6U9MfBscGOQ96zI8yLXWB8/hL03IlYz2/z4sEdL/aqoUIFuF306sWaghyltqWPWsbi" "WgInDv0WOBbMuFfMzKISgo3ViIcH8FnN6GlZorWxZZwGoAihaLrBo5qvTFpm0tBtIB1w7R9b" "hGMtBIblwuKNv+PbkYUqxUgFQBkzf8u7+6edgN3mXDlbiz8kCYQhKROGZENPagTz6TXYkUVf" "pSBaKYh9bsdV5cdfKTRcLg2dqhntP/8ybxddXwtUzUiTiurDkxQGroqizBptZIaNpnygp92h" "+ZPq2nFv+6DfOFg9XJG92ez4WKZ4IsdTZKuHPLLorrf7O8RWCQtzQHJqAAAAAElFTkSuQmCC") index.append('user_delete') catalog['user_delete'] = user_delete #---------------------------------------------------------------------- user_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvpJ" "REFUOI2lk19MlXUcxj+/933PezwvdF4OCBxg5g4cp9IQDHQsxWq6YsNlUW7pNKYXtLm5vGhz" "y7zLorpwja0CabU2HVt1YUuT/jAxU0eaOEUMEUqSIxzOOXA4vH/Ov7c7Jce66bl7novPvnv2" "fOF/Sjwa7Fu39HBFQeagLDs5yYxD3BbG6Kzr6Infw28vBpAXmtZa38GqUucd7TGhKm6BJAvA" "cQnSDQXeXOn2lHn2UYC00Kz1Z9s0TYhYPEN0LkPCgqykosiK8LlSBxa74F+AmbkMJU/vY+f+" "Qzz70l5C8woRS8FQ8tA8suej/Y3u/+ygc/fyyO4Pf8hP3uklYZhMR2fx5mrolVvoadser2vM" "b80YwW45t4r56T6w7rUoCwFmVhsy717ZkHYvxZeTxldYSiItQ3QYfZkaydU3d3sqGtADa5kZ" "W8lQT9cHD0us7XDdSSzZ9Hj4m+qamipQvQhJQXUsrvzURk1Ts+4rqxdzE7eQkwaat5jZyT8V" "ARBsPO2OEdvrofjjM531DHbsxMEBIN83T13jBvTy57FD3ZgRwdQfBknTjlh24ikZHJEKDOzS" "1WXHejrXc1VoXF6xg5HyHWRLSnihxkYPbsWa6ERSDaCI1Mi1SdOwnqt74/Sgsrr5i21lUvjz" "199s5lxEZtBwSFngv/8te4IX0YMvYt37BMmVJhkPMP7zb3x2Y9WnR491DABIxyvf//pES5TJ" "m99zaQKMmKDw71O87LtA0RNNJO93IasOdnw5ob7LFAWq2a73vfVgB5IQkuLWOH9pmqBi4Bvp" "5tWCi2SdUkLX28liMR8t4+4vtzhydRsuzYssS8pDwIoth8Z6v0wvSYbSJ4/3s97sonJjK+7x" "8wyf/JWBnij9Z65xoLeJPGfcGD33le2p3HzkAWDNa+3vafWb8v1+/FMziY6h21MkB78jUN1A" "Ts5KxvqHeffsM7G/UkU/qi41oD1ZV7impf3woksEeGVjnllbUaysW12O47Iv2OHwnq1t10cX" "+wOAfwAJ9yQGhieeeAAAAABJRU5ErkJggg==") index.append('user_edit') catalog['user_edit'] = user_edit #---------------------------------------------------------------------- user_female = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlhJ" "REFUOI2lkktIlGEYhc93+ecfp5lMncREkpikGVAXY0FjqQsXSbhok5sWQUKCGCUtJDAiDFxF" "UBAa2bKNmxbhZSGUCCMqQ2ohNipKXvL2Ozqjc/nn+75W2TgqEb3Ll4fDec95gf8cctSy8ZLz" "sStHtDCmTiSEwk6c7M1tay/eB9Zb01mWvrhbltVSkq+e2RzEwnUCyggApREkK3JO2mlwLfop" "lafpAsVOeTsWFWRjJQFjzUQkBkhqAWecZGnmg7+e0F5pV1y3orSyGvmeElgzT2P66xf09vSj" "wNxUthJfxv1XffFjHQBA09telF+rQX6hC9nZWbjou4q2N93gFKS6wqFSWX7IEiEyuhqk0BzQ" "qQRAIJQFML5DgYjiuu7E8RmUdWpCEhkc98MmQmBMA2McdpbAlL8fAjxZcPl5xpEOztf06DN9" "1+NmVS73uu7BP/bygLbvQgt66Ji+OPwweqa207bysWEvRUCRmT4SD9S3qxHaDxqTKI/cBHYj" "QDIG0ASImsO50iIECm8pb1cDQdUTjs9Pk/stBOrbVXHdFSQiFNYtBWWEgHAEiklQhwXS2ATN" "zQH4LiYCK/B2PSL7GQx2NClPsxvi2yyWBkZhGquQ0R2EIutY3lpCfNuAiu5idnwaJrHA0+zG" "YEeTOtSCKZIQOsXG0g9wSJwiDLqQMDYMaEJC2DMQC4VhxZ8cOQAwisDo0IA3HMxTmYSTIufZ" "A8BvfPnnAvwLq8I+NMkYwQSQ8olTH+44hl9b23RNc7nz8mrT/wMAJufnhwWjI77GeKvnxrvw" "Ucw/zy82WeiSwfZ1AwAAAABJRU5ErkJggg==") index.append('user_female') catalog['user_female'] = user_female #---------------------------------------------------------------------- user_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAsBJ" "REFUOI2lkW1olWUYx3/389znHM/ZznFnm+henLKtD5onMhEXa60iwygwBYWMEBZljQZ+EEQy" "wihYHypiEemX9YJJ2Yc+tSQwX2aMWMcMNkezYbOy3MvZdk7nPOd+7pe+VKxhEfT/9vtz8eO6" "uOB/RiwtujfXPt9SYw76vqtQxrFQFsWJ+cjrH2SnDt9M4C+GpzalD2bq3UuJpIjKmMDzBeAi" "At1Rk6r0xm+UziwVeIth4yrbm0gIkVswzOYNhQCsF0X6UqQj4f6bbfA3wVzeUNfZzZ6e57h3" "RxfXf5PMBJKirCIR9+Nv9GyLLRXIxVCzpma2c8fj1er706yWkiee6SZVmWD5+vs51burlOlI" "Ovr+RVCyiculya/bdayWdIUmvaKegvZh9jsWVMX4ht0n1T+fsOlo5M2r90ycev81Uswj5DKE" "jFHpK86ceJWL7cnMk/0b3VKBAGjd9mksR64rzsq3PjvWxsjRPTjcHwOC+seOc+zcg7Q2NDH6" "U5YPnx4TiwROJLee3Fsdq+8fePsOssTJzoG5dDfWGpTVKKNpSLdwW+NdfHX1NJd+HNKf7/81" "isDJdTvf2d7gTfXvO7CTczM+I0VHGIBvFVtv3YtxFmMNFsfP89fINLZTUCWZ6z2rhl05Ko+v" "f+Xjxi2P8NHoAMN1D+M7gdUOTyuMs/wwM05oNdqGhCZkoZzn9tUdFMKinHthMPA8ITwZSzA4" "NE2rLBIUoVyEQAdoo1mZamJVag11y5uJ+HFWJBvIXrvAhSuDY0GeKvHtez2HwtGBF/t+6WKE" "O+WGRzsRQG7iFgKlUFYRaEVL7Tramh9gePJLLk4M3shPF5uu9FEWAJc/6Uq+O9QaPTGWeZm5" "6Yd8mah2nh/BOjChNrpcqLzv2arNzW2R8+NffLPMt1tGj6D+euN/ydrDTFnn105KE+EI+s/+" "d1VJIz7+DPDLAAAAAElFTkSuQmCC") index.append('user_go') catalog['user_go'] = user_go #---------------------------------------------------------------------- user_gray = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAppJ" "REFUOI2lU01Ik3Ecft7/f3v3vvt6nds0p5uXDVQGo5aM8LDADkYK4sFDCUFGGHnog6BSUAxP" "FXToEIUGQYR6UOhS9IF4UAjUSm0lzXfmxB1sbprZ3s9uY8zqUM/x4fk9PL8v4D/B/I7s6mi/" "U7r2+jLVJeQ0HTsqC8nbMDw0+qyzWEuLifOdp/vd6bnrlZUl0KVtuHzV2N3+ht2drYOHos3C" "/IfFF4V6UmxQsvWpr8ymIhEXoVrcSKx8haPcA56RkV54ebFYv88gnVzGStaImshR8EI5UnsU" "eypBRmZhJApz60qHpVBv2JeglP15svsSV1XKQVYURL8soUSwIUvdGL9/UzoeyclX/2ZQ7q54" "73VaIgoxwm5SYA8dxneFwsEoqCpzLwTbx6Q/thCNnubGE7a1iScPYUcWjIEDYzDBSiU8H3mA" "oSUuEW4+Zy6syW+hqanJzrI/rnEc1+VvaMO90SlIyXf4uLiA/qfzqI60YWNjo86iZeHxeN6u" "rq5K+QR9fX0kFAr1UEp7KaXQdR2qqoILtYPUtoLjOKTTabhcLui6fsNoNHaHw2FjPoHVar1A" "CBlsaWlBLBaDKIpgWRb19fVwOp2YnZ2FKIqglCIYDDK6rjeqqrodj8dnGACY661RqiKt9O4M" "Ac/zkGUZoihic3MTlFLwPA9BECDLMux2O/pPOLD8aix35HaMIwBAGIYYTGasr6/DarVCURR4" "PB74/X4QQuD1emGxWBAIBJBKpUAMRhDKsPkZkMCxHvHNY0XXdUxOTsJsNsNms8HpdIJlWTgc" "DrjdbkxPTyOTyWBlaizH1zUOAgXPFJs4YxsY2TuQTCYfCYJQqapqhaZpJgDQNA2EkHQmk/ns" "8/nODpyyrdW2Du8U39A/4ReBw/A4gmcobgAAAABJRU5ErkJggg==") index.append('user_gray') catalog['user_gray'] = user_gray #---------------------------------------------------------------------- user_green = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn5J" "REFUOI2lkl1ojXEcxz/Pc57z/pyzc3RW21qzWWxD5GINIUWIpbnggtWEkCK7cOGtlbiR5oIm" "JQpXlpclSSQ5ZeZCIZutmezMRtnO5jlv/+fl/F2oxWKK7+X39/19br5f+E8pvzM/dVQlwplU" "qeJWwAZHSL4GgiOVm/tK/goYulc9EFWMismTDVKALRXG3YHB8k29M3/Oa1MBUXe6AltBpgD1" "hycVICPRvqTLpubVqUZ+KE9veg3joQNkS2YhDLByCpam4vZCvG1ZdFrAg5eqUTF/G/4ZxTiy" "CXVhNUrNCjx1p3kzqGWjseL0tICPqYJuaXzBcfkIBwN41V1YsgFnQtL/KdQ9f0u7+UfA7osX" "Aw+j5cH2G62EmUDRfCiaF91lcvdmK7f8pd6ms1ciP/9MtrD/2rVwMvn2wjfj9tYjB8/Qeb6N" "aOYHPxnIM69pO+cuHUf31d8uLq7a3bptz1cAF0BLS4tau7HsRF//9b3NzQeZyHzGLgmSrQyT" "KtcRRX6y9hhr167j+YubNcZ4rKS2cef9Vx0dtgYwWqadfBJvO1Rfv4FEIsHo6CimaWJZFqZp" "IoQgmRxDiBxLFtfR39fTmDccA9inALw8Vm2X1jW4LrgH8fl8ADiOg2VZkxDTNMlmc4RCOodD" "i+h9dMNaeuadRwVQFUXVvAGGh4fRdZ1cTpDLCYQQCGGiaW48Hh+VlXP4PDKGqrlxuVRtsgV1" "9uqjHx5ftZEq8Xgcv9+HrgeJRCIUFsaIRAqIxWbQ1fWMbCbFwNN24Z+76tQvLfTc2RHqDCwo" "evD67Z18/n2NIycUKS2klOTzCsiglE7h2Pra5StWmj2JmobLxtQN/ZO+A/fjCXUHdgrPAAAA" "AElFTkSuQmCC") index.append('user_green') catalog['user_green'] = user_green #---------------------------------------------------------------------- user_orange = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAntJ" "REFUOI2lks9vi3Ecx1/P833W9mm7VbVkxRCbGQ4mw0YcJHZYIpEhSCa2MLGQIDvvsNPEHyCC" "gyCxiE2CcBDBMhETO8wOGLOqSatsa62z9vntIBkaJuF9/OT9eX1+wn9K+l1w4OKyxwuGY5uE" "4uDoYOQk3lcsel59OFb5V8BAZ9m9kunRWlk3AXCyYKcdso7gU3lJX1XjyMaf/Uo+oESK1wrd" "xEw4IL7XcBQJacJGuf++Jt8v5wesJxpDRfvIbTqFtnEtmTHIZiQ0l4zH43DvXG1gVsDDXPFk" "eVUT6twIwn8U394NeHfUEzp0iagvMh0JBrOzjvAl5x1yMsn1lvBQ5FaAE0yZAnvKJJYKvqzb" "06X/sYPTR3f7Dbkg/ORqB0V8QVI8SIobv9Dp7+ogY4jgyf31oZ9zZq5w5si2oEee7Kye/7Su" "9MADBi8d46MeBqDYNcbqnW1EuxvoS6zrsWzR0HL+UWIG0N7eLjcuHLjgjN9tKt1/CzJvIfkY" "sp9xtBToaQisgCXbedXdyv13VXdccuGelvO3pwVASyVn1wR6miObj0FmGBK9kE1Abgy0NKY+" "jZ6KouTihIJeFrji5bGUu/Rm/+h1BaCiMNmsL23FenMF4VYBcCwD2zSwTAPL1LEMnYnoM1RV" "xbfqOBXxa7tmlihLkqy4vaTHk+BbjKnlMHQN09AwDR1JFCAXqAQXriCZtpGVAoSQlR+A5bVt" "0QeXTdsRRAd7Udw+XGoAtz+Md04xHn8Ib2Aew6+G+Jq1GOnt0tRVWzt+ucLLGwcLU/0vln6Y" "cm6XBeMlbjEpSbaBDdiOgm77nNF0+GtADWyJ1JS/Xll/IZP/Q/+kb7SN/+rdChuRAAAAAElF" "TkSuQmCC") index.append('user_orange') catalog['user_orange'] = user_orange #---------------------------------------------------------------------- user_red = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAphJ" "REFUOI2lkktsTHEYxX//e+/M7evemTaZlk4rhApCmjYolSBRGxqpJixUQtgQCQmxaDzKQkQQ" "temquiA2uvFaIIiQiEcVjZS2UcSjHn2Yzty5M7f33r8FaZoJFpzk25yc7+T7cg78J8TvyG0b" "158seH9rtyod0r4k7gVxSpe0nblwZWumVs0ktm/ddCgy3NkYUkcJBAWKKvClixUfqahcVht6" "2vXi+l8vaKyvkoX2KwYsDw8ABU+oxGyfEScgLz4bVCbqlUwD52OPnLlqOzsbD1K3roHPtsqI" "o5FSDQKKK47v2Zg7Ua9lGpTNMGPVNSvD/ugnyioj7DYNwiEDc/pCrp3ekaioSo/t/ZuB4pt9" "Mv5lgadmYeouZvl8Eq6K6nwn6eX1zF3f7vzxhcu1tTnTBqL247bTmMQQWhZC08lTHZ6dayb0" "OhpvrV5jTNwZT6Fl9Yb8knT61LxwcO3MAy30tTbzvPspb7o68Tq6mNtwjEkd96cK381ZOqX6" "waV3z1PjBk1NTcqaXL0lase2FB07ijb0jaLcyZQZpczIjlKYFUGz4hj19YhHD6tiTjJYv6D8" "Tnt3t6cCHNDzD8/XrV1GwwYYGoT+PoiPgpVAWNbP+fQebBuzOCKKneFFb785gQv9PbcEQOf+" "WW5JVZ0a6fAg91dK7hikHXDSkLIhlcJPJFDyCxheFaX3Znt68YmXWQqAIoSi6TnI/j4I5SMt" "C2klwU4i7SQyoONnZ0N5JUNfRlC0AIoqguMpKGU1+97cPuv6wOCN24i8PEQ4DJFCRLQUEYmg" "TI4ycO8Jw0mf/rvt6ew5K47AhCq/vLjF+HA+PvXrd/1qpTFWqntjAimREjwpSCma7E2olmG6" "y6dsNnpn17XFMzv0T/gBtjkGMIoW8QQAAAAASUVORK5CYII=") index.append('user_red') catalog['user_red'] = user_red #---------------------------------------------------------------------- user_suit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAp1J" "REFUOI2lUl1IU3EcPff/v9vdnHeb06mpE00XGuJnpuWDRY4iLCTQl6REX5IwS/FBAvGheigs" "6ll9UKSYRoYVmRl9kSaYEX2ZWpmkM0X34Zi77t5/b0NG+VDn8XB+h3P4HeA/wf2JPFVZ0Waa" "G26gTIJfYfDIakiWos4O+0BNqJaGErU1J1vNK2+aDdQNlZoDoRwUFoDXs5qTW1xqmHj3fnDL" "BM3HCli07zMWvDJkAACBzFG4fApWJRXrf7tMNutJqIH0c5LtOFyLM80tKCs/DoePYlXisU5F" "qEiAu9JYqdus50MNrKl6194Sm1Fxz8Oaa0aDXoTRIEKfshsPr59eyynwbzRtZeCicVPMs5gv" "Uw30QgD6rF1YC1BQyQmvLE5mVPRKf61ga+zS3RdP+Lpv3YYeLnC8BhwvIJxK6Ouzo5tUrh1t" "ahc33wS/UHjOblLz7JoiRpUVHqxAz/A0nCMDcAw9w+W5TKTaqvDBSZIUiZkT8ktfzL6+ux5M" "UF5up4VpsW2yIFZTSqFwPKY0aYgtqUekNh4rmgg43BJiIvRYVws1HNByqO6BEDRYS95oXfJz" "VfVHskEIwc2XU9AqEqJ6LiHM7wZTCxic+A6vX0Zx1nYuxpJ4VibzrcEK9v0fhyoyKOlzJMMa" "Z8S2iHA4nR6YZsbxVJeOBWMiok1GAIDCGK5aH3OZs+35Ha+WLxAAIBxHeCEM04seROjU2JAV" "JMSbMWarw6ilCCnxURC1PLKTTPjxywXCq0Aopw5WINaS89+edAUYY7gzOgNRq4IxXIAhNgZU" "LcBs0CAhUodH4zPwuF34+rzXr9154CKwacqf+qvFGxN7ksfmlXt6szkhwMAxxgAAsiyDgjHv" "0qI3z6Ld15g38iW9rNMTuqF/wm+iwvQsrUsz/QAAAABJRU5ErkJggg==") index.append('user_suit') catalog['user_suit'] = user_suit #---------------------------------------------------------------------- vcard = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAatJ" "REFUOI3Vkr1uE1EQhb9l1zYxJg6xliAiSw5yk8JIxLIwDUhUBrc8AS0vEImKJ6DgEagoaFxS" "YrlwIJIdBfMjCsNqKRzhREFZ1rs7sxRhVw4ESiSOdDUzuqMz58y98N/DcF130zCMewAiAoCq" "IiLEcYyIpPV8jKIIEXlquK4b2bZtAsRxnDIn+WkxyYfDoViAmclkeLwtBN439t+/JA6POGOv" "c3Gtxt3CR6rVKpsvDvD8AO97gOeHPLtfRURMa37qxrsnRF9e8clxGO95xA93AAjDkEe3FlDN" "oaqoKollKykAwpVr3Ly6yu2sRe/1LkPTTBu73e6J5bVarWOCZHFhpGxNLmNZ+xQWF9kOrjOd" "+lA4Jmg2m+n0RPUJBQfOB+y1Kzy3Nph+Dji7nOXSkZs29vv9vytYPXfIm69L6PISF1ay+Ic+" "53UPWEBEqNfrzNtNnjsleHDnRnrheR6z2QzVcio7l8tRLBb/TOA4DpPJhFKpRKVSIZ/P8ytG" "oxHj8ZhyuUytVkNVMQaDwUhV10WERqNh9Hq9+LSfl5x2u210Op34p523v0355/gBY2ok7BHW" "FqoAAAAASUVORK5CYII=") index.append('vcard') catalog['vcard'] = vcard #---------------------------------------------------------------------- vcard_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAipJ" "REFUOI3Vks1LVGEUh5/rvePHNJopk2MmqIwLFxoK2iRhYEhjq6D+gWpnyzYDroIWbqJF4aIW" "LYIgLFBbJBYEjePCkmFMyz7o63pFRhy/8npn7n3f22KYq0JE287mnB8cnvM7hwP/fSiGYcQU" "RbkEIIQAQEqJEALXdRFCeHp/dhwHIcRDxTAMJxgMqgCu63rkQv2nXKhTqZTQANXn83F7VpAz" "t1n/+BrX3qEo2MLRxlbOB74QDoeJTW5gWjnM3RymZfP4ShghhKrtn9qxeAdn+Q0/dJ3vqybu" "4BwAtm1z40wZUpYgpURKSWFlrSAA7Jp2etrq6C3WSLydJ6WqXmM8Hj9wvGg0mgcUDmc7kpn0" "MTRtnUBFBbO5k2QyFgTygEgk4k0vuD7gYEP/RLCxiadaB5mfOUqrigntGF7jo4n7fN2Y55e1" "hZXdJdp1kUpRv+eg7tAWC2uVyKpKjtQUY21ZlMtVoIwXyVHWfIv09kQ4XtXMq4VRxubuEhId" "e4Br/ae8/UzTJJvNImU9Ukomxke40H8OUSQ4UdvHy/cjRFq7eTL2fA+g6zrpdJrq6moaGhrw" "+/0ecHVzBZ8SoL/lKgDXz97j2bthHDmO5jjOh2Qy2SKEoLOzU0kkEu7S0tKBz9vcXmdheZrU" "8hSxvgcMTV6mVC1BLdJc5e+fno+ugdqb9U2HB7vbTtMcaufzSpLpuSn0b5u3/gmQh4SGUJQB" "Bcpd2MZ1h2eGV2K/AczvQHNBu/4cAAAAAElFTkSuQmCC") index.append('vcard_add') catalog['vcard_add'] = vcard_add #---------------------------------------------------------------------- vcard_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhtJ" "REFUOI3Vkj9oE3EUxz+Xu6b/0jamxraW0kZSaBELFkozKTjVzoqDTi6CXdQpUJB2cXVwcNHJ" "QRxcFEGKgxgDooaYYokWhdbLlTbpP1p6TXL3fudQcm2gg6tveX94fN73PR7896ZZlpXUNO0K" "gIgAoJRCRPA8DxHx86PedV1E5JlmWZYbjUZ1AM/zfHItPs7X4lwuJwagNzQ08DAjVO1dtn5+" "wHP2CESHORU7x2ToF/F4nOTcNna5ir1fxS47vLgZR0R04+jU0R+PcFe+sGyaLJVsvOl5ABzH" "YfZiM0o1opRCKUVtZaOWADhd57kw0suloEH663dyuu43plKpuuNNTEwcAGqHc1zF5+JpDGOL" "UHs7meo4m5tlCB0AEomEP72muk7BtrlINHaGl8Yom3+qNEWCdO9ZfmP2ySyB7GtkzUTCEQav" "3kU6Rg4V9LbusLARRkXCnOgKUt4p06ZKQDOlt0+JrmcYvDFFY+ws+/Nz5NPP0bqW0fL5vDc0" "NFS3n23bVCoVX/LCnQTj16do/v0erI/QEWbd6CfzafFQgWmaFItFOjs7GRgYoKWlxQfKmklT" "dwwm7/k1Y6YHY3sDw3XdfDabHRYRxsbGtHQ67RUKhfrP64hgf3tD66vbVPZXsYHdHR2nLexq" "x394vaWu9cwEQ63TfSfFMAIFdksuS6u6VMvq/j8BDiB9SXtj5VZAaf0q4FkK7/Hld+rBXymh" "QjKs9xznAAAAAElFTkSuQmCC") index.append('vcard_delete') catalog['vcard_delete'] = vcard_delete #---------------------------------------------------------------------- vcard_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAApdJ" "REFUOI2lks9vTFEUxz9v3pupjmmnP0yLtvTHSJEoFQ2iqWChmrQrS5EgkYidWIjasBMLCwsW" "tRCJsPAHsJDUGISOdOhPlNbz0Gk7nVZN3697nwXTVtOduznn3HzP55z7zYX/PIphGBcURTkK" "IIQAQEqJEALP8xBCLNRLo+u6CCHuKoZhuJFIRAXwPG+BnMtXirk8mUwKDVD9fj/XEwI7+5Pp" "4ad4zi98kS2U1WyjLfSRaDTKhccZsqZNdt4mazo8OBlFCKFqS6fuHLqB++01Y7rO6EQWr/Mt" "AI7jcHl/PlLmIaVESknuyVquAHDKG2lpqOBgQCPe00dSVReEsViMAtnPmkwPamgbY5Pd+IsP" "oOWMc1zJq9R6NG2aUGEhCXs36bQJoT+AXdFpXH2C/KpjhGsayXyuZ/DJvcUNMvp7IjW1PNR2" "kv5is6okwNpfBgBW6hGqNUzJpn2kRwYJKDYFhWsJFZUvblCxepb+qSJkSRHF5QHMWZMCOYE6" "P4DmHyJcexjr+30CQYWx3iGkF8AINy8Czh7Zu+BFNpvFsiysKZ08s49wXQemcQtfwMUf2shq" "7ytrWq8x8nIAXw6g6zqJRILR0VGCwSDWjxhk4oSjHZjGTXx+B3u2mh/db5ipPUF+pA4pJUpv" "b++AlHKLEIKmpiYlHo979vgLyoLjbG5pxx6/g6LamDOVpGJvEFam5kNd5+e/3g0qy//27TOV" "p/a0H+9ylTJKS+IUlwUwZ6qYjL1M4cztrT/X82mpXlsOKKiu79rafJrh++d5H3tO3obtOKnh" "b0Uqh3d0/tsMoC6/aKjOv7SnMuwrXldF+uskev/gnOpXDzVfSb5brl0RUBp0Lo596sedm5JW" "nnjmQ7a2Xe0bWqkZ4Dfz7WEAH+poVQAAAABJRU5ErkJggg==") index.append('vcard_edit') catalog['vcard_edit'] = vcard_edit #---------------------------------------------------------------------- vector = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAcxJ" "REFUOI2dks9LFGEYx5/3nWWbyYiGWNEJU0FajCgokN2DlzqsIEgS8wd4GDwIMuMfsNMeIk8x" "52BZgoSge3XpEAQOlagkiKIRbIUr+4t0t9mZed6nS4Xsrjvkc3y+z/N5fkoQYZZlmalU6kU6" "nQbXdd12nUcBiGjJcZwRIjK76T0BhUIhq6rqummaXxljTrcY1iuZiGYR8Z5hGNXT4mLtDl3X" "pUwmkyWimajkjg5s2+ZE9J5zfu1wYPappvVPXVJiSc/H+v5h6135KPwYEl+9WIWNZ7lRrwOQ" "z+cflkql+XKlnuifXCh+qcArH0XoBawpx2CgheB5jXAbCYuBEHucgm//AH9nXgtur4wPX37k" "7jYnni8mN08WuL+8M4HAR0hQXSAeCxK/mGVZJhEtqaq6rmna3M75qUKfzEdzD67c7Dazbm/F" "jyUpiYhKgKzB/9z5aq1Wu2UYRvWCzMcYMOW0pb3M3fBfZ8c/Y4vvYwv8GGPsSdudFTkOiV6b" "BwB4u3y9AjbVOgRrpfjJeXNA04/37kRBALp8YvUo/M4ZB4F++kyActnfICI4p0ipMwFCxA9N" "X8BQQrmr21vx/waQEKs/PcQ+mQ3+aIjpKMBvG2bgsqvDeecAAAAASUVORK5CYII=") index.append('vector') catalog['vector'] = vector #---------------------------------------------------------------------- vector_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmpJ" "REFUOI2Fkk9IVFEUxr973zi+l5qNotn0RyVLZmOQIjOLNikoJKLEgIs2LibJsGZskySOLiI3" "1kA1C0GGIKlWFmGLJEIyHSzxT0pYWYFljYzjpKO++XPfaZMiM6Z3+Z3z/e45nE/CHs/hcNjN" "ZvNji8UCr9frja/zvQBE1OxyufKIyL5TfVeAx+NpMxgM43a7/TtjzLVTD9vNTES1Qogym80W" "+F+fLl6wWq1SRUVFGxFV72VOmMDpdHIiGuKcn1zMqe02GrMrDyi6QjUignOL4UH/auxdjPjI" "/gAmHnTkqwmAnp6edp/P1+BfCmZln7k8/3UJLyJCi6lRti7rkBMWUNW12EdBYj6qaV84RX9s" "ATZ3Houe7jXlZt70flovfXilcHL7BzWds6UCPI80CmpChDTSNpjD4bATUbPBYBg3Go31s/sq" "PSkyz+84f7hop52tzml9SJIKhRBKVLA1/u/Ox5aXl0/ZbLZAqswLGJgSb7x6r6616W7diiH9" "RjidXXrLVVuNCCOiY4zdjruzIuuRtd3ccKe2PeOg4iw2leBIxgm8nnma5p1+0xL4XJ6ckANH" "7/z73Myk4oHxUEl/S8EYAFy4Vb5hraqSIXFUm5rQ9eoiJHA86numJiQxsBr7yRmHJiKWTS0Y" "WpKTWCqqTU0AgGtl3TieXQQGJicA/P7IBBEhWZHMW9ofnzqzMIzOgXoAQOfLeswtToFAiRPE" "hBhdj2g4mqWctTqn9QCgadTlnRqGHjo8/+CGnukwNDEIgN1PiDJp2siKKkSKzA4trGnnAPSN" "un+1opF0T771NzL0pxGwCiL3qPv39b8yxh/wbn5sLgAAAABJRU5ErkJggg==") index.append('vector_add') catalog['vector_add'] = vector_add #---------------------------------------------------------------------- vector_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmxJ" "REFUOI2FUl1Ik2EUPu/7zblPsxym6GTOhTSi6M+Q7cKCDGa/JDG87mIJBfF93tgPuO2iiC5i" "VwXBGEFCXXVllAVlk1w/Sy0rDK1Ep8zmJrrNb9v3vqeblNpnei7PeZ7nnIfzCLBBybIs2e32" "Bw6HA8LhcLhwTjcSQMROv99fj4jSWvN1BYLBYLfRaBySJOknIcS/FoasR0bENsZYi9vtTvwP" "pytsuFwuwel0diPiqY3Imgs8Hg9FxAFK6fa56ra7JlNVa7mosyk5tjAxl+2PL6nvVKSDmxMw" "fM9nVTQCgUDAG4vFOuLzC5VVzRemvs/D4xzjqpInGYMOqrMMFCWtfmXIpvKcj1PMT68KrHiO" "5Pf37LBUXAt/yzTdv2gb+XvB6RtjTQxoPXJc4IylOPJlIsuyhIidRqNxyGQynR0raQ2WGqjV" "d6Z291qeXZ5RfUoQbIwxMc9Imv75c10ymdzjdrsTmwy0gQARC4mhdvOlFyfLJs+F9irSq129" "598cOsGykNMRQm4V/Fk06KHyX3JdV1mtyWdrkfTF1p2w/LHP/CXUd+Xqh31xTQ7knqn3loqi" "xmdDqQO9lxsiAABPjggTB+Wb28SJlwDRAYAt5RDXWSDyNPRDk4PEkhq1bi1u5CznAIAIAIDA" "idVQbQU41rmK03lrQEBSr4lyPJ4bRkQoFgX7So9TjGaGewG8NZDtIpDsIrAY+wVMwBmNgMrY" "20yOg7lSPOzyjOoBAEoqqgKfX/ers4oIi0IRJBMExqcJQ8TbGgvI+eCiwlipgdTMpPlxAHjU" "/HDWG2o3K58mZzooJxZOaZQDv3P0Ob/+G9hRKAks747RAAAAAElFTkSuQmCC") index.append('vector_delete') catalog['vector_delete'] = vector_delete #---------------------------------------------------------------------- wand = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAhhJ" "REFUOI2Vkc2LUmEUxp/32tBVuToU4ujCoUWLaTPYkH2Zwai4EIwIQoJ2UjgEs2szVESbqF20" "mD+g6QMKom60cDMfTVLRpOFVBsIgiJGRatTr172+97RSmkHFnu05v/M85xxgBNH7E+b6+vSV" "fjVhENRYm/HU12auAUCd1FnwThIAmiueQ9VlT28YG+Zcfzf9FdT5Cd7hgm0qymsb18nQF2Bo" "c1Lw12MA2Dc0utF+brIdvc32HwTGxiGQfq/zZ73ZNI29GphA/XBkgmlsCYY2K0hTYPZj+Jj+" "BEmSINkkuK2b0KtpgLcW7REkB7qry56bjS/naXXpHLVaLTIMgz6/vETN/BztvIXyW8YkMOCI" "1dUJh2G0T168oUM8vAAigqIoqFYqYCYLGIfHJMAFAKa9cCPl8pChLV5+cDrqdruhqipKpRIa" "m3dw9owXrW/3OWNQiIPffYKVvl+IxWLkcrmQzWZhsVhgtVrx9JYBXtkANBUdvTZ5IIYffVfo" "wplMBqIoIpfL4dHV1w/1rTec6lunSKtlhA6i3f5dA+LxOPl8vh6sKAq2t7cZM/CMcaTsMaRt" "bRznhO9dprdCJBIhv98PWZYhiiLy+TzK5XKvvvMC4fELSO1NzAAgGAxSIBCALMswm80oFAq7" "4KFKJpNULBbJ6/VSOBwmh8NBI4H/3qBcLiORSCCbzY7u3FUoFJoPBALkdDr/y7mrv7dE7lOg" "Fbx2AAAAAElFTkSuQmCC") index.append('wand') catalog['wand'] = wand #---------------------------------------------------------------------- weather_clouds = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAgZJ" "REFUOI3Vkr9rFFEUhc/Me7uTt+4khsgSohBkDUaCWbYI2AZsUiq4VQpRsPAfEKuYUjsDlgsp" "7EQt0insFEnhPyDJxi5EFF2R2Z1f775591mELAFJLZ7qVB/fvRzgX8c7LVEU1aWU940xd4no" "FhF9IqJ3zLzd6XSS8wDytAghHk9PX3xeq9VQrQjkebH6c/BrdX//oAbgxbkGe3t7c9baR1rr" "JwvXrk4koxhlSZBCQl0I8eFjlOR5/nQ4HG5vbm7+ZeJFUfRsdnZ2YyKQSEYxtM4Bx3BwECKA" "KYFRkqIoitgY8zZN09fr6+vRKcAnons1FWA0/A2tM8AxLFsYw0gyjbnLV7C8vIyVlZWpVqv1" "IAiCl91u9/YYoLUGswUzAw6wTqK0FTAqaDYXIIRAURTQWkMphXa7fVMp9XD8xDRN33z7/mNj" "aiqEsR5mpmdQr9cBAMwMa0/gzjkwM8IwhBCi0+12VZqmW2Jtbe3w+Phr0u9/aYTh5OT8/Lwk" "IhhjThR9HwDgnBtDm82m12g0Fo+Oji6NdwAAvV7vYGlp6ToRgZnheR583x+beJ4H5xycc1BK" "YWdnJ/PPArTW7+M4hpRyfHtRFBBCwPd95HkOIkK1WsVgMAAR7cqzgCzLXvX7/VoQBHestR4R" "fS7LUmRZ1orj2FUqlUPnnGLmG8aY3bIst84b2H+UP0VrGCreQ1YZAAAAAElFTkSuQmCC") index.append('weather_clouds') catalog['weather_clouds'] = weather_clouds #---------------------------------------------------------------------- weather_cloudy = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAn1J" "REFUOI2tk89LVFEUx7/3PmdstHHGdGb8MSGORtEiRCiG6AeCRUK/QApcuCk32l/QUmhfq7Ao" "ou24SChDbQyDoMCFSDagDbhIe8yMP2YcZ+a9e9+9p0XMlImLoO/qnMs5n3Mu5xzgf6oQD7eW" "7d3ZYKxsm9Oh2oNyqvZ4hjqdjwe/Mak7tGa3ACA7EyL/5RQ7CMABIDfbcjwfD6Zre8wJIuZx" "uLFuhHqxNRVa0ZoAAJnJwDsi7ANVHrIzwQ2ANbiaeuEOXgDJHMCrkVt4kCGwABG9Dl3LXN8H" "2ImH7mqNZ6Tp8aHOOyPcVQddXAO0BVZ1GNzTgmJqHqUfH4ZAxpKoslbarua2K1+o6009tzg1" "kcs3YnhaoYvfAVUEtIS2M1CFJKoDXXA0eyIdp+PPZABgmTfBG8Twoqatv97lbYXOJwFyQOQg" "L5uwYR9DphRGMb/tKMeazJZqHw0ODs5VANmp8JGSlKdA+lVD932/3klAy13knRBW81GE2qLw" "er0gImxubuLzx/eJkmT3hoeH5wCA+6+sbZFSF7WGP2t+hal6sJQfQCJ7Cc3tZ+Hz+aC1htYa" "gUAA3WfOnbQsa2DPHiiFxqP9GfZluoZqOqOINPvAGAMRQQgBol+jlFIiHA7Dsqyh0dHRatu2" "xypjXB1v7Fuvf/j2RFcfiKhStawyhHMOt9uNZDKJWCz2kv+OUNldJ5AoBwKAYRgwDAOMMXDO" "wTmvdBWJRCCEuFkBtN/e/mTb9rhpmlBKQSmFVCoF0zQr3ZimiXQ6DcMwsLy8DNu2J/bcQqFQ" "eLq4uAjLsm4JISCEmBdCGJZlnZdSQkq5IITwSCmjUsoJpdTY35v5z/oJpshY4T35N4IAAAAA" "SUVORK5CYII=") index.append('weather_cloudy') catalog['weather_cloudy'] = weather_cloudy #---------------------------------------------------------------------- weather_lightning = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAidJ" "REFUOI2dks1rE0Echt9skw2LIV9titsYCfVQhZiDJYjgQURowApeWqgXL1LwECFYDx5C7sU/" "IAieSqk2UkIu4iWWCCqCEIrgRVpCFfLBRpImYXZmZ8ZLE5uPgvpehoF5Ht6Z39gwJtls9gZj" "bIVSukApBaX0LWNsK5lM7g6ftY2DKaXPIpHIvMvlgmVZMAwDxWLxC2NsLZVKDUjsAJDL5WY4" "56uMsSVCiB6NRn2qqqLRaMCyLKiqilgsNl8oFFYAjAo456vhcDjt8XhgWRYIITAMA8f1wTmH" "1+sFIeRBIpFwMsYymUzmU19gmuaS2+1Gq9VCt9vtg4yx/trpdBCPx5V2u30/n88DwB9BDyCE" "wDRNCCHAOe/DQggQQtDpdBAKhcAYu9u7gnLcIFupVKCqKjRN60M+nw9+vx8OhwOapkHXddRq" "NVBKcwNvQCl9XiqV4HQ605fVja5ubzhnpxoT8giQEpAKwG0SW7tzovg9uME5z4wdo3wH+xGf" "vjPhu7LjCC5Asl9QXLNofnzSFUJ5NL1YfTE8dvvJTZMGbkrY1h2ei7DqRUhhorm3iZnb9TPD" "4NgGjTeBsnbp4XnFrgBSADYFUlgw9jYRXDwY+XR9gUxDMa4G1oWwPZYScOrXoZ2NgtS/of3z" "86nwSINefuwEDrXgtXPtww9NiypzF+7VqqcJBvJ1G2r5tf9p9f0tebA9mf0r6GTK2anl/ZeT" "ZP+Vb/mf4f/Nbx+SJyGvDFTvAAAAAElFTkSuQmCC") index.append('weather_lightning') catalog['weather_lightning'] = weather_lightning #---------------------------------------------------------------------- weather_rain = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAg5J" "REFUOI3Nkb1rU2EUxp97r03uDRdaobW2pjZ0sJihSxcXIZurS4cO0QzSQUghIIJDcBU/cDQI" "0WwOd8nqUHApBETc8gcIhTbGps3Xfd9z3vNeFxNbijjqs5wDh+fHc84B/rWcPw2iKCow8zYR" "3SEiENFHZv5QqVQ+/RUQRVGBiF6ur69vhmEIYwy63S5ardYXZn5UrVankEuTptlsLovIDjNv" "KaWW8vn8Zd/30e/3YYyB7/vY2NjY3N/f3wZwESAiO9ls9uns7CxEBFpr9Ho9/IoPEUEmk4FS" "6kG5XE4zc61Wq7WmAK31VhiGGI1GiON4amTmaR0MBigUCu7p6en9vb09APgNmBjiOIZSCiIC" "ZobWGswMEQERYTgcYn5+Hsx8FwDcMwmiw8NDAIDruhiPx1BKIQgCBEEAay0cx8Hc3Bw6nQ6I" "qHnuBkT0tt1ug4i2iAha68/M7BHRba01jDFfmTlg5ltE1BSR2oU37r47eO56TmAliV3PCWJK" "4iSxwVDb2BgbaG1j4SToHqcet15fj8+t8PD90dWbK+kSWVu/sZwu9Qa2vnZlpnR0Yupri6lS" "74TquaV0qXsszybmcwl2GwevjCSeNokQJ96YrFgST1MihsVjsmLF8bRknpwFuABw7823a6sL" "qeL3PjdWF1LFHyfSyC3OFI+7prGynCoO+9xYzWWKeuC8OGv+P/QTr/xcUygtNLwAAAAASUVO" "RK5CYII=") index.append('weather_rain') catalog['weather_rain'] = weather_rain #---------------------------------------------------------------------- weather_snow = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAatJ" "REFUOI3Fkr+LE0EcxV82IWB1SAJLhMARUmwjFgfRRrgiIIEINgu5StKIpRB7/QOsw2ErIYXN" "YROs1kAKIVwsLAKBzUqK/AP5uTPvO2MhWXLenbEQfPCYeczw4c0P4H8rddtCEASnInImIk+U" "UiD5mWTX9/0vBwFBEJySfFcul09yuRystZjP5xiNRpdKqdfNZjOBZHaTwWBwz1r7gqRPsuB5" "3t18Pg8RAQAUi0XEcXwyHA7PACSApEG/33/ruu6bQqEAx3HgOA6MMbDWJk6lUuh0OkZr/YHk" "eavV+ursACR913WRyfwqJSIwxkBEEpNEo9FwKpXKc6XUSwDYB8AYk9hae62BMQYkUSqVoLV+" "dgWglPoYhiFWqxWWyyXCMEQYhthsNliv14iiCLPZDMYYjMdjaK0vrlyiiLyPogiTycQnCaXU" "kGRaa/2YJLTW30Tkjtb6EckLY8z5tWes1Wr30+n0sYj86PV63w9lAEjvAzzPe9jtdj9tt9tJ" "HMfjbDb74E95Op3GtzY4NO4a3Kh6vf50sVjYdrv9qlqtHv2e9/fe+JX/5uz/TD8BPBpexU7P" "7IgAAAAASUVORK5CYII=") index.append('weather_snow') catalog['weather_snow'] = weather_snow #---------------------------------------------------------------------- weather_sun = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAjhJ" "REFUOI21kr1Pk1EUxn/3bUurSGlS27eKYKJQjIaNmLC4gCbWGHUhEsLm5CCbm2FXY3RzMDEm" "LDKhAxo+NGj4C1AhsUgCGKW19PMt/br3OCANKOpgPNM5N+f87pMnD/yPkol2L4Dzyr6RexMJ" "/WnX2uux6CuUAER4QMVcB8hO2fJXgDMTmd46FHJT4Xeu8FmMcDo9ade0lhRA8kWwM/XycOv2" "jdoJyE3bBlAIH32nbnUAmOIqeAI47+89E9QlEQhdSKhdgPx02DZKhpp7k3czk7bs7xrBOKtI" "NYtSFsrjR+Mm/+Eh9sXErk/rQ2bSFhHwRPrwNHdinFWQGogGBKuxlc2NOMW114iA4232RWPx" "ct2DwLl1pY1kGkI9SCkBUgWpIVJFTAlT/oq76Qhay3jLlaSKxuLluoLkRHgC4bz3UB8+uxud" "XQRdRKT2Q0UV5TmA+FpxEgs4a3NYUgm29ec23AChWCIG8OX51H3l8Q97GnyYag7YUoFSWL4Q" "2fUF8mtz10TjcqH8wBYA4PN4cNAYhqulNA2BbixqSCUFIqh9EQqZNMXEPKLlUftAqu5d3QNj" "VG/L5aTKr8zc+Tb/mM1SDRqPYTWdoFgok1t5y2Yx26K1jC6OBp/smQOA5bGDUtWq3dsYjFec" "5Ir/6Jm2zPLsbYW6KYannUOpq79N4tJYuMugA9GB5FKlkKRjIHU0/Wm2LAYnOphSGvkl+u6d" "w/H+xPx2r0VGALTWPZbLHQA4ObTR/zPgn+s7VkcRCQnMr/IAAAAASUVORK5CYII=") index.append('weather_sun') catalog['weather_sun'] = weather_sun #---------------------------------------------------------------------- webcam = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAp9J" "REFUOI2tkc1rG2cQxn+70b5Cu7Zi5A8ZKtvEHxCDbqZ1GlKc0IByM9i5hx76N+RYWsiht/4P" "pqdijC8GI3qxUSxQ/QEGB5+E1bW9GAtLsnf33dW7uz0EqW587ZxmhnmeeeYZjS/Ctu0JIcRq" "HMclpdSCUgql1L7rututVmt9aWnp7/vz2v3CcZxvNU17bxjGsqZp6LqOUoogCLi7u6PRaGx2" "Op1fV1ZW9nqYR/c3Ax9M01wWQqCU4vDwkPPzc4aGhhBCYFnW09PT05FSqVTZ2trqAOg9giiK" "VlOp1LKmaYRhSDqd5sWL71h6+ZLBwUF838cwDAqFwrLjOKs9XKqXSClLAwMDSCnJZDJ8ql9R" "3ftIkiQsLj5javwxV1dXjI2NcXNzUwJ++4+CIAgWkiQhCAJEOk11r0J28muyT17xV12RzWbp" "drtYloXneQsPFHieh1KKMAwhSYhjCDGJIkGoPe6dSafTwXXdvvF9Ba7r7t/e3hJFEe12m+fP" "vsG9bdP2JN8/TWg2mwCcnZ3h+/7+A4JWq7XtOA4AlUoFA593r7/ix1cDdF2HnZ2d/meklNsP" "Tmi32+u2bb8pFoulVCrF0dERtVqNOI7RdZ1MJkOtVuPg4OBPYP2BAsMwFi3Lyu/u7m4CzM/P" "MzMzw+zsLMViEdu22djY2BwZGckLIX7o4TSAtbW1t8DvSilxfHw8eXl52dB1nWazSRRFCCG4" "vr5GCDGZy+Uaw8PDVKvVn05OTn5JASRJ8sfc3ByO4zAxMdEYHx/HNE0uLi7wPA/DMKjX6/i+" "38jlckxPT1Mul38GPhNIKTFNk0KhwOjoKFJKpJTk8/l+PjU1RRiGdLtd4jhGKfWvifV6nXK5" "TBAEBEHQB0kp+70wDFFKEccx/2v8A7ReXpAaK10lAAAAAElFTkSuQmCC") index.append('webcam') catalog['webcam'] = webcam #---------------------------------------------------------------------- webcam_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAu9J" "REFUOI19k89rHGUYxz/v7O5sM/ujIZhkiZs2goEUgpeQppZIUqOuBWkgiWeRUg8FTx7sH6DQ" "HAQv5qAQD0E8iJRaCMTgoaGbxNIQdSMSKixZk80Q3WR3Z2f2nd13ZjzoLqkBn9PzwPN8n+/z" "PN9H8B/b39/v13V91vf9jFJqRCmFUmrLtu2Vcrn87cTExB+n88XpwDTNl4UQH0YikWkhBJqm" "oZTCdV1qtRqFQuF+tVqdn5mZ2WjVhE53Bj42DGNa13WUUmxvb3NwcEBnZye6rhOLxYZ2d3ef" "y2Qy2eXl5SqA1gLwPG82HA5PCyFoNBpEo1HGx19hYnKSRCJBvV4nEomQTqenTdOcbdWFW46U" "MhOPx5FS0tHRwW/5IzY31gmCgLGxK1xMnefo6Iienh5OTk4ywKfPMHBddyQIAlzXRY9G2dzI" "krwwSvKFazzJK5LJJM1mk1gshuM4I2cYOI6DUopGowFBgO9DAwPP02mI860xqVar2LbdXnyb" "gW3bW5Zl4XkelUqFq1cuY1sVKo5kaiigVCoBsLe3R71e3zoDUC6XV0zTBCCbzRKhzjuvPc+t" "a3Gatsna2lr7MlLKlTM6WFxc7Lcs64vh4eGM4zgcHx/TbDbxfR9N0zgR+xzUn+I0alhOpXZs" "leZX5nMftXUwNzf3hqZp13d2dn7s6+sbGhgYIB6P09XVxZ9+nnL0KeOjY0yNvklTL+l/OYVX" "Yy+GEgJgaWlpDvhKKaXncrkLh4eHBU3TKJVKeJ5H72TA2zfegpDGjUvv88kP7xFC4+t792UY" "IAiCbwYHBzFNk/7+/kIqlcIwDIrFIo7j8LvzkIiIc/3STQA+mPqcB7kFBN+dC/8rIgzDIJ1O" "093djZQSKSW9vb1IKXny+B6/Ftf5ufiIO69/yd3v3+VcKEpA8A+DfD7P6uoqruvium4bQEqJ" "67qEL/ps/rLO1ZfGeZBbQBdhHv30EBCfPfON/2eXb6fuIsRtAYkALIJg4fGCeedvo0ZxnC4m" "azUAAAAASUVORK5CYII=") index.append('webcam_add') catalog['webcam_add'] = webcam_add #---------------------------------------------------------------------- webcam_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAuVJ" "REFUOI19k09oI3UUxz8zmZlskjYN0j9Rk+32UGixt6BdZaW7KEQXIdAKHvWyCF4UL3rcg4re" "BEEPQi/Fk3hYwUI2C0pjthUsla2r9uCGxiYduqZNMp3Jb5LfzM+LCV0LvtN78N73fd/3vafx" "Hzs4OMhalrUShmFeSpmTUiKl3HZdt9hqtb5ZWlr662y+djawbftZTdPeM02zoGkauq4jpcT3" "fU5PT6nVarc6nc4ny8vLm4OayNnOwIfxeLxgWRZSSnZ2dqjX66RSKSzLIpFIzO3t7Y3n8/nK" "+vp6B0AfAARBsGIYRkHTNHq9HtFolCtXnmfp6lVGR0fpdruYpkkmkynYtr0yqDMGjhAiPzIy" "ghCCWCzG79UjtjbvopRicfEy0+kxjo6OmJyc5OTkJA98+ggD3/dzSil838eKRtnarJC8+DTJ" "mWv8XJUkk0n6/T6JRALP83LnGHieh5SSXq8HShGG0CNOEFj0tLHBmHQ6HVzXHQo/ZOC67rbj" "OARBQLvd5rnLz+A6bdqe4IU5RbPZBGB/f59ut7t9DqDVahVt2wagUqlg0uX1F5/kxrUR+q7N" "xsbGcDNCiOK5O1hdXc06jvPlwsJC3vM8jo+P6ff7hGGIruuk6z8R/bWI1mzQj9DQVPjZS3fC" "j4camKa5mEgkpsrl8q1cLleYn5/HdV2UUly4XyLm3GfujbeJzjxF997tJ34r3/6gpP5wNYC1" "tbVXga+klNbu7u7Fw8PDmq7rNJtNgiDgBlu88s5NYn/+APUfYSzF38Y028Vy1QBQSn09OzuL" "bdtks9laOp0mHo/TaDTwPI/H7n3PhfQMXH93qL5x83EiSrtk/HtExONxMpkMExMTCCEQQjA1" "NYUQgt6DFN4v35H49i38ro0HOJ0IQYSGAVCtVimVSvi+j+/7QwAhBL7vc308RuruBpfGYxgR" "E+eh5IGtoVT4+SPf+H9Wfi37vtdsvKmH2nSoq3qI+uLlO+FH/wBb9XjOrMfhRQAAAABJRU5E" "rkJggg==") index.append('webcam_delete') catalog['webcam_delete'] = webcam_delete #---------------------------------------------------------------------- webcam_error = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAvBJ" "REFUOI1lk81vG2UQxn/reNf2+qMG0tCojiOQVSchAoIxLiUoLaA6t0gJqsSJC/8AAgmFC+IA" "CE78DYSe+JCKUFAOcGhwHFWYoKJSOQp17TjBWEb+ynp37Xf35YDcJuSRRpqR5nnmGY1G4X+o" "VqsTmqatuK6bFUKkhBAIIQqGYWy0Wq1vFhYW9o/3K8eLWq32oqIo76mquqQoCh6PByEEtm1z" "dHREpVK50el0Pl1eXs4POSPHJwMf6bq+pGkaQgh2dnY4ODggGo2iaRrBYHCqWCyOZrPZ3Pr6" "egfAMxRwHGfF6/UuKYpCv9/H5/MxP/8yC5cvEw6HMU0TVVWJxWJLtVptZcjzDhPLsrKhUAjL" "sggEAtwt1dnObyGlJJO5yOS5M9TrdcbGxmg2m1ng8xMObNtOSSmxbRvN52M7nyMSTxN54gq/" "lASRSITBYEAwGKTX66WGvAcCvV4PIQT9fh+kxHWhj47laIxqZRq/f4wUXTqdDoZhcErAMIxC" "t9vFcRza7TaXLr6A0W3TM9vMBX5Af+RpfMYtyuUypmkWTgm0Wq2NWq0GQC6XQ8XkzdfOcy2R" "J3rueSLjc3g6BSrFLSzL2jh1xsXFxYNyuTzj9/sTjuNQKpW4d3ebiPEj49MZpLmF79FX6Ja+" "b5Tr7ru3/7jXOuFAVdVMMBh8fHNz8wbA9PQUyccOGX/qGli/cuuL64SiJvHIYHQu7vnkhIO1" "tbXXgevA+f39/av5fP7tRinHpdmzjE6ewe3tcHjnL8aTAcKTbzCo3pz9sxnSqof1nzwAUsqv" "EomEFo1GmZiYqKSee4arsw7R+LO4vdtI1yS1ksTtH+L37zKVXiYTH7z/YAXLstB1nVgsRjqd" "JvMkxC+8hB5uIMU/oIxQ+HYXcHGtXc5emOTVpJebH8zMKACrq6tyb28P27axbZt3rnSYf+tL" "Rjz3kaIJSB7Cw0ggyd93fqP43Ydfn/jGIX7+bK4hhatLVyJd97+Qkoe1BNcFVxb+BQ8eZ89N" "b+QnAAAAAElFTkSuQmCC") index.append('webcam_error') catalog['webcam_error'] = webcam_error #---------------------------------------------------------------------- world = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAz1J" "REFUOI1dk0toXGUAhb//PubOJDOZTF40CdPEGtrQmtrGRINpAwVrVhUKUhQFX5CVunLfjRBw" "40KJCwUrCEUCxYXQUquhppbGxsRIbIyTGqOZpMk4M5mbzJ37+O/93VhpPavD4ePbHcH/8uaN" "V08KxFsoBhG0CpSBEhUEMyqKJj4Y+ezKg7y4X85PnTfKxtoFBM+fyZ62MolWbKcexwcZuki2" "uLZxWUah/Now5bmJU5N7/wnGZsfMuBtMDbQcGX42ewrbtfDwWbEFMWVRdCKU9EngsOlNczt/" "+2dP6iOT5yYrGoDlBhf6mw8On+gYoBT6BJpASo2ajOEQo+RZbLsJ1ism+5NPMtjeezR0qxcB" "9LenXzshUO+9dPCMvhhW2aRGLZLsuUlKnontQi6/S6VaxcoUEekcQy29fHNn5kDP6P4F/ak3" "jr8/2jn0mNATbGoSVBvtYZIft3Rqrsad/B5RvIzVtYzXkKMQlTHKIX3NWW127dcmQ8FgtqGT" "n5wNCnGNw/qjREjWtn1ct0Z6n8JuuspKtAOeolFa5Aoez3T3E3iyzxBKNdcZ9aw5G2x7Dqm6" "A+z4KcrliHSrS1vGoRAew/YWsNQuu38XKe3UkUykCDzZaEQKIRT4no0ii2GGXL4VIBJJNlck" "mmqgo7VGavckdj7AZZbAXwWlCKQURhSGJdu3O5v1RlLxx1kvGLiBSSxuEW9LcPf3Iu4PjRC5" "pNtMGus7SevblKsVwlBVtCAI5/4o/UlPXZaN7e+JzDwx3SNwHYLAIJbMYDXFMeIapgjR/QId" "7S2sbqyCUkta6IYfXlq6LruSrRhOnkrxJpmMhyE9TKGwNB3D98lk10m3fYdWW+ZYto+Ja5eU" "hvaxPn/xl7u9Z3sGvFr10BPthyk5DnHrEaKagWWZmEJiygrp+q/gXpH+I73M5xbJ3fvr+tz4" "wjsGgLsnXp76bf6GV/OPjh4fYXnbQK8opNgliDRIhmS7ujnU1823cze5snArZwTyxYfO9Nwn" "T6eqtv5FIOXpV4ZfNwj3oVQdQhO0pG22SnN8dPXLEMV0jOiFmfHFrYcE9zP07uDZSEZjYRj1" "RTLM/DtXQCwBn86PL3z+IP8PibCT70syInMAAAAASUVORK5CYII=") index.append('world') catalog['world'] = world #---------------------------------------------------------------------- world_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA05J" "REFUOI1dk0tMXGUAhb//3jtP5skwPIpTkGIzVXlYixL7MI1WVq0xMd3oQmLCyrpx464bF40b" "YzQsXJi6MMaQGONCLMWQhpa0FK0g0CJUi2F4lhnmznDnvn83tjF+q5OTL2d3BP/jvevvnBSI" "C0j6EGQFUkOKMoJb0veHPzv11U//9cWjcHHiolbSVi8jePNs7kwoHcmiG3UYNrieicsW4+uj" "ru+5V7WAe3749Ej18cDQzFAgbDoTxxqeOf5a7jS6GcLCZkUXBGWIXcNHujYRDDasSW4Xbs9Z" "rnpq5PxIWQEImc7lo5nDx08cOEbRs3EUgesq1NwgBkGKVohtM8JaOcDB2Av0teS7PXP/GwD1" "/cnBEwL58VuHz6rz3j4b1Kj5LlUzRtEKoJuwXKhQ3t8nlN5FJJfpb8jz8+Ktjs6Bg7Pqi+8+" "98lAa/+zQo2wobggG2nxYvyypVIzFRYLVfxwiVDbElZimR2/hFby6MrklJnVe/WahL5copXf" "jHV2wgpPq4fwcVndtjHNGslmiV4/xoq/B5Yk5YZY3rF4tf0ojuV2aULKTFSrY9VYZ9syiEc7" "2LPjlEo+yaxJY9pgx+tFt2YJyQqVh7sU96LEInEcy01pvkQICbalI8mhBTxGbzqISIyNFRdF" "JjiQrRGvnEQvOJjM4Nh/gZQ4ris03/OKuq23ZtQU8XAPazsaphMgGA4Rboxw/89dzOkU2eA0" "2fA8IVunYlYYnbqC58my5jjerw+Kf7d2RnOMb94gFe0kqOZwTAOppgjG0iSsSfLN93j+SD9P" "1D/FxML33JyfRDMqtuKZ3uff3b3mtsWyaEaB8u4U6bSF5loEhCSkqGjVcXrzPXiKR0/LGTzh" "0N/1EopjNStfnvt2zLLtH8cWr/Fyay9JtY50zCcZ9EgETeIBi1J1i4CIce7IBQA+eOULDjV2" "AwQUALMq3p74487c7w/uMpDvoyOl0RSVNKgVMopBqVJiYX2KS1cHAbg0Nsj97Tkk0lQBln5Y" "svOvN3+9VNjsvXLn+pPdTW1KIqiSDEoydTbBQIWF1Snam9p5aKxR3t/mxuwk+p716eM3PqL/" "o743fNcf8jy/y3e99L91WatVbeEYTQIRllBByuHp4c0P/wHlU5gKXouFjQAAAABJRU5ErkJg" "gg==") index.append('world_add') catalog['world_add'] = world_add #---------------------------------------------------------------------- world_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA1FJ" "REFUOI1djEtoXGUARs99zHsyj0wS04ZJTA0lWhPT0mggTSRgW0TqCymIgoqQhVr3rroRkW5c" "KHUnLSgiASsRrcZIrI1ibWof1NiYNCbaybMzk7mTuXMf/39/NyrSs/o4fByNO3ht+sUhDe0Y" "in40mjWUidIqaFxQQXDy3eHTX/3/r/07jk8dN8vm8ik0njmSPxjJxpqx7AS2B0I6CNaZXDkr" "Aim+MUPi6MmRse3/AqMzo6Go40/tb9ozeCg/guVEcPFYsDTCKkLRDlDCI4bNqnuei4WL11xh" "DI8dHavoABHHP7Uvt3vwwM79lKSHr2sIoVMXYWzClNwIG06MW5UQ7ckH6d/R3Sud2scAxuvn" "XzqgoU48t/uIcV3WWKVOPRBsO0lKbgjLgflClUqtRiRbREvPM9DUzbezF3Z1HW6/ajz08t53" "DrcN3K8ZMVZ1AaqFHTLJpXWDuqMzW9gmiJaJdMzhpubZDMqYZUlPLq/PLN9oNBX051NtXLFX" "2Izq3GfcQ4BgecPDceqkWxVW4wQLwRa4ioyIML/p8sjd+/Bd0WNqSuXiZoJle4UN16Yhvost" "r4FyOSDd7NCStdmUfVjuVSKqSvV2kdJWnGSsAd8VGTNQaJoCz7VQ5DFDkrM/+WixJKsLAl2l" "2Nlcp6E6hFXwcZjB9/4ApfCF0MxAypLlWW05I0ND9AFubZo4fohwNEK0JcbNxSLOzxmG1j/j" "0OrnxG7/RS0Vo7glkVJVTN+XvyyV/mzriueZXPuBTLyLsJHHd2yUkSGczDKwdIbHQjPc+8Kr" "RDr3UL82wa/TkxysbFi6dOR7n/52TnQkmzHtApXij2SzLqZwCWmKiG7Qff1DukeeJnrzO7TT" "zxJfPENneyOD68WM/sHjn0y4nvflxOw5Hm7rI20kyCYD0mFJKuzQEHLJbq8Tbe2EY+Pwdgne" "WMSs3SAuVJMJ4Gxrz0/9fnnarXu9h/cOM7dhYlQUQqviBzp2qhH7yhckxl/Bra9hA1XLQBqs" "GABz43Ne9xOtH80V1vq+vjzd2XtXh54KG6TDilzCI5fwqVz6HiOk4xs1KkXF4ooupVAnNO5g" "4M3+pwIRjEoZ9ARCZv/RlSdLdbtvaSkd91Uu0FUhQL3/6GTw1t8ng6MIHf5KyAAAAABJRU5E" "rkJggg==") index.append('world_delete') catalog['world_delete'] = world_delete #---------------------------------------------------------------------- world_edit = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA2FJ" "REFUOI1dk01MFGcAhp9vZnaXhcVlQSg/LopQ+VFUWjBWLIkH9UBpY0JMmpraHkovbZMmnuvF" "1MRrG5rUJtjERhJaD14k1pYqSEQMiMUiLFYW2eV/2V3Y3ZnZmfl6srF9Tu/hyXN7Bf/js6GP" "3haIz5G0ICgWSA0pEghGpON0f9P2Y/+rvng5zg+c1za08BUEnR3B456At5hkOo+0CZatY7HM" "7ehNy7GtXzWXdbr7WN/Wv4Guh12uHD070Lx9b+uJ4DGSugcDk9mkwC09rKcdpGXiJc2iMcho" "ZPSxYaltfaf7EgqAR89eeaNoT+vR8mZitklWEViWQsZyk8ZNzPCwontZSLio9B2ipaxuv62n" "rgGoXwx+fFQgL32wp0OdtFMskiHjWGzpPmKGi6QOocgmiVQKT2Ad4Q9xeHsdv/01srvmZOWE" "huDLk+WHXSt6ik3NQnFKKbRzGFoTOBaEljcRORvklv9NoTFG23Ac1dfIBVWoN5zUBU1CS3Bb" "BY/SUVZzFBrUahwswismup7BXypJFt4ikHzKqUQ93sZ38Fc1EX9ey5Fb3zdoQsqiXC2PcDrK" "ipEmP3c3cTOfjQ0Hf7FOSSBNSULjrPcg/pJmYs+mcAuT/G2lFBZWKpojEUKCaSSRBNFcNjfv" "ZxFeH4uzFtXOHB+WKRRUncBY7MWdKwg/ekrWhq/m/zQUx7ZjSTNJkVpAZd4BFlY96FkXjvTQ" "WDLH2dIwBdXt6NHLCNcGLl8+MjNHrKGRiGnElWzWHpuLzVOTGyS6cg/HFcGtGlSs9fPpjgn8" "Ne+iR75DcWUxk7tY+GOUkYo6ZrcSIOWUYuv2t9en7lg7fcVo6QiJ9WHqGeRM8AUle9sxl35A" "dUuM5E6idx/QIwNU1bbSffu6VFAuq+PXnjyrO1XTbGRStW+WNWBMPqaj2IdNGfbmz+TkSTLx" "Hczfe8hVAlTv28d4aJLQ0os7YxcnzmkA+pY4MzAzPmRkzP01qzEaOruY7j3HzOAwnsoDpGKL" "RI80cby8kd/HhumfuB/Sstb7ACrA9I1ps+690p+mI0sHfaHV19+q8BMoCxJbWGN+5jmi/RMS" "0uDrX3rs2aWFu26c9geXniz/540v6WwLmE1Vr2mH6qtEWKSc3kTcWJfEQUwBPeMXJ66+6v8D" "iTGVsYw0U2EAAAAASUVORK5CYII=") index.append('world_edit') catalog['world_edit'] = world_edit #---------------------------------------------------------------------- world_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA09J" "REFUOI1dk8tPXHUAhb87c+cJAwwMBBimVQqVh9SWgiVCSZpIWdWkiemmJvWREGPUf8BFY3TV" "mHShYeUCV40hMSYm1miVtMVqQ5VKLbU81OFpmcwMM8zcuY/fw4006lmdnHw5u8/gf3lz9uWT" "BsZbaAYxaDTQJtooYHBbKzX54egnX/2bN/bLxZmLZt5MT2Hw4pnUWCgeaaRoVWG5IKSN4BHX" "tq4KJcU3ZkCcmzw1XXp8MHFnIhC2vZmBRO/w6dQpinYIB5eVokFQh8haCi1cIlhsOzeZ25xb" "cIR/dPrcdMEHELK9qf6Gw8MjrQPkpIvnMxDCR0UEsQiSc0Ls2BE2CgEOVD/LYEvXEWmXrwD4" "3775yoiBvnT+8Bn/r7LMNhUqSlCyq8k5AYo2LG/uUSiXCcWzGLXLDCW6+HbxdnvH+IFf/Cde" "O3Z5PDn0tOGPsO0ToJtokdX89MhPxfaxuFlChfOEDj7EqVkmo/KYeUlfQ8p3J/1bvalhMFWT" "5K61RSbso8d/CIUgveNi2xVqmzXF+q9ZUbvgaOpEiOWMw/NP9OM5os80tG6ImlWkrS12HItY" "tJ1dN0Y+r6httGmKW2TkUZLzk0i7TCbVRW43SnUkhueIOp/SGIYG1ymirRZMT3L1Rw8jHGF7" "xWR9rYZWJ4LwNG2JbkIr83h2BbTGE8IwlZS5oltMNvjriIWfYSNjYnsBWtQb1EYlzqbHXlqQ" "rO+gu/kEe3aZhY3vyJXHkVIXTM+TP/+ZW0t2RFNc++t76qIdBP0phHIZ672A1AqpJArNVmGd" "vrZhSm6Fdz5/HXTnA5+05UefPbguDlY3YlqbFLK3iMcdbOEitSKdXeaP7BKrmUV2K1nSuVWO" "pk7S2XycvcDCiH/+yv3VrrMdA06l/NTxlh5ylkU49CSZzBd0NvUTDdYQDdZQFarDci0SsVbm" "129xY2nWckoybgLYJeOlmaX5WafiHhk/NsrDHZN7wmHqhw9wlYstXA4lehhqP81cepaZpetO" "xGvrXr38e+WxTC98/FysXPR/6gkxdmH4VRPZjNZRDJ9BorbIe1+ep7dliBtLs3vVXqrn3qWV" "jf/YuJ+h9wfPKqEmpFR9Ssj4P3Nh17yfkIrAmikDvIvY5/8G8pOs734l8r8AAAAASUVORK5C" "YII=") index.append('world_go') catalog['world_go'] = world_go #---------------------------------------------------------------------- world_link = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAA1pJ" "REFUOI1dk89Pm3UAh5/v27e8LW1pgQFutWAGmThlTDKUjLKEuDnI3MySuWHUqDEhMfHHf+Au" "XvCiickuGjPjYXFc9OBmQCQEYkYGui0bQyDDIm1XOtpSeN++v18PKjE+p8/hyXP7CP7HezNv" "9QnE+3h0I2gQeDKe2EIw67nupc+Pff3jf33x77g4eVEuyqnLCM6dTpxQaoMNlLUQmgm2o2OT" "46fMddt17HHZb5+/1D+6sxsYnhv2B3Rr8siep3tfTPRT1hUMTFbKgipPYVNz8WyTIBpZY5qb" "6Zt3DNt3bPT86JYEoOjW5a76A73JfUcoOCaWJLBtiYpdhUYVBUNhQw+yvuWnOfwc3XvbDzm6" "egXA98H020mB98lrB0777joqWSpUXJsdPUzB8FPWYTm9zZaqotRuIqLL9OxpZ2Jhdn/byebb" "vuffefbTk/GeZ4QvSFaywWtkrxNmPuejoksspHdwA0WUlt8xapbJu0XkokNHfUKaSy3WyR50" "J2ri3NIy5AMSB32tuNikNkx0vUL0MY9y3RgrbgkMj5itsJw3OP5EF5Zhd8jC8+qr5RApLcOG" "oRGp3k/JjFAsukQbdBprNfLOYcrGbRRvm+1HmxRK1YSDESzDjsmuhxAemEYZjwSy3+H6DQsR" "DJNdsZG8GvY1VIhs91FOW+jMYZmr4HlYti1k13EKZbMcr/fFiAQ6SaVdRGqRVh7xeGM9izNZ" "7tCOJdl0uvdob24lkwswO30fz6QsW5bz6x+FtXhbdYLx9DTqLzt0BeNcuPAGqqrSur6OPD2L" "asGbQ+cIVPnJZrPMz89Tk6k1fIdfObh5b2P11VNtSWlyfILajTAvvXyWjz77gu+ufMPq6gNa" "m+MYW3l+npjg6uhVilqW/r4TlNZKfumrM9+OGaZ5bWxhishmkGgkCkCsZxBNNxgaGiKZTDI4" "OMjAwAC6UcH3pP63E4tJMoC+I16fXPptpoHoIfI5ALQb3yM8l5GREUKhEACqquK5cOvamnbq" "XarT6bS+e6YzXx6NFFbcH6IP6pIv9B4X8XgCv+Qjl8uxtLSEoii0tLTQ1NSEaZml9T/XmZqa" "ergb+Adfcvjoh6GHkY/jTfGAUqUIgeA+d0u27Kx22J1PCQSGYTiZTCavqurZvwD5UpqnRCXH" "YwAAAABJRU5ErkJggg==") index.append('world_link') catalog['world_link'] = world_link #---------------------------------------------------------------------- wrench = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAh5J" "REFUOI2Nkb1rE3EYx7+5u9gzL5qK1rqUqnRQS+gSnOxoA5kkov9BO4W6OcWgtVqQBDk6FbIF" "pGAxIEgHpxQsNNjBGElJtR5BCMYQm5zJ5e6e5+dSS9WmzbN++XyeNxf6qHQ6fU8IMS2EGGNm" "zMzMuP9kUj8wM8+Hw+Er0WhUISLlYH6sgIimp6amPLIsI5/Pg4j+ypUe3H4x85gkSahWqyiV" "Smuzs7OTqVRKMDOY2elnAle320W73QYRiWQyuTYyMoJIJAIiOnqCxcXFMBFJnU4HsiwjGAxO" "MjNUVUW9Xgczlw8VPHtZ0Ry7c4Nrq+OhUMhlmiaEEPB4PCAiEBFyuVybiJb+Eyws69qgX4k5" "5IMh3YTXa6FSqaBQKAghBO3tXmbmpUQi8dx1EH6yrGtDp9yx0eGTYCHw4auBRv0n/PU3pm3b" "4/F4/PO/DfcFj1/o2rmAO3bpvIofTRsOCQS8Cja3Wyh/a21k7gevH7auBACPMjvaWb87dnFI" "xfddGw3DgeUI2Cxg2gK/urLe69BSIrOjnTk9EBsdVlHbg92yCwGvjI1SC0XdWHn14NqdXgLF" "sjl2+cIAarsWGoYD1S1h0KdgvWRgq2KsvH4YvN0LBgClbTIcBzBtgROyhEG/gvUtA0W9mV2d" "mzgSBgCpbfH7ze0mAh4ZAZ+Cd5+a+PilmV2dm7h1HAzsfeHu02LRcnDVshx0bZF9u9AfDAC/" "AXxTHGbDwtyjAAAAAElFTkSuQmCC") index.append('wrench') catalog['wrench'] = wrench #---------------------------------------------------------------------- wrench_orange = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAfxJ" "REFUOI2NkU9I03EYh5/fNmvNLIlMy/DmQR27Sae8OtgpFh06BBFql2HnQCQw8TKJ4UnYJYKI" "EHYuPDgv4VgX0Qwb00a1g9PM3H7bb+/77TCzLKd7rx+e5/1n0UDF4/FHxphhY0y3qjIyMtL0" "O3M1Aqvq02Aw2BMOhz0i4vk7P1UgIsODg4M+t9tNKpVCRI7knjrcYalqt8vlIp/Ps7a2tjg6" "OjowPT1tVBVVrTYygVUulykWi4iIiUaji11dXYRCIUTk5AlmZmaCIuIqlUq43W4CgcCAquL1" "eikUCqjq+rEC8/phrFgxN+MF9ff391u2bWOMwefzISKICMlksigis9Z/8KuhGBeuRxCHvb09" "NvoekMvlWF5eNsYYOdh9XVVnx8fHnx0RmJdDMVqvRmjvA2Mg+46d7R1mt3tsx3H8Y2NjmX8b" "HgrMi/sxLnVG6PDDbh7UgeY2+LRA5fPK0tnHSzeOW9dVg+/FaL0W4UovfP8KP7fAqYA4ULE5" "4/zYrHdoj3l+N8bFzggdvbD7Dfa3wOOD5svwYR5y6TnryfqdugKccoSOvj+dm85BSxt8nIeN" "9Jw1kbldD64J7CJUq+DY4PFCSzusvoXN9wlrMnsiXLtBdT9NZqE28vk2WH0D2VTCmszeOg2G" "gy+YicAK4vRStcGpJKypLw3BAL8A5dwBXOjudkkAAAAASUVORK5CYII=") index.append('wrench_orange') catalog['wrench_orange'] = wrench_orange #---------------------------------------------------------------------- xhtml = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAehJ" "REFUOI3Fkz1rlFEQhZ/77mY/ZBOJGi1SBAmCBFQsRAsLMQo2lmJtY+lvSBHL/AE7GxGCWKSz" "SIKFFiKYwlSCXxExgjGbfffde2fujMVuQNAugtMMw8wZDnPOhFDUOEgUB0L/iwVhYXnb/9ZQ" "M0SMqIoIVOpUUYmiVMkpxagqpQ5w8VT7N6ij5uQ8zJodUUfMEHFEDclGUuPB6rfhAoBuX8nG" "CGSkPBpWJ6kRNZPEiWokMY506lS9EYMb5zo829hj/kyH3X7m8Ysdbl2apN0I+JAUGx/7rG/u" "cufKCaIaD9e3sUoooir9aEx2aphBc6ygSpl2I7C08pUALCx/Zmaqwdx0m+mjDU4eb1GJYaVS" "lFF5+a7kwuwhnr7aoTUWuHttinot0IsZB8qYMYPLpycA2BtkomS8zBS9yrk6N87a2y7Xz07Q" "j8b9J1+I4pSDjDuUg4y58+ZDj0/fI+4wEMdiotitEpKd55tdakXAHXpRcXfKmMGhTBlzWFrZ" "4mdfOdyusXh7Bo9OmF/c9JvnJ9n6EUliRDWi7F9+KNe+GpINGck7c6zJ6qP31Lt7SpUy460a" "aSzQkoA0HdWAaIGYI9nJ2VCDbIY7+Mh+Yfbeax9Uiotj0fCkuBgeMyTDsw1rdTD708r//Rt/" "AUr5Y5HHZalgAAAAAElFTkSuQmCC") index.append('xhtml') catalog['xhtml'] = xhtml #---------------------------------------------------------------------- xhtml_add = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAlBJ" "REFUOI3VkstLVVEUxn/nnnvVW1fFRC0sIk1IKUOiB6EQmuCgggb+AU0aCI6cGE0cGDRxFg2c" "RCOD6EGBgdCDEIuCwkijB0TYQw009Z573GfvvVaDa9CggdPWZA3W+n58fGvBf1/B0M1F/dfA" "iWCtYJzDWoidEhuHsY44USIrxLEjDXC0KfuXVHGieF/szivWKVYEaxXrBOuFxAmjjxaKAIDV" "gsMLGyIh8RvLTkmcYJwnsYpxQmKFbbk0cX7DQc/BHBPTa3QdyLFS8NyYWqb3WBXZkgAtmmL6" "S4EnsyucO1GHccL1J4tIbEkZ5ygYoSoXIgKlmRRx4smWBIzc/0EADN2cY3dNCS31WeqrS9hT" "W0ZsBYkcqcg4nn2KONy4hTsvlynLBJw/WUM6DMgbjwKR8YhA+74KANbWPcZ6NPKk87HS2VLO" "45lVulsrKBjh0u1vXDhbT7TuUYVo3fN89h4v3o2Tj5dJXELedSCmjfRKnGC98nR2lUMNW1GF" "vHGoKpHxoBC4Cd7/fEVnx2F2bmvi8cxdnr8do7ruA0HX8Kyebqvi65IhsYJxgrF/ki+eq1IG" "6D3VA2GKM839jDw8T0iKsVsPSK2uOeLEU14WUr4lpDIbUpULqc6F1OTS1FZk+JVfIBPkONPc" "D8BA1yiNta0EKUt6KbZcGf+GWkWMoIlDraDGQyKoF/buX2bm+xTT3ycZ7L7G5YlzlIWlqGQI" "NvPvR/p2DO9qqLx4vLWdpu1tfJx/zdSbSeY+r4xsClCEbL9MEPQFUK6whurVF1fnB38Dbx9X" "0Q/vGq0AAAAASUVORK5CYII=") index.append('xhtml_add') catalog['xhtml_add'] = xhtml_add #---------------------------------------------------------------------- xhtml_delete = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkZJ" "REFUOI3Vkj1oVFEQhb+3+7LZNZto4l9EQohBEIOKiGhhIf6AES1FLCwsNCJiYSUIsoXa2Qli" "OisFEUFRQhQNmmhhYwS3EAWDSYzRJGQ377297947Y7FRLCxsnWaKmfNxmDnw31dQujutfxs4" "EawVjHNYC4lTEuMw1pGkSmSFJHGEADvWF/6QKk4U7+vdecU6xYpgrWKdYL2QOqH/2bc6AKAS" "O7ywKBJSv7jslNQJxnlSqxgnpFZoK4YkC4sODmwpMjhaZe+mIvOx586rOY7sbKWQC9C6KUbH" "YobK85zYvRrjhFtD00hiyRjniI3QWswiAo0NGZLUU8gFXHv4lQAo3f1C58ocG9cWWLs8R9eq" "PIkVJHJkIuN4/TFie/cS7r+ZI98QcGrfSsJswILxKBAZjwjs2tACQLXmMdajkSezkCh7Njbz" "/H2F/ZtbiI1w5d4ExipRzaMKUc1TeXKT8tnNjPTmed+3nu5yP2JSwvkkxXrlRbnCtnVNqMKC" "cagqkfGg0DN2Gx1/ys5jJ2ns6iF5N0jzyBNGNSbYe7msh7e2Mj5rSK1gnGDsr8vX33V8+CCH" "Tp+j8GkIJoZh6TJ+hJ0MDHwgrFQdSeppzmdJGwLyNsA2Ks4FWJfBitIWTZJv74KD53+nJSyt" "oZ0ZwtnEcv3xBGoVMYKmDrWCGg+poF7Yl2sjfvuIpgdnMMkUMVCtZPkRLCf4l7y/PLqmlCs2" "XexY4cMwM071u+PzVNanNbn0T4A6pONCPDPZl5GgUzI6IeiN3qdy9ScvOWh2JshAWAAAAABJ" "RU5ErkJggg==") index.append('xhtml_delete') catalog['xhtml_delete'] = xhtml_delete #---------------------------------------------------------------------- xhtml_go = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAkJJ" "REFUOI3VkktIlFEUx3/fzGijjZFiKmSCSkSGFUVUSBCpUYvaRZsgCmrZslWBUC6DdkE7XQlS" "LVoE0UOEiqgMiYQeFM5QoVDTPL755t577rktNGjRom1nc+D8H/wWB/77icaml8PfBFHFOcWI" "4BwkEkiMYJyQ2EDslCQRMgB7Nzf9EQ2IBrxf2eIDTgJOFecCThTnFSvKzUdLKwUA5ZrgldWQ" "Yv2qWQJWFCMe6wJGFOuUtlyGpLpKcGRHjvvzFYYHc5RqnqmnRU7sa6WpMSKsQDG/WGNmocSZ" "g50YUSZmltHEkTIi1IzSmkujCmsaUiTW09QYce3uNyJgbLrArdfHyJeP07E+0NuRJXGKxkIq" "NsKzjzF7+pu586JItiHi/MgGMumIqvEEIDaeuli627dybmIXP+IY4zwh9mSqSeDQQAuP35YZ" "3b6OmlHGb3+hHp1CcVyc9ti0Y2PLZrZ27aVSjzk7uYWOzD3UWDKlxOJ8YHahzO6+tYQAVSPQ" "aBnddhofFK8eJfC1VGCwe4iqTZgr7CfSSTI/a44b95eoGs/lqTxGFOMC6ZTFB2Xx+wecCqIO" "5x1lU2HnpgNUXY3iyEky5YqQWE9LNo1tiMi6CLcmsGzriBc61/Ug6vFB+VbK05brYq7whOef" "FijOXifqv/Aq1BMhuIAaJVghOGXo6Fnq1mLVUhdLf/sA+/oO8zL/lAdvXhA/HydUe4j+9ecH" "rkTxnp5DzTPvH35xEcNfr/IO+PeC3kvEPqSbDb5vaZzPv++/APm8cVtKz8T3AAAAAElFTkSu" "QmCC") index.append('xhtml_go') catalog['xhtml_go'] = xhtml_go #---------------------------------------------------------------------- xhtml_valid = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAmdJ" "REFUOI2dk81rnGUUxX/vO8lkRpKUsU1DSWqUKkilLRVEqW7shx8LBQtRRNcu/QNcuWgXhXbj" "ztJNoVRBq5aCiyza4kIREezCLERoakbFFhozM+878zz3y8W04i7q2VwO3HPv4R5uwf/EsXOH" "l1Xlw/LfNL/15WuLr396/Nn7/Oi5518VyR8tzO/qFFuJ3768/KhkeSJJ+kzEX5Q0amWzL3bt" "nG+sddf7WzrIqp2U06Xdc4ul5LyS3S8/vLi7sdZd74eWTxbvrVwIAA/HzTF3zBwxRbKRRKi1" "S7R/YtvMDIO6Zv2325TpECptJpqbL/D0Y+1/7AzUA7NxVQtEg5u9b7l26zThBS8/9AHNYp6z" "V/9g4r6sVyvm3BM52QJRRzTI6oTu4+DsKbIFdzY6PDjtDAc6HvDSgWlWbvQ5sm+azdr4+OsN" "lp/p0G4WxNgUN27VXF+FNw/tIKlz/vptfCiUSZU6OZ3pBu4wNVkyzEa7WXDmyu8UwPufrLM0" "12TvQpuF7U0e2dliKI5XSlkl5ZufK57a8wCff7dBa7LgnaNzTDQKBskIoEqGOzz3+CwA/ZGR" "xIjKKAfD4PDeGa792OPY/lnq5Jy89CtJgmpkREA1MjyCH9YG/HInEQEjCTxlys1hRiz4arVH" "oyyIgEFSIoIqGQRU2fCAM1e6/Fkr29oNTryxRKSgOHJiNV452KF7N5HFSeokGV8+qZPV/05D" "zJF78S7tmOLqxZtM9PrKMBszrQZ5sqAlBTIVqBaIlogHYoGZow7mTgREjOMv9rz7fYyGSkjg" "yYmshDiRDLIT5mOuAe5bf95/xV8sNJdQu6rCfwAAAABJRU5ErkJggg==") index.append('xhtml_valid') catalog['xhtml_valid'] = xhtml_valid #---------------------------------------------------------------------- zoom = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnVJ" "REFUOI2Nkl9ozWEYx7/f93eObTTjYAzZykimXe5YTsilZKPdYGsWx5UipU65Imm50a5WSpia" "P83ZrtyxrBWrIaKUOVnkWGZz2tn58/57XPhTOmo+9++nz/s8D/GL8f72KKkShIqBQUS8h2g7" "Y4weRdF2N5+8P4Z/oADgRX9HPGB4CB61rqh7fD7XUJjLNBid74GXWglCQyNXWuP/EnC8vz0a" "MDzkrb6OWO8tEg0g15FwFD+pIG++D3YeJ4IuYwqte84++KtEESrhnUtLrLePCrtBbCKlTMBy" "gap3DJorW25c9d6lxTFR8gWCMW91MhTCVgBVJJyAjiIOhBFIlahQvc2bJKBipTOgirDIARHW" "gMpCaCCwIIyIOAocidVG2wEqRkoE3guKKAIiFiJGfj6wXsQS8EI4CiwAiHWlW7DazCin2jzV" "JAkLJdaLOKXghLAUsY6SFittpmBmSgu0HhXhQeXMWwi+kjAkLEQsRZyAsyEGKS4KnXPapUoL" "csVuD9RkBo+e8C4YAzihhHMQlSU4EajgWSbZmVq7dXN5hXFNyVOxQ3/dAQAMX94fD8K8YLRL" "e22SzsoAAIh2bRUrlp6v3rJFVa6pgylkkRoewfyHL2taro1N/REAwKNLe6POIwEypoiIeIHW" "bi4chKvqdu5AZfV6UClkPr3DyzsPvYFee/ja2BSxAIOnd3VENtT0bYhGUb50OYrZOUy9fo6H" "A0/eb6td0hgsJLj7dPLVvo3LUvlv0wcWLQ7D5PPITn1GmcnDzuZ6Fiz4zb14U4fJu76V9auQ" "+TibNjnbeOT2s+n/FgDAvWPbI9/nC2fCZVUXu24+LgDAD7oITKWdR0P4AAAAAElFTkSuQmCC") index.append('zoom') catalog['zoom'] = zoom #---------------------------------------------------------------------- zoom_in = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAoxJ" "REFUOI2lkl9ojXEYx7/P733fbcaMuXCWmgvnJHa1q2M55c+YGzFyQU2IkSJuaLnjQpLSQkSi" "qeXPnHO4UC6ktGI25s+WNbZM7GxhnBznfd/fv8eNP82WXfhePVefPs/zfIH/DP0aOlvq40Si" "kSASIKeMrQVLPaqUbEOoj1Xvudk+EUAAQFfL5gaHvDQs5ppQNlk/Xxl8y1Yq6TfB8lx23PSD" "k3UNExp0ttTHHfLSVstLSJy9QoRKEM0hgiG2gwLc8zW1ZQfB2aZUULf8wJ0xJoIgGq0xGU6c" "bSaBpSDEiLiQQUUMETXkVJesvXzeWpNhQ43jViBQwmqZdF0sBFBKBMMgQ8wGBMXgUhZuVPsq" "CYjE3wAXJMoopFZmqgGRBrMBYEEw57p3n5JSQQUK9VIvKJjqHh5nYC0jRAgwazArZhgiaMus" "A19iZawWfj4EALA2447oaqlGhREbLIlOAZ7HxHz62a4zKlSITCtHoANEpkdwYlrfKxlkx7/R" "StnGTOuFUb1gfCSCCvMhls2vQTQSw3BuGLGKGFYt/mMyBqDz4TELlGdTW3da47QD9MbPh0i2" "JdHR2wlPFOHx8w5cTd9AmA+R3JfYNKYHAHD/+JoGx6MjSpqMlSppNLcCwFE3+2rFklqkb6dw" "a+NeqCCHgfsP8P3tcGTtxfYR4GcTlx28fUH7qs4qOwjh7vMKvR7Xc3v8fIhkKonAl/CmFGPq" "rAgqFlVBomCoZXt89m+DfyW1f8nmsory5op4HEXTZyLMfcNI91Pca33Yf+hub9SZDHDt0eCL" "1fNmDPifP60rKPagfB+5kSEUqiB748mHpkkBAHC9492L1dGS1++7+qp18KXk8+tMf5BHVerl" "h/AHpqNL5vYKHLwAAAAASUVORK5CYII=") index.append('zoom_in') catalog['zoom_in'] = zoom_in #---------------------------------------------------------------------- zoom_out = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAnlJ" "REFUOI2lkk1IVGEUht/z3Zm0YJyayrRCLSeQhNo1SENFy4g0cWMpFTStgtoEg7tchEgQLkoK" "pLDQfqbRVdDCBBFK0KIoCCJJ+pkGzLx6Z+7c+/2cFqGQI7joXZ3NeXjewwH+M7Q0TA60xYhE" "kiDiICvCxoB9NSelPw5PdTVcfDqxGkAAwJuB9oRFwWEYVGvP7zFuvr6waNdL3+2B4Wq2AsNj" "N5oSqxpMDrTFLAoOG+XfRbz3PhHqQbSDCJrYzAjwh/mhM+cJ1jkpC01Hrzz7x0QQRNJoneF4" "bz8JHAFhDxGXMKiUIaKarIZQ4707xugMa0oWVSBQ3Cg/HQhgL4AwETSDNDFrECSDwywCUeXK" "NCDixTcgESGPUsxUCRIKTBIMBYJkZk0MTYRt0lcpEhQpAhjD8OABzArMkv8uKMOsCDBM0MRQ" "AMBKFx0xoHw5J7RoMSQmBbiWiXn/rc6bxvVgnBy07UDbC9g170DbTjHA+P44mJqFlg8gAmUk" "EDauB9XaDC4UwHkXyOUhci5kR9cqBnmvS6wrGbaHzl4INQ3eFkLvNk4OfL0X2l6Anl+Ath0Y" "Jwfjekhfirc294wPLv8BAIx2n0hYQeqUvs4YX6a14hQAsK9b1m8uu1peVydCFTWQBQfTo2PI" "fflZ0dg3kV0GAMCLa8di2iAJorggRNgwfF8vBq1guObQQYTKd4KEgP3tE94+HDES/vZTfRNZ" "WtlpZYYuH26PVFX2V8ViKC3bBM9ZRPb9a4ykXn7ueP4xaq0FePRq5t3x2o3T7q/Zk+s2BCFd" "F072B0qkiydT37vXNFjK48SBdunq/i3RrbC//s7IvNp3enBq9g9qa0zXvsOCsAAAAABJRU5E" "rkJggg==") index.append('zoom_out') catalog['zoom_out'] = zoom_out # Added so that the img2py module is runnable, for a sample of all available art. import wx class ArtFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title="Available Icons") panel = wx.Panel(self) self.Sizer = wx.BoxSizer() self.Sizer.Add(panel, 1, wx.EXPAND) import wx.lib.art.img2pyartprov as img2pyartprov class fakemodule: catalog = catalog index = index wx.ArtProvider.Push(img2pyartprov.Img2PyArtProvider(fakemodule())) panel.Sizer = wx.FlexGridSizer(cols=40, vgap=2, hgap=2) iconNames = sorted(catalog.keys()) self.SetIcon(wx.ArtProvider.GetIcon(iconNames[0])) for iconName in iconNames: bmp = wx.StaticBitmap(panel, bitmap=wx.ArtProvider.GetBitmap('wxART_'+iconName)) bmp.SetToolTipString(iconName) panel.Sizer.Add(bmp) self.Layout() self.Fit() def main(): app = wx.App(False) frame = ArtFrame().Show() app.MainLoop() if __name__ == "__main__": main() wxbanker-0.9.1/wxbanker/art/transparent.py0000644000175000017500000000253212243601243020625 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # transparent.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . """ This file exists because wxPython wx.EmptyBitmapRGBA does not exist on all platforms. """ from wxbanker.art.embeddedimage import PyEmbeddedImage catalog = {} index = [] transparent = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dE" "AP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oCFgEaIY1FTngAAAAZ" "dEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAEklEQVQ4y2NgGAWjYBSMAggA" "AAQQAAGFP6pyAAAAAElFTkSuQmCC") index.append('transparent') catalog['transparent'] = transparentwxbanker-0.9.1/wxbanker/bankcontrols.py0000644000175000017500000002103312243601243020172 0ustar mrooneymrooney# https://launchpad.net/wxbanker # bankcontrols.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx, datetime from wx.lib.pubsub import Publisher from wxbanker.smoothsizer import SmoothStaticBoxSizer from wxbanker import localization def fixMinWidth(ctrl, values): """Set the minimum width of a control to the max of all possible values.""" # Calculate the width of the button. ctrl.Freeze() minWidth, minHeight = ctrl.MinSize for value in values: ctrl.Label = value cWidth = ctrl.BestSize[0] minWidth = max((minWidth, cWidth)) ctrl.MinSize = minWidth, minHeight ctrl.Thaw() def DateCtrlFactory(parent, style=wx.DP_DROPDOWN|wx.DP_SHOWCENTURY): """ A function to return a DateCtrl given a parent and style. This factory prefers creating a generic (non-native) control as it is more flexible, but will return a native if necessary (Windows < wx 2.8.8.0, OSX). """ isGeneric = False try: DatePickerClass = wx.GenericDatePickerCtrl isGeneric = True except AttributeError: DatePickerClass = wx.DatePickerCtrl dateCtrl = DatePickerClass(parent, style=wx.DP_DROPDOWN|wx.DP_SHOWCENTURY|wx.TAB_TRAVERSAL) dateCtrl.SetToolTipString(_("Date")) dateCtrl.customKeyHandler = None # An isinstance won't work here, as wx.GenericDatePickerCtrl doesn't exist on certain platforms. if isGeneric: def onDateChar(event): key = event.GetKeyCode() incr = 0 if key == wx.WXK_DOWN: incr = -1 elif key == wx.WXK_UP: incr = 1 else: event.Skip() if incr: dateCtrl.Value += incr*wx.DateSpan(days=1) try: dateCtrl.Children[0].Children[0].Bind(wx.EVT_KEY_DOWN, onDateChar) dateCtrl.customKeyHandler = onDateChar except Exception: print "Unable to bind to dateCtrl's text field, that's odd! Please file a bug: https://bugs.launchpad.net/wxbanker/+filebug" # date controls seem to need an extra bit of width to be fully visible. bestSize = dateCtrl.BestSize bestSize[0] += 5 dateCtrl.SetMinSize(bestSize) return dateCtrl class HyperlinkText(wx.HyperlinkCtrl): """A hyper link control with no special visited color, which can accept a click callback function.""" def __init__(self, parent, id=-1, label='', url='', style=wx.NO_BORDER | wx.HL_ALIGN_CENTRE, onClick=None, *args, **kwargs): # By default, disable the right-click "Copy URL" menu. wx.HyperlinkCtrl.__init__(self, parent, id, label, url, style=style, *args, **kwargs) # Don't show a different color for previously clicked items. self.VisitedColour = wx.BLUE # Bind to the optional callable. if callable: self.Bind(wx.EVT_HYPERLINK, onClick) class CompactableComboBox(wx.ComboBox): """A combobox which can be Compact'd to only take up as much space as necessary.""" def Compact(self): # Calculates and sets the minimum width of the ComboBox. # Width is based on the width of the longest string. # From the ideas of Mike Rooney, Cody Precord, Robin Dunn and Raffaello. comboStrings = self.Strings if len(comboStrings) == 0: self.SetMinSize(wx.DefaultSize) else: height = self.Size[1] maxTextWidth = max([self.Parent.GetTextExtent(s.strip())[0] for s in comboStrings]) self.SetMinSize((maxTextWidth + height + 12, height)) class MultiStateButton(wx.Button): def __init__(self, parent, id=-1, baseLabel="%s", labelDict=None, state=None, style=0): wx.Button.__init__(self, parent, id=id, style=style) self.BaseLabel = baseLabel self._State = state if labelDict is None: labelDict = {None: ""} self.LabelDict = labelDict self.State = state def GetLabelDict(self): return self._LabelDict def SetLabelDict(self, ldict): self._LabelDict = ldict fixMinWidth(self, [self.BaseLabel % v for v in ldict.values()]) self.State = self._State def GetState(self): return self._State def SetState(self, state): self._State = state self.Label = self.BaseLabel % self.LabelDict[state] LabelDict = property(GetLabelDict, SetLabelDict) State = property(GetState, SetState) class UpdatableSearchCtrl(wx.SearchCtrl): def UpdateValue(self, value): """Update the value such that the control has focus and the text is not gray.""" self.SetFocus() self.SetValue(value) self.SetInsertionPoint(len(self.Value)) class HintedTextCtrl(UpdatableSearchCtrl): def __init__(self, *args, **kwargs): conf = {"hint": "", "icon": None, "handler": None} for kw in conf.keys(): if kw in kwargs: conf[kw] = kwargs[kw] del kwargs[kw] UpdatableSearchCtrl.__init__(self, *args, **kwargs) self.ShowCancelButton(False) if conf['icon'] is None: self.ShowSearchButton(False) else: self.SetSearchBitmap(wx.ArtProvider.GetBitmap(conf['icon'])) self.ShowSearchButton(True) self.SetDescriptiveText(conf['hint']) try: self.Children[0].Bind(wx.EVT_CHAR, self.onChar) if conf['handler']: self.Children[0].Bind(wx.EVT_KEY_DOWN, conf['handler']) except IndexError: # On OSX for example, a SearchCtrl is native and has no Children. pass def onChar(self, event): if event.KeyCode == wx.WXK_TAB: if event.ShiftDown(): self.Navigate(wx.NavigationKeyEvent.IsBackward) else: self.Navigate() else: event.Skip() class GBRow(wx.Window): """ A convenience class for representing a row in a GridBagSizer, allowing it to be hidden. """ def __init__(self, parent, row, *args, **kwargs): wx.Window.__init__(self, parent, *args, **kwargs) self.Hide() self.Row = row self.Column = 0 def AddNext(self, ctrl, *args, **kwargs): # Handle the arguments, including giving everything a top padding of 6 pixels. if "flag" in kwargs: kwargs["flag"] = kwargs["flag"] | wx.ALIGN_CENTER_VERTICAL | wx.TOP else: kwargs["flag"] = wx.ALIGN_CENTER_VERTICAL | wx.TOP kwargs["border"] = 6 # Add the item. self.Parent.Sizer.Add(ctrl, wx.GBPosition(self.Row, self.Column), *args, **kwargs) # Increment the column count by the number of columns the item spans. self.Column += self.Parent.Sizer.GetItemSpan(ctrl)[1] class FlashableButton(wx.BitmapButton): ID_TIMER = wx.NewId() FLASH_DELAY = 1000 def __init__(self, parent, bitmap): wx.BitmapButton.__init__(self, parent, bitmap=bitmap) self.EmptyBitmap = wx.ArtProvider.GetBitmap('wxART_transparent') self.OriginalBitmap = bitmap self.FlashState = 0 self.Running = False self.Timer = wx.Timer(self, self.ID_TIMER) wx.EVT_TIMER(self, self.ID_TIMER, self.onFlashTimer) def StopFlashing(self): if self.Running: self.Timer.Stop() self.SetBitmapLabel(self.OriginalBitmap) self.Running = False def StartFlashing(self): if not self.Running: self.Timer.Start(self.FLASH_DELAY) self.Running = True def onFlashTimer(self, event): if self.FlashState: self.SetBitmapLabel(self.OriginalBitmap) else: self.SetBitmapLabel(self.EmptyBitmap) # Now toggle the flash state. self.FlashState = not self.FlashStatewxbanker-0.9.1/wxbanker/bankexceptions.py0000644000175000017500000000265612243601243020522 0ustar mrooneymrooney# https://launchpad.net/wxbanker # bankexceptions.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . class InvalidAccountException(Exception): def __init__(self, account): self.account = account def __str__(self): return "Invalid account '%s' specified."%self.account class AccountAlreadyExistsException(Exception): def __init__(self, account): self.account = account def __str__(self): return "Account '%s' already exists."%self.account class BlankAccountNameException(Exception): def __str__(self): return "Account names cannot be blank." class InvalidTransactionException(Exception): pass class MissingLinkException(Exception): pass class MintIntegrationException(Exception): pass wxbanker-0.9.1/wxbanker/bankobjects/0000755000175000017500000000000012243601243017407 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/bankobjects/__init__.py0000644000175000017500000000000012243601243021506 0ustar mrooneymrooneywxbanker-0.9.1/wxbanker/bankobjects/account.py0000644000175000017500000003537212243601243021427 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # account.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wx.lib.pubsub import Publisher from wxbanker.bankobjects.ormobject import ORMObject from wxbanker.bankobjects.transaction import Transaction from wxbanker.bankobjects.recurringtransaction import RecurringTransaction from wxbanker import currencies, bankexceptions, debug from wxbanker.mint.api import Mint from wxbanker.currencies import CurrencyList from wxbanker.currconvert import CurrencyConverter import datetime class Account(ORMObject): ORM_TABLE = "accounts" ORM_ATTRIBUTES = ["Name", "Balance", "MintId"] def __init__(self, store, aID, name, currency=0, balance=0.0, mintId=None, currNick=False): ORMObject.__init__(self) self.IsFrozen = True self.Store = store self.ID = aID self._Name = name self._Transactions = None self._RecurringTransactions = [] self._preTransactions = [] # Make sure that Currency and Balance are not None (bug #653716) self.Currency = currency or 0 self.Balance = balance or 0.0 self.MintId = mintId self.ShowCurrencyNick = currNick or False self.IsFrozen = False Publisher.subscribe(self.onTransactionAmountChanged, "ormobject.updated.Transaction.Amount") def ParseAmount(self, strAmount): """ Robustly parse an amount. Remove ANY spaces, so they can be used as padding or thousands separators. Find the thing intended as a decimal, if any, and replace it with a period, removing anything else that may be a thousands sep. """ # Remove any spaces anywhere. strAmount = strAmount.replace(" ", "") # Iterate over the string in reverse to locate decimal sep. decimalPos = None for i in range(min(3, len(strAmount))): pos = -(i+1) char = strAmount[pos] if char in ",." and i <= 2: decimalPos = pos + 1 break strAmount = strAmount.replace(",", "") strAmount = strAmount.replace(".", "") if decimalPos: strAmount = strAmount[:decimalPos] + "." + strAmount[decimalPos:] return float(strAmount) def GetSiblings(self): return [account for account in self.Parent if account is not self] def SetCurrency(self, currency): if type(currency) == int: self._Currency = currencies.CurrencyList[currency]() else: self._Currency = currency def GetCurrency(self): return self._Currency def balanceAtCurrency(self, balance, currency): if currency: conv = CurrencyConverter() destCurrency = CurrencyList[currency]().GetCurrencyNick() srcCurrency = self.GetCurrency().GetCurrencyNick() return conv.Convert(balance, srcCurrency, destCurrency) return balance def GetBalance(self, currency=None): return self.balanceAtCurrency(self.Balance, currency) def GetCurrentBalance(self, currency=None): """Returns the balance up to and including today, but not transactions in the future.""" currentBalance = self.Balance today = datetime.date.today() transactions = self.Transactions[:] transactions.sort() index = len(transactions) - 1 while index >= 0 and transactions[index].Date > today: currentBalance -= transactions[index].Amount index -= 1 return self.balanceAtCurrency(currentBalance, currency) def GetRecurringTransactions(self): return self._RecurringTransactions def SetRecurringTransactions(self, recurrings): self._RecurringTransactions = recurrings def GetTransactions(self): if self._Transactions is None: self._Transactions = self.Store.getTransactionsFrom(self) # If transactions were added before this list was pulled, # and then an attribute is changed on one of them (Amount/Description/Date), it won't be # reflected on the new account at run-time because it has a replacement instance for that transaction. # So we need to swap it in. if self._preTransactions: # Iterate over this first (and thus once) since it is probably larger than _pre. for i, newT in enumerate(self._Transactions): for oldT in self._preTransactions: # Compare just IDs otherwise TDD is impossible; new attributes not yet stored # will cause the objects to not be properly replaced and break tests. if oldT.ID == newT.ID: self._Transactions[i] = oldT break return self._Transactions def GetName(self): return self._Name def SetName(self, name): self.Parent.ThrowExceptionOnInvalidName(name) self._Name = name def Remove(self): self.Parent.Remove(self.Name) def AddTransactions(self, transactions, sources=None): Publisher.sendMessage("batch.start") # If we don't have any sources, we want None for each transaction. if sources is None: sources = [None for i in range(len(transactions))] for t, source in zip(transactions, sources): self.AddTransaction(transaction=t, source=source) Publisher.sendMessage("batch.end") def AddRecurringTransaction(self, amount, description, date, repeatType, repeatEvery=1, repeatOn=None, endDate=None, source=None): # Create the recurring transaction object. recurring = RecurringTransaction(None, self, amount, description, date, repeatType, repeatEvery, repeatOn, endDate, source) # Store it. self.Store.MakeRecurringTransaction(recurring) # Add it to our internal list. self.RecurringTransactions.append(recurring) Publisher.sendMessage("recurringtransaction.created", (self, recurring)) return recurring def RemoveRecurringTransaction(self, recurring): # Orphan any recurring children so that they are normal transactions. for child in recurring.GetChildren(): child.RecurringParent = None if child.LinkedTransaction: child.LinkedTransaction.RecurringParent = None # Now remove the actual recurring transaction. self.RecurringTransactions.remove(recurring) self.Store.RemoveRecurringTransaction(recurring) def AddTransaction(self, amount=None, description="", date=None, source=None, transaction=None): """ Enter a transaction in this account, optionally making the opposite transaction in the source account first. """ Publisher.sendMessage("batch.start") if transaction: # It is "partial" because its ID and parent aren't necessarily correct. partialTrans = transaction partialTrans.Parent = self elif amount is not None: # No transaction object was given, we need to make one. partialTrans = Transaction(None, self, amount, description, date) else: raise Exception("AddTransaction: Must provide either transaction arguments or a transaction object.") if source: otherTrans = source.AddTransaction(-1 * partialTrans.Amount, partialTrans._Description, partialTrans.Date) transaction = self.Store.MakeTransaction(self, partialTrans) # If it was a transfer, link them together if source: transaction.LinkedTransaction = otherTrans otherTrans.LinkedTransaction = transaction # Don't append if there aren't transactions loaded yet, it is already in the model and will appear on a load. (LP: 347385). if self._Transactions is not None: self.Transactions.append(transaction) else: # We will need to do some magic with these later when transactions are loaded. self._preTransactions.append(transaction) Publisher.sendMessage("transaction.created", (self, transaction)) # Update the balance. self.Balance += transaction.Amount Publisher.sendMessage("batch.end") if source: return transaction, otherTrans else: return transaction def RemoveTransaction(self, transaction): return self.RemoveTransactions([transaction]) def RemoveTransactions(self, transactions, removeLinkedTransactions=True): """ By default removing a transaction removes the linked transaction from its account too. However when removeLinkedTransactions is False, only transactions in this account will be removed, such as from Account.Purge(). """ Publisher.sendMessage("batch.start") # Return the sources, if any, of the removed transactions, in case we are moving for example. sources = [] # Accumulate the difference and update the balance just once. Cuts 33% time of removals. difference = 0 # Make a copy of the list, to protect against getting passed self.Transactions itself. # Otherwise when we remove from self.Transactions, we'd end up iterating over every other transaction! (LP: #605591) transactions = transactions[:] for transaction in transactions: if transaction not in self.Transactions: raise bankexceptions.InvalidTransactionException("Transaction does not exist in account '%s'" % self.Name) # If this transaction was a transfer, delete the other transaction as well. if transaction.LinkedTransaction: link = transaction.LinkedTransaction sources.append(link.Parent) # Kill the other transaction's link to this one, otherwise this is quite recursive. link.LinkedTransaction = None # Delete the linked transaction from its account as well, if we should. if removeLinkedTransactions: link.Remove() else: sources.append(None) # Now remove this transaction. self.Store.RemoveTransaction(transaction) transaction.Parent = None self.Transactions.remove(transaction) difference += transaction.Amount # Update the balance. self.Balance -= difference # Send the message for all transactions at once, cuts _97%_ of time! OLV is slow here I guess. Publisher.sendMessage("transactions.removed", (self, transactions)) Publisher.sendMessage("batch.end") return sources def Purge(self): """ Call this when the account is being deleted and should purge itself. This will delete all transactions but NOT any linked transactions in other accounts, because when you close a bank account it doesn't erase the historical transfers in other accounts. """ self.RemoveTransactions(self.Transactions, removeLinkedTransactions=False) def MoveTransaction(self, transaction, destAccount): self.MoveTransactions([transaction], destAccount) def MoveTransactions(self, transactions, destAccount): Publisher.sendMessage("batch.start") sources = self.RemoveTransactions(transactions) destAccount.AddTransactions(transactions, sources) Publisher.sendMessage("batch.end") def GetMintId(self): return self._MintId def SetMintId(self, mintId): if mintId is not None: mintId = int(mintId) self._MintId = mintId def IsMintEnabled(self): return self.MintId is not None def IsOutOfSync(self): """Returns true only if explicitly out of sync: set to sync and able to get a balance, and balance is different.""" if self.IsMintEnabled(): if Mint.IsLoggedIn(): return not self.IsInSync() return False def IsInSync(self): if self.MintId is None: raise bankexceptions.MintIntegrationException("This account has no MintId.") try: mintBalance = Mint.GetAccountBalance(self.MintId) except: return False inSync = abs(mintBalance - self.CurrentBalance) < .001 return inSync def GetSyncString(self): if self.MintId is None: raise bankexceptions.MintIntegrationException("This account has no MintId.") try: item = Mint.GetAccount(self.MintId) except: syncString = "Unable to synchronize with Mint.com" else: syncString = "%s: %s" % (item['name'], self.float2str(item['balance'])) return syncString def onTransactionAmountChanged(self, message): transaction = message.data if transaction.Parent == self: debug.debug("Updating balance because I am %s: %s" % (self.Name, transaction)) self.Balance = sum((t.Amount for t in self.Transactions)) else: debug.debug("Ignoring transaction because I am %s: %s" % (self.Name, transaction)) def float2str(self, *args, **kwargs): return self.Currency.float2str(withNick=self.ShowCurrencyNick, *args, **kwargs) def __cmp__(self, other): return cmp(self.Name, other.Name) def __eq__(self, other): if other is None: return False return ( self.Name == other.Name and self.Balance == other.Balance and self.Currency == other.Currency and self.Transactions == other.Transactions and self.RecurringTransactions == other.RecurringTransactions ) Name = property(GetName, SetName) Transactions = property(GetTransactions) RecurringTransactions = property(GetRecurringTransactions) Currency = property(GetCurrency, SetCurrency) MintId = property(GetMintId, SetMintId) CurrentBalance = property(GetCurrentBalance) wxbanker-0.9.1/wxbanker/bankobjects/accountlist.py0000644000175000017500000000731212243601243022314 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # accountlist.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wx.lib.pubsub import Publisher from wxbanker import bankexceptions class AccountList(list): def __init__(self, bankmodel, store): list.__init__(self, store.GetAccounts()) # Make sure all the items know their parent list. for account in self: account.Parent = self self.BankModel = bankmodel self.Store = store self.sort() Publisher.subscribe(self.onAccountRenamed, "ormobject.updated.Account.Name") def GetRecurringTransactions(self): allRecurrings = [] for account in self: recurrings = account.GetRecurringTransactions() if recurrings: allRecurrings.extend(recurrings) return allRecurrings def GetBalance(self): totalCurrency = self.BankModel.GlobalCurrency total = 0 for account in self: total = total + account.GetBalance(totalCurrency) return total def GetById(self, theId): for account in self: if account.ID == theId: return account def AccountIndex(self, accountName): for i, account in enumerate(self): if account.Name == accountName: return i return -1 def ThrowExceptionOnInvalidName(self, accountName): # First make sure we were given a name! if not accountName: raise bankexceptions.BlankAccountNameException # Now ensure an account by that name doesn't already exist. if self.AccountIndex(accountName) >= 0: raise bankexceptions.AccountAlreadyExistsException(accountName) def Create(self, accountName): self.ThrowExceptionOnInvalidName(accountName) currency = 0 if len(self): # If the list contains items, the currency needs to be consistent. currency = self[-1].Currency account = self.Store.CreateAccount(accountName, currency) # Make sure this account knows its parent. account.Parent = self self.append(account) self.sort() Publisher.sendMessage("account.created.%s" % accountName, account) return account def Remove(self, accountName): index = self.AccountIndex(accountName) if index == -1: raise bankexceptions.InvalidAccountException(accountName) account = self.pop(index) # Remove all the transactions associated with this account. account.Purge() Publisher.sendMessage("account.removed.%s"%accountName, account) def __eq__(self, other): if len(self) != len(other): return False for leftAccount, rightAccount in zip(self, other): if not leftAccount == rightAccount: return False return True def onAccountRenamed(self, message): self.sort() Balance = property(GetBalance) wxbanker-0.9.1/wxbanker/bankobjects/bankmodel.py0000644000175000017500000002072112243601243021717 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # bankmodel.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx from wx.lib.pubsub import Publisher import wx.lib.delayedresult as delayedresult import re, datetime from wxbanker import currencies from wxbanker.bankobjects.ormobject import ORMKeyValueObject from wxbanker.bankobjects.accountlist import AccountList from wxbanker.mint.api import Mint from wxbanker.currencies import GetCurrencyInt class BankModel(ORMKeyValueObject): ORM_TABLE = "meta" ORM_ATTRIBUTES = ["LastAccountId", "MintEnabled", "GlobalCurrency"] def __init__(self, store): ORMKeyValueObject.__init__(self, store) self.Store = store self.Accounts = AccountList(self, store) self._Tags = {} # Handle Mint integration, but send the message in the main thread, otherwise, dead. if self.MintEnabled: delayedresult.startWorker(lambda result: Publisher.sendMessage("mint.updated"), Mint.LoginFromKeyring, wkwargs={"notify": False}) Publisher.subscribe(self.onGlobalCurrencyChanged, "user.global_currency_changed") Publisher.subscribe(self.onAccountCurrencyChanged, "user.account_currency_changed") Publisher.subscribe(self.onMintToggled, "user.mint.toggled") Publisher.subscribe(self.onAccountChanged, "view.account changed") Publisher.subscribe(self.onTransactionTagged, "transaction.tagged") Publisher.subscribe(self.onTransactionUntagged, "transaction.untagged") def GetLastAccount(self): return self.Accounts.GetById(self.LastAccountId) def GetBalance(self): return self.Accounts.Balance def GetRecurringTransactions(self): return self.Accounts.GetRecurringTransactions() def GetTransactions(self): transactions = [] for account in self.Accounts: transactions.extend(account.Transactions) return transactions def GetDateRange(self): """Get the date of the first and last transaction.""" transactions = self.GetTransactions() # If there are no transactions, let's go with today. if not transactions: return datetime.date.today(), datetime.date.today() else: # Sorting transactions is very important, otherwise the first and last dates are arbitrary! transactions.sort() return transactions[0].Date, transactions[-1].Date def GetXTotals(self, account=None, daterange=None): """ Get totals every so many days, optionally within a specific account and/or date range. This is particularly useful when we want to graph a summary of account balances. """ if account is None: transactions = self.GetTransactions() currency = self.GlobalCurrency else: transactions = account.Transactions[:] currency = GetCurrencyInt(account.GetCurrency()) transactions.sort() if transactions == []: return [] startingBalance = 0.0 # Crop transactions around the date range, if supplied. if daterange: startDate, endDate = daterange starti, endi = None, len(transactions) total = 0.0 for i, t in enumerate(transactions): if starti is None and t.Date >= startDate: starti = i startingBalance = total if t.Date > endDate: endi = i break total += t.GetAmount(currency) transactions = transactions[starti:endi] else: # Figure out the actual start and end dates we end up with. startDate, endDate = transactions[0].Date, transactions[-1].Date # If the last transaction was before today, we still want to graph until today. today = datetime.date.today() if daterange: endDate = daterange[1] elif today > endDate: endDate = today onedaydelta = datetime.timedelta(days=1) # Generate day totals totals = [] currDate = startDate tindex = 0 balance = startingBalance while currDate <= endDate: while tindex < len(transactions) and transactions[tindex].Date <= currDate: balance += transactions[tindex].GetAmount(currency) tindex += 1 totals.append([currDate, balance]) currDate += onedaydelta return totals def CreateAccount(self, accountName): return self.Accounts.Create(accountName) def RemoveAccount(self, accountName): return self.Accounts.Remove(accountName) def Search(self, searchString, account=None, matchIndex=1): """ matchIndex: 0: Amount, 1: Description, 2: Date I originally used strings here but passing around and then validating on translated strings seems like a bad and fragile idea. """ # Handle account options. if account is None: potentials = self.GetTransactions() else: potentials = account.Transactions[:] # Find all the matches. matches = [] for trans in potentials: potentialStr = unicode((trans.Amount, trans.Description, trans.Date)[matchIndex]) if re.findall(searchString, potentialStr, flags=re.IGNORECASE): matches.append(trans) return matches def Save(self): self.Store.Save() def float2str(self, *args, **kwargs): """ Handle representing floats as strings for non account-specific amounts, such as totals. """ currency = currencies.CurrencyList[self.GlobalCurrency]() return currency.float2str(*args, **kwargs) def setGlobalCurrency(self, currencyIndex): self.Store.setCurrency(currencyIndex) Publisher.sendMessage("currency_changed", currencyIndex) def setAccountCurrency(self, account, currencyIndex): self.Store.setCurrency(currencyIndex, account) account.SetCurrency(currencyIndex) Publisher.sendMessage("currency_changed", currencyIndex) def onGlobalCurrencyChanged(self, message): currencyIndex = message.data self.setGlobalCurrency(currencyIndex) def onAccountCurrencyChanged(self, message): account, currency = message.data self.setAccountCurrency(account, currency) def onAccountChanged(self, message): account = message.data if account: self.LastAccountId = account.ID else: self.LastAccountId = None def onTransactionTagged(self, message): tagNames = message.data for tag in tagNames: if tag in self._Tags: self._Tags[tag] += 1 else: self._Tags[tag] = 1 def onTransactionUntagged(self, message): tagNames = message.data for tag in tagNames: self._Tags[tag] -= 1 if self._Tags[tag] == 0: self._Tags.pop(tag) def onMintToggled(self, message): enabled = message.data self.MintEnabled = enabled def __eq__(self, other): return ( self.Accounts == other.Accounts and self.Tags == other.Tags and self.MintEnabled == other.MintEnabled ) def Print(self): print "Model: %s" % self.Balance for a in self.Accounts: print " %s: %s" % (a.Name, a.Balance) for t in a.Transactions: print t def GetTags(self): return set(self._Tags.keys()) Balance = property(GetBalance) Tags = property(GetTags) wxbanker-0.9.1/wxbanker/bankobjects/ormobject.py0000644000175000017500000000576312243601243021760 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # ormobject.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wx.lib.pubsub import Publisher class ORMObject(object): ORM_TABLE = None ORM_ATTRIBUTES = [] def __init__(self): self.IsFrozen = True # If the object doesn't have an ID, we need to set one for setattr. if not hasattr(self, "ID"): self.ID = None self.IsFrozen = False def __setattr__(self, attrname, val): object.__setattr__(self, attrname, val) if not self.IsFrozen and self.ID is not None: self.publishIfAppropriate(attrname, val) def publishIfAppropriate(self, attrname, val): if attrname in self.ORM_ATTRIBUTES: classname = self.__class__.__name__ Publisher.sendMessage("ormobject.updated.%s.%s" % (classname, attrname.strip("_")), self) def getAttrValue(self, attrname): from wxbanker.bankobjects.account import Account from wxbanker.bankobjects.transaction import Transaction value = getattr(self, attrname) if isinstance(value, (Account, Transaction)): value = value.ID elif attrname == "RepeatOn" and value is not None: value = ",".join([str(x) for x in value]) # Description is special in that GetDescription returns a decorated _Description, and should not be stored. elif attrname == "Description": value = self._Description elif attrname == "Date": # No tests fail if this clause is removed; weird. value = "%s/%s/%s"%(self.Date.year, str(self.Date.month).zfill(2), str(self.Date.day).zfill(2)) return value def toResult(self): result = [self.ID] for attr in self.ORM_ATTRIBUTES: result.append(self.getAttrValue(attr)) return result class ORMKeyValueObject(ORMObject): """ This is an ORM object whose ORM_ATTRIBUTES are key:value pairs in a table. """ def __init__(self, store): self.IsFrozen = True store.PopulateKeyValues(self) self.IsFrozen = False def __setattr__(self, attrname, val): object.__setattr__(self, attrname, val) if not self.IsFrozen: self.publishIfAppropriate(attrname, val) wxbanker-0.9.1/wxbanker/bankobjects/recurringtransaction.py0000644000175000017500000002203412243601243024230 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # recurringtransaction.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker import localization import datetime, functools, gettext from dateutil import rrule from wxbanker import helpers from wxbanker.bankobjects.transaction import Transaction from wxbanker.bankobjects.ormobject import ORMObject class InvalidDateRangeException(Exception): pass class RecurringWeeklyException(Exception): pass class RecurringTransaction(Transaction, ORMObject): ORM_TABLE = "recurring_transactions" ORM_ATTRIBUTES = ["Amount", "Description", "Date", "RepeatType", "RepeatEvery", "RepeatOn", "EndDate", "Source", "LastTransacted"] DAILY = 0 WEEKLY = 1 MONTLY = 2 YEARLY = 3 def __init__(self, tID, parent, amount, description, date, repeatType, repeatEvery=1, repeatOn=None, endDate=None, source=None, lastTransacted=None): Transaction.__init__(self, tID, parent, amount, description, date) ORMObject.__init__(self) # If the transaction recurs weekly and repeatsOn isn't specified, use the starting date. if repeatType == self.WEEKLY and repeatOn is None: todaydaynumber = date.weekday() repeatOn = [int(i==todaydaynumber) for i in range(7)] self.IsFrozen = True self.RepeatType = repeatType self.RepeatEvery = repeatEvery self.RepeatOn = repeatOn self.EndDate = endDate self.Source = source self.LastTransacted = lastTransacted self.IsFrozen = False def IsWeekly(self): return self.RepeatType == self.WEEKLY def PerformTransactions(self): for date in self.GetUntransactedDates(): result = self.Parent.AddTransaction(self.Amount, self.Description, date, self.Source) if isinstance(result, Transaction): result = (result,) for transaction in result: transaction.RecurringParent = self self.LastTransacted = datetime.date.today() def GetRRule(self): """Generate the dateutils.rrule for this recurring transaction.""" # Create some mapping lists. rruleDays = [rrule.MO, rrule.TU, rrule.WE, rrule.TH, rrule.FR, rrule.SA, rrule.SU] rruleTypes = [rrule.DAILY, rrule.WEEKLY, rrule.MONTHLY, rrule.YEARLY] func = functools.partial(rrule.rrule, rruleTypes[self.RepeatType], dtstart=self.Date, interval=self.RepeatEvery, wkst=rrule.MO) if self.RepeatType == self.WEEKLY: result = func(byweekday=[rruleDays[i] for i, x in enumerate(self.RepeatOn) if x]) elif self.RepeatType == self.MONTLY: # "a date on the specified day of the month, unless it is beyond the end of month, in which case it will be the last day of the month" result = func(bymonthday=(self.Date.day, -1), bysetpos=1) else: result = func() return result def DateToDatetime(self, date): """Convert a date to a datetime at the first microsecond of that day.""" return datetime.datetime(date.year, date.month, date.day) def GetUntransactedDates(self): """Get all due transaction dates.""" result = self.GetRRule() today = datetime.date.today() # Stop at the end date or today, whichever is earlier. if self.EndDate: end = min(self.EndDate, today) else: end = today if self.LastTransacted: # Start on the day after the last transaction start = self.LastTransacted + datetime.timedelta(days=1) else: start = self.Date # Convert dates to datetimes. start, end = [self.DateToDatetime(d) for d in (start, end)] # Calculate the result. result = result.between(start, end, inc=True) # Return just the dates, we don't care about datetime. return [dt.date() for dt in list(result)] def GetNext(self): """Get the next transaction date that will occur.""" result = self.GetRRule() after = self.LastTransacted or (self.Date - datetime.timedelta(days=1)) after = self.DateToDatetime(after) return result.after(after, inc=False).date() def SetLastTransacted(self, date): if date is None: self._LastTransacted = None else: self._LastTransacted = self._MassageDate(date) def GetLastTransacted(self): return self._LastTransacted def SetEndDate(self, date): if date is None: self._EndDate = None else: self._EndDate = self._MassageDate(date) def GetEndDate(self): return self._EndDate def GetRecurrance(self): """Generate a string for describing the recurrance, such as "Daily until 2009-10-02".""" summary = "" repeatType = self.RepeatType if repeatType == 0: summary = gettext.ngettext("Daily", "Every %(num)d days", self.RepeatEvery) % {'num':self.RepeatEvery} elif repeatType == 1: if self.RepeatOn == [1,1,1,1,1,0,0]: summary = _("Weekly on weekdays") elif self.RepeatOn == [0,0,0,0,0,1,1]: summary = _("Weekly on weekends") elif self.RepeatOn == [1,1,1,1,1,1,1]: summary = _("Daily") else: pluralDayNames = (_("Mondays"), _("Tuesdays"), _("Wednesdays"), _("Thursdays"), _("Fridays"), _("Saturdays"), _("Sundays")) repeatDays = tuple(day for i, day in enumerate(pluralDayNames) if self.RepeatOn[i]) # Figure out the base for this string. if self.RepeatEvery == 1: summaryBase = _("Weekly on %s") else: summaryBase = _("Every %(num)d weeks on %%s") % {'num':self.RepeatEvery} if len(repeatDays) == 0: summary = "Never" elif len(repeatDays) == 1: summary = summaryBase % repeatDays[0] else: summary = summaryBase % ((", ".join(repeatDays[:-1])) + (_(" and %s") % repeatDays[-1])) elif repeatType == 2: summary = gettext.ngettext("Monthly", "Every %(num)d months", self.RepeatEvery) % {'num':self.RepeatEvery} elif repeatType == 3: summary = gettext.ngettext("Annually", "Every %(num)d years", self.RepeatEvery) % {'num':self.RepeatEvery} # If the recurring ends at some point, add that information to the summary text. if self.EndDate: summary += " " + _("until %s") % helpers.pydate2wxdate(self.EndDate).FormatISODate() return summary def Update(self, rtype, revery, ron, rend): """Update our values.""" self.RepeatType = rtype self.RepeatEvery = revery self.RepeatOn = ron self.EndDate = rend def UpdateFrom(self, rt): """Given a recurring transaction, mirror it in this one.""" for attr in self.ORM_ATTRIBUTES[:-1]: setattr(self, attr, getattr(rt, attr)) def GetStringBase(self): return "%s, %s: " % (self.Description or _("No description"), self.RenderAmount()) def GetDueString(self): datelist = ", ".join([str(d) for d in self.GetUntransactedDates()]) return self.GetStringBase() + datelist def GetDescriptionString(self): return self.GetStringBase() + self.GetRecurrance() def GetChildren(self): for transaction in self.Parent.Transactions: if transaction.RecurringParent == self: yield transaction def __eq__(self, other): if other is None: return False assert isinstance(other, RecurringTransaction), other return ( Transaction.__eq__(self, other) and self.RepeatType == other.RepeatType and self.RepeatEvery == other.RepeatEvery and self.RepeatOn == other.RepeatOn and self.EndDate == other.EndDate and self.Source == other.Source and self.LastTransacted == other.LastTransacted ) LastTransacted = property(GetLastTransacted, SetLastTransacted) EndDate = property(GetEndDate, SetEndDate) wxbanker-0.9.1/wxbanker/bankobjects/tag.py0000644000175000017500000000323112243601243020533 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # tag.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wx.lib.pubsub import Publisher from wxbanker import bankexceptions class EmptyTagException(Exception): def __str__(self): return "Tags cannot be empty" class Tag(object): TAG_CHAR = "#" def __init__(self, tag): # Support a copy-constructor of sorts as well. if isinstance(tag, Tag): tag = tag.Name # A tag cannot be blank! if not tag: raise EmptyTagException() self.Name = tag def __str__(self): return "%s%s" % (self.TAG_CHAR, self.Name) def __eq__(self, other): return isinstance(other, Tag) and self.Name == other.Name def __cmp__(self, other): if not isinstance(other, Tag): return 1 return cmp(self.Name, other.Name) def __hash__(self): return hash(self.Name)wxbanker-0.9.1/wxbanker/bankobjects/transaction.py0000644000175000017500000001777712243601243022331 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # transaction.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wx.lib.pubsub import Publisher import datetime import re from wxbanker.bankobjects.ormobject import ORMObject from wxbanker.bankobjects.tag import Tag, EmptyTagException from wxbanker import debug from wxbanker.currencies import CurrencyList from wxbanker.currconvert import CurrencyConverter class Transaction(ORMObject): """ An object which represents a transaction. Changes to this object get sent out via pubsub, typically causing the model to make the change. """ ORM_TABLE = "transactions" ORM_ATTRIBUTES = ["_Amount", "_Description", "_Date", "LinkedTransaction", "RecurringParent"] def __init__(self, tID, parent, amount, description, date): ORMObject.__init__(self) self.IsFrozen = True self.ID = tID self.LinkedTransaction = None self.Parent = parent self.Date = date self.Tags = set() self.Description = description self.Amount = amount self.RecurringParent = None self.IsFrozen = False def GetDate(self): return self._Date def SetDate(self, date, fromLink=False): date = self._MassageDate(date) self._Date = date # Update the linked transaction if one exists. if not fromLink and self.LinkedTransaction: self.LinkedTransaction.SetDate(date, fromLink=True) def _MassageDate(self, date): """ Takes a date and returns a valid datetime.date object. `date` can be a datetime object, or a string. In the case of a string, valid separators are '-' and '/'. Abbreviated years will be converted into the "intended" year: 86 => 1986, 08 => 2008. """ if date is None: return datetime.date.today() # The maximum number of years you can refer to in the future, using an abbreviation. # Ex: If it is 2008 and MAX_FUTURE_ABBR is 10, years 9-18 will become 2009-2018, # while 19-99 will become 1919-1999. MAX_FUTURE_ABBR = 10 date = str(date) #if it is a datetime.date object, make it a Y-M-D string. date = date.replace('/', '-') # '-' is our standard assumed separator year, m, d = [int(x) for x in date.split("-")] if year < 100: currentYear = datetime.date.today().year currentAbr = currentYear % 100 currentBase = currentYear / 100 if year <= currentAbr + MAX_FUTURE_ABBR: #allow the user to reasonably refer to future years year += currentBase * 100 else: year += (currentBase-1) * 100 return datetime.date(year, m, d) def GetDescription(self): description = self._Description if self.LinkedTransaction: parentName = self.LinkedTransaction.Parent.Name if self.Amount > 0: transferString = _("Transfer from %s") % parentName else: transferString = _("Transfer to %s") % parentName if description: description = transferString + " (%s)"%description else: description = transferString return description def SetDescription(self, description, fromLink=False): """Update the description, ensuring it is a string.""" description = unicode(description) self._Description = description # Update the linked transaction if one exists. if not fromLink and self.LinkedTransaction: self.LinkedTransaction.SetDescription(description, fromLink=True) # Parse/update tags. tags = set() for word in description.split(" "): if word.startswith("#"): tagName = word[1:].lower() try: tag = Tag(tagName) except EmptyTagException: # This is not so good but, we can't argue with the description, it just isn't a tag. continue tags.add(tag) removedTags = self._Tags.difference(tags) addedTags = tags.difference(self._Tags) self.TagsRemoved(removedTags) self.TagsAdded(addedTags) def TagsAdded(self, tagNames): self.Tags.update(tagNames) Publisher.sendMessage("transaction.tagged", tagNames) def TagsRemoved(self, tagNames): self.Tags.difference_update(tagNames) Publisher.sendMessage("transaction.untagged", tagNames) def AddTag(self, tagName): tag = Tag(tagName) if tag not in self.Tags: self.Description = self._Description + " %s" % tag def RemoveTag(self, tagName): fullTag = str(Tag(tagName)) pattern = "( %s$|%s )" % (fullTag, fullTag) self.Description = re.sub(pattern, "", self.Description) def GetTags(self): return self._Tags def SetTags(self, tagList): self._Tags = tagList def GetAmount(self, currency=None): if currency: conv = CurrencyConverter() destCurrency = CurrencyList[currency]().GetCurrencyNick() srcCurrency = self.Parent.GetCurrency().GetCurrencyNick() return conv.Convert(self._Amount, srcCurrency, destCurrency) return self._Amount def SetAmount(self, amount, fromLink=False): """Update the amount, ensuring it is a float.""" amount = float(amount) self._Amount = amount # Update the linked transaction if one exists. if not fromLink and self.LinkedTransaction: self.LinkedTransaction.SetAmount(-amount, fromLink=True) def GetLinkedTransaction(self): return self._LinkedTransaction def SetLinkedTransaction(self, transaction): self._LinkedTransaction = transaction def GetLinkedTransactionID(self): """ This exists to make it easy to compare linked transactions in __eq__, where it needs to be done based on ID so we don't recurse forever in comparisons. """ if self.LinkedTransaction: return self.LinkedTransaction.ID else: return None def Remove(self): return self.Parent.RemoveTransaction(self) def RenderAmount(self): return self.Parent.float2str(self.Amount) def __str__(self): return "%i/%i/%i: %s -- %.2f" % (self.Date.year, self.Date.month, self.Date.day, self.Description, self.Amount) def __cmp__(self, other): return cmp( (self.Date, self.ID), (other.Date, other.ID) ) def __eq__(self, other): if not isinstance(other, Transaction): return False return ( self.Date == other.Date and self._Description == other._Description and self.Amount == other.Amount and self.Tags == other.Tags and self.GetLinkedTransactionID() == other.GetLinkedTransactionID() and self.ID == other.ID ) Date = property(GetDate, SetDate) Description = property(GetDescription, SetDescription) Amount = property(GetAmount, SetAmount) LinkedTransaction = property(GetLinkedTransaction, SetLinkedTransaction) Tags = property(GetTags, SetTags) wxbanker-0.9.1/wxbanker/bankobjects/transactionlist.py0000644000175000017500000000240212243601243023200 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # transactionlist.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . class TransactionList(list): def __init__(self, items=None): # list does not understand items=None apparently. if items is None: items = [] list.__init__(self, items) def __eq__(self, other): if not len(self) == len(other): return False for leftTrans, rightTrans in zip(self, other): if not leftTrans == rightTrans: return False return Truewxbanker-0.9.1/wxbanker/brandedframe.py0000644000175000017500000000250212243601243020105 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # brandedframe.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx import os def getIcon(): appIcon = wx.ArtProvider.GetIcon('wxART_coins') # Use a higher resolution icon if available (LP: #617645) hiResIconPath = '/usr/share/icons/hicolor/48x48/apps/wxbanker.png' if os.path.exists(hiResIconPath): appIcon = wx.Icon(hiResIconPath, wx.BITMAP_TYPE_PNG) return appIcon class BrandedFrame(wx.Frame): def __init__(self, *args, **kwargs): wx.Frame.__init__(self, *args, **kwargs) appIcon = getIcon() self.SetIcon(appIcon) wxbanker-0.9.1/wxbanker/cairoplot/0000755000175000017500000000000012243601243017116 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/cairoplot/__init__.py0000644000175000017500000000000012243601243021215 0ustar mrooneymrooneywxbanker-0.9.1/wxbanker/cairoplot/cairoplot.py0000644000175000017500000031756212243601243021502 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # CairoPlot.py # # Copyright (c) 2008 Rodrigo Moreira Araújo # # Author: Rodrigo Moreiro Araujo # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public License # as published by the Free Software Foundation; either version 2 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 Lesser 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 #Contributor: João S. O. Bueno #TODO: review BarPlot Code #TODO: x_label colision problem on Horizontal Bar Plot #TODO: y_label's eat too much space on HBP __version__ = 1.1 import cairo import math import random from series import Series, Group, Data HORZ = 0 VERT = 1 NORM = 2 COLORS = {"red" : (1.0,0.0,0.0,1.0), "lime" : (0.0,1.0,0.0,1.0), "blue" : (0.0,0.0,1.0,1.0), "maroon" : (0.5,0.0,0.0,1.0), "green" : (0.0,0.5,0.0,1.0), "navy" : (0.0,0.0,0.5,1.0), "yellow" : (1.0,1.0,0.0,1.0), "magenta" : (1.0,0.0,1.0,1.0), "cyan" : (0.0,1.0,1.0,1.0), "orange" : (1.0,0.5,0.0,1.0), "white" : (1.0,1.0,1.0,1.0), "black" : (0.0,0.0,0.0,1.0), "gray" : (0.5,0.5,0.5,1.0), "light_gray" : (0.9,0.9,0.9,1.0), "transparent" : (0.0,0.0,0.0,0.0)} THEMES = {"black_red" : [(0.0,0.0,0.0,1.0), (1.0,0.0,0.0,1.0)], "red_green_blue" : [(1.0,0.0,0.0,1.0), (0.0,1.0,0.0,1.0), (0.0,0.0,1.0,1.0)], "red_orange_yellow" : [(1.0,0.2,0.0,1.0), (1.0,0.7,0.0,1.0), (1.0,1.0,0.0,1.0)], "yellow_orange_red" : [(1.0,1.0,0.0,1.0), (1.0,0.7,0.0,1.0), (1.0,0.2,0.0,1.0)], "rainbow" : [(1.0,0.0,0.0,1.0), (1.0,0.5,0.0,1.0), (1.0,1.0,0.0,1.0), (0.0,1.0,0.0,1.0), (0.0,0.0,1.0,1.0), (0.3, 0.0, 0.5,1.0), (0.5, 0.0, 1.0, 1.0)]} def colors_from_theme( theme, series_length, mode = 'solid' ): colors = [] if theme not in THEMES.keys() : raise Exception, "Theme not defined" color_steps = THEMES[theme] n_colors = len(color_steps) if series_length <= n_colors: colors = [color + tuple([mode]) for color in color_steps[0:n_colors]] else: iterations = [(series_length - n_colors)/(n_colors - 1) for i in color_steps[:-1]] over_iterations = (series_length - n_colors) % (n_colors - 1) for i in range(n_colors - 1): if over_iterations <= 0: break iterations[i] += 1 over_iterations -= 1 for index,color in enumerate(color_steps[:-1]): colors.append(color + tuple([mode])) if iterations[index] == 0: continue next_color = color_steps[index+1] color_step = ((next_color[0] - color[0])/(iterations[index] + 1), (next_color[1] - color[1])/(iterations[index] + 1), (next_color[2] - color[2])/(iterations[index] + 1), (next_color[3] - color[3])/(iterations[index] + 1)) for i in range( iterations[index] ): colors.append((color[0] + color_step[0]*(i+1), color[1] + color_step[1]*(i+1), color[2] + color_step[2]*(i+1), color[3] + color_step[3]*(i+1), mode)) colors.append(color_steps[-1] + tuple([mode])) return colors def other_direction(direction): "explicit is better than implicit" if direction == HORZ: return VERT else: return HORZ #Class definition class Plot(object): def __init__(self, surface=None, data=None, width=640, height=480, background=None, border = 0, x_labels = None, y_labels = None, series_colors = None): random.seed(2) self.create_surface(surface, width, height) self.dimensions = {} self.dimensions[HORZ] = width self.dimensions[VERT] = height self.context = cairo.Context(self.surface) self.labels={} self.labels[HORZ] = x_labels self.labels[VERT] = y_labels self.load_series(data, x_labels, y_labels, series_colors) self.font_size = 10 self.set_background (background) self.border = border self.borders = {} self.line_color = (0.5, 0.5, 0.5) self.line_width = 0.5 self.label_color = (0.0, 0.0, 0.0) self.grid_color = (0.8, 0.8, 0.8) def create_surface(self, surface, width=None, height=None): self.filename = None if isinstance(surface, cairo.Surface): self.surface = surface return if not type(surface) in (str, unicode): raise TypeError("Surface should be either a Cairo surface or a filename, not %s" % surface) sufix = surface.rsplit(".")[-1].lower() self.filename = surface if sufix == "png": self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) elif sufix == "ps": self.surface = cairo.PSSurface(surface, width, height) elif sufix == "pdf": self.surface = cairo.PSSurface(surface, width, height) else: if sufix != "svg": self.filename += ".svg" self.surface = cairo.SVGSurface(self.filename, width, height) def commit(self): try: self.context.show_page() if self.filename and self.filename.endswith(".png"): self.surface.write_to_png(self.filename) else: self.surface.finish() except cairo.Error: pass def load_series (self, data, x_labels=None, y_labels=None, series_colors=None): self.series_labels = [] self.series = None #The pretty way #if not isinstance(data, Series): # # Not an instance of Series # self.series = Series(data) #else: # self.series = data # #self.series_labels = self.series.get_names() #TODO: Remove on next version # The ugly way, keeping retrocompatibility... if callable(data) or type(data) is list and callable(data[0]): # Lambda or List of lambdas self.series = data self.series_labels = None elif isinstance(data, Series): # Instance of Series self.series = data self.series_labels = data.get_names() else: # Anything else self.series = Series(data) self.series_labels = self.series.get_names() #TODO: allow user passed series_widths self.series_widths = [1.0 for group in self.series] #TODO: Remove on next version self.process_colors( series_colors ) def process_colors( self, series_colors, length = None, mode = 'solid' ): #series_colors might be None, a theme, a string of colors names or a list of color tuples if length is None : length = len( self.series.to_list() ) #no colors passed if not series_colors: #Randomize colors self.series_colors = [ [random.random() for i in range(3)] + [1.0, mode] for series in range( length ) ] else: #Just theme pattern if not hasattr( series_colors, "__iter__" ): theme = series_colors self.series_colors = colors_from_theme( theme.lower(), length ) #Theme pattern and mode elif not hasattr(series_colors, '__delitem__') and not hasattr( series_colors[0], "__iter__" ): theme = series_colors[0] mode = series_colors[1] self.series_colors = colors_from_theme( theme.lower(), length, mode ) #List else: self.series_colors = series_colors for index, color in enumerate( self.series_colors ): #element is a color name if not hasattr(color, "__iter__"): self.series_colors[index] = COLORS[color.lower()] + tuple([mode]) #element is rgb tuple instead of rgba elif len( color ) == 3 : self.series_colors[index] += (1.0,mode) #element has 4 elements, might be rgba tuple or rgb tuple with mode elif len( color ) == 4 : #last element is mode if not hasattr(color[3], "__iter__"): self.series_colors[index] += tuple([color[3]]) self.series_colors[index][3] = 1.0 #last element is alpha else: self.series_colors[index] += tuple([mode]) def get_width(self): return self.surface.get_width() def get_height(self): return self.surface.get_height() def set_background(self, background): if background is None: self.background = (0.0,0.0,0.0,0.0) elif type(background) in (cairo.LinearGradient, tuple): self.background = background elif not hasattr(background,"__iter__"): colors = background.split(" ") if len(colors) == 1 and colors[0] in COLORS: self.background = COLORS[background] elif len(colors) > 1: self.background = cairo.LinearGradient(self.dimensions[HORZ] / 2, 0, self.dimensions[HORZ] / 2, self.dimensions[VERT]) for index,color in enumerate(colors): self.background.add_color_stop_rgba(float(index)/(len(colors)-1),*COLORS[color]) else: raise TypeError ("Background should be either cairo.LinearGradient or a 3/4-tuple, not %s" % type(background)) def render_background(self): if isinstance(self.background, cairo.LinearGradient): self.context.set_source(self.background) else: self.context.set_source_rgba(*self.background) self.context.rectangle(0,0, self.dimensions[HORZ], self.dimensions[VERT]) self.context.fill() def render_bounding_box(self): self.context.set_source_rgba(*self.line_color) self.context.set_line_width(self.line_width) self.context.rectangle(self.border, self.border, self.dimensions[HORZ] - 2 * self.border, self.dimensions[VERT] - 2 * self.border) self.context.stroke() def render(self): pass class ScatterPlot( Plot ): def __init__(self, surface=None, data=None, errorx=None, errory=None, width=640, height=480, background=None, border=0, axis = False, dash = False, discrete = False, dots = 0, grid = False, series_legend = False, x_labels = None, y_labels = None, x_formatter = None, y_formatter = None, x_bounds = None, y_bounds = None, z_bounds = None, x_title = None, y_title = None, series_colors = None, circle_colors = None ): self.bounds = {} self.bounds[HORZ] = x_bounds self.bounds[VERT] = y_bounds self.bounds[NORM] = z_bounds self.titles = {} self.titles[HORZ] = x_title self.titles[VERT] = y_title self.label_formatters = {} self.label_formatters[HORZ] = x_formatter self.label_formatters[VERT] = y_formatter self.max_value = {} self.axis = axis self.discrete = discrete self.dots = dots self.grid = grid self.series_legend = series_legend self.variable_radius = False self.x_label_angle = math.pi / 2.5 self.circle_colors = circle_colors Plot.__init__(self, surface, data, width, height, background, border, x_labels, y_labels, series_colors) self.dash = None if dash: if hasattr(dash, "keys"): self.dash = [dash[key] for key in self.series_labels] elif max([hasattr(item,'__delitem__') for item in data]) : self.dash = dash else: self.dash = [dash] self.load_errors(errorx, errory) def convert_list_to_tuple(self, data): #Data must be converted from lists of coordinates to a single # list of tuples out_data = zip(*data) if len(data) == 3: self.variable_radius = True return out_data def load_series(self, data, x_labels = None, y_labels = None, series_colors=None): #TODO: In cairoplot 2.0 keep only the Series instances # Convert Data and Group to Series if isinstance(data, Data) or isinstance(data, Group): data = Series(data) # Series if isinstance(data, Series): for group in data: for item in group: if len(item) is 3: self.variable_radius = True #Dictionary with lists if hasattr(data, "keys") : if hasattr( data.values()[0][0], "__delitem__" ) : for key in data.keys() : data[key] = self.convert_list_to_tuple(data[key]) elif len(data.values()[0][0]) == 3: self.variable_radius = True #List elif hasattr(data[0], "__delitem__") : #List of lists if hasattr(data[0][0], "__delitem__") : for index,value in enumerate(data) : data[index] = self.convert_list_to_tuple(value) #List elif type(data[0][0]) != type((0,0)): data = self.convert_list_to_tuple(data) #Three dimensional data elif len(data[0][0]) == 3: self.variable_radius = True #List with three dimensional tuples elif len(data[0]) == 3: self.variable_radius = True Plot.load_series(self, data, x_labels, y_labels, series_colors) self.calc_boundaries() self.calc_labels() def load_errors(self, errorx, errory): self.errors = None if errorx == None and errory == None: return self.errors = {} self.errors[HORZ] = None self.errors[VERT] = None #asimetric errors if errorx and hasattr(errorx[0], "__delitem__"): self.errors[HORZ] = errorx #simetric errors elif errorx: self.errors[HORZ] = [errorx] #asimetric errors if errory and hasattr(errory[0], "__delitem__"): self.errors[VERT] = errory #simetric errors elif errory: self.errors[VERT] = [errory] def calc_labels(self): for key in (HORZ, VERT): if not self.labels[key]: amplitude = self.bounds[key][1] - self.bounds[key][0] labels = (self.bounds[key][0] + (amplitude * i / 10.0) for i in range(11)) if self.label_formatters[key]: self.labels[key] = [self.label_formatters[key](label) for label in labels] elif amplitude % 10: #if horizontal labels need floating points self.labels[key] = ["%.2lf" % float(label) for label in labels] else: self.labels[key] = ["%d" % int(label) for label in labels] def calc_extents(self, direction): self.context.set_font_size(self.font_size * 0.8) self.max_value[direction] = max(self.context.text_extents(item)[2] for item in self.labels[direction]) self.borders[other_direction(direction)] = self.max_value[direction] + self.border + 20 def calc_boundaries(self): #HORZ = 0, VERT = 1, NORM = 2 min_data_value = [0,0,0] max_data_value = [0,0,0] for group in self.series: if type(group[0].content) in (int, float, long): group = [Data((index, item.content)) for index,item in enumerate(group)] for point in group: for index, item in enumerate(point.content): if item > max_data_value[index]: max_data_value[index] = item elif item < min_data_value[index]: min_data_value[index] = item if not self.bounds[HORZ]: self.bounds[HORZ] = (min_data_value[HORZ], max_data_value[HORZ]) if not self.bounds[VERT]: self.bounds[VERT] = (min_data_value[VERT], max_data_value[VERT]) if not self.bounds[NORM]: self.bounds[NORM] = (min_data_value[NORM], max_data_value[NORM]) def calc_all_extents(self): self.calc_extents(HORZ) self.calc_extents(VERT) self.plot_height = self.dimensions[VERT] - 2 * self.borders[VERT] self.plot_width = self.dimensions[HORZ] - 2* self.borders[HORZ] self.plot_top = self.dimensions[VERT] - self.borders[VERT] def calc_steps(self): #Calculates all the x, y, z and color steps series_amplitude = [self.bounds[index][1] - self.bounds[index][0] for index in range(3)] if series_amplitude[HORZ]: self.horizontal_step = float (self.plot_width) / series_amplitude[HORZ] else: self.horizontal_step = 0.00 if series_amplitude[VERT]: self.vertical_step = float (self.plot_height) / series_amplitude[VERT] else: self.vertical_step = 0.00 if series_amplitude[NORM]: if self.variable_radius: self.z_step = float (self.bounds[NORM][1]) / series_amplitude[NORM] if self.circle_colors: self.circle_color_step = tuple([float(self.circle_colors[1][i]-self.circle_colors[0][i])/series_amplitude[NORM] for i in range(4)]) else: self.z_step = 0.00 self.circle_color_step = ( 0.0, 0.0, 0.0, 0.0 ) def get_circle_color(self, value): return tuple( [self.circle_colors[0][i] + value*self.circle_color_step[i] for i in range(4)] ) def render(self): self.calc_all_extents() self.calc_steps() self.render_background() self.render_bounding_box() if self.axis: self.render_axis() if self.grid: self.render_grid() self.render_labels() self.render_plot() if self.errors: self.render_errors() if self.series_legend and self.series_labels: self.render_legend() def render_axis(self): #Draws both the axis lines and their titles cr = self.context cr.set_source_rgba(*self.line_color) cr.move_to(self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT]) cr.line_to(self.borders[HORZ], self.borders[VERT]) cr.stroke() cr.move_to(self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT]) cr.line_to(self.dimensions[HORZ] - self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT]) cr.stroke() cr.set_source_rgba(*self.label_color) self.context.set_font_size( 1.2 * self.font_size ) if self.titles[HORZ]: title_width,title_height = cr.text_extents(self.titles[HORZ])[2:4] cr.move_to( self.dimensions[HORZ]/2 - title_width/2, self.borders[VERT] - title_height/2 ) cr.show_text( self.titles[HORZ] ) if self.titles[VERT]: title_width,title_height = cr.text_extents(self.titles[VERT])[2:4] cr.move_to( self.dimensions[HORZ] - self.borders[HORZ] + title_height/2, self.dimensions[VERT]/2 - title_width/2) cr.save() cr.rotate( math.pi/2 ) cr.show_text( self.titles[VERT] ) cr.restore() def render_grid(self): cr = self.context horizontal_step = float( self.plot_height ) / ( len( self.labels[VERT] ) - 1 ) vertical_step = float( self.plot_width ) / ( len( self.labels[HORZ] ) - 1 ) x = self.borders[HORZ] + vertical_step y = self.plot_top - horizontal_step for label in self.labels[HORZ][:-1]: cr.set_source_rgba(*self.grid_color) cr.move_to(x, self.dimensions[VERT] - self.borders[VERT]) cr.line_to(x, self.borders[VERT]) cr.stroke() x += vertical_step for label in self.labels[VERT][:-1]: cr.set_source_rgba(*self.grid_color) cr.move_to(self.borders[HORZ], y) cr.line_to(self.dimensions[HORZ] - self.borders[HORZ], y) cr.stroke() y -= horizontal_step def render_labels(self): self.context.set_font_size(self.font_size * 0.8) self.render_horz_labels() self.render_vert_labels() def render_horz_labels(self): cr = self.context step = float( self.plot_width ) / ( len( self.labels[HORZ] ) - 1 ) x = self.borders[HORZ] y = self.dimensions[VERT] - self.borders[VERT] + 5 # store rotation matrix from the initial state rotation_matrix = cr.get_matrix() rotation_matrix.rotate(self.x_label_angle) cr.set_source_rgba(*self.label_color) for item in self.labels[HORZ]: width = cr.text_extents(item)[2] cr.move_to(x, y) cr.save() cr.set_matrix(rotation_matrix) cr.show_text(item) cr.restore() x += step def render_vert_labels(self): cr = self.context step = ( self.plot_height ) / ( len( self.labels[VERT] ) - 1 ) y = self.plot_top cr.set_source_rgba(*self.label_color) for item in self.labels[VERT]: width = cr.text_extents(item)[2] cr.move_to(self.borders[HORZ] - width - 5,y) cr.show_text(item) y -= step def render_legend(self): cr = self.context cr.set_font_size(self.font_size) cr.set_line_width(self.line_width) widest_word = max(self.series_labels, key = lambda item: self.context.text_extents(item)[2]) tallest_word = max(self.series_labels, key = lambda item: self.context.text_extents(item)[3]) max_width = self.context.text_extents(widest_word)[2] max_height = self.context.text_extents(tallest_word)[3] * 1.1 color_box_height = max_height / 2 color_box_width = color_box_height * 2 #Draw a bounding box bounding_box_width = max_width + color_box_width + 15 bounding_box_height = (len(self.series_labels)+0.5) * max_height cr.set_source_rgba(1,1,1,0.5) cr.rectangle(self.dimensions[HORZ] - self.borders[HORZ] - bounding_box_width, self.borders[VERT], bounding_box_width, bounding_box_height) cr.fill() cr.set_source_rgba(*self.line_color) cr.set_line_width(self.line_width) cr.rectangle(self.dimensions[HORZ] - self.borders[HORZ] - bounding_box_width, self.borders[VERT], bounding_box_width, bounding_box_height) cr.stroke() for idx,key in enumerate(self.series_labels): #Draw color box cr.set_source_rgba(*self.series_colors[idx][:4]) cr.rectangle(self.dimensions[HORZ] - self.borders[HORZ] - max_width - color_box_width - 10, self.borders[VERT] + color_box_height + (idx*max_height) , color_box_width, color_box_height) cr.fill() cr.set_source_rgba(0, 0, 0) cr.rectangle(self.dimensions[HORZ] - self.borders[HORZ] - max_width - color_box_width - 10, self.borders[VERT] + color_box_height + (idx*max_height), color_box_width, color_box_height) cr.stroke() #Draw series labels cr.set_source_rgba(0, 0, 0) cr.move_to(self.dimensions[HORZ] - self.borders[HORZ] - max_width - 5, self.borders[VERT] + ((idx+1)*max_height)) cr.show_text(key) def render_errors(self): cr = self.context cr.rectangle(self.borders[HORZ], self.borders[VERT], self.plot_width, self.plot_height) cr.clip() radius = self.dots x0 = self.borders[HORZ] - self.bounds[HORZ][0]*self.horizontal_step y0 = self.borders[VERT] - self.bounds[VERT][0]*self.vertical_step for index, group in enumerate(self.series): cr.set_source_rgba(*self.series_colors[index][:4]) for number, data in enumerate(group): x = x0 + self.horizontal_step * data.content[0] y = self.dimensions[VERT] - y0 - self.vertical_step * data.content[1] if self.errors[HORZ]: cr.move_to(x, y) x1 = x - self.horizontal_step * self.errors[HORZ][0][number] cr.line_to(x1, y) cr.line_to(x1, y - radius) cr.line_to(x1, y + radius) cr.stroke() if self.errors[HORZ] and len(self.errors[HORZ]) == 2: cr.move_to(x, y) x1 = x + self.horizontal_step * self.errors[HORZ][1][number] cr.line_to(x1, y) cr.line_to(x1, y - radius) cr.line_to(x1, y + radius) cr.stroke() if self.errors[VERT]: cr.move_to(x, y) y1 = y + self.vertical_step * self.errors[VERT][0][number] cr.line_to(x, y1) cr.line_to(x - radius, y1) cr.line_to(x + radius, y1) cr.stroke() if self.errors[VERT] and len(self.errors[VERT]) == 2: cr.move_to(x, y) y1 = y - self.vertical_step * self.errors[VERT][1][number] cr.line_to(x, y1) cr.line_to(x - radius, y1) cr.line_to(x + radius, y1) cr.stroke() def render_plot(self): cr = self.context if self.discrete: cr.rectangle(self.borders[HORZ], self.borders[VERT], self.plot_width, self.plot_height) cr.clip() x0 = self.borders[HORZ] - self.bounds[HORZ][0]*self.horizontal_step y0 = self.borders[VERT] - self.bounds[VERT][0]*self.vertical_step radius = self.dots for number, group in enumerate (self.series): cr.set_source_rgba(*self.series_colors[number][:4]) for data in group : if self.variable_radius: radius = data.content[2]*self.z_step if self.circle_colors: cr.set_source_rgba( *self.get_circle_color( data.content[2]) ) x = x0 + self.horizontal_step*data.content[0] y = y0 + self.vertical_step*data.content[1] cr.arc(x, self.dimensions[VERT] - y, radius, 0, 2*math.pi) cr.fill() else: cr.rectangle(self.borders[HORZ], self.borders[VERT], self.plot_width, self.plot_height) cr.clip() x0 = self.borders[HORZ] - self.bounds[HORZ][0]*self.horizontal_step y0 = self.borders[VERT] - self.bounds[VERT][0]*self.vertical_step radius = self.dots for number, group in enumerate (self.series): last_data = None cr.set_source_rgba(*self.series_colors[number][:4]) for data in group : x = x0 + self.horizontal_step*data.content[0] y = y0 + self.vertical_step*data.content[1] if self.dots: if self.variable_radius: radius = data.content[2]*self.z_step cr.arc(x, self.dimensions[VERT] - y, radius, 0, 2*math.pi) cr.fill() if last_data : old_x = x0 + self.horizontal_step*last_data.content[0] old_y = y0 + self.vertical_step*last_data.content[1] cr.move_to( old_x, self.dimensions[VERT] - old_y ) cr.line_to( x, self.dimensions[VERT] - y) cr.set_line_width(self.series_widths[number]) # Display line as dash line if self.dash and self.dash[number]: s = self.series_widths[number] cr.set_dash([s*3, s*3], 0) cr.stroke() cr.set_dash([]) last_data = data class DotLinePlot(ScatterPlot): def __init__(self, surface=None, data=None, width=640, height=480, background=None, border=0, axis = False, dash = False, dots = 0, grid = False, series_legend = False, x_labels = None, y_labels = None, x_bounds = None, y_bounds = None, x_title = None, y_title = None, series_colors = None): ScatterPlot.__init__(self, surface, data, None, None, width, height, background, border, axis, dash, False, dots, grid, series_legend, x_labels, y_labels, x_bounds, y_bounds, None, x_title, y_title, series_colors, None ) def load_series(self, data, x_labels = None, y_labels = None, series_colors=None): Plot.load_series(self, data, x_labels, y_labels, series_colors) for group in self.series : for index,data in enumerate(group): group[index].content = (index, data.content) self.calc_boundaries() self.calc_labels() class FunctionPlot(ScatterPlot): def __init__(self, surface=None, data=None, width=640, height=480, background=None, border=0, axis = False, discrete = False, dots = 0, grid = False, series_legend = False, x_labels = None, y_labels = None, x_bounds = None, y_bounds = None, x_title = None, y_title = None, series_colors = None, step = 1): self.function = data self.step = step self.discrete = discrete data, x_bounds = self.load_series_from_function( self.function, x_bounds ) ScatterPlot.__init__(self, surface, data, None, None, width, height, background, border, axis, False, discrete, dots, grid, series_legend, x_labels, y_labels, x_bounds, y_bounds, None, x_title, y_title, series_colors, None ) def load_series(self, data, x_labels = None, y_labels = None, series_colors=None): Plot.load_series(self, data, x_labels, y_labels, series_colors) if len(self.series[0][0]) is 1: for group_id, group in enumerate(self.series) : for index,data in enumerate(group): group[index].content = (self.bounds[HORZ][0] + self.step*index, data.content) self.calc_boundaries() self.calc_labels() def load_series_from_function( self, function, x_bounds ): #TODO: Add the possibility for the user to define multiple functions with different discretization parameters #This function converts a function, a list of functions or a dictionary #of functions into its corresponding array of data series = Series() if isinstance(function, Group) or isinstance(function, Data): function = Series(function) # If is instance of Series if isinstance(function, Series): # Overwrite any bounds passed by the function x_bounds = (function.range[0],function.range[-1]) #if no bounds are provided if x_bounds == None: x_bounds = (0,10) #TODO: Finish the dict translation if hasattr(function, "keys"): #dictionary: for key in function.keys(): group = Group(name=key) #data[ key ] = [] i = x_bounds[0] while i <= x_bounds[1] : group.add_data(function[ key ](i)) #data[ key ].append( function[ key ](i) ) i += self.step series.add_group(group) elif hasattr(function, "__delitem__"): #list of functions for index,f in enumerate( function ) : group = Group() #data.append( [] ) i = x_bounds[0] while i <= x_bounds[1] : group.add_data(f(i)) #data[ index ].append( f(i) ) i += self.step series.add_group(group) elif isinstance(function, Series): # instance of Series series = function else: #function group = Group() i = x_bounds[0] while i <= x_bounds[1] : group.add_data(function(i)) i += self.step series.add_group(group) return series, x_bounds def calc_labels(self): if not self.labels[HORZ]: self.labels[HORZ] = [] i = self.bounds[HORZ][0] while i<=self.bounds[HORZ][1]: self.labels[HORZ].append(str(i)) i += float(self.bounds[HORZ][1] - self.bounds[HORZ][0])/10 ScatterPlot.calc_labels(self) def render_plot(self): if not self.discrete: ScatterPlot.render_plot(self) else: last = None cr = self.context for number, group in enumerate (self.series): cr.set_source_rgba(*self.series_colors[number][:4]) x0 = self.borders[HORZ] - self.bounds[HORZ][0]*self.horizontal_step y0 = self.borders[VERT] - self.bounds[VERT][0]*self.vertical_step for data in group: x = x0 + self.horizontal_step * data.content[0] y = y0 + self.vertical_step * data.content[1] cr.move_to(x, self.dimensions[VERT] - y) cr.line_to(x, self.plot_top) cr.set_line_width(self.series_widths[number]) cr.stroke() if self.dots: cr.new_path() cr.arc(x, self.dimensions[VERT] - y, 3, 0, 2.1 * math.pi) cr.close_path() cr.fill() class BarPlot(Plot): def __init__(self, surface = None, data = None, width = 640, height = 480, background = "white light_gray", border = 0, display_values = False, grid = False, rounded_corners = False, stack = False, three_dimension = False, x_labels = None, y_labels = None, x_bounds = None, y_bounds = None, series_colors = None, main_dir = None): self.bounds = {} self.bounds[HORZ] = x_bounds self.bounds[VERT] = y_bounds self.display_values = display_values self.grid = grid self.rounded_corners = rounded_corners self.stack = stack self.three_dimension = three_dimension self.x_label_angle = math.pi / 2.5 self.main_dir = main_dir self.max_value = {} self.plot_dimensions = {} self.steps = {} self.value_label_color = (0.5,0.5,0.5,1.0) Plot.__init__(self, surface, data, width, height, background, border, x_labels, y_labels, series_colors) def load_series(self, data, x_labels = None, y_labels = None, series_colors = None): Plot.load_series(self, data, x_labels, y_labels, series_colors) self.calc_boundaries() def process_colors(self, series_colors): #Data for a BarPlot might be a List or a List of Lists. #On the first case, colors must be generated for all bars, #On the second, colors must be generated for each of the inner lists. #TODO: Didn't get it... #if hasattr(self.data[0], '__getitem__'): # length = max(len(series) for series in self.data) #else: # length = len( self.data ) length = max(len(group) for group in self.series) Plot.process_colors( self, series_colors, length, 'linear') def calc_boundaries(self): if not self.bounds[self.main_dir]: min_data_value = 0 if self.stack: max_data_value = max(sum(group.to_list()) for group in self.series) else: max_data_value = max(max(group.to_list()) for group in self.series) min_data_value = min(min(group.to_list()) for group in self.series) self.bounds[self.main_dir] = (min(0, min_data_value), max_data_value) if not self.bounds[other_direction(self.main_dir)]: self.bounds[other_direction(self.main_dir)] = (0, len(self.series)) def calc_extents(self, direction): self.max_value[direction] = 0 if self.labels[direction]: widest_word = max(self.labels[direction], key = lambda item: self.context.text_extents(item)[2]) self.max_value[direction] = self.context.text_extents(widest_word)[3 - direction] self.borders[other_direction(direction)] = (2-direction)*self.max_value[direction] + self.border + direction*(5) else: self.borders[other_direction(direction)] = self.border def calc_horz_extents(self): self.calc_extents(HORZ) def calc_vert_extents(self): self.calc_extents(VERT) def calc_all_extents(self): self.calc_horz_extents() self.calc_vert_extents() other_dir = other_direction(self.main_dir) self.value_label = 0 if self.display_values: if self.stack: self.value_label = self.context.text_extents(str(max(sum(group.to_list()) for group in self.series)))[2 + self.main_dir] else: self.value_label = self.context.text_extents(str(max(max(group.to_list()) for group in self.series)))[2 + self.main_dir] if self.labels[self.main_dir]: self.plot_dimensions[self.main_dir] = self.dimensions[self.main_dir] - 2*self.borders[self.main_dir] - self.value_label else: self.plot_dimensions[self.main_dir] = self.dimensions[self.main_dir] - self.borders[self.main_dir] - 1.2*self.border - self.value_label self.plot_dimensions[other_dir] = self.dimensions[other_dir] - self.borders[other_dir] - self.border self.plot_top = self.dimensions[VERT] - self.borders[VERT] def calc_steps(self): other_dir = other_direction(self.main_dir) self.series_amplitude = self.bounds[self.main_dir][1] - self.bounds[self.main_dir][0] if self.series_amplitude: self.steps[self.main_dir] = float(self.plot_dimensions[self.main_dir])/self.series_amplitude else: self.steps[self.main_dir] = 0.00 series_length = len(self.series) self.steps[other_dir] = float(self.plot_dimensions[other_dir])/(series_length + 0.1*(series_length + 1)) self.space = 0.1*self.steps[other_dir] def render(self): self.calc_all_extents() self.calc_steps() if self.bounds[VERT][0] < 0: self.plot_top += self.bounds[VERT][0] * self.steps[VERT] self.render_background() self.render_bounding_box() if self.grid: self.render_grid() if self.three_dimension: self.render_ground() if self.display_values: self.render_values() self.render_labels() self.render_plot() if self.series_labels: self.render_legend() def draw_3d_rectangle_front(self, x0, y0, x1, y1, shift): self.context.rectangle(x0-shift, y0+shift, x1-x0, y1-y0) def draw_3d_rectangle_side(self, x0, y0, x1, y1, shift): self.context.move_to(x1-shift,y0+shift) self.context.line_to(x1, y0) self.context.line_to(x1, y1) self.context.line_to(x1-shift, y1+shift) self.context.line_to(x1-shift, y0+shift) self.context.close_path() def draw_3d_rectangle_top(self, x0, y0, x1, y1, shift): self.context.move_to(x0-shift,y0+shift) self.context.line_to(x0, y0) self.context.line_to(x1, y0) self.context.line_to(x1-shift, y0+shift) self.context.line_to(x0-shift, y0+shift) self.context.close_path() def draw_round_rectangle(self, x0, y0, x1, y1): if y0 > y1: y0, y1 = y1, y0 self.context.arc(x0+5, y0+5, 5, -math.pi, -math.pi/2) self.context.line_to(x1-5, y0) self.context.arc(x1-5, y0+5, 5, -math.pi/2, 0) self.context.line_to(x1, y1-5) self.context.arc(x1-5, y1-5, 5, 0, math.pi/2) self.context.line_to(x0+5, y1) self.context.arc(x0+5, y1-5, 5, math.pi/2, math.pi) self.context.line_to(x0, y0+5) self.context.close_path() def render_ground(self): self.draw_3d_rectangle_front(self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT], self.dimensions[HORZ] - self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT] + 5, 10) self.context.fill() self.draw_3d_rectangle_side (self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT], self.dimensions[HORZ] - self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT] + 5, 10) self.context.fill() self.draw_3d_rectangle_top (self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT], self.dimensions[HORZ] - self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT] + 5, 10) self.context.fill() def render_labels(self): self.context.set_font_size(self.font_size * 0.8) if self.labels[HORZ]: self.render_horz_labels() if self.labels[VERT]: self.render_vert_labels() def render_legend(self): cr = self.context cr.set_font_size(self.font_size) cr.set_line_width(self.line_width) widest_word = max(self.series_labels, key = lambda item: self.context.text_extents(item)[2]) tallest_word = max(self.series_labels, key = lambda item: self.context.text_extents(item)[3]) max_width = self.context.text_extents(widest_word)[2] max_height = self.context.text_extents(tallest_word)[3] * 1.1 + 5 color_box_height = max_height / 2 color_box_width = color_box_height * 2 #Draw a bounding box bounding_box_width = max_width + color_box_width + 15 bounding_box_height = (len(self.series_labels)+0.5) * max_height cr.set_source_rgba(1,1,1,0.5) cr.rectangle(self.dimensions[HORZ] - self.border - bounding_box_width, self.border, bounding_box_width, bounding_box_height) cr.fill() cr.set_source_rgba(*self.line_color) cr.set_line_width(self.line_width) cr.rectangle(self.dimensions[HORZ] - self.border - bounding_box_width, self.border, bounding_box_width, bounding_box_height) cr.stroke() for idx,key in enumerate(self.series_labels): #Draw color box cr.set_source_rgba(*self.series_colors[idx][:4]) cr.rectangle(self.dimensions[HORZ] - self.border - max_width - color_box_width - 10, self.border + color_box_height + (idx*max_height) , color_box_width, color_box_height) cr.fill() cr.set_source_rgba(0, 0, 0) cr.rectangle(self.dimensions[HORZ] - self.border - max_width - color_box_width - 10, self.border + color_box_height + (idx*max_height), color_box_width, color_box_height) cr.stroke() #Draw series labels cr.set_source_rgba(0, 0, 0) cr.move_to(self.dimensions[HORZ] - self.border - max_width - 5, self.border + ((idx+1)*max_height)) cr.show_text(key) class HorizontalBarPlot(BarPlot): def __init__(self, surface = None, data = None, width = 640, height = 480, background = "white light_gray", border = 0, display_values = False, grid = False, rounded_corners = False, stack = False, three_dimension = False, series_labels = None, x_labels = None, y_labels = None, x_bounds = None, y_bounds = None, series_colors = None): BarPlot.__init__(self, surface, data, width, height, background, border, display_values, grid, rounded_corners, stack, three_dimension, x_labels, y_labels, x_bounds, y_bounds, series_colors, HORZ) self.series_labels = series_labels def calc_vert_extents(self): self.calc_extents(VERT) if self.labels[HORZ] and not self.labels[VERT]: self.borders[HORZ] += 10 def draw_rectangle_bottom(self, x0, y0, x1, y1): self.context.arc(x0+5, y1-5, 5, math.pi/2, math.pi) self.context.line_to(x0, y0+5) self.context.arc(x0+5, y0+5, 5, -math.pi, -math.pi/2) self.context.line_to(x1, y0) self.context.line_to(x1, y1) self.context.line_to(x0+5, y1) self.context.close_path() def draw_rectangle_top(self, x0, y0, x1, y1): self.context.arc(x1-5, y0+5, 5, -math.pi/2, 0) self.context.line_to(x1, y1-5) self.context.arc(x1-5, y1-5, 5, 0, math.pi/2) self.context.line_to(x0, y1) self.context.line_to(x0, y0) self.context.line_to(x1, y0) self.context.close_path() def draw_rectangle(self, index, length, x0, y0, x1, y1): if length == 1: BarPlot.draw_rectangle(self, x0, y0, x1, y1) elif index == 0: self.draw_rectangle_bottom(x0, y0, x1, y1) elif index == length-1: self.draw_rectangle_top(x0, y0, x1, y1) else: self.context.rectangle(x0, y0, x1-x0, y1-y0) #TODO: Review BarPlot.render_grid code def render_grid(self): self.context.set_source_rgba(0.8, 0.8, 0.8) if self.labels[HORZ]: self.context.set_font_size(self.font_size * 0.8) step = (self.dimensions[HORZ] - 2*self.borders[HORZ] - self.value_label)/(len(self.labels[HORZ])-1) x = self.borders[HORZ] next_x = 0 for item in self.labels[HORZ]: width = self.context.text_extents(item)[2] if x - width/2 > next_x and x - width/2 > self.border: self.context.move_to(x, self.border) self.context.line_to(x, self.dimensions[VERT] - self.borders[VERT]) self.context.stroke() next_x = x + width/2 x += step else: lines = 11 horizontal_step = float(self.plot_dimensions[HORZ])/(lines-1) x = self.borders[HORZ] for y in xrange(0, lines): self.context.move_to(x, self.border) self.context.line_to(x, self.dimensions[VERT] - self.borders[VERT]) self.context.stroke() x += horizontal_step def render_horz_labels(self): step = (self.dimensions[HORZ] - 2*self.borders[HORZ])/(len(self.labels[HORZ])-1) x = self.borders[HORZ] next_x = 0 for item in self.labels[HORZ]: self.context.set_source_rgba(*self.label_color) width = self.context.text_extents(item)[2] if x - width/2 > next_x and x - width/2 > self.border: self.context.move_to(x - width/2, self.dimensions[VERT] - self.borders[VERT] + self.max_value[HORZ] + 3) self.context.show_text(item) next_x = x + width/2 x += step def render_vert_labels(self): series_length = len(self.labels[VERT]) step = (self.plot_dimensions[VERT] - (series_length + 1)*self.space)/(len(self.labels[VERT])) y = self.border + step/2 + self.space for item in self.labels[VERT]: self.context.set_source_rgba(*self.label_color) width, height = self.context.text_extents(item)[2:4] self.context.move_to(self.borders[HORZ] - width - 5, y + height/2) self.context.show_text(item) y += step + self.space self.labels[VERT].reverse() def render_values(self): self.context.set_source_rgba(*self.value_label_color) self.context.set_font_size(self.font_size * 0.8) if self.stack: for i,group in enumerate(self.series): value = sum(group.to_list()) height = self.context.text_extents(str(value))[3] x = self.borders[HORZ] + value*self.steps[HORZ] + 2 y = self.borders[VERT] + (i+0.5)*self.steps[VERT] + (i+1)*self.space + height/2 self.context.move_to(x, y) self.context.show_text(str(value)) else: for i,group in enumerate(self.series): inner_step = self.steps[VERT]/len(group) y0 = self.border + i*self.steps[VERT] + (i+1)*self.space for number,data in enumerate(group): height = self.context.text_extents(str(data.content))[3] self.context.move_to(self.borders[HORZ] + data.content*self.steps[HORZ] + 2, y0 + 0.5*inner_step + height/2, ) self.context.show_text(str(data.content)) y0 += inner_step def render_plot(self): if self.stack: for i,group in enumerate(self.series): x0 = self.borders[HORZ] y0 = self.borders[VERT] + i*self.steps[VERT] + (i+1)*self.space for number,data in enumerate(group): if self.series_colors[number][4] in ('radial','linear') : linear = cairo.LinearGradient( data.content*self.steps[HORZ]/2, y0, data.content*self.steps[HORZ]/2, y0 + self.steps[VERT] ) color = self.series_colors[number] linear.add_color_stop_rgba(0.0, 3.5*color[0]/5.0, 3.5*color[1]/5.0, 3.5*color[2]/5.0,1.0) linear.add_color_stop_rgba(1.0, *color[:4]) self.context.set_source(linear) elif self.series_colors[number][4] == 'solid': self.context.set_source_rgba(*self.series_colors[number][:4]) if self.rounded_corners: self.draw_rectangle(number, len(group), x0, y0, x0+data.content*self.steps[HORZ], y0+self.steps[VERT]) self.context.fill() else: self.context.rectangle(x0, y0, data.content*self.steps[HORZ], self.steps[VERT]) self.context.fill() x0 += data.content*self.steps[HORZ] else: for i,group in enumerate(self.series): inner_step = self.steps[VERT]/len(group) x0 = self.borders[HORZ] y0 = self.border + i*self.steps[VERT] + (i+1)*self.space for number,data in enumerate(group): linear = cairo.LinearGradient(data.content*self.steps[HORZ]/2, y0, data.content*self.steps[HORZ]/2, y0 + inner_step) color = self.series_colors[number] linear.add_color_stop_rgba(0.0, 3.5*color[0]/5.0, 3.5*color[1]/5.0, 3.5*color[2]/5.0,1.0) linear.add_color_stop_rgba(1.0, *color[:4]) self.context.set_source(linear) if self.rounded_corners and data.content != 0: BarPlot.draw_round_rectangle(self,x0, y0, x0 + data.content*self.steps[HORZ], y0 + inner_step) self.context.fill() else: self.context.rectangle(x0, y0, data.content*self.steps[HORZ], inner_step) self.context.fill() y0 += inner_step class VerticalBarPlot(BarPlot): def __init__(self, surface = None, data = None, width = 640, height = 480, background = "white light_gray", border = 0, display_values = False, grid = False, rounded_corners = False, stack = False, three_dimension = False, series_labels = None, x_labels = None, y_labels = None, x_bounds = None, y_bounds = None, series_colors = None, value_formatter = None): BarPlot.__init__(self, surface, data, width, height, background, border, display_values, grid, rounded_corners, stack, three_dimension, x_labels, y_labels, x_bounds, y_bounds, series_colors, VERT) self.series_labels = series_labels self.value_formatter = value_formatter or str def calc_vert_extents(self): self.calc_extents(VERT) if self.labels[VERT] and not self.labels[HORZ]: self.borders[VERT] += 10 def draw_rectangle_bottom(self, x0, y0, x1, y1): self.context.move_to(x1,y1) self.context.arc(x1-5, y1-5, 5, 0, math.pi/2) self.context.line_to(x0+5, y1) self.context.arc(x0+5, y1-5, 5, math.pi/2, math.pi) self.context.line_to(x0, y0) self.context.line_to(x1, y0) self.context.line_to(x1, y1) self.context.close_path() def draw_rectangle_top(self, x0, y0, x1, y1): self.context.arc(x0+5, y0+5, 5, -math.pi, -math.pi/2) self.context.line_to(x1-5, y0) self.context.arc(x1-5, y0+5, 5, -math.pi/2, 0) self.context.line_to(x1, y1) self.context.line_to(x0, y1) self.context.line_to(x0, y0) self.context.close_path() def draw_rectangle(self, index, length, x0, y0, x1, y1): if length == 1: BarPlot.draw_rectangle(self, x0, y0, x1, y1) elif index == 0: self.draw_rectangle_bottom(x0, y0, x1, y1) elif index == length-1: self.draw_rectangle_top(x0, y0, x1, y1) else: self.context.rectangle(x0, y0, x1-x0, y1-y0) def render_grid(self): self.context.set_source_rgba(0.8, 0.8, 0.8) if self.labels[VERT]: lines = len(self.labels[VERT]) vertical_step = float(self.plot_dimensions[self.main_dir])/(lines-1) y = self.borders[VERT] + self.value_label else: lines = 11 vertical_step = float(self.plot_dimensions[self.main_dir])/(lines-1) y = 1.2*self.border + self.value_label + self.bounds[VERT][0]*self.steps[VERT] for x in xrange(0, lines): self.context.move_to(self.borders[HORZ], y) self.context.line_to(self.dimensions[HORZ] - self.border, y) self.context.stroke() y += vertical_step def render_ground(self): self.draw_3d_rectangle_front(self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT], self.dimensions[HORZ] - self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT] + 5, 10) self.context.fill() self.draw_3d_rectangle_side (self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT], self.dimensions[HORZ] - self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT] + 5, 10) self.context.fill() self.draw_3d_rectangle_top (self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT], self.dimensions[HORZ] - self.borders[HORZ], self.dimensions[VERT] - self.borders[VERT] + 5, 10) self.context.fill() def render_horz_labels(self): series_length = len(self.labels[HORZ]) step = float (self.plot_dimensions[HORZ] - (series_length + 1)*self.space)/len(self.labels[HORZ]) x = self.borders[HORZ] + step/2 + self.space next_x = 0 for item in self.labels[HORZ]: self.context.set_source_rgba(*self.label_color) width = self.context.text_extents(item)[2] if x - width/2 > next_x and x - width/2 > self.borders[HORZ]: self.context.move_to(x - width/2, self.dimensions[VERT] - self.borders[VERT] + self.max_value[HORZ] + 3) self.context.show_text(item) next_x = x + width/2 x += step + self.space def render_vert_labels(self): self.context.set_source_rgba(*self.label_color) y = self.borders[VERT] + self.value_label step = (self.dimensions[VERT] - 2*self.borders[VERT] - self.value_label)/(len(self.labels[VERT]) - 1) self.labels[VERT].reverse() for item in self.labels[VERT]: width, height = self.context.text_extents(item)[2:4] self.context.move_to(self.borders[HORZ] - width - 5, y + height/2) self.context.show_text(item) y += step self.labels[VERT].reverse() def render_values(self): self.context.set_source_rgba(*self.value_label_color) self.context.set_font_size(self.font_size * 0.8) if self.stack: for i,group in enumerate(self.series): value = sum(group.to_list()) strvalue = self.value_formatter(value) width = self.context.text_extents(strvalue)[2] x = self.borders[HORZ] + (i+0.5)*self.steps[HORZ] + (i+1)*self.space - width/2 y = value*self.steps[VERT] + 2 self.context.move_to(x, self.plot_top-y) self.context.show_text(strvalue) else: for i,group in enumerate(self.series): inner_step = self.steps[HORZ]/len(group) x0 = self.borders[HORZ] + i*self.steps[HORZ] + (i+1)*self.space for number,data in enumerate(group): strvalue = self.value_formatter(data.content) width = self.context.text_extents(strvalue)[2] negative_value_correction = 0 if data.content < 0: negative_value_correction = 6 + self.steps[VERT] self.context.move_to(x0 + 0.5*inner_step - width/2, self.plot_top - data.content*self.steps[VERT] - 2 + negative_value_correction) self.context.show_text(strvalue) x0 += inner_step def render_plot(self): if self.stack: for i,group in enumerate(self.series): x0 = self.borders[HORZ] + i*self.steps[HORZ] + (i+1)*self.space y0 = 0 for number,data in enumerate(group): if self.series_colors[number][4] in ('linear','radial'): linear = cairo.LinearGradient( x0, data.content*self.steps[VERT]/2, x0 + self.steps[HORZ], data.content*self.steps[VERT]/2 ) color = self.series_colors[number] linear.add_color_stop_rgba(0.0, 3.5*color[0]/5.0, 3.5*color[1]/5.0, 3.5*color[2]/5.0,1.0) linear.add_color_stop_rgba(1.0, *color[:4]) self.context.set_source(linear) elif self.series_colors[number][4] == 'solid': self.context.set_source_rgba(*self.series_colors[number][:4]) if self.rounded_corners: self.draw_rectangle(number, len(group), x0, self.plot_top - y0 - data.content*self.steps[VERT], x0 + self.steps[HORZ], self.plot_top - y0) self.context.fill() else: self.context.rectangle(x0, self.plot_top - y0 - data.content*self.steps[VERT], self.steps[HORZ], data.content*self.steps[VERT]) self.context.fill() y0 += data.content*self.steps[VERT] else: for i,group in enumerate(self.series): inner_step = self.steps[HORZ]/len(group) y0 = self.borders[VERT] x0 = self.borders[HORZ] + i*self.steps[HORZ] + (i+1)*self.space for number,data in enumerate(group): if self.series_colors[number][4] == 'linear': linear = cairo.LinearGradient( x0, data.content*self.steps[VERT]/2, x0 + inner_step, data.content*self.steps[VERT]/2 ) color = self.series_colors[number] linear.add_color_stop_rgba(0.0, 3.5*color[0]/5.0, 3.5*color[1]/5.0, 3.5*color[2]/5.0,1.0) linear.add_color_stop_rgba(1.0, *color[:4]) self.context.set_source(linear) elif self.series_colors[number][4] == 'solid': self.context.set_source_rgba(*self.series_colors[number][:4]) if self.rounded_corners and data.content != 0: BarPlot.draw_round_rectangle(self, x0, self.plot_top - data.content*self.steps[VERT], x0+inner_step, self.plot_top) self.context.fill() elif self.three_dimension: self.draw_3d_rectangle_front(x0, self.plot_top - data.content*self.steps[VERT], x0+inner_step, self.plot_top, 5) self.context.fill() self.draw_3d_rectangle_side(x0, self.plot_top - data.content*self.steps[VERT], x0+inner_step, self.plot_top, 5) self.context.fill() self.draw_3d_rectangle_top(x0, self.plot_top - data.content*self.steps[VERT], x0+inner_step, self.plot_top, 5) self.context.fill() else: self.context.rectangle(x0, self.plot_top - data.content*self.steps[VERT], inner_step, data.content*self.steps[VERT]) self.context.fill() x0 += inner_step class StreamChart(VerticalBarPlot): def __init__(self, surface = None, data = None, width = 640, height = 480, background = "white light_gray", border = 0, grid = False, series_legend = None, x_labels = None, x_bounds = None, y_bounds = None, series_colors = None): VerticalBarPlot.__init__(self, surface, data, width, height, background, border, False, grid, False, True, False, None, x_labels, None, x_bounds, y_bounds, series_colors) def calc_steps(self): other_dir = other_direction(self.main_dir) self.series_amplitude = self.bounds[self.main_dir][1] - self.bounds[self.main_dir][0] if self.series_amplitude: self.steps[self.main_dir] = float(self.plot_dimensions[self.main_dir])/self.series_amplitude else: self.steps[self.main_dir] = 0.00 series_length = len(self.data) self.steps[other_dir] = float(self.plot_dimensions[other_dir])/series_length def render_legend(self): pass def ground(self, index): sum_values = sum(self.data[index]) return -0.5*sum_values def calc_angles(self): middle = self.plot_top - self.plot_dimensions[VERT]/2.0 self.angles = [tuple([0.0 for x in range(len(self.data)+1)])] for x_index in range(1, len(self.data)-1): t = [] x0 = self.borders[HORZ] + (0.5 + x_index - 1)*self.steps[HORZ] x2 = self.borders[HORZ] + (0.5 + x_index + 1)*self.steps[HORZ] y0 = middle - self.ground(x_index-1)*self.steps[VERT] y2 = middle - self.ground(x_index+1)*self.steps[VERT] t.append(math.atan(float(y0-y2)/(x0-x2))) for data_index in range(len(self.data[x_index])): x0 = self.borders[HORZ] + (0.5 + x_index - 1)*self.steps[HORZ] x2 = self.borders[HORZ] + (0.5 + x_index + 1)*self.steps[HORZ] y0 = middle - self.ground(x_index-1)*self.steps[VERT] - self.data[x_index-1][data_index]*self.steps[VERT] y2 = middle - self.ground(x_index+1)*self.steps[VERT] - self.data[x_index+1][data_index]*self.steps[VERT] for i in range(0,data_index): y0 -= self.data[x_index-1][i]*self.steps[VERT] y2 -= self.data[x_index+1][i]*self.steps[VERT] if data_index == len(self.data[0])-1 and False: self.context.set_source_rgba(0.0,0.0,0.0,0.3) self.context.move_to(x0,y0) self.context.line_to(x2,y2) self.context.stroke() self.context.arc(x0,y0,2,0,2*math.pi) self.context.fill() t.append(math.atan(float(y0-y2)/(x0-x2))) self.angles.append(tuple(t)) self.angles.append(tuple([0.0 for x in range(len(self.data)+1)])) def render_plot(self): self.calc_angles() middle = self.plot_top - self.plot_dimensions[VERT]/2.0 p = 0.4*self.steps[HORZ] for data_index in range(len(self.data[0])-1,-1,-1): self.context.set_source_rgba(*self.series_colors[data_index][:4]) #draw the upper line for x_index in range(len(self.data)-1) : x1 = self.borders[HORZ] + (0.5 + x_index)*self.steps[HORZ] y1 = middle - self.ground(x_index)*self.steps[VERT] - self.data[x_index][data_index]*self.steps[VERT] x2 = self.borders[HORZ] + (0.5 + x_index + 1)*self.steps[HORZ] y2 = middle - self.ground(x_index + 1)*self.steps[VERT] - self.data[x_index + 1][data_index]*self.steps[VERT] for i in range(0,data_index): y1 -= self.data[x_index][i]*self.steps[VERT] y2 -= self.data[x_index+1][i]*self.steps[VERT] if x_index == 0: self.context.move_to(x1,y1) ang1 = self.angles[x_index][data_index+1] ang2 = self.angles[x_index+1][data_index+1] + math.pi self.context.curve_to(x1+p*math.cos(ang1),y1+p*math.sin(ang1), x2+p*math.cos(ang2),y2+p*math.sin(ang2), x2,y2) for x_index in range(len(self.data)-1,0,-1) : x1 = self.borders[HORZ] + (0.5 + x_index)*self.steps[HORZ] y1 = middle - self.ground(x_index)*self.steps[VERT] x2 = self.borders[HORZ] + (0.5 + x_index - 1)*self.steps[HORZ] y2 = middle - self.ground(x_index - 1)*self.steps[VERT] for i in range(0,data_index): y1 -= self.data[x_index][i]*self.steps[VERT] y2 -= self.data[x_index-1][i]*self.steps[VERT] if x_index == len(self.data)-1: self.context.line_to(x1,y1+2) #revert angles by pi degrees to take the turn back ang1 = self.angles[x_index][data_index] + math.pi ang2 = self.angles[x_index-1][data_index] self.context.curve_to(x1+p*math.cos(ang1),y1+p*math.sin(ang1), x2+p*math.cos(ang2),y2+p*math.sin(ang2), x2,y2+2) self.context.close_path() self.context.fill() if False: self.context.move_to(self.borders[HORZ] + 0.5*self.steps[HORZ], middle) for x_index in range(len(self.data)-1) : x1 = self.borders[HORZ] + (0.5 + x_index)*self.steps[HORZ] y1 = middle - self.ground(x_index)*self.steps[VERT] - self.data[x_index][data_index]*self.steps[VERT] x2 = self.borders[HORZ] + (0.5 + x_index + 1)*self.steps[HORZ] y2 = middle - self.ground(x_index + 1)*self.steps[VERT] - self.data[x_index + 1][data_index]*self.steps[VERT] for i in range(0,data_index): y1 -= self.data[x_index][i]*self.steps[VERT] y2 -= self.data[x_index+1][i]*self.steps[VERT] ang1 = self.angles[x_index][data_index+1] ang2 = self.angles[x_index+1][data_index+1] + math.pi self.context.set_source_rgba(1.0,0.0,0.0) self.context.arc(x1+p*math.cos(ang1),y1+p*math.sin(ang1),2,0,2*math.pi) self.context.fill() self.context.set_source_rgba(0.0,0.0,0.0) self.context.arc(x2+p*math.cos(ang2),y2+p*math.sin(ang2),2,0,2*math.pi) self.context.fill() '''self.context.set_source_rgba(0.0,0.0,0.0,0.3) self.context.arc(x2,y2,2,0,2*math.pi) self.context.fill()''' self.context.move_to(x1,y1) self.context.line_to(x1+p*math.cos(ang1),y1+p*math.sin(ang1)) self.context.stroke() self.context.move_to(x2,y2) self.context.line_to(x2+p*math.cos(ang2),y2+p*math.sin(ang2)) self.context.stroke() if False: for x_index in range(len(self.data)-1,0,-1) : x1 = self.borders[HORZ] + (0.5 + x_index)*self.steps[HORZ] y1 = middle - self.ground(x_index)*self.steps[VERT] x2 = self.borders[HORZ] + (0.5 + x_index - 1)*self.steps[HORZ] y2 = middle - self.ground(x_index - 1)*self.steps[VERT] for i in range(0,data_index): y1 -= self.data[x_index][i]*self.steps[VERT] y2 -= self.data[x_index-1][i]*self.steps[VERT] #revert angles by pi degrees to take the turn back ang1 = self.angles[x_index][data_index] + math.pi ang2 = self.angles[x_index-1][data_index] self.context.set_source_rgba(0.0,1.0,0.0) self.context.arc(x1+p*math.cos(ang1),y1+p*math.sin(ang1),2,0,2*math.pi) self.context.fill() self.context.set_source_rgba(0.0,0.0,1.0) self.context.arc(x2+p*math.cos(ang2),y2+p*math.sin(ang2),2,0,2*math.pi) self.context.fill() '''self.context.set_source_rgba(0.0,0.0,0.0,0.3) self.context.arc(x2,y2,2,0,2*math.pi) self.context.fill()''' self.context.move_to(x1,y1) self.context.line_to(x1+p*math.cos(ang1),y1+p*math.sin(ang1)) self.context.stroke() self.context.move_to(x2,y2) self.context.line_to(x2+p*math.cos(ang2),y2+p*math.sin(ang2)) self.context.stroke() #break #self.context.arc(self.dimensions[HORZ]/2, self.dimensions[VERT]/2,50,0,3*math.pi/2) #self.context.fill() class PiePlot(Plot): #TODO: Check the old cairoplot, graphs aren't matching def __init__ (self, surface = None, data = None, width = 640, height = 480, background = "white light_gray", gradient = False, shadow = False, colors = None): Plot.__init__( self, surface, data, width, height, background, series_colors = colors ) self.center = (self.dimensions[HORZ]/2, self.dimensions[VERT]/2) self.total = sum( self.series.to_list() ) self.radius = min(self.dimensions[HORZ]/3,self.dimensions[VERT]/3) self.gradient = gradient self.shadow = shadow def sort_function(x,y): return x.content - y.content def load_series(self, data, x_labels=None, y_labels=None, series_colors=None): Plot.load_series(self, data, x_labels, y_labels, series_colors) # Already done inside series #self.data = sorted(self.data) def draw_piece(self, angle, next_angle): self.context.move_to(self.center[0],self.center[1]) self.context.line_to(self.center[0] + self.radius*math.cos(angle), self.center[1] + self.radius*math.sin(angle)) self.context.arc(self.center[0], self.center[1], self.radius, angle, next_angle) self.context.line_to(self.center[0], self.center[1]) self.context.close_path() def render(self): self.render_background() self.render_bounding_box() if self.shadow: self.render_shadow() self.render_plot() self.render_series_labels() def render_shadow(self): horizontal_shift = 3 vertical_shift = 3 self.context.set_source_rgba(0, 0, 0, 0.5) self.context.arc(self.center[0] + horizontal_shift, self.center[1] + vertical_shift, self.radius, 0, 2*math.pi) self.context.fill() def render_series_labels(self): angle = 0 next_angle = 0 x0,y0 = self.center cr = self.context for number,key in enumerate(self.series_labels): # self.data[number] should be just a number data = sum(self.series[number].to_list()) next_angle = angle + 2.0*math.pi*data/self.total cr.set_source_rgba(*self.series_colors[number][:4]) w = cr.text_extents(key)[2] if (angle + next_angle)/2 < math.pi/2 or (angle + next_angle)/2 > 3*math.pi/2: cr.move_to(x0 + (self.radius+10)*math.cos((angle+next_angle)/2), y0 + (self.radius+10)*math.sin((angle+next_angle)/2) ) else: cr.move_to(x0 + (self.radius+10)*math.cos((angle+next_angle)/2) - w, y0 + (self.radius+10)*math.sin((angle+next_angle)/2) ) cr.show_text(key) angle = next_angle def render_plot(self): angle = 0 next_angle = 0 x0,y0 = self.center cr = self.context for number,group in enumerate(self.series): # Group should be just a number data = sum(group.to_list()) next_angle = angle + 2.0*math.pi*data/self.total if self.gradient or self.series_colors[number][4] in ('linear','radial'): gradient_color = cairo.RadialGradient(self.center[0], self.center[1], 0, self.center[0], self.center[1], self.radius) gradient_color.add_color_stop_rgba(0.3, *self.series_colors[number][:4]) gradient_color.add_color_stop_rgba(1, self.series_colors[number][0]*0.7, self.series_colors[number][1]*0.7, self.series_colors[number][2]*0.7, self.series_colors[number][3]) cr.set_source(gradient_color) else: cr.set_source_rgba(*self.series_colors[number][:4]) self.draw_piece(angle, next_angle) cr.fill() cr.set_source_rgba(1.0, 1.0, 1.0) self.draw_piece(angle, next_angle) cr.stroke() angle = next_angle class DonutPlot(PiePlot): def __init__ (self, surface = None, data = None, width = 640, height = 480, background = "white light_gray", gradient = False, shadow = False, colors = None, inner_radius=-1): Plot.__init__( self, surface, data, width, height, background, series_colors = colors ) self.center = ( self.dimensions[HORZ]/2, self.dimensions[VERT]/2 ) self.total = sum( self.series.to_list() ) self.radius = min( self.dimensions[HORZ]/3,self.dimensions[VERT]/3 ) self.inner_radius = inner_radius*self.radius if inner_radius == -1: self.inner_radius = self.radius/3 self.gradient = gradient self.shadow = shadow def draw_piece(self, angle, next_angle): self.context.move_to(self.center[0] + (self.inner_radius)*math.cos(angle), self.center[1] + (self.inner_radius)*math.sin(angle)) self.context.line_to(self.center[0] + self.radius*math.cos(angle), self.center[1] + self.radius*math.sin(angle)) self.context.arc(self.center[0], self.center[1], self.radius, angle, next_angle) self.context.line_to(self.center[0] + (self.inner_radius)*math.cos(next_angle), self.center[1] + (self.inner_radius)*math.sin(next_angle)) self.context.arc_negative(self.center[0], self.center[1], self.inner_radius, next_angle, angle) self.context.close_path() def render_shadow(self): horizontal_shift = 3 vertical_shift = 3 self.context.set_source_rgba(0, 0, 0, 0.5) self.context.arc(self.center[0] + horizontal_shift, self.center[1] + vertical_shift, self.inner_radius, 0, 2*math.pi) self.context.arc_negative(self.center[0] + horizontal_shift, self.center[1] + vertical_shift, self.radius, 0, -2*math.pi) self.context.fill() class GanttChart (Plot) : def __init__(self, surface = None, data = None, width = 640, height = 480, x_labels = None, y_labels = None, colors = None): self.bounds = {} self.max_value = {} Plot.__init__(self, surface, data, width, height, x_labels = x_labels, y_labels = y_labels, series_colors = colors) def load_series(self, data, x_labels=None, y_labels=None, series_colors=None): Plot.load_series(self, data, x_labels, y_labels, series_colors) self.calc_boundaries() def calc_boundaries(self): self.bounds[HORZ] = (0,len(self.series)) end_pos = max(self.series.to_list()) #for group in self.series: # if hasattr(item, "__delitem__"): # for sub_item in item: # end_pos = max(sub_item) # else: # end_pos = max(item) self.bounds[VERT] = (0,end_pos) def calc_extents(self, direction): self.max_value[direction] = 0 if self.labels[direction]: self.max_value[direction] = max(self.context.text_extents(item)[2] for item in self.labels[direction]) else: self.max_value[direction] = self.context.text_extents( str(self.bounds[direction][1] + 1) )[2] def calc_horz_extents(self): self.calc_extents(HORZ) self.borders[HORZ] = 100 + self.max_value[HORZ] def calc_vert_extents(self): self.calc_extents(VERT) self.borders[VERT] = self.dimensions[VERT]/(self.bounds[HORZ][1] + 1) def calc_steps(self): self.horizontal_step = (self.dimensions[HORZ] - self.borders[HORZ])/(len(self.labels[VERT])) self.vertical_step = self.borders[VERT] def render(self): self.calc_horz_extents() self.calc_vert_extents() self.calc_steps() self.render_background() self.render_labels() self.render_grid() self.render_plot() def render_background(self): cr = self.context cr.set_source_rgba(255,255,255) cr.rectangle(0,0,self.dimensions[HORZ], self.dimensions[VERT]) cr.fill() for number,group in enumerate(self.series): linear = cairo.LinearGradient(self.dimensions[HORZ]/2, self.borders[VERT] + number*self.vertical_step, self.dimensions[HORZ]/2, self.borders[VERT] + (number+1)*self.vertical_step) linear.add_color_stop_rgba(0,1.0,1.0,1.0,1.0) linear.add_color_stop_rgba(1.0,0.9,0.9,0.9,1.0) cr.set_source(linear) cr.rectangle(0,self.borders[VERT] + number*self.vertical_step,self.dimensions[HORZ],self.vertical_step) cr.fill() def render_grid(self): cr = self.context cr.set_source_rgba(0.7, 0.7, 0.7) cr.set_dash((1,0,0,0,0,0,1)) cr.set_line_width(0.5) for number,label in enumerate(self.labels[VERT]): h = cr.text_extents(label)[3] cr.move_to(self.borders[HORZ] + number*self.horizontal_step, self.vertical_step/2 + h) cr.line_to(self.borders[HORZ] + number*self.horizontal_step, self.dimensions[VERT]) cr.stroke() def render_labels(self): self.context.set_font_size(0.02 * self.dimensions[HORZ]) self.render_horz_labels() self.render_vert_labels() def render_horz_labels(self): cr = self.context labels = self.labels[HORZ] if not labels: labels = [str(i) for i in range(1, self.bounds[HORZ][1] + 1) ] for number,label in enumerate(labels): if label != None: cr.set_source_rgba(0.5, 0.5, 0.5) w,h = cr.text_extents(label)[2], cr.text_extents(label)[3] cr.move_to(40,self.borders[VERT] + number*self.vertical_step + self.vertical_step/2 + h/2) cr.show_text(label) def render_vert_labels(self): cr = self.context labels = self.labels[VERT] if not labels: labels = [str(i) for i in range(1, self.bounds[VERT][1] + 1) ] for number,label in enumerate(labels): w,h = cr.text_extents(label)[2], cr.text_extents(label)[3] cr.move_to(self.borders[HORZ] + number*self.horizontal_step - w/2, self.vertical_step/2) cr.show_text(label) def render_rectangle(self, x0, y0, x1, y1, color): self.draw_shadow(x0, y0, x1, y1) self.draw_rectangle(x0, y0, x1, y1, color) def draw_rectangular_shadow(self, gradient, x0, y0, w, h): self.context.set_source(gradient) self.context.rectangle(x0,y0,w,h) self.context.fill() def draw_circular_shadow(self, x, y, radius, ang_start, ang_end, mult, shadow): gradient = cairo.RadialGradient(x, y, 0, x, y, 2*radius) gradient.add_color_stop_rgba(0, 0, 0, 0, shadow) gradient.add_color_stop_rgba(1, 0, 0, 0, 0) self.context.set_source(gradient) self.context.move_to(x,y) self.context.line_to(x + mult[0]*radius,y + mult[1]*radius) self.context.arc(x, y, 8, ang_start, ang_end) self.context.line_to(x,y) self.context.close_path() self.context.fill() def draw_rectangle(self, x0, y0, x1, y1, color): cr = self.context middle = (x0+x1)/2 linear = cairo.LinearGradient(middle,y0,middle,y1) linear.add_color_stop_rgba(0,3.5*color[0]/5.0, 3.5*color[1]/5.0, 3.5*color[2]/5.0,1.0) linear.add_color_stop_rgba(1,*color[:4]) cr.set_source(linear) cr.arc(x0+5, y0+5, 5, 0, 2*math.pi) cr.arc(x1-5, y0+5, 5, 0, 2*math.pi) cr.arc(x0+5, y1-5, 5, 0, 2*math.pi) cr.arc(x1-5, y1-5, 5, 0, 2*math.pi) cr.rectangle(x0+5,y0,x1-x0-10,y1-y0) cr.rectangle(x0,y0+5,x1-x0,y1-y0-10) cr.fill() def draw_shadow(self, x0, y0, x1, y1): shadow = 0.4 h_mid = (x0+x1)/2 v_mid = (y0+y1)/2 h_linear_1 = cairo.LinearGradient(h_mid,y0-4,h_mid,y0+4) h_linear_2 = cairo.LinearGradient(h_mid,y1-4,h_mid,y1+4) v_linear_1 = cairo.LinearGradient(x0-4,v_mid,x0+4,v_mid) v_linear_2 = cairo.LinearGradient(x1-4,v_mid,x1+4,v_mid) h_linear_1.add_color_stop_rgba( 0, 0, 0, 0, 0) h_linear_1.add_color_stop_rgba( 1, 0, 0, 0, shadow) h_linear_2.add_color_stop_rgba( 0, 0, 0, 0, shadow) h_linear_2.add_color_stop_rgba( 1, 0, 0, 0, 0) v_linear_1.add_color_stop_rgba( 0, 0, 0, 0, 0) v_linear_1.add_color_stop_rgba( 1, 0, 0, 0, shadow) v_linear_2.add_color_stop_rgba( 0, 0, 0, 0, shadow) v_linear_2.add_color_stop_rgba( 1, 0, 0, 0, 0) self.draw_rectangular_shadow(h_linear_1,x0+4,y0-4,x1-x0-8,8) self.draw_rectangular_shadow(h_linear_2,x0+4,y1-4,x1-x0-8,8) self.draw_rectangular_shadow(v_linear_1,x0-4,y0+4,8,y1-y0-8) self.draw_rectangular_shadow(v_linear_2,x1-4,y0+4,8,y1-y0-8) self.draw_circular_shadow(x0+4, y0+4, 4, math.pi, 3*math.pi/2, (-1,0), shadow) self.draw_circular_shadow(x1-4, y0+4, 4, 3*math.pi/2, 2*math.pi, (0,-1), shadow) self.draw_circular_shadow(x0+4, y1-4, 4, math.pi/2, math.pi, (0,1), shadow) self.draw_circular_shadow(x1-4, y1-4, 4, 0, math.pi/2, (1,0), shadow) def render_plot(self): for index,group in enumerate(self.series): for data in group: self.render_rectangle(self.borders[HORZ] + data.content[0]*self.horizontal_step, self.borders[VERT] + index*self.vertical_step + self.vertical_step/4.0, self.borders[HORZ] + data.content[1]*self.horizontal_step, self.borders[VERT] + index*self.vertical_step + 3.0*self.vertical_step/4.0, self.series_colors[index]) # Function definition def scatter_plot(name, data = None, errorx = None, errory = None, width = 640, height = 480, background = "white light_gray", border = 0, axis = False, dash = False, discrete = False, dots = False, grid = False, series_legend = False, x_labels = None, y_labels = None, x_formatter = None, y_formatter = None, x_bounds = None, y_bounds = None, z_bounds = None, x_title = None, y_title = None, series_colors = None, circle_colors = None): ''' - Function to plot scatter data. - Parameters data - The values to be ploted might be passed in a two basic: list of points: [(0,0), (0,1), (0,2)] or [(0,0,1), (0,1,4), (0,2,1)] lists of coordinates: [ [0,0,0] , [0,1,2] ] or [ [0,0,0] , [0,1,2] , [1,4,1] ] Notice that these kinds of that can be grouped in order to form more complex data using lists of lists or dictionaries; series_colors - Define color values for each of the series circle_colors - Define a lower and an upper bound for the circle colors for variable radius (3 dimensions) series ''' plot = ScatterPlot( name, data, errorx, errory, width, height, background, border, axis, dash, discrete, dots, grid, series_legend, x_labels, y_labels, x_formatter, y_formatter, x_bounds, y_bounds, z_bounds, x_title, y_title, series_colors, circle_colors ) plot.render() plot.commit() def dot_line_plot(name, data, width, height, background = "white light_gray", border = 0, axis = False, dash = False, dots = False, grid = False, series_legend = False, x_labels = None, y_labels = None, x_bounds = None, y_bounds = None, x_title = None, y_title = None, series_colors = None): ''' - Function to plot graphics using dots and lines. dot_line_plot (name, data, width, height, background = "white light_gray", border = 0, axis = False, grid = False, x_labels = None, y_labels = None, x_bounds = None, y_bounds = None) - Parameters name - Name of the desired output file, no need to input the .svg as it will be added at runtim; data - The list, list of lists or dictionary holding the data to be plotted; width, height - Dimensions of the output image; background - A 3 element tuple representing the rgb color expected for the background or a new cairo linear gradient. If left None, a gray to white gradient will be generated; border - Distance in pixels of a square border into which the graphics will be drawn; axis - Whether or not the axis are to be drawn; dash - Boolean or a list or a dictionary of booleans indicating whether or not the associated series should be drawn in dashed mode; dots - Whether or not dots should be drawn on each point; grid - Whether or not the gris is to be drawn; series_legend - Whether or not the legend is to be drawn; x_labels, y_labels - lists of strings containing the horizontal and vertical labels for the axis; x_bounds, y_bounds - tuples containing the lower and upper value bounds for the data to be plotted; x_title - Whether or not to plot a title over the x axis. y_title - Whether or not to plot a title over the y axis. - Examples of use data = [0, 1, 3, 8, 9, 0, 10, 10, 2, 1] CairoPlot.dot_line_plot('teste', data, 400, 300) data = { "john" : [10, 10, 10, 10, 30], "mary" : [0, 0, 3, 5, 15], "philip" : [13, 32, 11, 25, 2] } x_labels = ["jan/2008", "feb/2008", "mar/2008", "apr/2008", "may/2008" ] CairoPlot.dot_line_plot( 'test', data, 400, 300, axis = True, grid = True, series_legend = True, x_labels = x_labels ) ''' plot = DotLinePlot( name, data, width, height, background, border, axis, dash, dots, grid, series_legend, x_labels, y_labels, x_bounds, y_bounds, x_title, y_title, series_colors ) plot.render() plot.commit() def function_plot(name, data, width, height, background = "white light_gray", border = 0, axis = True, dots = False, discrete = False, grid = False, series_legend = False, x_labels = None, y_labels = None, x_bounds = None, y_bounds = None, x_title = None, y_title = None, series_colors = None, step = 1): ''' - Function to plot functions. function_plot(name, data, width, height, background = "white light_gray", border = 0, axis = True, grid = False, dots = False, x_labels = None, y_labels = None, x_bounds = None, y_bounds = None, step = 1, discrete = False) - Parameters name - Name of the desired output file, no need to input the .svg as it will be added at runtim; data - The list, list of lists or dictionary holding the data to be plotted; width, height - Dimensions of the output image; background - A 3 element tuple representing the rgb color expected for the background or a new cairo linear gradient. If left None, a gray to white gradient will be generated; border - Distance in pixels of a square border into which the graphics will be drawn; axis - Whether or not the axis are to be drawn; grid - Whether or not the gris is to be drawn; dots - Whether or not dots should be shown at each point; x_labels, y_labels - lists of strings containing the horizontal and vertical labels for the axis; x_bounds, y_bounds - tuples containing the lower and upper value bounds for the data to be plotted; step - the horizontal distance from one point to the other. The smaller, the smoother the curve will be; discrete - whether or not the function should be plotted in discrete format. - Example of use data = lambda x : x**2 CairoPlot.function_plot('function4', data, 400, 300, grid = True, x_bounds=(-10,10), step = 0.1) ''' plot = FunctionPlot( name, data, width, height, background, border, axis, discrete, dots, grid, series_legend, x_labels, y_labels, x_bounds, y_bounds, x_title, y_title, series_colors, step ) plot.render() plot.commit() def pie_plot( name, data, width, height, background = "white light_gray", gradient = False, shadow = False, colors = None ): ''' - Function to plot pie graphics. pie_plot(name, data, width, height, background = "white light_gray", gradient = False, colors = None) - Parameters name - Name of the desired output file, no need to input the .svg as it will be added at runtim; data - The list, list of lists or dictionary holding the data to be plotted; width, height - Dimensions of the output image; background - A 3 element tuple representing the rgb color expected for the background or a new cairo linear gradient. If left None, a gray to white gradient will be generated; gradient - Whether or not the pie color will be painted with a gradient; shadow - Whether or not there will be a shadow behind the pie; colors - List of slices colors. - Example of use teste_data = {"john" : 123, "mary" : 489, "philip" : 890 , "suzy" : 235} CairoPlot.pie_plot("pie_teste", teste_data, 500, 500) ''' plot = PiePlot( name, data, width, height, background, gradient, shadow, colors ) plot.render() plot.commit() def donut_plot(name, data, width, height, background = "white light_gray", gradient = False, shadow = False, colors = None, inner_radius = -1): ''' - Function to plot donut graphics. donut_plot(name, data, width, height, background = "white light_gray", gradient = False, inner_radius = -1) - Parameters name - Name of the desired output file, no need to input the .svg as it will be added at runtim; data - The list, list of lists or dictionary holding the data to be plotted; width, height - Dimensions of the output image; background - A 3 element tuple representing the rgb color expected for the background or a new cairo linear gradient. If left None, a gray to white gradient will be generated; shadow - Whether or not there will be a shadow behind the donut; gradient - Whether or not the donut color will be painted with a gradient; colors - List of slices colors; inner_radius - The radius of the donut's inner circle. - Example of use teste_data = {"john" : 123, "mary" : 489, "philip" : 890 , "suzy" : 235} CairoPlot.donut_plot("donut_teste", teste_data, 500, 500) ''' plot = DonutPlot(name, data, width, height, background, gradient, shadow, colors, inner_radius) plot.render() plot.commit() def gantt_chart(name, pieces, width, height, x_labels, y_labels, colors): ''' - Function to generate Gantt Charts. gantt_chart(name, pieces, width, height, x_labels, y_labels, colors): - Parameters name - Name of the desired output file, no need to input the .svg as it will be added at runtim; pieces - A list defining the spaces to be drawn. The user must pass, for each line, the index of its start and the index of its end. If a line must have two or more spaces, they must be passed inside a list; width, height - Dimensions of the output image; x_labels - A list of names for each of the vertical lines; y_labels - A list of names for each of the horizontal spaces; colors - List containing the colors expected for each of the horizontal spaces - Example of use pieces = [ (0.5,5.5) , [(0,4),(6,8)] , (5.5,7) , (7,8)] x_labels = [ 'teste01', 'teste02', 'teste03', 'teste04'] y_labels = [ '0001', '0002', '0003', '0004', '0005', '0006', '0007', '0008', '0009', '0010' ] colors = [ (1.0, 0.0, 0.0), (1.0, 0.7, 0.0), (1.0, 1.0, 0.0), (0.0, 1.0, 0.0) ] CairoPlot.gantt_chart('gantt_teste', pieces, 600, 300, x_labels, y_labels, colors) ''' plot = GanttChart(name, pieces, width, height, x_labels, y_labels, colors) plot.render() plot.commit() def vertical_bar_plot(name, data, width, height, background = "white light_gray", border = 0, display_values = False, grid = False, rounded_corners = False, stack = False, three_dimension = False, series_labels = None, x_labels = None, y_labels = None, x_bounds = None, y_bounds = None, colors = None, value_formatter = None): #TODO: Fix docstring for vertical_bar_plot ''' - Function to generate vertical Bar Plot Charts. bar_plot(name, data, width, height, background, border, grid, rounded_corners, three_dimension, x_labels, y_labels, x_bounds, y_bounds, colors): - Parameters name - Name of the desired output file, no need to input the .svg as it will be added at runtime; data - The list, list of lists or dictionary holding the data to be plotted; width, height - Dimensions of the output image; background - A 3 element tuple representing the rgb color expected for the background or a new cairo linear gradient. If left None, a gray to white gradient will be generated; border - Distance in pixels of a square border into which the graphics will be drawn; grid - Whether or not the gris is to be drawn; rounded_corners - Whether or not the bars should have rounded corners; three_dimension - Whether or not the bars should be drawn in pseudo 3D; x_labels, y_labels - lists of strings containing the horizontal and vertical labels for the axis; x_bounds, y_bounds - tuples containing the lower and upper value bounds for the data to be plotted; colors - List containing the colors expected for each of the bars. value_formatter - if present, this function will be called with the value, and the string it returns will be used - Example of use data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] CairoPlot.vertical_bar_plot ('bar2', data, 400, 300, border = 20, grid = True, rounded_corners = False) ''' plot = VerticalBarPlot(name, data, width, height, background, border, display_values, grid, rounded_corners, stack, three_dimension, series_labels, x_labels, y_labels, x_bounds, y_bounds, colors, value_formatter) plot.render() plot.commit() def horizontal_bar_plot(name, data, width, height, background = "white light_gray", border = 0, display_values = False, grid = False, rounded_corners = False, stack = False, three_dimension = False, series_labels = None, x_labels = None, y_labels = None, x_bounds = None, y_bounds = None, colors = None): #TODO: Fix docstring for horizontal_bar_plot ''' - Function to generate Horizontal Bar Plot Charts. bar_plot(name, data, width, height, background, border, grid, rounded_corners, three_dimension, x_labels, y_labels, x_bounds, y_bounds, colors): - Parameters name - Name of the desired output file, no need to input the .svg as it will be added at runtime; data - The list, list of lists or dictionary holding the data to be plotted; width, height - Dimensions of the output image; background - A 3 element tuple representing the rgb color expected for the background or a new cairo linear gradient. If left None, a gray to white gradient will be generated; border - Distance in pixels of a square border into which the graphics will be drawn; grid - Whether or not the gris is to be drawn; rounded_corners - Whether or not the bars should have rounded corners; three_dimension - Whether or not the bars should be drawn in pseudo 3D; x_labels, y_labels - lists of strings containing the horizontal and vertical labels for the axis; x_bounds, y_bounds - tuples containing the lower and upper value bounds for the data to be plotted; colors - List containing the colors expected for each of the bars. - Example of use data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] CairoPlot.bar_plot ('bar2', data, 400, 300, border = 20, grid = True, rounded_corners = False) ''' plot = HorizontalBarPlot(name, data, width, height, background, border, display_values, grid, rounded_corners, stack, three_dimension, series_labels, x_labels, y_labels, x_bounds, y_bounds, colors) plot.render() plot.commit() def stream_chart(name, data, width, height, background = "white light_gray", border = 0, grid = False, series_legend = None, x_labels = None, x_bounds = None, y_bounds = None, colors = None): #TODO: Fix docstring for horizontal_bar_plot plot = StreamChart(name, data, width, height, background, border, grid, series_legend, x_labels, x_bounds, y_bounds, colors) plot.render() plot.commit() if __name__ == "__main__": import tests import seriestests wxbanker-0.9.1/wxbanker/cairoplot/ChangeLog0000644000175000017500000001411612243601243020673 0ustar mrooneymrooney 2009-07-09 Rodrigo Araújo * CairoPlot.py: Correctiong naming conventions (Series.py -> series.py). Added series.py to setup.py. 2009-07-05 Rodrigo Araújo * CairoPlot.py: Merged Magnun's branch. Series, Group and Data input formats are now available. 2009-03-10 Rodrigo Araújo * CairoPlot.py: Color themes now work correctly for backgrounds. besides allowing the user to change the background color using strings, it's also possible to define gradients using a string of colors like "red white" which would create a red-to-white gradient. Furthermore, background=None now implies on transparent backgrounds; Value labels above the bars are now possible through the display_values attribute; The series_labels parameter is now enabled for BarPlot charts. Whenever it's present, a legend box is plotted on the right upper corner. 2009-03-09 Rodrigo Araújo * CairoPlot.py: BarPlot, HorizontalBarPlot and VerticalBarPlot revision and refactoring; Color themes are now allowed for backgrounds. 2009-03-08 Rodrigo Araújo * CairoPlot.py: Code revision and refactoring; The BarPlot class is now a base class on top of which the classes HorizontalBarPlot and VerticalBarPlot are built Color themes are now available; PiePlot and DonutPlot data is now ordered; Horizontal label collision problem was solved for BarPlots; Axis titles are now allowed for ScatterPlot, DotLinePlot and FunctionPlot classes. * tests.py: Theme tests were added; BarPlot tests were changed into HorizontalBarPlot and VerticalBarPlot tests. 2009-01-30 Rodrigo Araújo * CairoPlot.py: Class structure was refactored as it was noted that the new ScatterPlot was able to render DotLine and FunctionPlots; Following the refactoring, the bounds associated with a FunctionPlot chart (x_bounds) now define a closed interval, which means the last value is also taken taken into account; Error bars support was added to the ScatterPlot; All h_* and v_* parameters have been changed to x_* and y_*. * tests.py: FunctionPlot tests were changed to fit the new bounds; All tests were changed to reflect the h_* and v_* to x_* and y_* parameter change. 2009-01-27 Rodrigo Araújo * CairoPlot.py: Bug fixes; Code refactoring for the Plot and DotLinePlot classes; Added ScatterPlot class; Changed the code Josselin added to draw the y axis title. Moved the code to render_axis and changed the way the titles are drawn; * tests.py: Added tests for ScatterPlot. 2009-01-07 Rodrigo Araújo * CairoPlot.py: Bug fixes; Sebastien Cote was responsible for the addition of series' colors and legends and also for a bug fix when drawing h_labels; Paul Hummer (from Canonical) was responsible for the 'python setup.py install' new installation method; Josselin Mouette and her crew were responsible for some code refactoring and the ability to add a title to the y axis; * tests.py: Updated tests for FunctionPlot. 2008-08-15 Rodrigo Araújo * CairoPlot.py: Added discrete series option to FunctionPlot * tests.py: Added new tests for FunctionPlot new option 2008-08-14 Rodrigo Araújo * CairoPlot.py: Added DonutPlot Added FunctionPlot Added rounded corners option to Bar Plot Added pseudo 3D option to Bar Plot Set the default for the DotLinePlot to plot without the dots * tests.py: Added new tests for the donut_plot function Added new tests for the function_plot function Added new tests for BarPlot new options 2008-07-12 Rodrigo Araújo * CairoPlot.py: Bug fixes for BarPlot * tests.py: Added new tests for the bar_plot function 2008-07-11 Rodrigo Araújo * CairoPlot.py: Added BarPlot working draft * tests.py: Added tests regarding the use of bar_plot function 2008-07-07 Rodrigo Araújo * CairoPlot.py: Changed PizzaPlot Class and pizza_plot function names to PiePlot and pie_plot respectively; Refactored Gantt Chart into Object Oriented mode; Fixed the function DotLinePlot.calc_extents; Added color_series argument to Plot constructor; 2008-07-04 Rodrigo Araújo * tests.py: Test suit used to check if the module is working correctly * CairoPlot.py: Refactored Pizza Graphic into Object Oriented mode; Fixed the function Plot.render_bounding_box which wasn't drawing the line after defining it. 2008-07-04 João S. O. Bueno * NEWS: initial NEWS * CairoPlot.py: Refactored DotLine Graphic into Object Oriented mode Added support for other kind of Cairo Surfaces Added suport for changing some parameters of plot, through modification of object properties. Temporarily disabled series legend plotting 2008-07-03 João S. O. Bueno * ChangeLog: initial ChangeLog * COPYING: License file added (GNU LGPL 2.1) * TODO: initial TODO 2008-06-13 Rodrigo Araújo * Initial commit wxbanker-0.9.1/wxbanker/cairoplot/COPYING0000644000175000017500000006350412243601243020161 0ustar mrooneymrooney GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! wxbanker-0.9.1/wxbanker/cairoplot/MANIFEST0000644000175000017500000000007312243601243020247 0ustar mrooneymrooneyCOPYING cairoplot.py ChangeLog NEWS TODO setup.py tests.py wxbanker-0.9.1/wxbanker/cairoplot/NEWS0000644000175000017500000000120512243601243017613 0ustar mrooneymrooney Version 1.1: - Refactored code into OO form for dot and line code - Refactored code into OO form for pizza plot - Pizza plot renamed to Pie plot - Added support for Bar Plots - Refactored code into OO form for gantt chart - Allow use of other types of cairo surfaces - Added rounded corners and pseudo 3D option to Bar Plots - Added support for Donut Plots - Added support for Function Plots - Added discrete series option to Function Plots Version 1.2 - Added support for Scatter Plots - Added support for error bars on Scatter Plots - Added support for Horizontal and Vertical Bar Plots wxbanker-0.9.1/wxbanker/cairoplot/series.py0000644000175000017500000012416112243601243020767 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # Serie.py # # Copyright (c) 2008 Magnun Leno da Silva # # Author: Magnun Leno da Silva # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public License # as published by the Free Software Foundation; either version 2 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 Lesser 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 # Contributor: Rodrigo Moreiro Araujo #import cairoplot import doctest NUMTYPES = (int, float, long) LISTTYPES = (list, tuple) STRTYPES = (str, unicode) FILLING_TYPES = ['linear', 'solid', 'gradient'] DEFAULT_COLOR_FILLING = 'solid' #TODO: Define default color list DEFAULT_COLOR_LIST = None class Data(object): ''' Class that models the main data structure. It can hold: - a number type (int, float or long) - a tuple, witch represents a point and can have 2 or 3 items (x,y,z) - if a list is passed it will be converted to a tuple. obs: In case a tuple is passed it will convert to tuple ''' def __init__(self, data=None, name=None, parent=None): ''' Starts main atributes from the Data class @name - Name for each point; @content - The real data, can be an int, float, long or tuple, which represents a point (x,y) or (x,y,z); @parent - A pointer that give the data access to it's parent. Usage: >>> d = Data(name='empty'); print d empty: () >>> d = Data((1,1),'point a'); print d point a: (1, 1) >>> d = Data((1,2,3),'point b'); print d point b: (1, 2, 3) >>> d = Data([2,3],'point c'); print d point c: (2, 3) >>> d = Data(12, 'simple value'); print d simple value: 12 ''' # Initial values self.__content = None self.__name = None # Setting passed values self.parent = parent self.name = name self.content = data # Name property @apply def name(): doc = ''' Name is a read/write property that controls the input of name. - If passed an invalid value it cleans the name with None Usage: >>> d = Data(13); d.name = 'name_test'; print d name_test: 13 >>> d.name = 11; print d 13 >>> d.name = 'other_name'; print d other_name: 13 >>> d.name = None; print d 13 >>> d.name = 'last_name'; print d last_name: 13 >>> d.name = ''; print d 13 ''' def fget(self): ''' returns the name as a string ''' return self.__name def fset(self, name): ''' Sets the name of the Data ''' if type(name) in STRTYPES and len(name) > 0: self.__name = name else: self.__name = None return property(**locals()) # Content property @apply def content(): doc = ''' Content is a read/write property that validate the data passed and return it. Usage: >>> d = Data(); d.content = 13; d.content 13 >>> d = Data(); d.content = (1,2); d.content (1, 2) >>> d = Data(); d.content = (1,2,3); d.content (1, 2, 3) >>> d = Data(); d.content = [1,2,3]; d.content (1, 2, 3) >>> d = Data(); d.content = [1.5,.2,3.3]; d.content (1.5, 0.20000000000000001, 3.2999999999999998) ''' def fget(self): ''' Return the content of Data ''' return self.__content def fset(self, data): ''' Ensures that data is a valid tuple/list or a number (int, float or long) ''' # Type: None if data is None: self.__content = None return # Type: Int or Float elif type(data) in NUMTYPES: self.__content = data # Type: List or Tuple elif type(data) in LISTTYPES: # Ensures the correct size if len(data) not in (2, 3): raise TypeError, "Data (as list/tuple) must have 2 or 3 items" return # Ensures that all items in list/tuple is a number isnum = lambda x : type(x) not in NUMTYPES if max(map(isnum, data)): # An item in data isn't an int or a float raise TypeError, "All content of data must be a number (int or float)" # Convert the tuple to list if type(data) is list: data = tuple(data) # Append a copy and sets the type self.__content = data[:] # Unknown type! else: self.__content = None raise TypeError, "Data must be an int, float or a tuple with two or three items" return return property(**locals()) def clear(self): ''' Clear the all Data (content, name and parent) ''' self.content = None self.name = None self.parent = None def copy(self): ''' Returns a copy of the Data structure ''' # The copy new_data = Data() if self.content is not None: # If content is a point if type(self.content) is tuple: new_data.__content = self.content[:] # If content is a number else: new_data.__content = self.content # If it has a name if self.name is not None: new_data.__name = self.name return new_data def __str__(self): ''' Return a string representation of the Data structure ''' if self.name is None: if self.content is None: return '' return str(self.content) else: if self.content is None: return self.name+": ()" return self.name+": "+str(self.content) def __len__(self): ''' Return the length of the Data. - If it's a number return 1; - If it's a list return it's length; - If its None return 0. ''' if self.content is None: return 0 elif type(self.content) in NUMTYPES: return 1 return len(self.content) class Group(object): ''' Class that models a group of data. Every value (int, float, long, tuple or list) passed is converted to a list of Data. It can receive: - A single number (int, float, long); - A list of numbers; - A tuple of numbers; - An instance of Data; - A list of Data; Obs: If a tuple with 2 or 3 items is passed it is converted to a point. If a tuple with only 1 item is passed it's converted to a number; If a tuple with more than 2 items is passed it's converted to a list of numbers ''' def __init__(self, group=None, name=None, parent=None): ''' Starts main atributes in Group instance. @data_list - a list of data which forms the group; @range - a range that represent the x axis of possible functions; @name - name of the data group; @parent - the Serie parent of this group. Usage: >>> g = Group(13, 'simple number'); print g simple number ['13'] >>> g = Group((1,2), 'simple point'); print g simple point ['(1, 2)'] >>> g = Group([1,2,3,4], 'list of numbers'); print g list of numbers ['1', '2', '3', '4'] >>> g = Group((1,2,3,4),'int in tuple'); print g int in tuple ['1', '2', '3', '4'] >>> g = Group([(1,2),(2,3),(3,4)], 'list of points'); print g list of points ['(1, 2)', '(2, 3)', '(3, 4)'] >>> g = Group([[1,2,3],[1,2,3]], '2D coordinate lists'); print g 2D coordinated lists ['(1, 1)', '(2, 2)', '(3, 3)'] >>> g = Group([[1,2],[1,2],[1,2]], '3D coordinate lists'); print g 3D coordinated lists ['(1, 1, 1)', '(2, 2, 2)'] ''' # Initial values self.__data_list = [] self.__range = [] self.__name = None self.parent = parent self.name = name self.data_list = group # Name property @apply def name(): doc = ''' Name is a read/write property that controls the input of name. - If passed an invalid value it cleans the name with None Usage: >>> g = Group(13); g.name = 'name_test'; print g name_test ['13'] >>> g.name = 11; print g ['13'] >>> g.name = 'other_name'; print g other_name ['13'] >>> g.name = None; print g ['13'] >>> g.name = 'last_name'; print g last_name ['13'] >>> g.name = ''; print g ['13'] ''' def fget(self): ''' Returns the name as a string ''' return self.__name def fset(self, name): ''' Sets the name of the Group ''' if type(name) in STRTYPES and len(name) > 0: self.__name = name else: self.__name = None return property(**locals()) # data_list property @apply def data_list(): doc = ''' The data_list is a read/write property that can be a list of numbers, a list of points or a list of 2 or 3 coordinate lists. This property uses mainly the self.add_data method. Usage: >>> g = Group(); g.data_list = 13; print g ['13'] >>> g.data_list = (1,2); print g ['(1, 2)'] >>> g.data_list = Data((1,2),'point a'); print g ['point a: (1, 2)'] >>> g.data_list = [1,2,3]; print g ['1', '2', '3'] >>> g.data_list = (1,2,3,4); print g ['1', '2', '3', '4'] >>> g.data_list = [(1,2),(2,3),(3,4)]; print g ['(1, 2)', '(2, 3)', '(3, 4)'] >>> g.data_list = [[1,2],[1,2]]; print g ['(1, 1)', '(2, 2)'] >>> g.data_list = [[1,2],[1,2],[1,2]]; print g ['(1, 1, 1)', '(2, 2, 2)'] >>> g.range = (10); g.data_list = lambda x:x**2; print g ['(0.0, 0.0)', '(1.0, 1.0)', '(2.0, 4.0)', '(3.0, 9.0)', '(4.0, 16.0)', '(5.0, 25.0)', '(6.0, 36.0)', '(7.0, 49.0)', '(8.0, 64.0)', '(9.0, 81.0)'] ''' def fget(self): ''' Returns the value of data_list ''' return self.__data_list def fset(self, group): ''' Ensures that group is valid. ''' # None if group is None: self.__data_list = [] # Int/float/long or Instance of Data elif type(group) in NUMTYPES or isinstance(group, Data): # Clean data_list self.__data_list = [] self.add_data(group) # One point elif type(group) is tuple and len(group) in (2,3): self.__data_list = [] self.add_data(group) # list of items elif type(group) in LISTTYPES and type(group[0]) is not list: # Clean data_list self.__data_list = [] for item in group: # try to append and catch an exception self.add_data(item) # function lambda elif callable(group): # Explicit is better than implicit function = group # Has range if len(self.range) is not 0: # Clean data_list self.__data_list = [] # Generate values for the lambda function for x in self.range: #self.add_data((x,round(group(x),2))) self.add_data((x,function(x))) # Only have range in parent elif self.parent is not None and len(self.parent.range) is not 0: # Copy parent range self.__range = self.parent.range[:] # Clean data_list self.__data_list = [] # Generate values for the lambda function for x in self.range: #self.add_data((x,round(group(x),2))) self.add_data((x,function(x))) # Don't have range anywhere else: # x_data don't exist raise Exception, "Data argument is valid but to use function type please set x_range first" # Coordinate Lists elif type(group) in LISTTYPES and type(group[0]) is list: # Clean data_list self.__data_list = [] data = [] if len(group) == 3: data = zip(group[0], group[1], group[2]) elif len(group) == 2: data = zip(group[0], group[1]) else: raise TypeError, "Only one list of coordinates was received." for item in data: self.add_data(item) else: raise TypeError, "Group type not supported" return property(**locals()) @apply def range(): doc = ''' The range is a read/write property that generates a range of values for the x axis of the functions. When passed a tuple it almost works like the built-in range funtion: - 1 item, represent the end of the range started from 0; - 2 items, represents the start and the end, respectively; - 3 items, the last one represents the step; When passed a list the range function understands as a valid range. Usage: >>> g = Group(); g.range = 10; print g.range [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0] >>> g = Group(); g.range = (5); print g.range [0.0, 1.0, 2.0, 3.0, 4.0] >>> g = Group(); g.range = (1,7); print g.range [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] >>> g = Group(); g.range = (0,10,2); print g.range [0.0, 2.0, 4.0, 6.0, 8.0] >>> >>> g = Group(); g.range = [0]; print g.range [0.0] >>> g = Group(); g.range = [0,10,20]; print g.range [0.0, 10.0, 20.0] ''' def fget(self): ''' Returns the range ''' return self.__range def fset(self, x_range): ''' Controls the input of a valid type and generate the range ''' # if passed a simple number convert to tuple if type(x_range) in NUMTYPES: x_range = (x_range,) # A list, just convert to float if type(x_range) is list and len(x_range) > 0: # Convert all to float x_range = map(float, x_range) # Prevents repeated values and convert back to list self.__range = list(set(x_range[:])) # Sort the list to ascending order self.__range.sort() # A tuple, must check the lengths and generate the values elif type(x_range) is tuple and len(x_range) in (1,2,3): # Convert all to float x_range = map(float, x_range) # Inital values start = 0.0 step = 1.0 end = 0.0 # Only the end and it can't be less or iqual to 0 if len(x_range) is 1 and x_range > 0: end = x_range[0] # The start and the end but the start must be less then the end elif len(x_range) is 2 and x_range[0] < x_range[1]: start = x_range[0] end = x_range[1] # All 3, but the start must be less then the end elif x_range[0] <= x_range[1]: start = x_range[0] end = x_range[1] step = x_range[2] # Starts the range self.__range = [] # Generate the range # Can't use the range function because it doesn't support float values while start < end: self.__range.append(start) start += step # Incorrect type else: raise Exception, "x_range must be a list with one or more items or a tuple with 2 or 3 items" return property(**locals()) def add_data(self, data, name=None): ''' Append a new data to the data_list. - If data is an instance of Data, append it - If it's an int, float, tuple or list create an instance of Data and append it Usage: >>> g = Group() >>> g.add_data(12); print g ['12'] >>> g.add_data(7,'other'); print g ['12', 'other: 7'] >>> >>> g = Group() >>> g.add_data((1,1),'a'); print g ['a: (1, 1)'] >>> g.add_data((2,2),'b'); print g ['a: (1, 1)', 'b: (2, 2)'] >>> >>> g.add_data(Data((1,2),'c')); print g ['a: (1, 1)', 'b: (2, 2)', 'c: (1, 2)'] ''' if not isinstance(data, Data): # Try to convert data = Data(data,name,self) if data.content is not None: self.__data_list.append(data.copy()) self.__data_list[-1].parent = self def to_list(self): ''' Returns the group as a list of numbers (int, float or long) or a list of tuples (points 2D or 3D). Usage: >>> g = Group([1,2,3,4],'g1'); g.to_list() [1, 2, 3, 4] >>> g = Group([(1,2),(2,3),(3,4)],'g2'); g.to_list() [(1, 2), (2, 3), (3, 4)] >>> g = Group([(1,2,3),(3,4,5)],'g2'); g.to_list() [(1, 2, 3), (3, 4, 5)] ''' return [data.content for data in self] def copy(self): ''' Returns a copy of this group ''' new_group = Group() new_group.__name = self.__name if self.__range is not None: new_group.__range = self.__range[:] for data in self: new_group.add_data(data.copy()) return new_group def get_names(self): ''' Return a list with the names of all data in this group ''' names = [] for data in self: if data.name is None: names.append('Data '+str(data.index()+1)) else: names.append(data.name) return names def __str__ (self): ''' Returns a string representing the Group ''' ret = "" if self.name is not None: ret += self.name + " " if len(self) > 0: list_str = [str(item) for item in self] ret += str(list_str) else: ret += "[]" return ret def __getitem__(self, key): ''' Makes a Group iterable, based in the data_list property ''' return self.data_list[key] def __len__(self): ''' Returns the length of the Group, based in the data_list property ''' return len(self.data_list) class Colors(object): ''' Class that models the colors its labels (names) and its properties, RGB and filling type. It can receive: - A list where each item is a list with 3 or 4 items. The first 3 items represent the RGB values and the last argument defines the filling type. The list will be converted to a dict and each color will receve a name based in its position in the list. - A dictionary where each key will be the color name and its item can be a list with 3 or 4 items. The first 3 items represent the RGB colors and the last argument defines the filling type. ''' def __init__(self, color_list=None): ''' Start the color_list property @ color_list - the list or dict contaning the colors properties. ''' self.__color_list = None self.color_list = color_list @apply def color_list(): doc = ''' >>> c = Colors([[1,1,1],[2,2,2,'linear'],[3,3,3,'gradient']]) >>> print c.color_list {'Color 2': [2, 2, 2, 'linear'], 'Color 3': [3, 3, 3, 'gradient'], 'Color 1': [1, 1, 1, 'solid']} >>> c.color_list = [[1,1,1],(2,2,2,'solid'),(3,3,3,'linear')] >>> print c.color_list {'Color 2': [2, 2, 2, 'solid'], 'Color 3': [3, 3, 3, 'linear'], 'Color 1': [1, 1, 1, 'solid']} >>> c.color_list = {'a':[1,1,1],'b':(2,2,2,'solid'),'c':(3,3,3,'linear'), 'd':(4,4,4)} >>> print c.color_list {'a': [1, 1, 1, 'solid'], 'c': [3, 3, 3, 'linear'], 'b': [2, 2, 2, 'solid'], 'd': [4, 4, 4, 'solid']} ''' def fget(self): ''' Return the color list ''' return self.__color_list def fset(self, color_list): ''' Format the color list to a dictionary ''' if color_list is None: self.__color_list = None return if type(color_list) in LISTTYPES and type(color_list[0]) in LISTTYPES: old_color_list = color_list[:] color_list = {} for index, color in enumerate(old_color_list): if len(color) is 3 and max(map(type, color)) in NUMTYPES: color_list['Color '+str(index+1)] = list(color)+[DEFAULT_COLOR_FILLING] elif len(color) is 4 and max(map(type, color[:-1])) in NUMTYPES and color[-1] in FILLING_TYPES: color_list['Color '+str(index+1)] = list(color) else: raise TypeError, "Unsuported color format" elif type(color_list) is not dict: raise TypeError, "Unsuported color format" for name, color in color_list.items(): if len(color) is 3: if max(map(type, color)) in NUMTYPES: color_list[name] = list(color)+[DEFAULT_COLOR_FILLING] else: raise TypeError, "Unsuported color format" elif len(color) is 4: if max(map(type, color[:-1])) in NUMTYPES and color[-1] in FILLING_TYPES: color_list[name] = list(color) else: raise TypeError, "Unsuported color format" self.__color_list = color_list.copy() return property(**locals()) class Series(object): ''' Class that models a Series (group of groups). Every value (int, float, long, tuple or list) passed is converted to a list of Group or Data. It can receive: - a single number or point, will be converted to a Group of one Data; - a list of numbers, will be converted to a group of numbers; - a list of tuples, will converted to a single Group of points; - a list of lists of numbers, each 'sublist' will be converted to a group of numbers; - a list of lists of tuples, each 'sublist' will be converted to a group of points; - a list of lists of lists, the content of the 'sublist' will be processed as coordinated lists and the result will be converted to a group of points; - a Dictionary where each item can be the same of the list: number, point, list of numbers, list of points or list of lists (coordinated lists); - an instance of Data; - an instance of group. ''' def __init__(self, series=None, name=None, property=[], colors=None): ''' Starts main atributes in Group instance. @series - a list, dict of data of which the series is composed; @name - name of the series; @property - a list/dict of properties to be used in the plots of this Series Usage: >>> print Series([1,2,3,4]) ["Group 1 ['1', '2', '3', '4']"] >>> print Series([[1,2,3],[4,5,6]]) ["Group 1 ['1', '2', '3']", "Group 2 ['4', '5', '6']"] >>> print Series((1,2)) ["Group 1 ['(1, 2)']"] >>> print Series([(1,2),(2,3)]) ["Group 1 ['(1, 2)', '(2, 3)']"] >>> print Series([[(1,2),(2,3)],[(4,5),(5,6)]]) ["Group 1 ['(1, 2)', '(2, 3)']", "Group 2 ['(4, 5)', '(5, 6)']"] >>> print Series([[[1,2,3],[1,2,3],[1,2,3]]]) ["Group 1 ['(1, 1, 1)', '(2, 2, 2)', '(3, 3, 3)']"] >>> print Series({'g1':[1,2,3], 'g2':[4,5,6]}) ["g1 ['1', '2', '3']", "g2 ['4', '5', '6']"] >>> print Series({'g1':[(1,2),(2,3)], 'g2':[(4,5),(5,6)]}) ["g1 ['(1, 2)', '(2, 3)']", "g2 ['(4, 5)', '(5, 6)']"] >>> print Series({'g1':[[1,2],[1,2]], 'g2':[[4,5],[4,5]]}) ["g1 ['(1, 1)', '(2, 2)']", "g2 ['(4, 4)', '(5, 5)']"] >>> print Series(Data(1,'d1')) ["Group 1 ['d1: 1']"] >>> print Series(Group([(1,2),(2,3)],'g1')) ["g1 ['(1, 2)', '(2, 3)']"] ''' # Intial values self.__group_list = [] self.__name = None self.__range = None # TODO: Implement colors with filling self.__colors = None self.name = name self.group_list = series self.colors = colors # Name property @apply def name(): doc = ''' Name is a read/write property that controls the input of name. - If passed an invalid value it cleans the name with None Usage: >>> s = Series(13); s.name = 'name_test'; print s name_test ["Group 1 ['13']"] >>> s.name = 11; print s ["Group 1 ['13']"] >>> s.name = 'other_name'; print s other_name ["Group 1 ['13']"] >>> s.name = None; print s ["Group 1 ['13']"] >>> s.name = 'last_name'; print s last_name ["Group 1 ['13']"] >>> s.name = ''; print s ["Group 1 ['13']"] ''' def fget(self): ''' Returns the name as a string ''' return self.__name def fset(self, name): ''' Sets the name of the Group ''' if type(name) in STRTYPES and len(name) > 0: self.__name = name else: self.__name = None return property(**locals()) # Colors property @apply def colors(): doc = ''' >>> s = Series() >>> s.colors = [[1,1,1],[2,2,2,'linear'],[3,3,3,'gradient']] >>> print s.colors {'Color 2': [2, 2, 2, 'linear'], 'Color 3': [3, 3, 3, 'gradient'], 'Color 1': [1, 1, 1, 'solid']} >>> s.colors = [[1,1,1],(2,2,2,'solid'),(3,3,3,'linear')] >>> print s.colors {'Color 2': [2, 2, 2, 'solid'], 'Color 3': [3, 3, 3, 'linear'], 'Color 1': [1, 1, 1, 'solid']} >>> s.colors = {'a':[1,1,1],'b':(2,2,2,'solid'),'c':(3,3,3,'linear'), 'd':(4,4,4)} >>> print s.colors {'a': [1, 1, 1, 'solid'], 'c': [3, 3, 3, 'linear'], 'b': [2, 2, 2, 'solid'], 'd': [4, 4, 4, 'solid']} ''' def fget(self): ''' Return the color list ''' return self.__colors.color_list def fset(self, colors): ''' Format the color list to a dictionary ''' self.__colors = Colors(colors) return property(**locals()) @apply def range(): doc = ''' The range is a read/write property that generates a range of values for the x axis of the functions. When passed a tuple it almost works like the built-in range funtion: - 1 item, represent the end of the range started from 0; - 2 items, represents the start and the end, respectively; - 3 items, the last one represents the step; When passed a list the range function understands as a valid range. Usage: >>> s = Series(); s.range = 10; print s.range [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0] >>> s = Series(); s.range = (5); print s.range [0.0, 1.0, 2.0, 3.0, 4.0, 5.0] >>> s = Series(); s.range = (1,7); print s.range [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0] >>> s = Series(); s.range = (0,10,2); print s.range [0.0, 2.0, 4.0, 6.0, 8.0, 10.0] >>> >>> s = Series(); s.range = [0]; print s.range [0.0] >>> s = Series(); s.range = [0,10,20]; print s.range [0.0, 10.0, 20.0] ''' def fget(self): ''' Returns the range ''' return self.__range def fset(self, x_range): ''' Controls the input of a valid type and generate the range ''' # if passed a simple number convert to tuple if type(x_range) in NUMTYPES: x_range = (x_range,) # A list, just convert to float if type(x_range) is list and len(x_range) > 0: # Convert all to float x_range = map(float, x_range) # Prevents repeated values and convert back to list self.__range = list(set(x_range[:])) # Sort the list to ascending order self.__range.sort() # A tuple, must check the lengths and generate the values elif type(x_range) is tuple and len(x_range) in (1,2,3): # Convert all to float x_range = map(float, x_range) # Inital values start = 0.0 step = 1.0 end = 0.0 # Only the end and it can't be less or iqual to 0 if len(x_range) is 1 and x_range > 0: end = x_range[0] # The start and the end but the start must be lesser then the end elif len(x_range) is 2 and x_range[0] < x_range[1]: start = x_range[0] end = x_range[1] # All 3, but the start must be lesser then the end elif x_range[0] < x_range[1]: start = x_range[0] end = x_range[1] step = x_range[2] # Starts the range self.__range = [] # Generate the range # Cnat use the range function becouse it don't suport float values while start <= end: self.__range.append(start) start += step # Incorrect type else: raise Exception, "x_range must be a list with one or more item or a tuple with 2 or 3 items" return property(**locals()) @apply def group_list(): doc = ''' The group_list is a read/write property used to pre-process the list of Groups. It can be: - a single number, point or lambda, will be converted to a single Group of one Data; - a list of numbers, will be converted to a group of numbers; - a list of tuples, will converted to a single Group of points; - a list of lists of numbers, each 'sublist' will be converted to a group of numbers; - a list of lists of tuples, each 'sublist' will be converted to a group of points; - a list of lists of lists, the content of the 'sublist' will be processed as coordinated lists and the result will be converted to a group of points; - a list of lambdas, each lambda represents a Group; - a Dictionary where each item can be the same of the list: number, point, list of numbers, list of points, list of lists (coordinated lists) or lambdas - an instance of Data; - an instance of group. Usage: >>> s = Series() >>> s.group_list = [1,2,3,4]; print s ["Group 1 ['1', '2', '3', '4']"] >>> s.group_list = [[1,2,3],[4,5,6]]; print s ["Group 1 ['1', '2', '3']", "Group 2 ['4', '5', '6']"] >>> s.group_list = (1,2); print s ["Group 1 ['(1, 2)']"] >>> s.group_list = [(1,2),(2,3)]; print s ["Group 1 ['(1, 2)', '(2, 3)']"] >>> s.group_list = [[(1,2),(2,3)],[(4,5),(5,6)]]; print s ["Group 1 ['(1, 2)', '(2, 3)']", "Group 2 ['(4, 5)', '(5, 6)']"] >>> s.group_list = [[[1,2,3],[1,2,3],[1,2,3]]]; print s ["Group 1 ['(1, 1, 1)', '(2, 2, 2)', '(3, 3, 3)']"] >>> s.group_list = [(0.5,5.5) , [(0,4),(6,8)] , (5.5,7) , (7,9)]; print s ["Group 1 ['(0.5, 5.5)']", "Group 2 ['(0, 4)', '(6, 8)']", "Group 3 ['(5.5, 7)']", "Group 4 ['(7, 9)']"] >>> s.group_list = {'g1':[1,2,3], 'g2':[4,5,6]}; print s ["g1 ['1', '2', '3']", "g2 ['4', '5', '6']"] >>> s.group_list = {'g1':[(1,2),(2,3)], 'g2':[(4,5),(5,6)]}; print s ["g1 ['(1, 2)', '(2, 3)']", "g2 ['(4, 5)', '(5, 6)']"] >>> s.group_list = {'g1':[[1,2],[1,2]], 'g2':[[4,5],[4,5]]}; print s ["g1 ['(1, 1)', '(2, 2)']", "g2 ['(4, 4)', '(5, 5)']"] >>> s.range = 10 >>> s.group_list = lambda x:x*2 >>> s.group_list = [lambda x:x*2, lambda x:x**2, lambda x:x**3]; print s ["Group 1 ['(0.0, 0.0)', '(1.0, 2.0)', '(2.0, 4.0)', '(3.0, 6.0)', '(4.0, 8.0)', '(5.0, 10.0)', '(6.0, 12.0)', '(7.0, 14.0)', '(8.0, 16.0)', '(9.0, 18.0)', '(10.0, 20.0)']", "Group 2 ['(0.0, 0.0)', '(1.0, 1.0)', '(2.0, 4.0)', '(3.0, 9.0)', '(4.0, 16.0)', '(5.0, 25.0)', '(6.0, 36.0)', '(7.0, 49.0)', '(8.0, 64.0)', '(9.0, 81.0)', '(10.0, 100.0)']", "Group 3 ['(0.0, 0.0)', '(1.0, 1.0)', '(2.0, 8.0)', '(3.0, 27.0)', '(4.0, 64.0)', '(5.0, 125.0)', '(6.0, 216.0)', '(7.0, 343.0)', '(8.0, 512.0)', '(9.0, 729.0)', '(10.0, 1000.0)']"] >>> s.group_list = {'linear':lambda x:x*2, 'square':lambda x:x**2, 'cubic':lambda x:x**3}; print s ["cubic ['(0.0, 0.0)', '(1.0, 1.0)', '(2.0, 8.0)', '(3.0, 27.0)', '(4.0, 64.0)', '(5.0, 125.0)', '(6.0, 216.0)', '(7.0, 343.0)', '(8.0, 512.0)', '(9.0, 729.0)', '(10.0, 1000.0)']", "linear ['(0.0, 0.0)', '(1.0, 2.0)', '(2.0, 4.0)', '(3.0, 6.0)', '(4.0, 8.0)', '(5.0, 10.0)', '(6.0, 12.0)', '(7.0, 14.0)', '(8.0, 16.0)', '(9.0, 18.0)', '(10.0, 20.0)']", "square ['(0.0, 0.0)', '(1.0, 1.0)', '(2.0, 4.0)', '(3.0, 9.0)', '(4.0, 16.0)', '(5.0, 25.0)', '(6.0, 36.0)', '(7.0, 49.0)', '(8.0, 64.0)', '(9.0, 81.0)', '(10.0, 100.0)']"] >>> s.group_list = Data(1,'d1'); print s ["Group 1 ['d1: 1']"] >>> s.group_list = Group([(1,2),(2,3)],'g1'); print s ["g1 ['(1, 2)', '(2, 3)']"] ''' def fget(self): ''' Return the group list. ''' return self.__group_list def fset(self, series): ''' Controls the input of a valid group list. ''' #TODO: Add support to the following strem of data: [ (0.5,5.5) , [(0,4),(6,8)] , (5.5,7) , (7,9)] # Type: None if series is None: self.__group_list = [] # List or Tuple elif type(series) in LISTTYPES: self.__group_list = [] is_function = lambda x: callable(x) # Groups if list in map(type, series) or max(map(is_function, series)): for group in series: self.add_group(group) # single group else: self.add_group(series) #old code ## List of numbers #if type(series[0]) in NUMTYPES or type(series[0]) is tuple: # print series # self.add_group(series) # ## List of anything else #else: # for group in series: # self.add_group(group) # Dict representing series of groups elif type(series) is dict: self.__group_list = [] names = series.keys() names.sort() for name in names: self.add_group(Group(series[name],name,self)) # A single lambda elif callable(series): self.__group_list = [] self.add_group(series) # Int/float, instance of Group or Data elif type(series) in NUMTYPES or isinstance(series, Group) or isinstance(series, Data): self.__group_list = [] self.add_group(series) # Default else: raise TypeError, "Serie type not supported" return property(**locals()) def add_group(self, group, name=None): ''' Append a new group in group_list ''' if not isinstance(group, Group): #Try to convert group = Group(group, name, self) if len(group.data_list) is not 0: # Auto naming groups if group.name is None: group.name = "Group "+str(len(self.__group_list)+1) self.__group_list.append(group) self.__group_list[-1].parent = self def copy(self): ''' Returns a copy of the Series ''' new_series = Series() new_series.__name = self.__name if self.__range is not None: new_series.__range = self.__range[:] #Add color property in the copy method #self.__colors = None for group in self: new_series.add_group(group.copy()) return new_series def get_names(self): ''' Returns a list of the names of all groups in the Serie ''' names = [] for group in self: if group.name is None: names.append('Group '+str(group.index()+1)) else: names.append(group.name) return names def to_list(self): ''' Returns a list with the content of all groups and data ''' big_list = [] for group in self: for data in group: if type(data.content) in NUMTYPES: big_list.append(data.content) else: big_list = big_list + list(data.content) return big_list def __getitem__(self, key): ''' Makes the Series iterable, based in the group_list property ''' return self.__group_list[key] def __str__(self): ''' Returns a string that represents the Series ''' ret = "" if self.name is not None: ret += self.name + " " if len(self) > 0: list_str = [str(item) for item in self] ret += str(list_str) else: ret += "[]" return ret def __len__(self): ''' Returns the length of the Series, based in the group_lsit property ''' return len(self.group_list) if __name__ == '__main__': doctest.testmod() wxbanker-0.9.1/wxbanker/cairoplot/seriestests.py0000644000175000017500000003575112243601243022060 0ustar mrooneymrooneyimport cairo, math, sys import cairoplot from series import Series # non-random data for needs of visual comparison of changes if '--non-random' in sys.argv: random = lambda : 1.0 print 'Plotting nonrandom data' else: import random random = random.random # Line plotting test_scatter_plot = 1 test_dot_line_plot = 1 test_function_plot = 1 # Bar plotting test_vertical_bar_plot = 1 test_horizontal_bar_plot = 1 # Pie plotting test_pie_plot = 1 test_donut_plot = 1 # Others test_gantt_chart = 1 test_themes = 1 if test_scatter_plot: #Default data data = Series([ (-2,10), (0,0), (0,15), (1,5), (2,0), (3,-10), (3,5) ]) cairoplot.scatter_plot ( 'scatter_1_default_series.png', data = data, width = 500, height = 500, border = 20, axis = True, grid = True ) #lists of coordinates x,y data = Series([[[1,2,3,4,5],[1,1,1,1,1]]]) cairoplot.scatter_plot ( 'scatter_2_lists_series.png', data = data, width = 500, height = 500, border = 20, axis = True, grid = True ) #lists of coordinates x,y,z data = Series([[[0.5,1,2,3,4,5],[0.5,1,1,1,1,1],[10,6,10,20,10,6]]]) colors = [ (0,0,0,0.25), (1,0,0,0.75) ] cairoplot.scatter_plot ( 'scatter_3_lists_series.png', data = data, width = 500, height = 500, border = 20, axis = True, discrete = True, grid = True, circle_colors = colors ) data = Series([(-1, -16, 12), (-12, 17, 11), (-4, 6, 5), (4, -20, 12), (13, -3, 21), (7, 14, 20), (-11, -2, 18), (19, 7, 18), (-10, -19, 15), (-17, -2, 6), (-9, 4, 10), (14, 11, 16), (13, -11, 18), (20, 20, 16), (7, -8, 15), (-16, 17, 16), (16, 9, 9), (-3, -13, 25), (-20, -6, 17), (-10, -10, 12), (-7, 17, 25), (10, -10, 13), (10, 13, 20), (17, 6, 15), (18, -11, 14), (18, -12, 11), (-9, 11, 14), (17, -15, 25), (-2, -8, 5), (5, 20, 20), (18, 20, 23), (-20, -16, 17), (-19, -2, 9), (-11, 19, 18), (17, 16, 12), (-5, -20, 15), (-20, -13, 10), (-3, 5, 20), (-1, 13, 17), (-11, -9, 11)]) colors = [ (0,0,0,0.25), (1,0,0,0.75) ] cairoplot.scatter_plot ( 'scatter_2_variable_radius_series.png', data = data, width = 500, height = 500, border = 20, axis = True, discrete = True, dots = 2, grid = True, x_title = "x axis", y_title = "y axis", circle_colors = colors ) #Scatter x DotLine error bars t = [x*0.1 for x in range(0,40)] f = [math.exp(x) for x in t] g = [10*math.cos(x) for x in t] h = [10*math.sin(x) for x in t] erx = [0.1*random() for x in t] ery = [5*random() for x in t] data = Series({"exp" : [t,f], "cos" : [t,g], "sin" : [t,h]}) series_colors = [ (1,0,0), (0,0,0), (0,0,1) ] cairoplot.scatter_plot ( 'cross_r_exponential_series.png', data = data, errorx = [erx,erx], errory = [ery,ery], width = 800, height = 600, border = 20, axis = True, discrete = False, dots = 5, grid = True, x_title = "t", y_title = "f(t) g(t)", series_legend=True, series_colors = series_colors ) if test_dot_line_plot: #Default plot data = [ 0, 1, 3.5, 8.5, 9, 0, 10, 10, 2, 1 ] cairoplot.dot_line_plot( "dot_line_1_default_series.png", data, 400, 300, border = 50, axis = True, grid = True, x_title = "x axis", y_title = "y axis" ) #Labels data = { "john" : [-5, -2, 0, 1, 3], "mary" : [0, 0, 3, 5, 2], "philip" : [-2, -3, -4, 2, 1] } x_labels = [ "jan/2008", "feb/2008", "mar/2008", "apr/2008", "may/2008" ] y_labels = [ "very low", "low", "medium", "high", "very high" ] cairoplot.dot_line_plot( "dot_line_2_dictionary_labels_series.png", data, 400, 300, x_labels = x_labels, y_labels = y_labels, axis = True, grid = True, x_title = "x axis", y_title = "y axis", series_legend=True ) #Series legend data = { "john" : [10, 10, 10, 10, 30], "mary" : [0, 0, 3, 5, 15], "philip" : [13, 32, 11, 25, 2] } x_labels = [ "jan/2008", "feb/2008", "mar/2008", "apr/2008", "may/2008" ] cairoplot.dot_line_plot( 'dot_line_3_series_legend_series.png', data, 400, 300, x_labels = x_labels, axis = True, grid = True, series_legend = True ) #Speed test, many x_labels data = range(1000) x_labels = [str(x) for x in data] cairoplot.dot_line_plot( 'dot_line_4_many_x_labels.png', data, 14000, 300, x_labels = x_labels, axis = True, grid = True, series_legend = True ) if test_function_plot : #Default Plot data = lambda x : x**2 cairoplot.function_plot( 'function_1_default_series.png', data, 400, 300, grid = True, x_bounds=(-10,10), step = 0.1 ) #Discrete Plot data = lambda x : math.sin(0.1*x)*math.cos(x) cairoplot.function_plot( 'function_2_discrete_series.png', data, 800, 300, discrete = True, dots = True, grid = True, x_bounds=(0,80), x_title = "t (s)", y_title = "sin(0.1*x)*cos(x)") #Labels test data = lambda x : [1,2,3,4,5][x] x_labels = [ "4", "3", "2", "1", "0" ] cairoplot.function_plot( 'function_3_labels_series.png', data, 400, 300, discrete = True, dots = True, grid = True, x_labels = x_labels, x_bounds=(0,4), step = 1 ) #Multiple functions data = [ lambda x : 1, lambda y : y**2, lambda z : -z**2 ] colors = [ (1.0, 0.0, 0.0 ), ( 0.0, 1.0, 0.0 ), ( 0.0, 0.0, 1.0 ) ] cairoplot.function_plot( 'function_4_multi_functions_series.png', data, 400, 300, grid = True, series_colors = colors, step = 0.1 ) #Gaussian a = 1 b = 0 c = 1.5 gaussian = lambda x : a*math.exp(-(x-b)*(x-b)/(2*c*c)) cairoplot.function_plot( 'function_5_gaussian_series.png', data, 400, 300, grid = True, x_bounds = (-10,10), step = 0.1 ) #Dict function plot data = Series() data.range = (-5,5) data.group_list = {'linear':lambda x : x*2, 'quadratic':lambda x:x**2, 'cubic':lambda x:(x**3)/2} cairoplot.function_plot( 'function_6_dict_serie.png', data, 400, 300, grid = True, x_bounds=(-5,5), step = 0.1 ) if test_vertical_bar_plot: #Passing a dictionary data = Series({ 'teste00' : [27], 'teste01' : [10], 'teste02' : [18], 'teste03' : [5], 'teste04' : [1], 'teste05' : [22] }) cairoplot.vertical_bar_plot ( 'vbar_0_dictionary_series.png', data, 400, 300, border = 20, grid = True, rounded_corners = True ) #Display values data = Series({ 'teste00' : [27], 'teste01' : [10], 'teste02' : [18], 'teste03' : [5], 'teste04' : [1], 'teste05' : [22] }) cairoplot.vertical_bar_plot ( 'vbar_0_dictionary_series.png', data, 400, 300, border = 20, display_values = True, grid = True, rounded_corners = True ) #Using default, rounded corners and 3D visualization data = Series([ [0, 3, 11], [8, 9, 21], [13, 10, 9], [2, 30, 8] ]) colors = [ (1,0.2,0), (1,0.7,0), (1,1,0) ] series_labels = ["red", "orange", "yellow"] cairoplot.vertical_bar_plot ( 'vbar_1_default_series.png', data, 400, 300, border = 20, grid = True, rounded_corners = False, colors = "yellow_orange_red" ) cairoplot.vertical_bar_plot ( 'vbar_2_rounded_series.png', data, 400, 300, border = 20, series_labels = series_labels, display_values = True, grid = True, rounded_corners = True, colors = colors ) cairoplot.vertical_bar_plot ( 'vbar_3_3D_series.png', data, 400, 300, border = 20, series_labels = series_labels, grid = True, three_dimension = True, colors = colors ) #Mixing groups and columns data = Series([ [1], [2], [3,4], [4], [5], [6], [7], [8], [9], [10] ]) cairoplot.vertical_bar_plot ( 'vbar_4_group_series.png', data, 400, 300, border = 20, grid = True ) #Using no labels, horizontal and vertical labels data = Series([[3,4], [4,8], [5,3], [9,1]]) y_labels = [ "line1", "line2", "line3", "line4", "line5", "line6" ] x_labels = [ "group1", "group2", "group3", "group4" ] cairoplot.vertical_bar_plot ( 'vbar_5_no_labels_series.png', data, 600, 200, border = 20, grid = True ) cairoplot.vertical_bar_plot ( 'vbar_6_x_labels_series.png', data, 600, 200, border = 20, grid = True, x_labels = x_labels ) cairoplot.vertical_bar_plot ( 'vbar_7_y_labels_series.png', data, 600, 200, border = 20, grid = True, y_labels = y_labels ) cairoplot.vertical_bar_plot ( 'vbar_8_hy_labels_series.png', data, 600, 200, border = 20, display_values = True, grid = True, x_labels = x_labels, y_labels = y_labels ) #Large data set data = Series([[10*random()] for x in range(50)]) x_labels = ["large label name oh my god it's big" for x in data] cairoplot.vertical_bar_plot ( 'vbar_9_large_series.png', data, 1000, 800, border = 20, grid = True, rounded_corners = True, x_labels = x_labels ) #Stack vertical data = Series([ [6, 4, 10], [8, 9, 3], [1, 10, 9], [2, 7, 11] ]) colors = [ (1,0.2,0), (1,0.7,0), (1,1,0) ] x_labels = ["teste1", "teste2", "testegrande3", "testegrande4"] cairoplot.vertical_bar_plot ( 'vbar_10_stack_series.png', data, 400, 300, border = 20, display_values = True, grid = True, rounded_corners = True, stack = True, x_labels = x_labels, colors = colors ) if test_horizontal_bar_plot: #Passing a dictionary data = Series({ 'teste00' : [27], 'teste01' : [10], 'teste02' : [18], 'teste03' : [5], 'teste04' : [1], 'teste05' : [22] }) cairoplot.horizontal_bar_plot ( 'hbar_0_dictionary_series.png', data, 400, 300, border = 20, display_values = True, grid = True, rounded_corners = True ) #Using default, rounded corners and 3D visualization data = Series([ [0, 3, 11], [8, 9, 21], [13, 10, 9], [2, 30, 8] ]) colors = [ (1,0.2,0), (1,0.7,0), (1,1,0) ] series_labels = ["red", "orange", "yellow"] cairoplot.horizontal_bar_plot ( 'hbar_1_default_series.png', data, 400, 300, border = 20, grid = True, rounded_corners = False, colors = "yellow_orange_red" ) cairoplot.horizontal_bar_plot ( 'hbar_2_rounded_series.png', data, 400, 300, border = 20, series_labels = series_labels, display_values = True, grid = True, rounded_corners = True, colors = colors ) #Mixing groups and columns data = ([ [1], [2], [3,4], [4], [5], [6], [7], [8], [9], [10] ]) cairoplot.horizontal_bar_plot ( 'hbar_4_group_series.png', data, 400, 300, border = 20, grid = True ) #Using no labels, horizontal and vertical labels series_labels = ["data11", "data22"] data = Series([[3,4], [4,8], [5,3], [9,1]]) x_labels = [ "line1", "line2", "line3", "line4", "line5", "line6" ] y_labels = [ "group1", "group2", "group3", "group4" ] cairoplot.horizontal_bar_plot ( 'hbar_5_no_labels_series.png', data, 600, 200, border = 20, series_labels = series_labels, grid = True ) cairoplot.horizontal_bar_plot ( 'hbar_6_x_labels_series.png', data, 600, 200, border = 20, series_labels = series_labels, grid = True, x_labels = x_labels ) cairoplot.horizontal_bar_plot ( 'hbar_7_y_labels_series.png', data, 600, 200, border = 20, series_labels = series_labels, grid = True, y_labels = y_labels ) cairoplot.horizontal_bar_plot ( 'hbar_8_hy_labels_series.png', data, 600, 200, border = 20, series_labels = series_labels, display_values = True, grid = True, x_labels = x_labels, y_labels = y_labels ) #Large data set data = Series([[10*random()] for x in range(25)]) x_labels = ["large label name oh my god it's big" for x in data] cairoplot.horizontal_bar_plot ( 'hbar_9_large_series.png', data, 1000, 800, border = 20, grid = True, rounded_corners = True, x_labels = x_labels ) #Stack horizontal data = Series([ [6, 4, 10], [8, 9, 3], [1, 10, 9], [2, 7, 11] ]) colors = [ (1,0.2,0), (1,0.7,0), (1,1,0) ] y_labels = ["teste1", "teste2", "testegrande3", "testegrande4"] cairoplot.horizontal_bar_plot ( 'hbar_10_stack_series.png', data, 400, 300, border = 20, display_values = True, grid = True, rounded_corners = True, stack = True, y_labels = y_labels, colors = colors ) if test_pie_plot : #Define a new backgrond background = cairo.LinearGradient(300, 0, 300, 400) background.add_color_stop_rgb(0.0,0.7,0.0,0.0) background.add_color_stop_rgb(1.0,0.3,0.0,0.0) #Plot data data = {"orcs" : 100, "goblins" : 230, "elves" : 50 , "demons" : 43, "humans" : 332} cairoplot.pie_plot( "pie_1_default_series.png", data, 600, 400 ) cairoplot.pie_plot( "pie_2_gradient_shadow_series.png", data, 600, 400, gradient = True, shadow = True ) cairoplot.pie_plot( "pie_3_background_series.png", data, 600, 400, background = background, gradient = True, shadow = True ) if test_donut_plot : #Define a new backgrond background = cairo.LinearGradient(300, 0, 300, 400) background.add_color_stop_rgb(0,0.4,0.4,0.4) background.add_color_stop_rgb(1.0,0.1,0.1,0.1) data = {"john" : 700, "mary" : 100, "philip" : 100 , "suzy" : 50, "yman" : 50} #Default plot, gradient and shadow, different background cairoplot.donut_plot( "donut_1_default_series.png", data, 600, 400, inner_radius = 0.3 ) cairoplot.donut_plot( "donut_2_gradient_shadow_series.png", data, 600, 400, gradient = True, shadow = True, inner_radius = 0.3 ) cairoplot.donut_plot( "donut_3_background_series.png", data, 600, 400, background = background, gradient = True, shadow = True, inner_radius = 0.3 ) if test_gantt_chart : #Default Plot pieces = Series([(0.5, 5.5), [(0, 4), (6, 8)], (5.5, 7), (7, 9)]) x_labels = [ 'teste01', 'teste02', 'teste03', 'teste04'] y_labels = [ '0001', '0002', '0003', '0004', '0005', '0006', '0007', '0008', '0009', '0010' ] colors = [ (1.0, 0.0, 0.0), (1.0, 0.7, 0.0), (1.0, 1.0, 0.0), (0.0, 1.0, 0.0) ] cairoplot.gantt_chart('gantt_1_default_series.png', pieces, 500, 350, x_labels, y_labels, colors) if test_themes : data = Series([[1,2,3,4,5,6,7,8,9,10,11,12,13,14]]) cairoplot.vertical_bar_plot ( 'bar_1_color_themes_series.png', data, 400, 300, border = 20, grid = True, colors="rainbow" ) data = Series([[1,2,3,4,5,6,7,8,9,10,11,12,13,14]]) cairoplot.vertical_bar_plot ( 'bar_2_color_themes_series.png', data, 400, 300, background = "white light_gray", border = 20, grid = True, colors="rainbow" ) data = Series() data.range = (0,10,0.1) data.group_list = [ lambda x : 1, lambda y : y**2, lambda z : -z**2 ] cairoplot.function_plot( 'function_color_themes_series.png', data, 400, 300, grid = True, series_colors = ["red", "orange", "yellow"], step = 0.1 ) #Scatter x DotLine t = [x*0.1 for x in range(0,40)] f = [math.exp(x) for x in t] g = [10*math.cos(x) for x in t] h = [10*math.sin(x) for x in t] erx = [0.1*random() for x in t] ery = [5*random() for x in t] data = Series({"exp" : [t,f], "cos" : [t,g], "sin" : [t,h]}) series_colors = [ (1,0,0), (0,0,0) ] cairoplot.scatter_plot ( 'scatter_color_themes_series.png', data = data, errorx = [erx,erx], errory = [ery,ery], width = 800, height = 600, border = 20, axis = True, discrete = False, dots = 5, grid = True, x_title = "t", y_title = "f(t) g(t)", series_legend=True, series_colors = ["red", "blue", "orange"]) wxbanker-0.9.1/wxbanker/cairoplot/setup.py0000644000175000017500000000077612243601243020642 0ustar mrooneymrooney#!/usr/bin/env python '''Cairoplot installation script.''' from distutils.core import setup import os setup( description='Cairoplot', license='GNU LGPL 2.1', long_description=''' Using Python and PyCairo to develop a module to plot graphics in an easy and intuitive way, creating beautiful results for presentations. ''', name='Cairoplot', py_modules=['cairoplot','series'], url='http://linil.wordpress.com/2008/09/16/cairoplot-11/', version='1.1', ) wxbanker-0.9.1/wxbanker/cairoplot/tests.py0000644000175000017500000003441512243601243020641 0ustar mrooneymrooneyimport cairo, math, random import cairoplot # Line plotting test_scatter_plot = 1 test_dot_line_plot = 1 test_function_plot = 1 # Bar plotting test_vertical_bar_plot = 1 test_horizontal_bar_plot = 1 # Pie plotting test_pie_plot = 1 test_donut_plot = 1 # Others test_gantt_chart = 1 test_themes = 1 if test_scatter_plot: #Special data data = [(50,10),(15,55),(10,70),(15,85),(30,90),(40,85),(50,70),(60,85),(70,90),(85,85),(90,70),(85,55),(50,10)] cairoplot.scatter_plot ( 'scatter_0.svg', data = data, width = 500, height = 500, border = 20, axis = True, dots = 3, grid = True, x_bounds=[0,100], y_bounds=[0,100], series_colors = [(1,0,0)] ) #Default data data = [ (-2,10), (0,0), (0,15), (1,5), (2,0), (3,-10), (3,5) ] cairoplot.scatter_plot ( 'scatter_1_default.svg', data = data, width = 500, height = 500, border = 20, axis = True, grid = True ) #lists of coordinates x,y data = [[1,2,3,4,5],[1,1,1,1,1]] cairoplot.scatter_plot ( 'scatter_2_lists.svg', data = data, width = 500, height = 500, border = 20, axis = True, grid = True ) #lists of coordinates x,y,z data = [[0.5,1,2,3,4,5],[0.5,1,1,1,1,1],[10,6,10,20,10,6]] colors = [ (0,0,0,0.25), (1,0,0,0.75) ] cairoplot.scatter_plot ( 'scatter_3_lists.svg', data = data, width = 500, height = 500, border = 20, axis = True, discrete = True, grid = True, circle_colors = colors ) data = [(-1, -16, 12), (-12, 17, 11), (-4, 6, 5), (4, -20, 12), (13, -3, 21), (7, 14, 20), (-11, -2, 18), (19, 7, 18), (-10, -19, 15), (-17, -2, 6), (-9, 4, 10), (14, 11, 16), (13, -11, 18), (20, 20, 16), (7, -8, 15), (-16, 17, 16), (16, 9, 9), (-3, -13, 25), (-20, -6, 17), (-10, -10, 12), (-7, 17, 25), (10, -10, 13), (10, 13, 20), (17, 6, 15), (18, -11, 14), (18, -12, 11), (-9, 11, 14), (17, -15, 25), (-2, -8, 5), (5, 20, 20), (18, 20, 23), (-20, -16, 17), (-19, -2, 9), (-11, 19, 18), (17, 16, 12), (-5, -20, 15), (-20, -13, 10), (-3, 5, 20), (-1, 13, 17), (-11, -9, 11)] colors = [ (0,0,0,0.25), (1,0,0,0.75) ] cairoplot.scatter_plot ( 'scatter_2_variable_radius.svg', data = data, width = 500, height = 500, border = 20, axis = True, discrete = True, dots = 2, grid = True, x_title = "x axis", y_title = "y axis", circle_colors = colors ) #Scatter x DotLine error bars t = [x*0.1 for x in range(0,40)] f = [math.exp(x) for x in t] g = [10*math.cos(x) for x in t] h = [10*math.sin(x) for x in t] erx = [0.1*random.random() for x in t] ery = [5*random.random() for x in t] data = {"exp" : [t,f], "cos" : [t,g], "sin" : [t,h]} series_colors = [ (1,0,0), (0,0,0), (0,0,1) ] cairoplot.scatter_plot ( 'cross_r_exponential.svg', data = data, errorx = [erx,erx], errory = [ery,ery], width = 800, height = 600, border = 20, axis = True, discrete = False, dots = 5, grid = True, x_title = "t", y_title = "f(t) g(t)", series_legend=True, series_colors = series_colors ) if test_dot_line_plot: #Default plot data = [ 0, 1, 3.5, 8.5, 9, 0, 10, 10, 2, 1 ] cairoplot.dot_line_plot( "dot_line_1_default.svg", data, 400, 300, border = 50, axis = True, grid = True, x_title = "x axis", y_title = "y axis" ) #Labels data = { "john" : [-5, -2, 0, 1, 3], "mary" : [0, 0, 3, 5, 2], "philip" : [-2, -3, -4, 2, 1] } x_labels = [ "jan/2008", "feb/2008", "mar/2008", "apr/2008", "may/2008" ] y_labels = [ "very low", "low", "medium", "high", "very high" ] cairoplot.dot_line_plot( "dot_line_2_dictionary_labels.svg", data, 400, 300, x_labels = x_labels, y_labels = y_labels, axis = True, grid = True, x_title = "x axis", y_title = "y axis", series_legend=True ) #Series legend data = { "john" : [10, 10, 10, 10, 30], "mary" : [0, 0, 3, 5, 15], "philip" : [13, 32, 11, 25, 2] } x_labels = [ "jan/2008", "feb/2008", "mar/2008", "apr/2008", "may/2008" ] cairoplot.dot_line_plot( 'dot_line_3_series_legend.svg', data, 400, 300, x_labels = x_labels, axis = True, grid = True, series_legend = True ) if test_function_plot : #Default Plot data = lambda x : x**2 cairoplot.function_plot( 'function_1_default.svg', data, 400, 300, grid = True, x_bounds=(-10,10), step = 0.1 ) #Discrete Plot data = lambda x : math.sin(0.1*x)*math.cos(x) cairoplot.function_plot( 'function_2_discrete.svg', data, 800, 300, discrete = True, dots = True, grid = True, x_bounds=(0,80), x_title = "t (s)", y_title = "sin(0.1*x)*cos(x)") #Labels test data = lambda x : [1,2,3,4,5][x] x_labels = [ "4", "3", "2", "1", "0" ] cairoplot.function_plot( 'function_3_labels.svg', data, 400, 300, discrete = True, dots = True, grid = True, x_labels = x_labels, x_bounds=(0,4), step = 1 ) #Multiple functions data = [ lambda x : 1, lambda y : y**2, lambda z : -z**2 ] colors = [ (1.0, 0.0, 0.0 ), ( 0.0, 1.0, 0.0 ), ( 0.0, 0.0, 1.0 ) ] cairoplot.function_plot( 'function_4_multi_functions.svg', data, 400, 300, grid = True, series_colors = colors, step = 0.1 ) #Gaussian a = 1 b = 0 c = 1.5 gaussian = lambda x : a*math.exp(-(x-b)*(x-b)/(2*c*c)) cairoplot.function_plot( 'function_5_gaussian.svg', data, 400, 300, grid = True, x_bounds = (-10,10), step = 0.1 ) #Dict function plot data = {'linear':lambda x : x*2, 'quadratic':lambda x:x**2, 'cubic':lambda x:(x**3)/2} cairoplot.function_plot( 'function_6_dict.svg', data, 400, 300, grid = True, x_bounds=(-5,5), step = 0.1 ) if test_vertical_bar_plot: #Passing a dictionary data = { 'teste00' : [27], 'teste01' : [10], 'teste02' : [18], 'teste03' : [5], 'teste04' : [1], 'teste05' : [22] } cairoplot.vertical_bar_plot ( 'vbar_0_dictionary.svg', data, 400, 300, border = 20, grid = True, rounded_corners = True ) #Display values data = { 'teste00' : [27], 'teste01' : [10], 'teste02' : [18], 'teste03' : [5], 'teste04' : [1], 'teste05' : [22] } cairoplot.vertical_bar_plot ( 'vbar_0_dictionary.svg', data, 400, 300, border = 20, display_values = True, grid = True, rounded_corners = True ) #Using default, rounded corners and 3D visualization data = [ [0, 3, 11], [8, 9, 21], [13, 10, 9], [2, 30, 8] ] colors = [ (1,0.2,0), (1,0.7,0), (1,1,0) ] series_labels = ["red", "orange", "yellow"] cairoplot.vertical_bar_plot ( 'vbar_1_default.svg', data, 400, 300, border = 20, grid = True, rounded_corners = False, colors = "yellow_orange_red" ) cairoplot.vertical_bar_plot ( 'vbar_2_rounded.svg', data, 400, 300, border = 20, series_labels = series_labels, display_values = True, grid = True, rounded_corners = True, colors = colors ) cairoplot.vertical_bar_plot ( 'vbar_3_3D.svg', data, 400, 300, border = 20, series_labels = series_labels, grid = True, three_dimension = True, colors = colors ) #Mixing groups and columns data = [ [1], [2], [3,4], [4], [5], [6], [7], [8], [9], [10] ] cairoplot.vertical_bar_plot ( 'vbar_4_group.svg', data, 400, 300, border = 20, grid = True ) #Using no labels, horizontal and vertical labels data = [[3,4], [4,8], [5,3], [9,1]] y_labels = [ "line1", "line2", "line3", "line4", "line5", "line6" ] x_labels = [ "group1", "group2", "group3", "group4" ] cairoplot.vertical_bar_plot ( 'vbar_5_no_labels.svg', data, 600, 200, border = 20, grid = True ) cairoplot.vertical_bar_plot ( 'vbar_6_x_labels.svg', data, 600, 200, border = 20, grid = True, x_labels = x_labels ) cairoplot.vertical_bar_plot ( 'vbar_7_y_labels.svg', data, 600, 200, border = 20, grid = True, y_labels = y_labels ) cairoplot.vertical_bar_plot ( 'vbar_8_hy_labels.svg', data, 600, 200, border = 20, display_values = True, grid = True, x_labels = x_labels, y_labels = y_labels ) #Large data set data = [[10*random.random()] for x in range(50)] x_labels = ["large label name oh my god it's big" for x in data] cairoplot.vertical_bar_plot ( 'vbar_9_large.svg', data, 1000, 800, border = 20, grid = True, rounded_corners = True, x_labels = x_labels ) #Stack vertical data = [ [6, 4, 10], [8, 9, 3], [1, 10, 9], [2, 7, 11] ] colors = [ (1,0.2,0), (1,0.7,0), (1,1,0) ] x_labels = ["teste1", "teste2", "testegrande3", "testegrande4"] cairoplot.vertical_bar_plot ( 'vbar_10_stack.svg', data, 400, 300, border = 20, display_values = True, grid = True, rounded_corners = True, stack = True, x_labels = x_labels, colors = colors ) if test_horizontal_bar_plot: #Passing a dictionary data = { 'teste00' : [27], 'teste01' : [10], 'teste02' : [18], 'teste03' : [5], 'teste04' : [1], 'teste05' : [22] } cairoplot.horizontal_bar_plot ( 'hbar_0_dictionary.svg', data, 400, 300, border = 20, display_values = True, grid = True, rounded_corners = True ) #Using default, rounded corners and 3D visualization data = [ [0, 3, 11], [8, 9, 21], [13, 10, 9], [2, 30, 8] ] colors = [ (1,0.2,0), (1,0.7,0), (1,1,0) ] series_labels = ["red", "orange", "yellow"] cairoplot.horizontal_bar_plot ( 'hbar_1_default.svg', data, 400, 300, border = 20, grid = True, rounded_corners = False, colors = "yellow_orange_red" ) cairoplot.horizontal_bar_plot ( 'hbar_2_rounded.svg', data, 400, 300, border = 20, series_labels = series_labels, display_values = True, grid = True, rounded_corners = True, colors = colors ) #Mixing groups and columns data = [ [1], [2], [3,4], [4], [5], [6], [7], [8], [9], [10] ] cairoplot.horizontal_bar_plot ( 'hbar_4_group.svg', data, 400, 300, border = 20, grid = True ) #Using no labels, horizontal and vertical labels series_labels = ["data11", "data22"] data = [[3,4], [4,8], [5,3], [9,1]] x_labels = [ "line1", "line2", "line3", "line4", "line5", "line6" ] y_labels = [ "group1", "group2", "group3", "group4" ] cairoplot.horizontal_bar_plot ( 'hbar_5_no_labels.svg', data, 600, 200, border = 20, series_labels = series_labels, grid = True ) cairoplot.horizontal_bar_plot ( 'hbar_6_x_labels.svg', data, 600, 200, border = 20, series_labels = series_labels, grid = True, x_labels = x_labels ) cairoplot.horizontal_bar_plot ( 'hbar_7_y_labels.svg', data, 600, 200, border = 20, series_labels = series_labels, grid = True, y_labels = y_labels ) cairoplot.horizontal_bar_plot ( 'hbar_8_hy_labels.svg', data, 600, 200, border = 20, series_labels = series_labels, display_values = True, grid = True, x_labels = x_labels, y_labels = y_labels ) #Large data set data = [[10*random.random()] for x in range(25)] x_labels = ["large label name oh my god it's big" for x in data] cairoplot.horizontal_bar_plot ( 'hbar_9_large.svg', data, 1000, 800, border = 20, grid = True, rounded_corners = True, x_labels = x_labels ) #Stack horizontal data = [ [6, 4, 10], [8, 9, 3], [1, 10, 9], [2, 7, 11] ] colors = [ (1,0.2,0), (1,0.7,0), (1,1,0) ] y_labels = ["teste1", "teste2", "testegrande3", "testegrande4"] cairoplot.horizontal_bar_plot ( 'hbar_10_stack.svg', data, 400, 300, border = 20, display_values = True, grid = True, rounded_corners = True, stack = True, y_labels = y_labels, colors = colors ) if test_pie_plot : #Define a new backgrond background = cairo.LinearGradient(300, 0, 300, 400) background.add_color_stop_rgb(0.0,0.7,0.0,0.0) background.add_color_stop_rgb(1.0,0.3,0.0,0.0) #Plot data data = {"orcs" : 100, "goblins" : 230, "elves" : 50 , "demons" : 43, "humans" : 332} cairoplot.pie_plot( "pie_1_default.svg", data, 600, 400 ) cairoplot.pie_plot( "pie_2_gradient_shadow.svg", data, 600, 400, gradient = True, shadow = True ) cairoplot.pie_plot( "pie_3_background.svg", data, 600, 400, background = background, gradient = True, shadow = True ) if test_donut_plot : #Define a new backgrond background = cairo.LinearGradient(300, 0, 300, 400) background.add_color_stop_rgb(0,0.4,0.4,0.4) background.add_color_stop_rgb(1.0,0.1,0.1,0.1) data = {"john" : 700, "mary" : 100, "philip" : 100 , "suzy" : 50, "yman" : 50} #Default plot, gradient and shadow, different background cairoplot.donut_plot( "donut_1_default.svg", data, 600, 400, inner_radius = 0.3 ) cairoplot.donut_plot( "donut_2_gradient_shadow.svg", data, 600, 400, gradient = True, shadow = True, inner_radius = 0.3 ) cairoplot.donut_plot( "donut_3_background.svg", data, 600, 400, background = background, gradient = True, shadow = True, inner_radius = 0.3 ) if test_gantt_chart : #Default Plot pieces = [(0.5, 5.5), [(0, 4), (6, 8)], (5.5, 7), (7, 9)] x_labels = [ 'teste01', 'teste02', 'teste03', 'teste04'] y_labels = [ '0001', '0002', '0003', '0004', '0005', '0006', '0007', '0008', '0009', '0010' ] colors = [ (1.0, 0.0, 0.0), (1.0, 0.7, 0.0), (1.0, 1.0, 0.0), (0.0, 1.0, 0.0) ] cairoplot.gantt_chart('gantt_1_default.svg', pieces, 500, 350, x_labels, y_labels, colors) if test_themes : data = [[1,2,3,4,5,6,7,8,9,10,11,12,13,14]] cairoplot.vertical_bar_plot ( 'bar_1_color_themes.svg', data, 400, 300, border = 20, grid = True, colors="rainbow" ) data = [[1,2,3,4,5,6,7,8,9,10,11,12,13,14]] cairoplot.vertical_bar_plot ( 'bar_2_color_themes.svg', data, 400, 300, background = "black light_gray", border = 20, grid = True, colors="rainbow" ) data = [ lambda x : 1, lambda y : y**2, lambda z : -z**2 ] cairoplot.function_plot( 'function_color_themes.svg', data, 400, 300, grid = True, series_colors = ["red", "orange", "yellow"], step = 0.1 ) #Scatter x DotLine t = [x*0.1 for x in range(0,40)] f = [math.exp(x) for x in t] g = [10*math.cos(x) for x in t] h = [10*math.sin(x) for x in t] erx = [0.1*random.random() for x in t] ery = [5*random.random() for x in t] data = {"exp" : [t,f], "cos" : [t,g], "sin" : [t,h]} series_colors = [ (1,0,0), (0,0,0) ] cairoplot.scatter_plot ( 'scatter_color_themes.svg', data = data, errorx = [erx,erx], errory = [ery,ery], width = 800, height = 600, border = 20, axis = True, discrete = False, dots = 5, grid = True, x_title = "t", y_title = "f(t) g(t)", series_legend=True, series_colors = ["red", "blue", "orange"]) wxbanker-0.9.1/wxbanker/cairoplot/testscripts/0000755000175000017500000000000012243601243021505 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/cairoplot/testscripts/compare.sh0000644000175000017500000000055612243601243023475 0ustar mrooneymrooney#!/bin/sh if [ $# -ne 3 ] then echo "Compare .png files in two directories" echo "Usage: ./compare.sh path1 path2 diffdir" echo "Example: ./compare.sh . ../other ./diff" exit fi for dir in $1 $2 do for i in $dir/*.png do convert $i $i.tiff done done for i in `(cd $1; ls *.tiff)` do perceptualdiff $1/$i $2/$i -output $3/$i.ppm done wxbanker-0.9.1/wxbanker/cairoplot/testscripts/timeit.sh0000644000175000017500000000013712243601243023335 0ustar mrooneymrooney#!/bin/sh DIRNAME=`dirname $0` (cd $DIRNAME/..; python -m timeit -n 1 -v "import seriestests") wxbanker-0.9.1/wxbanker/cairoplot/TODO0000644000175000017500000000105312243601243017605 0ustar mrooneymrooneyTODO: High Priority: - Finish refactoring code into OO form Medium Priority: - Allow changing of plot parameters - Implement data series as classes and objects - Implement Bar and Histogram charts - Enhance conformity with English terminology - Create more graphic elements (axis titles, etc...) - Create a python egg and setup-tools style install - Allow different combinations of line, dot, area plots for linear series - add pseudo_3D effects Low Priority: - Split or organize tests.py into a test suite wxbanker-0.9.1/wxbanker/calculator.py0000644000175000017500000001223712243601243017632 0ustar mrooneymrooney# https://launchpad.net/wxbanker # calculator.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx from wx.lib.pubsub import Publisher from wxbanker import localization class SimpleCalculator(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) self.numberClears = True sizer = wx.BoxSizer(wx.VERTICAL) self.display = wx.TextCtrl(self, -1, '0.00', style=wx.TE_RIGHT) self.display.Bind(wx.EVT_CHAR, self.onChar) sizer.Add(self.display, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 4) gs = wx.GridSizer(4, 4, 3, 3) for lbl in "C ()789/456*123-0.+=": if not lbl == ' ': btn = wx.Button(self, label=lbl) btn.Bind(wx.EVT_BUTTON, self.onButton) else: btn = wx.StaticText(self) gs.Add(btn, 1, wx.EXPAND) sizer.Add(gs, 1, wx.EXPAND) self.SetSizer(sizer) Publisher.subscribe(self.onPushChars, "CALCULATOR.PUSH_CHARS") wx.CallLater(50, self.display.SetInsertionPointEnd) def onPushChars(self, message): for char in message.data: self.onChar(char=char) self.Parent.Parent.SetExpanded(True) def onChar(self, event=None, char=None): """ Handles characters, either from a button or a key typed into the text control. Supported: 0123456789./*-+ Special: * 'c' or 'C': clears the text ctrl * '=' (or WXK_RETURN): evaluates the expression and displays the result * WXK_BACK: backspace, deletes the last character All other characters/keypresses are discarded. """ if event: keycode = event.KeyCode if keycode == wx.WXK_BACK: self.display.Value = self.display.Value[:-1] self.display.SetInsertionPointEnd() self.numberClears = False return elif keycode == wx.WXK_RETURN: char = '=' else: try: char = chr(event.KeyCode) except ValueError: # It may have been an arrow key press or something else not chr'able. if event: event.Skip() return else: assert char if char == '=': self.onEnter() elif char.upper() == 'C': self.display.Value = "" elif char in '()0123456789./*-+': if char in '()0123456789.' and self.numberClears: self.display.Value = "" self.numberClears = False self.display.AppendText(char) else: # Not a valid character. return self.display.SetFocus() self.display.SetInsertionPointEnd() def onEnter(self, event=None): """ Attempt to do a simple eval on the text. Note no implicit order of operations is respected. """ try: # Multiply by float first, so 1/2 is 0.50 and not 0.00 result = eval("1.*"+self.display.Value) except: return self.display.Value = "%.2f"%result self.numberClears = True self.display.SetInsertionPointEnd() def onButton(self, event=None): btn = event.EventObject command = btn.Label self.onChar(char=command) class CollapsableWidget(wx.CollapsiblePane): def __init__(self, parent, widget, labels, *args, **kwargs): self.Labels = labels wx.CollapsiblePane.__init__(self, parent, label=self.Labels[0], style=wx.CP_DEFAULT_STYLE|wx.CP_NO_TLW_RESIZE) pane = self.GetPane() self.widget = widget(pane, *args, **kwargs) pane.Sizer = wx.BoxSizer() pane.Sizer.Add(self.widget, 1, wx.EXPAND) self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnPaneChanged) def SetExpanded(self, expanded): """ Set whether the contained widget is collapsed or expanded. If there will be no change, don't do anything. """ if expanded != self.IsExpanded(): self.Collapse(not expanded) self.OnPaneChanged() def OnPaneChanged(self, evt=None): """Redo the text and layout when the widget state is toggled.""" self.Layout() # Change the labels expanded = int(self.IsExpanded()) self.Label = self.Labels[expanded] Publisher.sendMessage("CALCULATOR.TOGGLED", ("SHOW", "HIDE")[expanded]) wxbanker-0.9.1/wxbanker/compileart.py0000644000175000017500000001146412243601243017641 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # compileart.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . # """ A script to generate an img2py catalog module, given a directory full of images. It will also append some code to the end of the module, making it runnable, displaying a frame of all the available icons in the module, with the mouseover tooltip being the name of the icon. Note that this MUST be run with wxPython >= 2.8.8.0, although it will generate compatible code with at least back to 2.8.7.1 (and probably much farther). """ from wx.tools import img2py import os base = 'silk' validExts = ['png',] header = """#!/usr/bin/env python # # https://launchpad.net/wxbanker # silk.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . # """ testFrame = """ # Added so that the img2py module is runnable, for a sample of all available art. import wx class ArtFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title="Available Icons") panel = wx.Panel(self) self.Sizer = wx.BoxSizer() self.Sizer.Add(panel, 1, wx.EXPAND) import wx.lib.art.img2pyartprov as img2pyartprov class fakemodule: catalog = catalog index = index wx.ArtProvider.Push(img2pyartprov.Img2PyArtProvider(fakemodule())) panel.Sizer = wx.FlexGridSizer(cols=40, vgap=2, hgap=2) iconNames = sorted(catalog.keys()) self.SetIcon(wx.ArtProvider.GetIcon(iconNames[0])) for iconName in iconNames: bmp = wx.StaticBitmap(panel, bitmap=wx.ArtProvider.GetBitmap('wxART_'+iconName)) bmp.SetToolTipString(iconName) panel.Sizer.Add(bmp) self.Layout() self.Fit() def main(): app = wx.App(False) frame = ArtFrame().Show() app.MainLoop() if __name__ == "__main__": main() """ # Append should initially be False, so the file is overwritten # and the necessary imports/declarations are made. append = False for file in os.listdir(base): name, ext = [s.lower() for s in file.split('.')] if ext in validExts: #print 'img2pying %s' % file try: img2py.img2py(os.path.join(base, file), '%s.py'%base, append=append, imgName=name, catalog=True, functionCompatible=False) except TypeError: # Try with the typo that existed in wxPython 2.8.8.0 but fixed since 2.8.8.1. img2py.img2py(os.path.join(base, file), '%s.py'%base, append=append, imgName=name, catalog=True, functionCompatibile=False) # From now on, we want to append to the original file, not overwrite. append = True else: print 'Ignoring %s' % file # Fix < 2.8 compatibility by shipping embeddedimage.py. print "Fixing compatibility with wxPython < 2.8...", lines = open('%s.py'%base).readlines() assert lines[3] == "from wx.lib.embeddedimage import PyEmbeddedImage\n", lines[3] lines[3] = "from wxbanker.art.embeddedimage import PyEmbeddedImage\n" print "fixed!" print "Adding demo frame and making %s module runnable..."%base, for line in testFrame.splitlines(True): lines.append(line) print "added!" print "Prepending header (shebang and license)...", headerLines = header.splitlines() lines = headerLines + lines print "prepended!" print "Saving modified %s.py..."%base, open('%s.py'%base, 'w').writelines(lines) print "done!" wxbanker-0.9.1/wxbanker/controller.py0000644000175000017500000001527412243601243017670 0ustar mrooneymrooney# -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # controller.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.persistentstore import PersistentStore import wx, os from wx.lib.pubsub import Publisher from wxbanker import debug, fileservice class Controller(object): CONFIG_NAME = "wxBanker.cfg" DB_NAME = "bank.db" def __init__(self, path=None): self._AutoSave = True self._ShowZeroBalanceAccounts = True self._ShowCurrencyNick = True self.Models = [] self.InitConfig() self.LoadPath(path, use=True) Publisher.subscribe(self.onAutoSaveToggled, "user.autosave_toggled") Publisher.subscribe(self.onShowZeroToggled, "user.showzero_toggled") Publisher.subscribe(self.onShowCurrencyNickToggled, "user.show_currency_nick_toggled") Publisher.subscribe(self.onSaveRequest, "user.saved") def MigrateIfFound(self, fromPath, toPath): """Migrate a file from fromPath (if it exists) to toPath.""" if os.path.exists(fromPath): import shutil try: shutil.move(fromPath, toPath) except IOError: debug.debug("Unable to move %s to %s, attempting a copy instead..." % (fromPath, toPath)) shutil.copyfile(fromPath, toPath) return True def InitConfig(self): """Initialize our configuration object.""" # It is only necessary to initialize any default values we # have which differ from the default values of the types, # so initializing an Int to 0 or a Bool to False is not needed. self.wxApp = wx.App(False) self.wxApp.SetAppName("wxBanker") self.wxApp.Controller = self configPath = fileservice.getConfigFilePath(self.CONFIG_NAME) # If we support XDG and the config file doesn't exist, it might be time to migrate. if fileservice.xdg and not os.path.exists(configPath): # If we can find the files at the old locations, we should migrate them. oldConfigPath = os.path.expanduser("~/.wxBanker") oldBankPath = os.path.expanduser("~/.wxbanker/bank.db") self.MigrateIfFound(oldConfigPath, fileservice.getConfigFilePath(self.CONFIG_NAME)) self.MigrateIfFound(oldBankPath, fileservice.getDataFilePath(self.DB_NAME)) # Okay, now our files are in happy locations, let's go! config = wx.FileConfig(localFilename=configPath) wx.Config.Set(config) if not config.HasEntry("SIZE_X"): config.WriteInt("SIZE_X", 960) config.WriteInt("SIZE_Y", 720) if not config.HasEntry("POS_X"): config.WriteInt("POS_X", 100) config.WriteInt("POS_Y", 100) if not config.HasEntry("SHOW_CALC"): config.WriteBool("SHOW_CALC", False) if not config.HasEntry("AUTO-SAVE"): config.WriteBool("AUTO-SAVE", True) if not config.HasEntry("HIDE_ZERO_BALANCE_ACCOUNTS"): config.WriteBool("HIDE_ZERO_BALANCE_ACCOUNTS", False) if not config.HasEntry("SHOW_CURRENCY_NICK"): config.WriteBool("SHOW_CURRENCY_NICK", False) # Set the auto-save option as appropriate. self.AutoSave = config.ReadBool("AUTO-SAVE") self.ShowZeroBalanceAccounts = not config.ReadBool("HIDE_ZERO_BALANCE_ACCOUNTS") self.ShowCurrencyNick = config.ReadBool("SHOW_CURRENCY_NICK") def onAutoSaveToggled(self, message): val = message.data self.AutoSave = val def onShowZeroToggled(self, message): val = message.data self.ShowZeroBalanceAccounts = val def onShowCurrencyNickToggled(self, message): val = message.data self.ShowCurrencyNick = val def onSaveRequest(self, message): self.Model.Save() def GetAutoSave(self): return self._AutoSave def SetAutoSave(self, val): self._AutoSave = val wx.Config.Get().WriteBool("AUTO-SAVE", val) Publisher.sendMessage("controller.autosave_toggled", val) for model in self.Models: debug.debug("Setting auto-save to: %s" % val) model.Store.AutoSave = val # If the user enables auto-save, we want to also save. if self.AutoSave: Publisher.sendMessage("user.saved") def GetShowZero(self): return self._ShowZeroBalanceAccounts def SetShowZero(self, val): self._ShowZeroBalanceAccounts = val wx.Config.Get().WriteBool("HIDE_ZERO_BALANCE_ACCOUNTS", not val) Publisher.sendMessage("controller.showzero_toggled", val) def GetShowCurrencyNick(self): return self._ShowCurrencyNick def SetShowCurrencyNick(self, val): self._ShowCurrencyNick = val wx.Config.Get().WriteBool("SHOW_CURRENCY_NICK", val) Publisher.sendMessage("controller.show_currency_nick_toggled", val) def LoadPath(self, path, use=False): if path is None: path = fileservice.getDataFilePath(self.DB_NAME) store = PersistentStore(path) store.AutoSave = self.AutoSave model = store.GetModel() self.Models.append(model) if use: self.Model = model return model def Close(self, model=None): if model is None: models = self.Models[:] else: models = [model] for model in models: # We can't use in here, since we need the is operator, not == if not any((m is model for m in self.Models)): raise Exception("model not managed by this controller") model.Store.Close() # Again we can't use remove, different models can be == for i, m in enumerate(self.Models): if m is model: self.Models.pop(i) break AutoSave = property(GetAutoSave, SetAutoSave) ShowZeroBalanceAccounts = property(GetShowZero, SetShowZero) ShowCurrencyNick = property(GetShowCurrencyNick, SetShowCurrencyNick) wxbanker-0.9.1/wxbanker/csvexporter.py0000644000175000017500000000215212243601243020060 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- import csv, cStringIO class CsvExporter: """Iterate through the list of transactions for an account and exort to a CSV file.""" @staticmethod def Generate(model, delimiter=",", quotechar="'"): """Generate the CSV string.""" result = cStringIO.StringIO() writer = csv.writer(result, delimiter=delimiter, quotechar=quotechar) writer.writerow(['Account', 'Description', 'Amount', 'Date']) # Iterate through transaction list, write rows. for account in model.Accounts: for transaction in account.Transactions: row = [account.Name.encode("utf8"), transaction.GetDescription().encode("utf8"), transaction.GetAmount(), transaction.GetDate()] writer.writerow(row) return result.getvalue().decode("utf8") @staticmethod def Export(model, exportPath): # Generate the contents. result = CsvExporter.Generate(model) # Write it. exportFile = open(exportPath, 'w') exportFile.write(result.encode("utf8")) wxbanker-0.9.1/wxbanker/csvimporter.py0000644000175000017500000001270512243601243020056 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # csvimporter.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from datetime import date, datetime from wx.lib.pubsub import Publisher import codecs, csv, os, re from cStringIO import StringIO from wxbanker.bankobjects.transaction import Transaction from wxbanker import fileservice, debug try: import simplejson as json except: json = None shippedProfiles = { "mint": { "amountColumn": 4, "dateColumn": 1, "dateFormat": "%m/%d/%Y", "decimalSeparator": ".", "delimiter": ",", "descriptionColumns": "2", "encoding": "utf-8", "linesToSkip": 1 }, "Sparkasse": { "amountColumn": 9, "dateColumn": 2, "dateFormat": "%d.%m.%y", "decimalSeparator": ",", "delimiter": ";", "descriptionColumns": "6, 5 , 4", "encoding": "utf-8", "linesToSkip": 1 }, "comdirect": { "amountColumn": 5, "dateColumn": 1, "dateFormat": "%d.%m.%Y", "decimalSeparator": ",", "delimiter": ";", "descriptionColumns": "4 (3)", "encoding": "iso8859-1", "linesToSkip": 24 } } class CsvImporter: """ Parses a csv file and extracts the data for import into the wxBanker data structures. """ def getTransactionsFromFile(self, filename, settings): contents = open(filename, 'rb').read() return self.getTransactionsFromCSV(contents, settings) def getTransactionsFromCSV(self, csvdata, settings): csvdata = StringIO(csvdata) csvReader = csv.reader( UTF8Recoder(csvdata, settings['encoding']), delimiter=settings['delimiter']) transactions = [] linesSkipped = 0 for row in csvReader: # Unfortunately csvReader is not subscriptable so we must count ourselves. if settings['linesToSkip']>linesSkipped: linesSkipped+=1 continue # If we find a blank line, assume we've hit the end of the transactions. if not row: break # convert to python unicode strings row = [unicode(s, "utf-8") for s in row] amount = self.parseAmount(row[settings['amountColumn'] - 1], settings['decimalSeparator']) # Properly parse amounts from mint. if settings == shippedProfiles['mint'] and row[4] == "debit": amount *=-1 desc = re.sub('\d+', lambda x: row[int(x.group(0)) - 1], settings['descriptionColumns']) tdate = datetime.strptime(row[settings['dateColumn'] -1], settings['dateFormat']).strftime('%Y-%m-%d') transactions.append(Transaction(None, None, amount, desc, tdate)) return TransactionContainer(transactions) def parseAmount(self, val, decimalSeparator): amountStr = "" for char in val: if char in "-1234567890"+decimalSeparator: amountStr += char amountStr = amountStr.replace(decimalSeparator, '.') return float(amountStr) class TransactionContainer(object): def __init__(self, transactions): self.Name = "#CSVIMPORT" self.Transactions = transactions def RemoveTransactions(self, transactions): for t in transactions: self.Transactions.remove(t) Publisher.sendMessage("transactions.removed", (self, transactions)) class CsvImporterProfileManager: def __init__(self): self.configFile = fileservice.getConfigFilePath('csvImportProfiles.json') self.loadProfiles() def getProfile(self, key): return self.profiles.get(key, None) def saveProfile(self, key, settings): self.profiles[key] = settings self.saveProfiles() def deleteProfile(self, key): del self.profiles[key] def loadProfiles(self): self.profiles = shippedProfiles try: contents = open(self.configFile, 'r') storedProfiles = json.load(contents) except Exception, e: debug.debug("Unable to read CSV profiles file:", e) else: self.profiles.update(storedProfiles) def saveProfiles(self): file = open(self.configFile, 'w') try: json.dump(self.profiles, file, sort_keys=True, indent=4) finally: file.close() class UTF8Recoder: """ Iterator that reads an encoded stream and reencodes the input to UTF-8 see http://docs.python.org/library/csv.html """ def __init__(self, f, encoding): self.reader = codecs.getreader(encoding)(f) def __iter__(self): return self def next(self): return self.reader.next().encode("utf-8") wxbanker-0.9.1/wxbanker/csvimportframe.py0000644000175000017500000003365212243601243020546 0ustar mrooneymrooney# https://launchpad.net/wxbanker # csvimportframe.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx from wx.lib.pubsub import Publisher from wxbanker.csvimporter import CsvImporter, CsvImporterProfileManager, json from wxbanker.transactionolv import TransactionOLV from wxbanker.brandedframe import BrandedFrame class CsvImportFrame(BrandedFrame): """ Window for importing data from a CSV file """ def __init__(self): BrandedFrame.__init__(self, None, title=_("CSV import")) # Necessary to be able to preview imports since OLV looks for this attribute on its GrandParent. self.searchActive = False self.dateFormats = ['%Y/%m/%d', '%d/%m/%Y', '%m/%d/%Y'] self.encodings = ['cp1250', 'iso8859-1', 'iso8859-2', 'utf-8'] self.profileManager = CsvImporterProfileManager() self.transactionContainer = None topPanel = wx.Panel(self) topHorizontalSizer = wx.BoxSizer(wx.VERTICAL) topSizer = wx.BoxSizer(wx.VERTICAL) topSizer.AddSpacer(6) horizontalSizer = wx.BoxSizer(wx.HORIZONTAL) topSizer.Add(horizontalSizer, flag=wx.EXPAND) self.initSettingsControls(topPanel, horizontalSizer) self.initSettingsProfilesControl(topPanel, horizontalSizer) self.initFileAndActionControls(topPanel, topSizer) self.initTransactionCtrl(topPanel, topSizer) self.initTargetAccountControl(topPanel, topSizer) # set default values self.initCtrlValuesFromSettings(self.getDefaultSettings()) # layout sizers topPanel.SetSizer(topSizer) topPanel.SetAutoLayout(True) topSizer.Fit(self) self.Show(True) def initTargetAccountControl(self, topPanel, topSizer): targetText = wx.StaticText(topPanel, label=_("Target account")) targetSizer = wx.BoxSizer() try: bankModel = wx.GetApp().Controller.Model self.accountsDict = dict([(acc.GetName(), acc) for acc in bankModel.Accounts]) accounts = sorted(self.accountsDict.keys()) except: accounts = [] self.targetAccountCtrl = wx.Choice(topPanel, choices=accounts) self.cancelButton = wx.Button(topPanel, label=_("Cancel")) self.cancelButton.SetToolTipString(_("Cancel")) self.cancelButton.Bind(wx.EVT_BUTTON, lambda e: self.Destroy()) self.importButton = wx.Button(topPanel, label=_("Import")) self.importButton.SetToolTipString(_("Import")) self.importButton.Bind(wx.EVT_BUTTON, self.onClickImportButton) targetSizer.AddSpacer(6) targetSizer.Add(targetText, flag=wx.ALIGN_CENTER_VERTICAL) targetSizer.AddSpacer(6) targetSizer.Add(self.targetAccountCtrl) targetSizer.AddStretchSpacer(1) targetSizer.Add(self.cancelButton) targetSizer.AddSpacer(6) targetSizer.Add(self.importButton) targetSizer.AddSpacer(6) topSizer.AddSpacer(6) topSizer.Add(targetSizer, flag=wx.ALL|wx.EXPAND) def initSettingsControls(self, topPanel, parentSizer): # csv columns to wxBanker data mapping topSizer = wx.BoxSizer(wx.VERTICAL) parentSizer.Add(topSizer, flag=wx.EXPAND, proportion=1) staticBox = wx.StaticBox(topPanel, label=_("CSV columns mapping")) staticBoxSizer = wx.StaticBoxSizer(staticBox, wx.VERTICAL) topSizer.Add(staticBoxSizer, flag=wx.ALL|wx.EXPAND, border=1) sizer = wx.FlexGridSizer(rows=3, cols=4, hgap=15, vgap=0) sizer.SetFlexibleDirection(wx.HORIZONTAL) staticBoxSizer.Add(sizer, flag=wx.ALL|wx.EXPAND, border=5) self.dateColumnCtrl = wx.SpinCtrl(topPanel, size=(40,-1)) sizer.Add(wx.StaticText(topPanel, label=_('Date')), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.dateColumnCtrl, flag=wx.ALIGN_CENTER_VERTICAL) self.dateFormatCtrl = wx.ComboBox(topPanel, choices=self.dateFormats, size=(110,-1)) sizer.Add(wx.StaticText(topPanel, label=_('Date format')), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.dateFormatCtrl, flag=wx.ALIGN_CENTER_VERTICAL) self.amountColumnCtrl = wx.SpinCtrl(topPanel, size=(40,-1)) self.decimalSeparatorCtrl = wx.TextCtrl(topPanel, size=(20,-1)) sizer.Add(wx.StaticText(topPanel, label=_('Amount')), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.amountColumnCtrl, flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(wx.StaticText(topPanel, label=_('Decimal separator')), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.decimalSeparatorCtrl, flag=wx.ALIGN_CENTER_VERTICAL) self.descriptionColumnCtrl = wx.TextCtrl(topPanel) sizer.Add(wx.StaticText(topPanel, label=_('Description')), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.descriptionColumnCtrl, flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add((0,0)) sizer.Add((0,0)) # csv file settings - delimiter, encoding, first line has headers - skipped staticBox = wx.StaticBox(topPanel, label=_("CSV file settings")) staticBoxSizer = wx.StaticBoxSizer(staticBox, wx.VERTICAL) topSizer.AddSpacer(6) topSizer.Add(staticBoxSizer, flag=wx.ALL|wx.EXPAND, border=1) sizer = wx.FlexGridSizer(rows=3, cols=2, hgap=15, vgap=0) sizer.SetFlexibleDirection(wx.HORIZONTAL) staticBoxSizer.Add(sizer); self.linesToSkipCtrl = wx.SpinCtrl(topPanel, size=(40,-1)) sizer.Add(wx.StaticText(topPanel, label=_('Lines to skip')), flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(self.linesToSkipCtrl, flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(wx.StaticText(topPanel, label=_('Encoding')), flag=wx.ALIGN_CENTER_VERTICAL) self.fileEncodingCtrl = wx.ComboBox(topPanel, choices=self.encodings, size=(110,-1)) sizer.Add(self.fileEncodingCtrl, flag=wx.ALIGN_CENTER_VERTICAL) sizer.Add(wx.StaticText(topPanel, label=_('Column delimiter')), flag=wx.ALIGN_CENTER_VERTICAL) self.delimiterCtrl = wx.TextCtrl(topPanel, size=(30,-1)) self.delimiterCtrl.SetMaxLength(1) sizer.Add(self.delimiterCtrl, flag=wx.ALIGN_CENTER_VERTICAL) def initFileAndActionControls(self, topPanel, topSizer): # file picker control and import button sizer = wx.BoxSizer(wx.HORIZONTAL) topSizer.AddSpacer(6) topSizer.Add(sizer, flag=wx.EXPAND|wx.ALL, border=5) sizer.Add(wx.StaticText(topPanel, label=_('File to import')), flag=wx.ALIGN_CENTER_VERTICAL) self.filePickerCtrl = wx.FilePickerCtrl(topPanel) self.filePickerCtrl.Bind(wx.EVT_FILEPICKER_CHANGED, self.onFileChange) sizer.Add(self.filePickerCtrl, flag=wx.EXPAND|wx.LEFT|wx.RIGHT, proportion=2, border=10) def initTransactionCtrl(self, topPanel, topSizer): sizer = wx.BoxSizer(wx.HORIZONTAL) topSizer.Add(sizer, flag=wx.EXPAND|wx.ALL, proportion=1, border=5) self.transactionCtrl = DetachedTransactionOLV(topPanel, None) self.transactionCtrl.SetMinSize((-1, 200)) sizer.Add(self.transactionCtrl, flag=wx.ALL|wx.EXPAND, proportion=1) def initSettingsProfilesControl(self, topPanel, topSizer): staticBox = wx.StaticBox(topPanel, label=_("CSV profiles")) sizer = wx.StaticBoxSizer(staticBox, wx.VERTICAL) topSizer.Add(sizer, flag=wx.ALL|wx.EXPAND) if not json: info = wx.StaticText(topPanel, label=_('Python simplejson library is needed for csv profile loading/saving.'), style=wx.ALIGN_CENTER) info.Wrap(80) sizer.Add(info, flag=wx.ALIGN_CENTER_VERTICAL) return self.profileCtrl = wx.ComboBox(topPanel, choices=self.profileManager.profiles.keys(), size=(110,-1)) self.profileCtrl.Bind(wx.EVT_COMBOBOX, self.onProfileCtrlChange) sizer.Add(self.profileCtrl, flag=wx.ALIGN_CENTER) sizer.AddSpacer(6) self.saveProfileButton = wx.Button(topPanel, label=_("Save")) self.saveProfileButton.Bind(wx.EVT_BUTTON, self.onClickSaveProfileButton) self.saveProfileButton.Disable() sizer.Add(self.saveProfileButton, flag=wx.ALIGN_CENTER) sizer.AddSpacer(6) self.deleteProfileButton = wx.Button(topPanel, label=_("Remove")) self.deleteProfileButton.Bind(wx.EVT_BUTTON, self.onClickDeleteProfileButton) self.deleteProfileButton.Disable() sizer.Add(self.deleteProfileButton, flag=wx.ALIGN_CENTER) def initCtrlValuesFromSettings(self, settings): self.amountColumnCtrl.Value = settings['amountColumn'] self.decimalSeparatorCtrl.Value = settings['decimalSeparator'] self.dateColumnCtrl.Value = settings['dateColumn'] self.dateFormatCtrl.Value = settings['dateFormat'] self.descriptionColumnCtrl.Value = settings['descriptionColumns'] self.delimiterCtrl.Value = settings['delimiter'] self.linesToSkipCtrl.Value = settings['linesToSkip'] self.fileEncodingCtrl.Value = settings['encoding'] def getDefaultSettings(self): settings = {} settings['amountColumn'] = 2 settings['decimalSeparator'] = '.' settings['dateColumn'] = 1 settings['dateFormat'] = self.dateFormats[0] settings['descriptionColumns'] = "3, 4 (5)" settings['delimiter'] = ';' settings['linesToSkip'] = 0 settings['encoding'] = 'utf-8' return settings def getSettingsFromControls(self): settings = {} settings['amountColumn'] = self.amountColumnCtrl.Value settings['decimalSeparator'] = self.decimalSeparatorCtrl.Value settings['dateColumn'] = self.dateColumnCtrl.Value settings['dateFormat'] = self.dateFormatCtrl.Value settings['descriptionColumns'] = self.descriptionColumnCtrl.Value # delimiter must be 1-character string settings['delimiter'] = str(self.delimiterCtrl.Value) settings['linesToSkip'] = self.linesToSkipCtrl.Value settings['encoding'] = self.fileEncodingCtrl.Value return settings def runPreview(self): importer = CsvImporter() settings = self.getSettingsFromControls() file = self.filePickerCtrl.Path try: self.transactionContainer = importer.getTransactionsFromFile(file, settings) self.transactionCtrl.setAccount(self.transactionContainer) except UnicodeDecodeError,e: self.showErrorDialog(_("The file encoding does not seem to be '%s'.") % settings['encoding'], e) except Exception, e: self.showErrorDialog(exc=e) def showErrorDialog(self, errDetail = '', exc = None): errString = _('An error ocurred during the csv file import.') errCaption = _('CSV import error') dlg = wx.MessageDialog(self, errString + '\n' + errDetail + '\n\n[%s]' % str(exc), errCaption, wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() def importTransactions(self): account = self.accountsDict[self.targetAccountCtrl.StringSelection] account.AddTransactions(self.transactionContainer.Transactions) # Trigger an account change so the user is now looking at the imported transactions. Publisher.sendMessage("user.account changed", account) def onFileChange(self, event): if self.filePickerCtrl.Path != '': self.runPreview() def onProfileCtrlChange(self, event): if self.profileCtrl.Value != '': self.saveProfileButton.Enable() enabled = self.profileManager.getProfile(self.profileCtrl.Value) != None self.deleteProfileButton.Enable(enabled) # Load it. key = self.profileCtrl.Value self.initCtrlValuesFromSettings(self.profileManager.getProfile(key)) else : self.saveProfileButton.Disable() self.deleteProfileButton.Disable() def onClickImportButton(self, event): self.importTransactions() self.Destroy() def initProfileCtrl(self, value=None): self.profileCtrl.Items = self.profileManager.profiles.keys() if self.profileCtrl.Items: self.profileCtrl.Value = value or self.profileCtrl.Items[0] self.onProfileCtrlChange(None) def onClickSaveProfileButton(self, event): key = self.profileCtrl.Value if self.profileManager.profiles.has_key(key): d = wx.MessageDialog(self, message=_("Profile with the name '%s' exists already. Overwrite it ?")%key, caption=_('Overwrite profile ?'), style=wx.YES_NO) if d.ShowModal() != wx.ID_YES: return self.profileManager.saveProfile(key, self.getSettingsFromControls()) self.initProfileCtrl(value=key) def onClickDeleteProfileButton(self, event): key = self.profileCtrl.Value self.profileManager.deleteProfile(key) self.initProfileCtrl() class DetachedTransactionOLV(TransactionOLV): def __init__(self, *args, **kwargs): TransactionOLV.__init__(self, *args, **kwargs) self.SetEmptyListMsg(_('Select file and click "Preview"')) def renderFloat(self, floatVal): return str(floatVal) def showContextMenu(self, transactions, col): TransactionOLV.showContextMenu(self, transactions, col, removeOnly=True) if __name__ == '__main__': app = wx.PySimpleApp() frame = CsvImportFrame() app.MainLoop() wxbanker-0.9.1/wxbanker/currconvert.py0000644000175000017500000000456212243601243020057 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # currconvert.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker import localization, fileservice from xml.etree import ElementTree class ConversionException(Exception): pass class CurrencyConverter(object): def __init__(self): self.Exchanges = {"EUR": 1.0} self.OriginalPath = fileservice.getSharedFilePath("exchanges.xml") self._loadExchanges() def _loadExchanges(self): tree = ElementTree.fromstring(open(self.OriginalPath).read()) exchanges = tree.getchildren()[-1].getchildren()[0].getchildren() for e in exchanges: self.Exchanges[e.get("currency")] = float(e.get("rate")) def Convert(self, amount, original, destination): """ Convert an amount from one currency to another. In order to do this we first convert the original to euros, and then convert that to the destination currency, since all rates are based on euros. """ if original == destination: return amount #fromStr = original.CurrencyNick #toStr = destination.CurrencyNick fromStr, toStr = original, destination fromRate = self.Exchanges.get(fromStr) toRate = self.Exchanges.get(toStr) # Make sure we have an exchange rate for each currency. for rate in (fromRate, toRate): if rate is None: raise ConversionException(_('No exchange rate for currency "%s"') % rate) middle = amount * (1.0 / fromRate) end = middle * toRate return end if __name__ == "__main__": import doctest doctest.testmod() wxbanker-0.9.1/wxbanker/currencies.py0000644000175000017500000005366112243601243017651 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # currencies.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . # # First: apt-cache search language-pack | grep -v "(gnome|kde|base)" | grep -i LANGUAGE_SPOKEN_IN_COUNTRY # Usage: LC_ALL=vi_VN.utf8 python -m wxbanker/currencies Vietnamese import locale from wxbanker import localization def createFromLocale(currencyName): """Create a currency class from the current locale.""" import os new = {} local = LocalizedCurrency() base = BaseCurrency() currency_class_name = "%sCurrency" % currencyName currency_class = "class %s(BaseCurrency):\n def __init__(self):\n BaseCurrency.__init__(self)" % currency_class_name for key, val in local.LOCALECONV.items(): if not base.LOCALECONV.has_key(key) or base.LOCALECONV[key] != val: new[key] = val if isinstance(val, basestring) and not isinstance(val, unicode): val = "u'%s'" % val.decode("utf-8") currency_class += "\n" + (" "*8) + "self.LOCALECONV['%s'] = %s" % (key, val) print currency_class base.LOCALECONV = local.LOCALECONV testAmount = base.float2str(1234.5) currency_assertion = "self.assertEqual(currencies.%sCurrency().float2str(testAmount), u'%s')" % (currencyName, testAmount) print currency_assertion print "\nThanks for the request, I've added %s! How does it look? Examples: \"%s\" and \"%s\"" % (base.LOCALECONV['int_curr_symbol'].strip(), base.float2str(1234.56), base.float2str(-5)) currencies = open(__file__).read().decode("utf8") currencytests_path = os.path.join(os.path.dirname(__file__), "tests", "currencytests.py") currencytests = open(currencytests_path).read().decode("utf8") marker = u"# " + u"__CURRENCY_CLASS__" currencies = currencies.replace(marker, currency_class+u"\n\n"+marker) marker = u"# " + u"__CURRENCY_CLASS_NAME__" currencies = currencies.replace(marker, currency_class_name+u",\n "+marker) marker = u"# " + u"__CURRENCY_ASSERTION__" currencytests = currencytests.replace(marker, currency_assertion+u"\n "+marker) open(__file__, "w").write(currencies.encode("utf8")) open(currencytests_path, "w").write(currencytests.encode("utf8")) class BaseCurrency(object): """ This object represents the base of a currency, seeded with Western values. Subclasses need only change dictionary keys which are different. """ def __init__(self): self.LOCALECONV = { 'decimal_point': '.', 'frac_digits': 2, 'grouping': [3, 3, 0], 'int_frac_digits': 2, 'mon_decimal_point': '.', 'mon_grouping': [3, 3, 0], 'mon_thousands_sep': ',', 'n_cs_precedes': 1, 'n_sep_by_space': 0, 'n_sign_posn': 1, 'negative_sign': '-', 'p_cs_precedes': 1, 'p_sep_by_space': 0, 'p_sign_posn': 1, 'positive_sign': '', 'thousands_sep': ',' } def GetCurrencyNick(self): return self.LOCALECONV["int_curr_symbol"].strip() def float2str(self, val, just=0, withNick=False): """Formats float values as currency strings according to the currency settings in self.LOCALECONV""" # Don't show negative zeroes! if abs(val) < .001: val = 0 # Temporarily override the localeconv dictionary so the locale module acts as the desired locale. # Wrap in a try/finally to be extra safe as it needs to be restored no matter what. ##locale._override_localeconv = self.LOCALECONV # Use this when python2.5 support is dropped. localeConvBackup = locale.localeconv locale.localeconv = lambda: self.LOCALECONV try: s = locale.currency(val, grouping=True) finally: ##locale._override_localeconv = None locale.localeconv = localeConvBackup if not isinstance(s, unicode): s = unicode(s, locale.getlocale()[1]) if withNick: s = self.GetCurrencyNick() + " " + s # Justify as appropriate. s = s.rjust(just) return s def __eq__(self, other): return self.LOCALECONV == other.LOCALECONV CurrencyNick = property(GetCurrencyNick) class UnitedStatesCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['currency_symbol'] = u'$' self.LOCALECONV['int_curr_symbol'] = u'USD ' class EuroCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = ',' self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = ' ' self.LOCALECONV['decimal_point'] = ',' self.LOCALECONV['int_curr_symbol'] = 'EUR ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = ' ' self.LOCALECONV['currency_symbol'] = u'€' #'\xe2\x82\xac' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['p_cs_precedes'] = 0 class GreatBritainCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['int_curr_symbol'] = 'GBP ' self.LOCALECONV['currency_symbol'] = u'£' #'\xc2\xa3' class JapaneseCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['int_frac_digits'] = 0 self.LOCALECONV['frac_digits'] = 0 self.LOCALECONV['n_sign_posn'] = 4 self.LOCALECONV['int_curr_symbol'] = 'JPY ' self.LOCALECONV['p_sign_posn'] = 4 self.LOCALECONV['currency_symbol'] = u'¥' #'\xef\xbf\xa5' self.LOCALECONV['mon_grouping'] = [3, 0] self.LOCALECONV['grouping'] = [3, 0] class RussianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u' ' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'RUB ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = u' ' self.LOCALECONV['currency_symbol'] = u'руб' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['p_cs_precedes'] = 0 class UkranianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['p_sep_by_space'] = 2 self.LOCALECONV['thousands_sep'] = ' '#u'\xa0' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'UAH ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = ' ' #u'\xa0' self.LOCALECONV['currency_symbol'] = u'гр' #u'\u0433\u0440' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['p_cs_precedes'] = 0 class MexicanCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['currency_symbol'] = u'$' self.LOCALECONV['int_curr_symbol'] = u'MXN ' class SwedishCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u' ' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'SEK ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = u' ' self.LOCALECONV['currency_symbol'] = u'kr' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['p_cs_precedes'] = 0 class SaudiCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u'' self.LOCALECONV['int_curr_symbol'] = u'SAR ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = u'' self.LOCALECONV['currency_symbol'] = u'ريال' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['mon_grouping'] = [] self.LOCALECONV['p_cs_precedes'] = 0 self.LOCALECONV['grouping'] = [] class NorwegianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['thousands_sep'] = u' ' self.LOCALECONV['n_sign_posn'] = 4 self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'NOK ' self.LOCALECONV['p_sign_posn'] = 4 self.LOCALECONV['mon_thousands_sep'] = u' ' self.LOCALECONV['currency_symbol'] = u'kr' class ThaiCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['p_sep_by_space'] = 2 self.LOCALECONV['n_sign_posn'] = 4 self.LOCALECONV['int_curr_symbol'] = u'THB ' self.LOCALECONV['p_sign_posn'] = 4 self.LOCALECONV['currency_symbol'] = u'฿' self.LOCALECONV['n_sep_by_space'] = 2 self.LOCALECONV['mon_grouping'] = [3, 0] self.LOCALECONV['grouping'] = [3, 0] class VietnameseCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['int_frac_digits'] = 0 self.LOCALECONV['frac_digits'] = 0 self.LOCALECONV['thousands_sep'] = u'.' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'VND ' self.LOCALECONV['mon_thousands_sep'] = u'.' self.LOCALECONV['currency_symbol'] = u'₫' self.LOCALECONV['p_cs_precedes'] = 0 class IndianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['int_curr_symbol'] = u'INR ' self.LOCALECONV['currency_symbol'] = u'₨' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['mon_grouping'] = [3, 2, 0] self.LOCALECONV['grouping'] = [3, 2, 0] class RomanianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u'.' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'RON ' self.LOCALECONV['mon_thousands_sep'] = u'.' self.LOCALECONV['currency_symbol'] = u'Lei' self.LOCALECONV['n_sep_by_space'] = 1 class ArabEmiratesCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['int_frac_digits'] = 3 self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['frac_digits'] = 3 self.LOCALECONV['n_sign_posn'] = 2 self.LOCALECONV['int_curr_symbol'] = u'AED ' self.LOCALECONV['currency_symbol'] = u'د.إ.' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['mon_grouping'] = [3, 0] self.LOCALECONV['grouping'] = [3, 0] class LithuanianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u'.' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'LTL ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = u'.' self.LOCALECONV['currency_symbol'] = u'Lt' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['p_cs_precedes'] = 0 class SerbianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u'' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'RSD ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = u'.' self.LOCALECONV['currency_symbol'] = u'дин' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['p_cs_precedes'] = 0 self.LOCALECONV['grouping'] = [] class HungarianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u'.' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'HUF ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = u'.' self.LOCALECONV['currency_symbol'] = u'Ft' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['p_cs_precedes'] = 0 class IsraeliCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['n_sign_posn'] = 2 self.LOCALECONV['int_curr_symbol'] = u'ILS ' self.LOCALECONV['p_sign_posn'] = 2 self.LOCALECONV['currency_symbol'] = u'שח' self.LOCALECONV['n_sep_by_space'] = 1 class EgyptianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['int_frac_digits'] = 3 self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['frac_digits'] = 3 self.LOCALECONV['n_sign_posn'] = 2 self.LOCALECONV['int_curr_symbol'] = u'EGP ' self.LOCALECONV['currency_symbol'] = u'ج.م.' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['mon_grouping'] = [3, 0] self.LOCALECONV['grouping'] = [3, 0] class PolishCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u'' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'PLN ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = u'.' self.LOCALECONV['currency_symbol'] = u'zł' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['p_cs_precedes'] = 0 self.LOCALECONV['grouping'] = [] class CzechCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u' ' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'CZK ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = u' ' self.LOCALECONV['currency_symbol'] = u'Kč' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['p_cs_precedes'] = 0 class ArgentineCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u'.' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'ARS ' self.LOCALECONV['mon_thousands_sep'] = u'.' self.LOCALECONV['currency_symbol'] = u'$' self.LOCALECONV['n_sep_by_space'] = 1 class TaiwanCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['int_curr_symbol'] = u'TWD ' self.LOCALECONV['currency_symbol'] = u'NT$' self.LOCALECONV['mon_grouping'] = [3, 0] self.LOCALECONV['grouping'] = [3, 0] class GuatemalaCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u'.' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'GTQ ' self.LOCALECONV['currency_symbol'] = u'Q' self.LOCALECONV['n_sep_by_space'] = 1 class ChineseCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['n_sign_posn'] = 4 self.LOCALECONV['int_curr_symbol'] = u'CNY ' self.LOCALECONV['p_sign_posn'] = 4 self.LOCALECONV['currency_symbol'] = u'¥' self.LOCALECONV['mon_grouping'] = [3, 0] self.LOCALECONV['grouping'] = [3, 0] class MoroccanCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['int_frac_digits'] = 3 self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['frac_digits'] = 3 self.LOCALECONV['n_sign_posn'] = 2 self.LOCALECONV['int_curr_symbol'] = u'MAD ' self.LOCALECONV['currency_symbol'] = u'د.م.' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['mon_grouping'] = [3, 0] self.LOCALECONV['grouping'] = [3, 0] class MacedonianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u' ' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'MKD ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = u' ' self.LOCALECONV['currency_symbol'] = u'ден' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['p_cs_precedes'] = 0 class IndonesianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['thousands_sep'] = u'.' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'IDR ' self.LOCALECONV['mon_thousands_sep'] = u'.' self.LOCALECONV['currency_symbol'] = u'Rp' class CanadianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['int_curr_symbol'] = u'CAD ' self.LOCALECONV['currency_symbol'] = u'$' class KazakhstanCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['thousands_sep'] = u'.' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'KZT ' self.LOCALECONV['n_cs_precedes'] = 0 self.LOCALECONV['mon_thousands_sep'] = u' ' self.LOCALECONV['currency_symbol'] = u'тг' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['p_cs_precedes'] = 0 class TunisianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['int_frac_digits'] = 3 self.LOCALECONV['p_sep_by_space'] = 1 self.LOCALECONV['frac_digits'] = 3 self.LOCALECONV['n_sign_posn'] = 2 self.LOCALECONV['int_curr_symbol'] = u'TND ' self.LOCALECONV['currency_symbol'] = u'د.ت.' self.LOCALECONV['n_sep_by_space'] = 1 self.LOCALECONV['mon_grouping'] = [3, 0] self.LOCALECONV['grouping'] = [3, 0] class MalaysianCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['n_sign_posn'] = 0 self.LOCALECONV['int_curr_symbol'] = u'MYR ' self.LOCALECONV['currency_symbol'] = u'RM' self.LOCALECONV['mon_grouping'] = [3, 0] self.LOCALECONV['grouping'] = [3, 0] class SouthAfricanCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV['mon_decimal_point'] = u',' self.LOCALECONV['thousands_sep'] = u' ' self.LOCALECONV['decimal_point'] = u',' self.LOCALECONV['int_curr_symbol'] = u'ZAR ' self.LOCALECONV['mon_thousands_sep'] = u' ' self.LOCALECONV['currency_symbol'] = u'R' # __CURRENCY_CLASS__ class LocalizedCurrency(BaseCurrency): def __init__(self): BaseCurrency.__init__(self) self.LOCALECONV = locale.localeconv() def GetCurrencyInt(currency): for i, curr in enumerate(CurrencyList): if isinstance(currency, curr): return i return -1 CurrencyList = [ LocalizedCurrency, UnitedStatesCurrency, EuroCurrency, GreatBritainCurrency, JapaneseCurrency, RussianCurrency, UkranianCurrency, MexicanCurrency, SwedishCurrency, SaudiCurrency, NorwegianCurrency, ThaiCurrency, VietnameseCurrency, IndianCurrency, RomanianCurrency, ArabEmiratesCurrency, LithuanianCurrency, SerbianCurrency, HungarianCurrency, IsraeliCurrency, EgyptianCurrency, PolishCurrency, CzechCurrency, ArgentineCurrency, TaiwanCurrency, GuatemalaCurrency, ChineseCurrency, MoroccanCurrency, MacedonianCurrency, IndonesianCurrency, CanadianCurrency, KazakhstanCurrency, TunisianCurrency, MalaysianCurrency, SouthAfricanCurrency, # __CURRENCY_CLASS_NAME__ ] CurrencyStrings = ["%s: %s" % (c().LOCALECONV['int_curr_symbol'].strip(), c().float2str(1)) for c in CurrencyList] CurrencyStrings[0] += " (%s)" % _("detected") if __name__ == "__main__": import sys createFromLocale(sys.argv[1]) wxbanker-0.9.1/wxbanker/data/0000755000175000017500000000000012243601243016033 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/data/exchanges.xml0000644000175000017500000000325612243601243020530 0ustar mrooneymrooney Reference rates European Central Bank wxbanker-0.9.1/wxbanker/data/fixtures/0000755000175000017500000000000012243601243017704 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/data/fixtures/bank-0.4-broken.db0000644000175000017500000001200012243601243022674 0ustar mrooneymrooneySQLite format 3@   iJ%%WtabletransactionstransactionsCREATE TABLE transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10), linkId INTEGER, recurringParent INTEGER)=99tablerecurring_transactionsrecurring_transactionsCREATE TABLE recurring_transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10), repeatType INTEGER, repeatEvery INTEGER, repeatsOn VARCHAR(255), endDate CHAR(10), sourceId INTEGER, lastTransacted CHAR(10))f/tablemetametaCREATE TABLE meta (id INTEGER PRIMARY KEY, name VARCHAR(255), value VARCHAR(255)){tableaccountsaccountsCREATE TABLE accounts (id INTEGER PRIMARY KEY, name VARCHAR(255), currency INTEGER, balance FLOAT not null DEFAULT 0.0)  Another#My Checking !^Hello2009/12/13 !2009/12/13 !2009/12/13  VERSION6 wxbanker-0.9.1/wxbanker/data/fixtures/bank-0.4.db0000644000175000017500000001000012243601243021414 0ustar mrooneymrooneySQLite format 3@  f/tablemetametaCREATE TABLE meta (id INTEGER PRIMARY KEY, name VARCHAR(255), value VARCHAR(255))!%%tabletransactionstransactionsCREATE TABLE transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10))p3tableaccountsaccountsCREATE TABLE accounts (id INTEGER PRIMARY KEY, name VARCHAR(255), currency INTEGER)  Another#My Checking !^Hello2009/12/13 !2009/12/13 !2009/12/13  VERSION2wxbanker-0.9.1/wxbanker/data/fixtures/bank-0.5.db0000644000175000017500000001000012243601243021415 0ustar mrooneymrooneySQLite format 3@  ssf/tablemetametaCREATE TABLE meta (id INTEGER PRIMARY KEY, name VARCHAR(255), value VARCHAR(255))!%%tabletransactionstransactionsCREATE TABLE transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10))QtableaccountsaccountsCREATE TABLE accounts (id INTEGER PRIMARY KEY, name VARCHAR(255), currency INTEGER, balance FLOAT) Another^#My Checking  !^2009-12-13 !2009/12/13 !2009-12-13  VERSION3wxbanker-0.9.1/wxbanker/data/fixtures/bank-0.6-broken.db0000644000175000017500000001200012243601243022676 0ustar mrooneymrooneySQLite format 3@  iJ%%WtabletransactionstransactionsCREATE TABLE transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10), linkId INTEGER, recurringParent INTEGER)=99tablerecurring_transactionsrecurring_transactionsCREATE TABLE recurring_transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10), repeatType INTEGER, repeatEvery INTEGER, repeatsOn VARCHAR(255), endDate CHAR(10), sourceId INTEGER, lastTransacted CHAR(10))f/tablemetametaCREATE TABLE meta (id INTEGER PRIMARY KEY, name VARCHAR(255), value VARCHAR(255)){tableaccountsaccountsCREATE TABLE accounts (id INTEGER PRIMARY KEY, name VARCHAR(255), currency INTEGER, balance FLOAT not null DEFAULT 0.0) 'No It DoMyAccount񙙙 D !2010-01-30- !20!񙙙a2010-01-30 'LastAccountId1 VERSION9 wxbanker-0.9.1/wxbanker/data/fixtures/bank-0.7-605591-orphaned.db0000644000175000017500000005600012243601243023776 0ustar mrooneymrooneySQLite format 3@   xx qtableaccountsaccountsCREATE TABLE accounts (id INTEGER PRIMARY KEY, name VARCHAR(255), currency INTEGER, balance FLOAT, mintId INTEGER)J%%WtabletransactionstransactionsCREATE TABLE transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10), linkId INTEGER, recurringParent INTEGER)=99tablerecurring_transactionsrecurring_transactionsCREATE TABLE recurring_transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10), repeatType INTEGER, repeatEvery INTEGER, repeatsOn VARCHAR(255), endDate CHAR(10), sourceId INTEGER, lastTransacted CHAR(10))f/tablemetametaCREATE TABLE meta (id INTEGER PRIMARY KEY, name VARCHAR(255), value VARCHAR(255)) *#BofA C~CashO<pX7Checking@ bb 1o"Gna? )!Trinity - bars2009-11-14.7!zGLittle Johns - dining2009-11-140;!As33333Amazon.com - car repair2009-11-140;!;33333Amazon.com - car repair2009-11-14'!Zocalo - bars2009-11-13,3!!ffffffFood Lion - alcohol2009-11-13(+!QGzOpening balan(+!@=p Opening Balance2009-11-01; M!@sȣ =qTransfer from Checking (Payment)2009/11/309!Travel2009-12-01$B!JfffffGroceries2009-12-14$x!MzGGroceries2010-01-17;M!@`=p Transfer from Checking (Payment)2010-02-09$1!C޸QGroceries2010-02-25;@M!@fQTransfer from Checking (Payment)2010-03-09$i!N=p Groceries2010-03-29$!P\(Groceries2010-04-21":!P\(Payment2010-05-08$N!cD(\Groceries2010-05-17c!dSalary2010-05-28$o!fd(\Payment2010-06-18p$p!@fd(\Payment2010-06-18o'  VERSION10#MintEnabled0'LastAccountId2  wxbanker-0.9.1/wxbanker/data/fixtures/bank-0.7-605591.db0000644000175000017500000005600012243601243022200 0ustar mrooneymrooneySQLite format 3@    J%%WtabletransactionstransactionsCREATE TABLE transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10), linkId INTEGER, recurringParent INTEGER)=99tablerecurring_transactionsrecurring_transactionsCREATE TABLE recurring_transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10), repeatType INTEGER, repeatEvery INTEGER, repeatsOn VARCHAR(255), endDate CHAR(10), sourceId INTEGER, lastTransacted CHAR(10))f/tablemetametaCREATE TABLE meta (id INTEGER PRIMARY KEY, name VARCHAR(255), value VARCHAR(255))QtableaccountsaccountsCREATE TABLE accounts (id INTEGER PRIMARY KEY, name VARCHAR(255), currency INTEGER, balance FLOAT) *#BofA C~CashO<pX7Credit\W =pChecking@a? )!Trinity - bars2009-11-14.7!zGLittle Johns - dining2009-11-140;!As33333Amazon.com - car repair2009-11-140;!;33333Amazon.com - car repair2009-11-14'!Zocalo - bars2009-11-13,3!!ffffffFood Lion - alcohol2009-11-13(+!QGzOpening balance2009-11-13'7!Food Lion - Groceries2009/11/15$1!McGrady's - Dining2009/11/153O!Chris Lewis - UVa football ticket2009-11-13# !!@I =Pragmatics2009-11-13 !(Cash2009-11-12$ 1!McDonald's - Lunch2009-11-09 !Cab2009-11-07G i!@sȣ =qTransfer from ING Checking (Payment, Discover)2009-11-30A]!sȣ =qTransfer to Discover (Payment, Discover)2009-11-30(+!sȣ =qOpening balance2009-11-06%!From Kristen2009-11-07!Cash2009/11/03&'!{ \)Payment, HSBC2009-11-03(+!@c =pOpening Bala[UOIC=71*A 'LastAccountId2 VERSION9 22\Bh0W~(+!@=p Opening Balance2009-11-01(+!sȣ =qOpening balance2009-11-06; M!@sȣ =qTransfer from Checking (Payment)2009/11/30$-!F =pGroceries2009-11-309!Travel2009-12-01;;M!@QRTransfer from Checking (Payment)2009/12/28$B!JfffffGroceries2009-12-14;lM!@JfffffTransfer from Checking (Payment)2010-01-11$x!MzGGroceries2010-01-17$!Rp =Groceries2010-02-01;M!@`=p Transfer from Checking (Payment)2010-02-09$#!]GzGroceries2010-02-13$1!C޸QGroceries2010-02-256!Travel2010-02-24;@M!@fQTransfer from Checking (Payment)2010-03-09$A!=J=p Groceries2010-03-09  99`:Wt$i!N=p Groceries2010-03-29;uM!@VǮzHTransfer from Checking (Payment)2010-04-08$!P\(Groceries2010-04-21$:!P\(Payment2010-05-08;$;!@P\(Payment2010-05-08:$N!cD(\Groceries2010-05-17c!dSalary2010-05-28n!Travel2010-05-26$o!fd(\Payment2010-06-18p$p!@fd(\Payment2010-06-18o6'00*$!\W =pGroceries2010-07-12  wxbanker-0.9.1/wxbanker/data/fixtures/bank-example.db0000644000175000017500000027600012243601243022564 0ustar mrooneymrooneySQLite format 3@ [   /Chase Credit CardmQ#5Wells Fargo Checking@E\*)PayPal Balance@+RG[_{uoic]WQKE?93-'! ysmga[^0\[ZjYSX<V(UT{SeQOP9O"N MvK`JII3HFErD[CDB.@?>l=U;?:)98|7f5P4:3#2 0w/a.K-5+*)r(\'F%0$#"l V?(}gQ;$ wbL6 s \ E .  VERSION11#MintEnabled0 'LastAccountId3 \]}rg\WRyLGAP<61',&a!8p mmI$tableaccountsaccountsCREATE TABLE accounts (id INTEGER PRIMARY KEY, name VARCHAR(255), currency INTEGER, balance FLOAT not null DEFAULT 0.0, mintId INTEGER)J%%WtabletransactionstransactionsCREATE TABLE transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10), linkId INTEGER, recurringParent INTEGER)f/tablemetametaCREATE TABLE meta (id INTEGER PRIMARY KEY, name VARCHAR(255), value VARCHAR(255))=99tablerecurring_transactionsrecurring_transactionsCREATE TABLE recurring_transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10), repeatType INTEGER, repeatEvery INTEGER, repeatsOn VARCHAR(255), endDate CHAR(10), sourceId INTEGER, lastTransacted CHAR(10))uA%indextransactions_accountId_idxtransactionsCREATE INDEX transactions_accountId_idx ON transactions(accountId) 9a<j@zR(\9!!>LPayPal2010-08-02'%!@Ch\)Tom Harrison2010-08-02#!@X`Dean Mao2010-08-03))!@X`Waleed Abdulla2010-08-03&#!@X`David Borja2010-08-04))!@X`Allison Miller2010-08-04('!@X`Robert Gordon2010-08-04&#!@X`Andrew Chen2010-08-04%!!@X`Bill Lazar2010-08-05%!!@X`Reto Stamm2010-08-05$!@X`Matt Heck2010-08-05( '!@X`Timothy Sears2010-08-05& #!@X`Otavio Good2010-08-05( '!@X`Sophie Monroe2010-08-05' %!@X`Denise Ebery2010-08-05+ -!@X`Peter Harrington2010-08-06&#!@X`Robert Mayo2010-08-06))!@X`Nathan Schmidt2010-08-06'%!@X`Himani Amoli2010-08-06#!@X`Kei Kubo2010-08-06'%!@X`Steve Morris2010-08-06$!@X`Dan Perez2010-08-07'%!@X`Gregory Cook2010-08-07%!!@X`Mike Lundy2010-08-07 Y\2_7d9Y0.7!@X`Prasanth Ramachandran2010-07-29(-'!@X`Ian Langworth2010-07-29.,3!@X`Krassimir Tzvetanov2010-07-29,+/!@X`Stephen O Connell2010-07-29$*!@X`Jason May2010-07-30)))!@X`Alison Chaiken2010-07-30(('!@X`Vivek Agrawal2010-07-31''%!@X`Tyler Neylon2010-07-31)&)!@X`Alison Chaiken2010-07-31#%!@X`Jim Puls2010-07-31.$3!@X`Alberto Isaac Ayala2010-08-01&##!@X`Notprovided2010-08-01%"!!@X`Andy Smith2010-08-01(!'!@Ch\)Stephanie Hou2010-08-01- 1!@X`Masayoshi Nakamura2010-08-01%!!@X`Joseph Kim2010-08-01*+!@X`Frederick Kautz2010-08-01('!@X`Adam Glickman2010-08-01+-!@X`Jelena Jovanovic2010-08-02&#!@X`Chris Meyer2010-08-02&#!@X`Chris Smoak2010-08-02%!!@X`Taff Dirks2010-08-02 B`5e9f=kB'E%!@X`David Weekly2010-07-25&D#!@X`Alan Keefer2010-07-25+C-!@X`Aaron L Vollrath2010-07-25.B3!@X`Elizabeth Streckert2010-07-25$A!@X`David Hsu2010-07-25%@!!@X`Alan Brown2010-07-25'?%!@X`Jeff Lindsay2010-07-25*>+!@X`David Mckissack2010-07-26)=)!@X`Scott Herscher2010-07-27'<%!@X`Timothy Fitz2010-07-27);)!@X`Geoffrey Clapp2010-07-27&:#!@X`Rohit Khare2010-07-27*9+!@X`Joshua Harrison2010-07-27#8!@X`Hats Llc2010-07-28&7#!@X`David Mills2010-07-28'6%!@X`Dennis Wingo2010-07-28+5-!@X`Perrine Crampton2010-07-28+4-!@X`William Sinclair2010-07-28)3)!@X`Adam Hitchcock2010-07-28$2!@X`Jen Kelly2010-07-28)1)!@X`Nathan Saichek2010-07-28$0!@X`Bill Ward2010-07-28'/%!@X`Edward Leake2010-07-28 D`:jDl<kD%\!!@X`Nika Jones2010-07-17&[#!@X`Brent Tubbs2010-07-17(Z'!@Ch\)Dilip Deodhar2010-07-19)Y)!F(\Aliexpress Com2010-07-20(X'!@X`Sunil Kanderi2010-07-20(W'!@X`Lance Norskog2010-07-20.V?!Transfer to Dojo Checking2010-07-20+U-!@X`Stephen Williams2010-07-20'T%!@HLKitt Hodsden2010-07-21$S!@Ch\)Elmer Tan2010-07-21$R!@X`Jose Zero2010-07-224Q?!@H Raymundo Vazquez Martinez2010-07-22$P!@X`Danny Roa2010-07-22%O!!@X`James Fung2010-07-22,N/!@X`Michael Van Riper2010-07-22(M'!@X`Nick O Connor2010-07-22&L#!@X`Will Roscoe2010-07-23'K%!@= =p Gregory Cook2010-07-23$J!@X`John Bodo2010-07-23(I'!@X`Dusty Dettmer2010-07-23&H#!@X`Ari Krupnik2010-07-24%G!!@X`Arthur Kho2010-07-24%F!!@X`Brian Klug2010-07-24 >zP%O%c<g>'s%!@X`Emmie Thomas2010-07-14$r!@X`Chet Jain2010-07-14$q!@X`Jose Zero2010-07-14&p#!@X`Notprovided2010-07-15)o)!@X`Sandra Carrico2010-07-154n?!WEQTransfer to Dojo Checking2010-07-15%m!!@X`Ajay Kamat2010-07-15#l!@X`Sam Odio2010-07-15&k#!@X`Dan O Leary2010-07-15j!!,Doug Chang2010-07-15*i+!@*Santiago Zavala2010-07-15&h#!@X`Jason Abele2010-07-16(g'!@X`Lawrence Wong2010-07-16/f5!@3B\(Blue Oxen Associates2010-07-16#e!@Ch\)Russ Fan2010-07-16$d!@X`Max Hodak2010-07-16/c5!@X`Tennille Christensen2010-07-16'b%!@Ch\)Randal South2010-07-16)a)!@3B\(Brianne Hughes2010-07-16(`'!@X`Jagjit Srawan2010-07-16-_1!@(RKatherine Levinson2010-07-17)^)!@HLNathan Saichek2010-07-17*]+!@X`John Fitzgerald2010-07-17 :]4 f<d6 g:* +!@Santiago Zavala2010-07-10( '!@X`Joseph Castle2010-07-10!!VJeff Comer2010-07-10%!!@Ch\)Adam Smith2010-07-11,/!@X`Kaelin Colclasure2010-07-11('!@X`George Mealer2010-07-11+-!@Ch\)Caryl Westerberg2010-07-11,/!@X`Charmaigne Flores2010-07-11&#!@Ch\)Julie Hsieh2010-07-11&#!@X`Bill Rainey2010-07-12,/!@X`Steffany Boldrini2010-07-12&#!X`Jinal Dalal2010-07-12(~'!@Cancelled Fee2010-07-12%}!!@X`Elliot Lee2010-07-12'|%!@X`Scott Haines2010-07-12({'!@X`Ben Lipkowitz2010-07-13(z'!@X`Luke Crawford2010-07-13(y'!@X`Jonathan Hull2010-07-13'x%!@X`Kitt Hodsden2010-07-13%w!!@HLBrian Klug2010-07-13+v-!@X`Sindhura Mandava2010-07-13'u%!@X`John Zelling2010-07-13$t!@X`Ton Luong2010-07-13 offlrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno dSSY_ekqw}$+29@GNU\cjqx  '.5<CJQX_fmt{qrstuvwxyz{|}~ UY.a6c6 U+ -!@X`Gordon Mccreight2010-07-06*+!@X`Charles Merriam2010-07-06+-!@X`Peter Harrington2010-07-06*+!@X`Dave Koberstein2010-07-06('!@X`Arvind Sharma2010-07-07*+!@X`Greg Coladonato2010-07-07'%!@X`Gregory Cook2010-07-07%!!@X`Mike Lundy2010-07-07('!@X`John Menerick2010-07-07,/!@X`Kristianna Hamann2010-07-07$!@X`Dan Perez2010-07-07('!@X`Parthiv Patel2010-07-07#!@X`Ted Reed2010-07-07"!@X`Sung Wu2010-07-08*+!@X`Matthew Hancher2010-07-08%!!@hiReto Stamm2010-07-08*+!@X Santiago Zavala2010-07-08('!@X`Jeffrey Cohen2010-07-08$!@X`Kevin Gee2010-07-08* +!@X`Martin-Williams2010-07-09) )!@X`Mark Lentczner2010-07-09$ !@X`Kachingle2010-07-10 _}Q$Q(Y- _)6)!@X`Waleed Abdulla2010-07-03(5'!@X`Robert Gordon2010-07-04&4#!@X`David Borja2010-07-04)3)!@X`Georgi Dagnall2010-07-042!!vBrian Klug2010-07-04)1)!@X`Allison Miller2010-07-04'0%!@X`Denise Ebery2010-07-05%/!!@X`Bill Lazar2010-07-05%.!!@X`Reto Stamm2010-07-05'-%!@X`Laura Klemme2010-07-05(,'!@3B\(Stephanie Liu2010-07-05&+#!@X`Otavio Good2010-07-05.*3!@X`Christopher Agerton2010-07-05&)#!@X`Lecole Cole2010-07-05$(!@X`Tim Burks2010-07-05$'!@X`Matt Heck2010-07-05(&'!@X`Jesse Andrews2010-07-05*%+!@X`Ralph Pursifull2010-07-06)$)!@X`Nathan Schmidt2010-07-06(#'!@X`Steven Chanin2010-07-06&"#!@X`Robert Mayo2010-07-06,!/!@X`Jeremy Richardson2010-07-06 R}S*]7Y){R&L#!@X`Mark Flider2010-07-01(K'!@"\(Kevin Warnock2010-07-01+J-!@X`Gordon Mccreight2010-07-01*I+!@X`Charles Merriam2010-07-01%H!!@X`Andy Smith2010-07-01-G1!@X`Masayoshi Nakamura2010-07-01.F?!PTransfer to Dojo Checking2010-07-01&E#!@X`Notprovided2010-07-01(D'!@X`Adam Glickman2010-07-01.C3!@X`Alberto Isaac Ayala2010-07-01%B!!@HLJohn Allen2010-07-01#A!@"\(Jay Liew2010-07-01'@%!@Ch\)Tom Harrison2010-07-02!?!>PayPal2010-07-02&>#!@X`Chris Smoak2010-07-02+=-!@X`Jelena Jovanovic2010-07-02%<!!@X`Taff Dirks2010-07-02&;#!@X`Chris Meyer2010-07-02':%!@"\(Andrew Zamon2010-07-02#9!@X`Dean Mao2010-07-03,8/!@X`Madhur Khandelwal2010-07-03+7-!@X`Michael Crawford2010-07-03 T{M$xN#Q(T(b'!@X`Vivek Agrawal2010-06-30,a/!@Mehdi Maghsoodnia2010-06-30'`%!@HLJohn Deweese2010-06-30&_#!@8&fffffPeggy Smith2010-06-30$^!@X`Jason May2010-06-30&]#!@8&fffffJames Hogan2010-06-30,\/!@HLChristopher Rasch2010-06-30%[!!@8&fffffDanilo Roa2010-06-30(Z'!@X`Katy Levinson2010-06-30#Y!@X`Jim Puls2010-06-30'X%!@X`David Harris2010-06-30(W'!@X`Keith Randall2010-06-30'V%!@X`David Weekly2010-06-30*U+!@X`Matthew Hancher2010-06-30'T%!@X`Tyler Neylon2010-06-30*S+!@X`Frederick Kautz2010-07-01%R!!@X`John Wegis2010-07-01&Q#!@HLLaura Rubin2010-07-01+P-!@HLElizabeth Sadler2010-07-01(O'!@Ch\)Stephanie Hou2010-07-01%N!!@HLDanqing Wu2010-07-01/M5!@X`Tennille Christensen2010-07-01 [w?g4Y-[+w-!@X`Perrine Crampton2010-06-28'v%!@X`Edward Leake2010-06-28&u#!@X`David Mills2010-06-28't%!@X`Dennis Wingo2010-06-28$s!@X`Jen Kelly2010-06-28)r)!@X`Nathan Saichek2010-06-28'q%!@X`Robert Brown2010-06-28#p!@X`Hats Llc2010-06-28,o/!@X`Stephen O Connell2010-06-29(n'!@X`Ian Langworth2010-06-29.m3!@X`Krassimir Tzvetanov2010-06-290l7!@X`Prasanth Ramachandran2010-06-29%k!!@HLJeff Comer2010-06-29-j1!@3B\(Katherine Levinson2010-06-29*i+!@3B\(Noah Kantrowitz2010-06-29&h#!@HLChris Meyer2010-06-29'g%!@X`Kev Jr Burns2010-06-295fA!@HLLee Management Investments2010-06-29+e-!@)\(Jonathan Botelho2010-06-29,d/!@3B\(Katherine Compton2010-06-30)c)!@X`Alison Chaiken2010-06-30 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{      !"#$%&'()*+,-./01234567 VU)}R$yO'V( '!@X`Dusty Dettmer2010-06-23* +!@X`Chingchun Chien2010-06-23% !!@X`Arthur Kho2010-06-24& #!@X`Ari Krupnik2010-06-24% !!@X`Brian Klug2010-06-24%!!@X`Alan Brown2010-06-25'%!@X`David Weekly2010-06-25$!@X`David Hsu2010-06-25'%!@X`Jeff Lindsay2010-06-25&#!@X`Alan Keefer2010-06-25.3!@X`Elizabeth Streckert2010-06-25+-!@X`Aaron L Vollrath2010-06-25('!@X`Steven Chanin2010-06-26*+!@X`Joshua Harrison2010-06-27))!@X`Scott Herscher2010-06-27&~#!@X`Rohit Khare2010-06-27'}%!@X`Timothy Fitz2010-06-27)|)!@X`Geoffrey Clapp2010-06-27+{-!@X`William Sinclair2010-06-28'z%!@X`Payment From2010-06-28$y!@X`Bill Ward2010-06-28)x)!@X`Adam Hitchcock2010-06-28 7~W0X,\4_7%$!!@X`Nika Jones2010-06-17,#/!@X`Kaelin Colclasure2010-06-17("'!@Cancelled Fee2010-06-17*!+!@X`John Fitzgerald2010-06-17& #!@X`Brent Tubbs2010-06-17"!X`Charles2010-06-17%!!@X`John Nagle2010-06-18('!@X`Timothy Burks2010-06-18&#!@X`Jinal Dalal2010-06-18&#!@X`Richard Liu2010-06-18'%!@X`Laura Klemme2010-06-18&#!@X`Andrew Chen2010-06-19))!@X`Matthew Kulick2010-06-19$!@Ch\)Elmer Tan2010-06-19+-!@X`Stephen Williams2010-06-20-1!@X`Katherine Levinson2010-06-20('!@X`Lance Norskog2010-06-20%!!@X`James Fung2010-06-22$!@X`Jose Zero2010-06-22$!@X`Prgmr Com2010-06-22('!@X`Chris Agerton2010-06-22+-!@X`Gordon Mccreight2010-06-23&#!@X`Will Roscoe2010-06-23 =X&X/b7 g=';%!@X`Scott Haines2010-06-12&:#!X`Ann Burkett2010-06-12%9!!@HLBrian Klug2010-06-13'8%!@X`John Zelling2010-06-13(7'!@X`Ben Lipkowitz2010-06-13'6%!@X`Anurag Gupta2010-06-13(5'!@X`Jonathan Hull2010-06-13$4!@X`Ton Luong2010-06-13$3!@X`Chet Jain2010-06-14*2+!@X`Charles Poirier2010-06-14'1%!@X`Emmie Thomas2010-06-14%0!!@X`Ajay Kamat2010-06-15&/#!@X`Notprovided2010-06-15&.#!@X`Lecole Cole2010-06-15#-!@X`Sam Odio2010-06-15*,+!@X`Ralph Pursifull2010-06-16$+!@X`Max Hodak2010-06-16(*'!@X`Lawrence Wong2010-06-16/)5!@X`Tennille Christensen2010-06-16(('!@X`Keith Randall2010-06-16''%!@Ch\)Randal South2010-06-16'&%!@X`Adam Purkiss2010-06-16&%#!@X`Jason Abele2010-06-16 YV+~V-Y-Y%Q!!@X`Reto Stamm2010-06-08$P!@X`Kevin Gee2010-06-08*O+!@X Santiago Zavala2010-06-08*N+!@X`Martin-Williams2010-06-09(M'!@X`Greg Makowski2010-06-09)L)!@X`Mark Lentczner2010-06-09$K!@X`Kachingle2010-06-10*J+!@X`Dave Koberstein2010-06-10'I%!@X`Kitt Hodsden2010-06-10(H'!@X`Joseph Castle2010-06-10(G'!@X`Theodore Reed2010-06-10&F#!@Ch\)Julie Hsieh2010-06-11%E!!@Ch\)Adam Smith2010-06-11+D-!@Ch\)Caryl Westerberg2010-06-11(C'!@X`George Mealer2010-06-11&B#!@X`Ann Burkett2010-06-12(A'!@Cancelled Fee2010-06-12(@'!@Cancelled Fee2010-06-12(?'!@X`Jesse Andrews2010-06-12%>!!@X`Elliot Lee2010-06-12&=#!X`Ann Burkett2010-06-12+<-!@X`William A Rainey2010-06-12 [V)~W/}T*[)g)!@X`Allison Miller2010-06-04(f'!@X`Robert Gordon2010-06-04&e#!@X`David Borja2010-06-04%d!!@X`Bill Lazar2010-06-05$c!@X`Matt Heck2010-06-05'b%!@X`Denise Ebery2010-06-05&a#!@X`Otavio Good2010-06-05&`#!@X`Robert Mayo2010-06-06,_/!@X`Jeremy Richardson2010-06-06)^)!@X`Nathan Schmidt2010-06-06+]-!@X`Peter Harrington2010-06-06%\!!@X`Mike Lundy2010-06-07$[!@X`Dan Perez2010-06-07(Z'!@X`John Menerick2010-06-07'Y%!@X`Gregory Cook2010-06-07(X'!@X`Arvind Sharma2010-06-07(W'!@X`Parthiv Patel2010-06-07*V+!@X`Greg Coladonato2010-06-07&U#!@X`Daniel Kwon2010-06-07,T/!@X`Kristianna Hamann2010-06-07"S!@X`Sung Wu2010-06-08*R+!@X`Matthew Hancher2010-06-08 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{9:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ _zT%}Y1\1_(}'!@X`Ian Langworth2010-05-29(|'!@X`Vivek Agrawal2010-05-31#{!@X`Jim Puls2010-05-31'z%!@X`Tyler Neylon2010-05-31)y)!@X`Alison Chaiken2010-05-31(x'!@Ch\)Stephanie Hou2010-06-01*w+!@X`Frederick Kautz2010-06-01(v'!@X`Adam Glickman2010-06-01*u+!@X`Charles Merriam2010-06-01$t!@X`Jason May2010-06-01&s#!@X`Notprovided2010-06-01%r!!@X`Andy Smith2010-06-01!q!>PayPal2010-06-02&p#!@X`Chris Meyer2010-06-02'o%!@Ch\)Tom Harrison2010-06-02+n-!@X`Jelena Jovanovic2010-06-02$m!@X`Jeff Peck2010-06-03,l/!@X`Madhur Khandelwal2010-06-03#k!@X`Dean Mao2010-06-03)j)!@X`Waleed Abdulla2010-06-03+i-!@X`Michael Crawford2010-06-03)h)!@X`Georgi Dagnall2010-06-04 OmDtH"wM!vO$!@X`David Hsu2010-05-25'%!@X`Jeff Lindsay2010-05-25('!@X`Steven Chanin2010-05-26*+!@X`Joshua Harrison2010-05-27&#!@X`Rohit Khare2010-05-27))!@X`Scott Herscher2010-05-27' %!@X`Timothy Fitz2010-05-27) )!@X`Geoffrey Clapp2010-05-27' %!@X`Edward Leake2010-05-28, /!@X`Nahlyee Van Brunt2010-05-28# !@X`Hats Llc2010-05-28#!@X`Russ Fan2010-05-28))!@X`Nathan Saichek2010-05-28+-!@X`William Sinclair2010-05-28'%!@X`Robert Brown2010-05-28$!@X`Bill Ward2010-05-28'%!@X`Dennis Wingo2010-05-28$!@X`Jen Kelly2010-05-28&#!@X`David Mills2010-05-28.3!@X`Krassimir Tzvetanov2010-05-29,/!@X`Stephen O Connell2010-05-290~7!@X`Prasanth Ramachandran2010-05-29 WY/W&n9W(('!@X`Chris Agerton2010-05-22+'-!@X`Gordon Mccreight2010-05-232&;!@X`Gokuldas Kalyani Pillai2010-05-23(%'!@X`Dusty Dettmer2010-05-23&$#!@X`Will Roscoe2010-05-232#;!X`Gokuldas Kalyani Pillai2010-05-23("'!@Cancelled Fee2010-05-23(!'!@Cancelled Fee2010-05-232 ;!X`Gokuldas Kalyani Pillai2010-05-23*+!@X`Chingchun Chien2010-05-23.?!Transfer to Dojo Checking2010-05-24%!!@X`Arthur Kho2010-05-24&#!@X`Ari Krupnik2010-05-24%!!@X`Brian Klug2010-05-24+-!@X`Aaron L Vollrath2010-05-25.3!@X`Elizabeth Streckert2010-05-25'%!@X`David Weekly2010-05-25+-!@X`Taher Haveliwala2010-05-25&#!@X`Alan Keefer2010-05-25%!!@X`Ajay Kamat2010-05-25%!!@X`Alan Brown2010-05-25 6\,_4 b5c6*?+!@X`Ralph Pursifull2010-05-16*>+!X Martin-Williams2010-05-16(='!@ Cancelled Fee2010-05-16'<%!@Ch\)Randal South2010-05-16&;#!@X`Jason Abele2010-05-16$:!@X`Max Hodak2010-05-16*9+!@X`John Fitzgerald2010-05-17,8/!@X`Kaelin Colclasure2010-05-17%7!!@X`Nika Jones2010-05-17&6#!@X`Brent Tubbs2010-05-17%5!!@X`John Nagle2010-05-18'4%!@X`Laura Klemme2010-05-18(3'!@X`Timothy Burks2010-05-18&2#!@X`Jinal Dalal2010-05-18&1#!@X`Andrew Chen2010-05-19$0!@Ch\)Elmer Tan2010-05-19&/#!@X`Matt Kulick2010-05-19(.'!@X`Lance Norskog2010-05-20--1!@X`Katherine Levinson2010-05-20+,-!@X`Stephen Williams2010-05-20$+!@X`Prgmr Com2010-05-22%*!!@X`James Fung2010-05-22$)!@X`Jose Zero2010-05-22 :zT+Y/a8 b:%V!!@Ch\)Adam Smith2010-05-11&U#!@Ch\)Julie Hsieh2010-05-11(T'!@X`George Mealer2010-05-11*S+!@X Martin Williams2010-05-11'R%!@X`Scott Haines2010-05-12(Q'!@X`Jesse Andrews2010-05-12&P#!@X`Ann Burkett2010-05-12%O!!@X`Elliot Lee2010-05-12#N!@X`Pj Gupta2010-05-12+M-!@X`William A Rainey2010-05-12$L!@X`Ton Luong2010-05-13(K'!@X`Ben Lipkowitz2010-05-13'J%!@X`Payment From2010-05-13'I%!@X`Anurag Gupta2010-05-13'H%!@HLJennifer Lee2010-05-13'G%!@X`John Zelling2010-05-13$F!@X`Chet Jain2010-05-14*E+!@X`Charles Poirier2010-05-15&D#!@X`Notprovided2010-05-15#C!@X`Sam Odio2010-05-15&B#!@X`Lecole Cole2010-05-15(A'!@X`Keith Randall2010-05-16/@5!@X`Tennille Christensen2010-05-16 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{ RT-{T/[2R,l/!@X`Jeremy Richardson2010-05-06)k)!@X`Nathan Schmidt2010-05-06(j'!@X`Parthiv Patel2010-05-07(i'!@X`John Menerick2010-05-07,h/!@X`Kristianna Hamann2010-05-07&g#!@X`Daniel Kwon2010-05-07$f!@X`Dan Perez2010-05-07(e'!@X`Arvind Sharma2010-05-07%d!!@X`Mike Lundy2010-05-07*c+!@X`Greg Coladonato2010-05-07*b+!@X Santiago Zavala2010-05-08"a!@X`Sung Wu2010-05-08$`!@X`Kevin Gee2010-05-08*_+!@X`Matthew Hancher2010-05-08(^'!@X`Greg Makowski2010-05-09*]+!@X`Martin Williams2010-05-09*\+!@X`Dave Koberstein2010-05-10$[!@X`Kachingle2010-05-10(Z'!@X`Joseph Castle2010-05-10(Y'!@X`Theodore Reed2010-05-10%X!!@X`Danilo Roa2010-05-11+W-!@Ch\)Caryl Westerberg2010-05-11 J|U-[0nBtJ'%!@Ch\)Tom Harrison2010-05-02+-!@X`Jelena Jovanovic2010-05-02&#!@X`Chris Meyer2010-05-02$!@X`Jeff Peck2010-05-03#!@X`Jim Puls2010-05-03'~%!@X`Adam Purkiss2010-05-03)})!@X`Waleed Abdulla2010-05-03 |!X`Ninua2010-05-04 {!X`Ninua2010-05-04#z!X`Jim Puls2010-05-04(y'!@Cancelled Fee2010-05-04(x'!@Cancelled Fee2010-05-04(w'!@Cancelled Fee2010-05-04(v'!@Cancelled Fee2010-05-04)u)!@X`Allison Miller2010-05-04%t!!@X`Bill Lazar2010-05-05's%!@X`Denise Ebery2010-05-05&r#!@X`Otavio Good2010-05-05%q!!@X`Reto Stamm2010-05-05$p!@X`Matt Heck2010-05-05*o+!@X`Marilson Campos2010-05-05&n#!@X`Robert Mayo2010-05-06+m-!@X`Peter Harrington2010-05-06 <e?qFg6b<#!@X`Hats Llc2010-04-28#!@X`Russ Fan2010-04-28,/!@X`Stephen O Connell2010-04-29'%!@X`Sanjit Jhala2010-04-29,/!@X`Nahlyee Van Brunt2010-04-29#!@X`Lou Hong2010-04-30.3!@X`Krassimir Tzvetanov2010-04-3007!@X`Prasanth Ramachandran2010-04-30'%!@X`Tyler Neylon2010-04-30))!@X`Alison Chaiken2010-04-30('!@X`Vivek Agrawal2010-04-30('!@X`Adam Glickman2010-05-01('!@Ch\)Stephanie Hou2010-05-01" !@X`M Mcgaw2010-05-01( '!@X`Navneet Dalal2010-05-01% !!@X`Andy Smith2010-05-01* +!@X`Charles Merriam2010-05-01& #!@X`Notprovided2010-05-01#!@X`Jim Puls2010-05-01$!@X`Jason May2010-05-01*+!@X`Frederick Kautz2010-05-01 !@X`Ninua2010-05-02!!>PayPal2010-05-02 LV-T(yN$}L.03!@X`Elizabeth Streckert2010-04-25+/-!@X`Taher Haveliwala2010-04-25%.!!@X`Ajay Kamat2010-04-25$-!@X`David Hsu2010-04-25',%!@X`David Weekly2010-04-25'+%!@X`Jeff Lindsay2010-04-25(*'!@X`Steven Chanin2010-04-26*)+!@X`Chingchun Chien2010-04-26)()!@X`Scott Herscher2010-04-27)')!@X`Geoffrey Clapp2010-04-27'&%!@X`Timothy Fitz2010-04-27)%)!@HLMichael Rooney2010-04-27+$-!@X`Gabe Da Silveira2010-04-27&##!@X`Rohit Khare2010-04-27*"+!@X`Joshua Harrison2010-04-27+!-!@X`William Sinclair2010-04-28$ !@X`Bill Ward2010-04-28&#!@X`David Mills2010-04-28))!@X`Nathan Saichek2010-04-28'%!@X`Robert Brown2010-04-28'%!@X`Dennis Wingo2010-04-28'%!@X`Edward Leake2010-04-28 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` OxP$JsL$xO&F#!@X`Andrew Chen2010-04-19$E!@Ch\)Elmer Tan2010-04-19'D%!@X`Ian Danforth2010-04-19(C'!@X`Lance Norskog2010-04-20-B1!@X`Katherine Levinson2010-04-20%A!!@X`James Fung2010-04-22$@!@X`Jose Zero2010-04-22&?#!@X`Eric Sutton2010-04-22$>!@X`Prgmr Com2010-04-22(='!@X`Chris Agerton2010-04-22+<-!@X`Michael Crawford2010-04-23+;-!@X`Gordon Mccreight2010-04-232:;!@X`Gokuldas Kalyani Pillai2010-04-23&9#!@X`Will Roscoe2010-04-23(8'!@X`Dusty Dettmer2010-04-23%7!!@X`Arthur Kho2010-04-24&6#!@X`Ari Krupnik2010-04-24)5)!@X`Aaron Vollrath2010-04-25%4!!@X`Alan Brown2010-04-25&3#!@X`Alan Keefer2010-04-2542?!f=pTransfer to Dojo Checking2010-04-25%1!!k =pBrian Klug2010-04-25 ZZ+W*Y0Z'\%!@X`John Zelling2010-04-13(['!@X`Jonathan Hull2010-04-13&Z#!@X`Ann Burkett2010-04-14*Y+!@X`Charles Poirier2010-04-14(X'!@X`Joel Franusic2010-04-14&W#!@X`Lecole Cole2010-04-15#V!@X`Sam Odio2010-04-15%U!!@X`Euwyn Poon2010-04-15$T!@X`Max Hodak2010-04-16/S5!@X`Tennille Christensen2010-04-16'R%!@X`Nick Nayfack2010-04-16*Q+!@X`Ralph Pursifull2010-04-16(P'!@X`Keith Randall2010-04-16&O#!@X`Jason Abele2010-04-16'N%!@Ch\)Randal South2010-04-16&M#!@X`Brent Tubbs2010-04-17*L+!@X`John Fitzgerald2010-04-17,K/!@X`Kaelin Colclasure2010-04-17'J%!@X`Laura Klemme2010-04-18%I!!@X`John Nagle2010-04-18&H#!@X`Jinal Dalal2010-04-18(G'!@X`Timothy Burks2010-04-18 NU+wQ(T)yN(r'!@X`Joseph Castle2010-04-10+q-!@X`Cynthia Typaldos2010-04-10'p%!@X`Marc Infield2010-04-10*o+!@X`Dave Koberstein2010-04-10(n'!@X`Theodore Reed2010-04-10(m'!@X`George Mealer2010-04-11+l-!@Ch\)Caryl Westerberg2010-04-11&k#!@Ch\)Julie Hsieh2010-04-11%j!!@Ch\)Adam Smith2010-04-11%i!!@X`Danilo Roa2010-04-11*h+!@X Martin Williams2010-04-11&g#!@X`Bill Rainey2010-04-12#f!@X`Pj Gupta2010-04-12'e%!@X`Scott Haines2010-04-124d?!*fffffTransfer to Dojo Checking2010-04-12%c!!@X`Elliot Lee2010-04-12(b'!@X`Jesse Andrews2010-04-12'a%!@X`Anurag Gupta2010-04-13(`'!@X`Ben Lipkowitz2010-04-13,_/!@X`Christopher Rasch2010-04-13'^%!@HLJennifer Lee2010-04-13$]!@X`Ton Luong2010-04-13 YT)[,}V.Y))!@X`Allison Miller2010-04-04&#!@X`Otavio Good2010-04-05'%!@X`Denise Ebery2010-04-05+-!@X`Mark Hartenstein2010-04-05%!!@X`Reto Stamm2010-04-05%!!@X`Bill Lazar2010-04-05$!@X`Matt Heck2010-04-05*+!@X`Marilson Campos2010-04-05&#!@X`Robert Mayo2010-04-06))!@X`Nathan Schmidt2010-04-06*~+!@X`Greg Coladonato2010-04-07,}/!@X`Kristianna Hamann2010-04-07(|'!@X`John Menerick2010-04-07${!@X`Dan Perez2010-04-07%z!!@X`Mike Lundy2010-04-07&y#!@X`Daniel Kwon2010-04-07(x'!@X`Parthiv Patel2010-04-07(w'!@X`Arvind Sharma2010-04-07*v+!@X Santiago Zavala2010-04-08$u!@X`Kevin Gee2010-04-08*t+!@X`Matthew Hancher2010-04-08(s'!@X`Greg Makowski2010-04-09 P`6k@}R%{P('!@X`Vivek Agrawal2010-03-31))!@X`Alison Chaiken2010-03-31'%!@X`Tyler Neylon2010-03-31('!@Ch\)Stephanie Hou2010-04-01&#!@X`Notprovided2010-04-01*+!@Ch\)Manuel V Torres2010-04-01('!@X`Adam Glickman2010-04-01$!@X`Jason May2010-04-01"!@X`M Mcgaw2010-04-01*+!@X`Frederick Kautz2010-04-01!!Doug Chang2010-04-01%!!@X`Andy Smith2010-04-01('!@X`Navneet Dalal2010-04-01*+!@X`Charles Merriam2010-04-01 !@X`Ninua2010-04-02&#!@X`Chris Meyer2010-04-02!!>LPayPal2010-04-02+-!@X`Jelena Jovanovic2010-04-02' %!@X`Tom Harrison2010-04-02' %!@X`Adam Purkiss2010-04-03$ !@X`Jeff Peck2010-04-03# !@X`Jim Puls2010-04-03& #!@X`Sam Sampath2010-04-04 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{bcdefghijklmnopqrstuvwxyz{|}~ SvG!vO%Y0S)5)!@X`Geoffrey Clapp2010-03-27'4%!@X`Timothy Fitz2010-03-27)3)!@X`Scott Herscher2010-03-27+2-!@X`Gabe Da Silveira2010-03-27*1+!@X`Joshua Harrison2010-03-27&0#!@X`Rohit Khare2010-03-27'/%!@X`Dennis Wingo2010-03-28#.!@X`Russ Fan2010-03-28'-%!@X`Edward Leake2010-03-28),)!@X`Nathan Saichek2010-03-28#+!@X`Hats Llc2010-03-28'*%!@X`Wil Sinclair2010-03-28$)!@X`Bill Ward2010-03-28&(#!@X`David Mills2010-03-28,'/!@X`Nahlyee Van Brunt2010-03-28&&#!@X`Carlos Puig2010-03-28'%%!@X`Sanjit Jhala2010-03-29#$!@X`Lou Hong2010-03-29,#/!@X`Stephen O Connell2010-03-29."3!@X`Krassimir Tzvetanov2010-03-29#!!@X`Sayhired2010-03-290 7!@X`Prasanth Ramachandran2010-03-30 =|S+pB^6m=-K1!@X`Katherine Levinson2010-03-20$J!@X`Prgmr Com2010-03-22&I#!@X`Eric Sutton2010-03-22$H!@X`Jose Zero2010-03-22(G'!@X`Chris Agerton2010-03-22$F!@X`Prgmr Com2010-03-22%E!!@X`John Leung2010-03-23*D+!@X`Chingchun Chien2010-03-23(C'!@X`Dusty Dettmer2010-03-232B;!@X`Gokuldas Kalyani Pillai2010-03-23+A-!@X`Gordon Mccreight2010-03-23&@#!@X`Will Roscoe2010-03-23+?-!@X`Michael Crawford2010-03-244>?!\(Transfer to Dojo Checking2010-03-24&=#!@X`Ari Krupnik2010-03-240<7!@X`Sumithra Jonnalagadda2010-03-24%;!!@X`Alan Brown2010-03-25%:!!@X`Ajay Kamat2010-03-25&9#!@X`Alan Keefer2010-03-25%8!!@X`Arthur Kho2010-03-25.73!@X`Elizabeth Streckert2010-03-25(6'!@X`Steven Chanin2010-03-26 NY0 f;`6 N0a7!@X`Prasanth Ramachandran2010-03-16&`#!@X`Jason Abele2010-03-164_?!p(Transfer to Dojo Checking2010-03-16'^%!@Ch\)Randal South2010-03-16(]'!@X`Keith Randall2010-03-16'\1!Katherine Levinson2010-03-16/[5!@X`Tennille Christensen2010-03-16&Z#!@X`Brent Tubbs2010-03-17!Y'!dTim Bonnemann2010-03-17,X/!@X`Kaelin Colclasure2010-03-17*W+!@X`John Fitzgerald2010-03-17(V'!@X`Timothy Burks2010-03-18'U%!@X`Laura Klemme2010-03-18'T%!azGDavid Harris2010-03-18$S!@X`Elmer Tan2010-03-18%R!!@X`John Nagle2010-03-18$Q!@Ch\)Elmer Tan2010-03-19&P#!@X`Andrew Chen2010-03-19$O!X`Elmer Tan2010-03-19(N'!@Cancelled Fee2010-03-19(M'!@Cancelled Fee2010-03-19'L%!@X`Ian Danforth2010-03-19 UW,W,{Q*U(w'!@X`Ben Lipkowitz2010-03-13(v'!@X`Jonathan Hull2010-03-13)u)!@X`Andrew Wooster2010-03-13&t#!@X`Alan Keefer2010-03-13's%!@HLJennifer Lee2010-03-13$r!@X`Ton Luong2010-03-13'q%!@X`Anurag Gupta2010-03-13,p/!@X`Christopher Rasch2010-03-13'o%!@X`John Zelling2010-03-13*n+!@X`Charles Poirier2010-03-14(m'!@X`Joel Franusic2010-03-14(l'!@ Cancelled Fee2010-03-15,k/!X Michael Yamashita2010-03-15#j!@X`Sam Odio2010-03-15%i!!@X`Euwyn Poon2010-03-15&h#!@X`Lecole Cole2010-03-15,g/!X Michael Yamashita2010-03-15(f'!@%aGzPatrick Moore2010-03-15(e'!@X`Michael Smith2010-03-15*d+!@X`Ralph Pursifull2010-03-16$c!@X`Max Hodak2010-03-16'b%!@X`Nick Nayfack2010-03-16 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{      !"#$%& [[.T+X-[+ -!@X`Cynthia Typaldos2010-03-10$ !@X`Ton Luong2010-03-10% !!@X`Mike Lundy2010-03-10( '!@X`Joseph Castle2010-03-10' %!@X`Marc Infield2010-03-10('!@%aGzMariya Genzel2010-03-10('!@X`Theodore Reed2010-03-10%!!@X`Danilo Roa2010-03-11'%!?QDigitix Corp2010-03-11+-!@Ch\)Caryl Westerberg2010-03-11%!!@Ch\)Adam Smith2010-03-11&#!@Ch\)Julie Hsieh2010-03-11*+!@X Martin Williams2010-03-11))!@X`Rebecca Gorman2010-03-11('!@X`George Mealer2010-03-11)~)!@X`Michael Rooney2010-03-12'}%!@X`Scott Haines2010-03-12*|+!@X`Russell Wallace2010-03-12&{#!@X`Ann Burkett2010-03-12%z!!@X`Elliot Lee2010-03-12(y'!@X`Jesse Andrews2010-03-12&x#!@X`Bill Rainey2010-03-12 RyN#yJwN'zR%#!!@X`Reto Stamm2010-03-05&"#!@X`Otavio Good2010-03-05'!%!@X`Michael Tsao2010-03-05+ -!@X`Mark Hartenstein2010-03-05))!@X`Nathan Schmidt2010-03-06$!@X`Dan Perez2010-03-07&#!@X`Daniel Kwon2010-03-07&#!@X`Paul Hamann2010-03-07('!@X`John Menerick2010-03-07*+!@X`Greg Coladonato2010-03-07")!2Dave Schreiber2010-03-07*+!@X Santiago Zavala2010-03-08,/!@X Michael Yamashita2010-03-08*+!@X`Matthew Hancher2010-03-08('!@Cancelled Fee2010-03-09&#!X`Amit Sarkar2010-03-09&#!@X`Amit Sarkar2010-03-09('!@X`Greg Makowski2010-03-09('!@Cancelled Fee2010-03-09.?!Transfer to Dojo Checking2010-03-09&#!X`Amit Sarkar2010-03-09*+!@X`Dave Koberstein2010-03-10 F\.pFyNoF&:#!@X`Nik Kalyani2010-03-01%9!!@X`Andy Smith2010-03-01'8%!@X`Tom Harrison2010-03-02(7'!X`Andrew Dillon2010-03-02(6'!@Cancelled Fee2010-03-0245?!Transfer to Dojo Checking2010-03-02(4'!@Cancelled Fee2010-03-02(3'!X`Andrew Dillon2010-03-02&2#!@X`Chris Meyer2010-03-02,1/!@X`Nahlyee Van Brunt2010-03-02 0!@X`Ninua2010-03-02$/!@X`Max Hodak2010-03-02'.%!@X`Tyler Neylon2010-03-02+--!@X`Jelena Jovanovic2010-03-02,!PayPal2010-03-02$+!@X`Jeff Peck2010-03-03#*!@X`Kevin Ly2010-03-03#)!@X`Jim Puls2010-03-03+(-!@X`J Patrick Bedell2010-03-04)')!@X`Allison Miller2010-03-04&&#!@X`Sam Sampath2010-03-04$%!@X`Matt Heck2010-03-05%$!!@X`Bill Lazar2010-03-05 YV1xN'^5 Y)P)!@X`Scott Herscher2010-02-27*O+!@X`Joshua Harrison2010-02-27'N%!@X`Timothy Fitz2010-02-27+M-!@X`Gabe Da Silveira2010-02-27(L'!@X`Vivek Agrawal2010-02-28&K#!@X`David Mills2010-02-28'J%!@X`Edward Leake2010-02-28#I!@X`Hats Llc2010-02-28'H%!@X`Dennis Wingo2010-02-28&G#!@X`Carlos Puig2010-02-28#F!@X`Russ Fan2010-02-28$E!@X`Bill Ward2010-02-28'D%!@X`Wil Sinclair2010-02-28)C)!@X`Nathan Saichek2010-02-28,B/!@hJ=p Christopher Rasch2010-03-01(A'!@Ch\)Manuel Torres2010-03-010@7!@%aGzPhilmaking Consulting2010-03-01"?!@X`M Mcgaw2010-03-01(>'!@X`Adam Glickman2010-03-01*=+!@X`Charles Merriam2010-03-01$<!@X`Jason May2010-03-01(;'!@Ch\)Stephanie Hou2010-03-01 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ PZ3Z'{T&{P(f'!@X`Dusty Dettmer2010-02-23%e!!b\)Doug Chang2010-02-23*d+!@X`Chingchun Chien2010-02-23(c'!@%aGzGlobal Impact2010-02-23(b'!@%aGzWilliam Chung2010-02-23+a-!@X`Gordon Mccreight2010-02-23$`!@X`Sing Wong2010-02-24(_'!@%aGzJohn Hamilton2010-02-24'^%!@X`Appcelerator2010-02-24&]#!@X`Ari Krupnik2010-02-24+\-!@%aGzWill Tungpagasit2010-02-240[7!@X`Sumithra Jonnalagadda2010-02-24%Z!!@X`Ajay Kamat2010-02-25.Y3!@X`Elizabeth Streckert2010-02-25%X!!@X`Alan Brown2010-02-25)W)!@X`Nat C Voorhies2010-02-25)V)!@/ffffffAndrew Huibers2010-02-26$U!@/ffffffConor Lee2010-02-26(T'!@X`Steven Chanin2010-02-26&S#!@X`Rohit Khare2010-02-27)R)!@X`Michael Rooney2010-02-27#Q!@X Rod Frey2010-02-27 D\1U*W(qD*|+!@X`Ralph Pursifull2010-02-16({'!@X`Keith Randall2010-02-16&z#!@X`Jason Abele2010-02-160y7!@X`Prasanth Ramachandran2010-02-16-x1!@X`Stefan Gorzkiewicz2010-02-16,w/!@X`Kaelin Colclasure2010-02-17&v#!@X`Brent Tubbs2010-02-17(u'!@%aGzSteve Garrity2010-02-18$t!@X`Elmer Tan2010-02-18+s-!@X`Chris Countryman2010-02-18'r%!@X`Laura Klemme2010-02-18(q'!@X`Timothy Burks2010-02-18'p%!@X`Ian Danforth2010-02-19&o#!@X`Andrew Chen2010-02-19+n-!@5 =qSpencer Schoeben2010-02-20-m1!@X`Katherine Levinson2010-02-20(l'!@X`Andrew Dillon2010-02-21(k'!@X`Chris Agerton2010-02-22$j!@X`Prgmr Com2010-02-22&i#!@X`Eric Sutton2010-02-22$h!@X`Jose Zero2010-02-22*g+!@%aGzGreg Coladonato2010-02-22 Y_4 a4 X)Y'%!@HLJennifer Lee2010-02-13*+!@X`Frederick Kautz2010-02-13))!@X`Andrew Wooster2010-02-13$!@X`Ton Luong2010-02-13#!@X`Jon Hull2010-02-13, /!@X`Christopher Rasch2010-02-13' %!@X`Anurag Gupta2010-02-134 ?!zHTransfer to Dojo Checking2010-02-13& #!@"\(Anne Ogborn2010-02-14& #!@X`Anne Ogborn2010-02-14&#!X`Anne Ogborn2010-02-14*+!@X`Charles Poirier2010-02-14('!?\(\Cancelled Fee2010-02-14('!@X`Joel Franusic2010-02-14&#!X`Anne Ogborn2010-02-14('!@Cancelled Fee2010-02-14&#!@"\(Anne Ogborn2010-02-14('!@Cancelled Fee2010-02-14#!@X`Sam Odio2010-02-15&#!@X`Lecole Cole2010-02-15%~!!@X`Euwyn Poon2010-02-15'}%!@Ch\)Randal South2010-02-16 BY/a7 d<jB%)!!@X`Mike Lundy2010-02-10(('!@X`Theodore Reed2010-02-10*'+!@X`Carlos Mcevilly2010-02-10&&#!@Ch\)Julie Hsieh2010-02-11 %!X`Linda2010-02-11+$-!@Ch\)Caryl Westerberg2010-02-11%#!!@X`Noah Gibbs2010-02-11%"!!@Ch\)Adam Smith2010-02-11%!!!@X`Danilo Roa2010-02-11* +!@X Martin Williams2010-02-11('!@X`George Mealer2010-02-11('!@Cancelled Fee2010-02-11'%!@X`David Graham2010-02-11('!@Cancelled Fee2010-02-11 !X`Linda2010-02-11*+!@X`Russell Wallace2010-02-12%!!@X`Moorthi Pv2010-02-12('!@X`Jesse Andrews2010-02-12'%!@X`Scott Haines2010-02-12))!@X`Michael Rooney2010-02-12&#!@X`Bill Rainey2010-02-12&#!@X`Ann Burkett2010-02-12&#!@X`Alan Keefer2010-02-13 QV-yP)W.{Q'?%!@O\(David Weekly2010-02-05+>-!@X`J Patrick Bedell2010-02-05)=)!@\(\Hunter Gillane2010-02-05'<%!@X`Michael Tsao2010-02-05,;/!@HLCaroline Ratajski2010-02-05&:#!@X`Otavio Good2010-02-05(9'!@\(Michael Lundy2010-02-05$8!@X`Matt Heck2010-02-05)7)!@X`Nathan Schmidt2010-02-06(6'!@X`John Menerick2010-02-07&5#!@X`Paul Hamann2010-02-07$4!@X`Dan Perez2010-02-07&3#!@X`Daniel Kwon2010-02-07,2/!@X Michael Yamashita2010-02-08*1+!@X Santiago Zavala2010-02-08*0+!@X`Matthew Hancher2010-02-08(/'!@X`Greg Makowski2010-02-09&.#!@X`Amit Sarkar2010-02-09(-'!@X`Joseph Castle2010-02-10(,'!@X`Linda Holroyd2010-02-10*++!@X`Dave Koberstein2010-02-10$*!@X`Ton Luong2010-02-10 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{ DoKvFrHlD%U!!@HLBrian Klug2010-02-03%T!!@X`Zain Memon2010-02-03)S)!@8&fffffNathan Saichek2010-02-03'R%!@8&fffffDaniel Perez2010-02-03$Q!@X`Jeff Peck2010-02-034P?!QGzTransfer to Dojo Checking2010-02-03'O%!@X`Fist In Hand2010-02-03#N!@X`Kevin Ly2010-02-03%M!!@3B\(Jeff Comer2010-02-03)L)!@X`Allison Miller2010-02-04(K'!@Cancelled Fee2010-02-04,J/!@"\(Stephanie Robesky2010-02-04-I1!@X`Saundra D Kinnaird2010-02-04(H'!@8&fffffClive Boulton2010-02-04!G!@8&fffffPegpay2010-02-04(F'!@= =p Mariya Genzel2010-02-04(E'!X`Mariya Genzel2010-02-04-D1!l#33333Katherine Levinson2010-02-04!C!@8&fffffPegpay2010-02-04(B'!@Cancelled Fee2010-02-045AA!@HLLee Management Investments2010-02-04+@-!@X`Mark Hartenstein2010-02-05 Ib7mDe;qI%l!!@X`Andy Smith2010-01-29$k!@X`Jason May2010-01-29#j!@X`Russ Fan2010-01-29)i)!@X`Nathan Saichek2010-01-29$h!@X`Bill Ward2010-01-29'g%!@X`Dennis Wingo2010-01-29'f%!@X`Tyler Neylon2010-01-30+e-!@X`Jelena Jovanovic2010-01-30,d/!@X`Nahlyee Van Brunt2010-01-30*c+!@X`Joshua Harrison2010-01-30-b1!@X`Frederick Kautz Iv2010-02-01"a!@X`M Mcgaw2010-02-01&`#!@X`Nik Kalyani2010-02-01(_'!@Ch\)Manuel Torres2010-02-01(^'!@X`Adam Glickman2010-02-01&]#!@X`Chris Meyer2010-02-02$\!@X`Max Hodak2010-02-02![!>PayPal2010-02-02(Z'!@Ch\)Stephanie Hou2010-02-02'Y%!@X`Tom Harrison2010-02-02(X'!@X`Mariya Genzel2010-02-02 W!@X`Ninua2010-02-02#V!@X`Jim Puls2010-02-03 NV0\6uM!yN('!@X`Dusty Dettmer2010-01-23,/!@X`Jessy Cowan Sharp2010-01-24$!@X`Sing Wong2010-01-24'%!@X`Appcelerator2010-01-24%~!!@X`Ajay Kamat2010-01-25)})!@X`Nat C Voorhies2010-01-25%|!!@X`Alan Brown2010-01-25.{3!@X`Elizabeth Streckert2010-01-25(z'!@X`Steven Chanin2010-01-264y?!pp Transfer to Dojo Checking2010-01-26+x-!@X`Gabe Da Silveira2010-01-27#w!@X Rod Frey2010-01-27)v)!@X`Brady Mitchell2010-01-28&u#!@X`Rohit Khare2010-01-28't%!@X`Wil Sinclair2010-01-28)s)!@X`Scott Herscher2010-01-28&r#!@X`David Mills2010-01-28#q!@X`Hats Llc2010-01-28&p#!@X`Carlos Puig2010-01-28'o%!@X`Timothy Fitz2010-01-29'n%!@X`Edward Leake2010-01-29*m+!@X`Charles Merriam2010-01-29 K}V/V*X'vK('!@X`Andrew Benton2010-01-18'%!@X`Laura Klemme2010-01-18+-!@X`Teshager Tesfaye2010-01-18+-!@X`Chris Countryman2010-01-18('!@X`Timothy Burks2010-01-18.3!@X`Benjamin Silbermann2010-01-19'%!@X`Creative Llc2010-01-19&#!@X`Andrew Chen2010-01-19*+!@X`Ralph Pursifull2010-01-19'%!@X`Ian Danforth2010-01-20%!!vGzDoug Chang2010-01-20) )!@hiH Paul Hammann2010-01-20- 1!@X`Katherine Levinson2010-01-20( '!@X`Andrew Dillon2010-01-21& #!@X`Jeff Levine2010-01-21' %!@X`Richard Kiss2010-01-21('!@X`Chris Agerton2010-01-22$!@X`Jose Zero2010-01-22$!@X`Prgmr Com2010-01-22%!!@X`James Auer2010-01-22+-!@X`Gordon Mccreight2010-01-23*+!@X`Chingchun Chien2010-01-23 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO HHmDuM wH,./!@X`Erik Brynjolfsson2010-01-13"-)!dCodingclan Llc2010-01-13),)!@X`Andrew Wooster2010-01-13&+#!@X`Alan Keefer2010-01-13,*/!@X`Christopher Rasch2010-01-13*)+!@X`Carlos Mcevilly2010-01-13%(!!~O =pDoug Chang2010-01-14(''!@X`Joel Franusic2010-01-14*&+!@X`Charles Poirier2010-01-14&%#!@X`Anne Ogborn2010-01-14#$!@X`Sam Odio2010-01-15%#!!@X`Euwyn Poon2010-01-15&"#!@Ch\)Carl Tanner2010-01-15&!#!@X`Lecole Cole2010-01-15( '!@X`Keith Randall2010-01-16'%!@Ch\)Randal South2010-01-16'%!@X`Randy Thelen2010-01-1607!@X`Prasanth Ramachandran2010-01-164?!AG{Transfer to Dojo Checking2010-01-16&#!@X`Jason Abele2010-01-16,/!@X`Kaelin Colclasure2010-01-17&#!@X`Brent Tubbs2010-01-17 Y}S&}U.V+Y(D'!@X`Greg Makowski2010-01-09*C+!@X`Dave Koberstein2010-01-10%B!!@X`Mike Lundy2010-01-10$A!@X`Ton Luong2010-01-10(@'!@X`Linda Holroyd2010-01-10(?'!@X`Joseph Castle2010-01-10(>'!@X`Theodore Reed2010-01-10'=%!@X`David Graham2010-01-11%<!!@Ch\)Adam Smith2010-01-11*;+!@X Martin Williams2010-01-11+:-!@Ch\)Caryl Westerberg2010-01-11$9!@X`Danny Roa2010-01-11%8!!@X`Moorthi Pv2010-01-12&7#!@X`Amit Sarkar2010-01-12(6'!@X`Jesse Andrews2010-01-12)5)!@X`Michael Rooney2010-01-12&4#!@X`Bill Rainey2010-01-12*3+!@X`Russell Wallace2010-01-12'2%!@X`Scott Haines2010-01-12+1-!@X`Sachenka Mezzich2010-01-13'0%!@X`Anurag Gupta2010-01-13(/'!@X`Brian Johnson2010-01-13 ;|S*\.Q+f;(['!@X`Mariya Genzel2010-01-02'Z%!@X`Tom Harrison2010-01-02$Y!@X`Max Hodak2010-01-02 X!@X`Ninua2010-01-02&W#!@X`Chris Meyer2010-01-02%V!!@X`Zain Memon2010-01-03#U!@X`Kevin Ly2010-01-034T?!yTransfer to Dojo Checking2010-01-03#S!@X`Jim Puls2010-01-03'R%!@X`Fist In Hand2010-01-03)Q)!@X`Allison Miller2010-01-04'P%!@X`Michael Tsao2010-01-05+O-!@X`Mark Hartenstein2010-01-05&N#!@X`Otavio Good2010-01-05$M!@X`Matt Heck2010-01-05)L)!@X`Nathan Schmidt2010-01-06$K!@X`Dan Perez2010-01-07(J'!@X`John Menerick2010-01-07&I#!@X`Paul Hamann2010-01-07&H#!@X`Daniel Kwon2010-01-07%G!!HJeff Comer2010-01-08,F/!@X Michael Yamashita2010-01-08*E+!@X`Matthew Hancher2010-01-08 D_6 _7oCmD&r#!@X`David Mills2009-12-28(q'!@Ch\)Stephanie Hou2009-12-28&p#!@X`Isocket Llc2009-12-28)o)!@X`Brady Mitchell2009-12-28&n#!@X`Carlos Puig2009-12-29*m+!@X`Charles Merriam2009-12-29)l)!@X`Nathan Saichek2009-12-29'k%!@X`Dennis Wingo2009-12-29$j!@X`Bill Ward2009-12-29$i!@X`Jason May2009-12-29'h%!@X`Edward Leake2009-12-29#g!@X`Russ Fan2009-12-29%f!!@X`Andy Smith2009-12-29'e%!@X`Tyler Neylon2009-12-30,d/!@X`Nahlyee Van Brunt2009-12-30+c-!@X`Jelena Jovanovic2009-12-30#b!@X`Hats Llc2009-12-31'a%!@X`Timothy Fitz2009-12-31&`#!@X`Mika Mcgraw2010-01-01(_'!@X`Adam Glickman2010-01-01^!PayPal2010-01-01&]#!@X`Laura Rubin2010-01-01-\1!@X`Frederick Kautz Iv2010-01-01 Z}R$tJ#wP%Z'%!@X`Richard Kiss2009-12-21'%!@X`Andrew Evans2009-12-21%!!@X`James Auer2009-12-22$!@X`Jose Zero2009-12-22%!!@X`Chip Vanek2009-12-22('!@X`Chris Agerton2009-12-22$!@X`Prgmr Com2009-12-22*+!@X`Chingchun Chien2009-12-23+-!@X`Gordon Mccreight2009-12-23!!Doug Chang2009-12-23,~/!@X`Jessy Cowan Sharp2009-12-24$}!@X`Sing Wong2009-12-24'|%!@X`Appcelerator2009-12-24({'!@X`Dusty Dettmer2009-12-24)z)!@X`Nat C Voorhies2009-12-25%y!!@X`Ajay Kamat2009-12-25.x3!@X`Elizabeth Streckert2009-12-25+w-!@X`J Patrick Bedell2009-12-25(v'!@X`Steven Chanin2009-12-26+u-!@X`Gabe Da Silveira2009-12-27)t)!@X`Scott Herscher2009-12-28&s#!@X`Rohit Khare2009-12-28 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{QRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ]{R!sEX.]('!@X`Joel Franusic2009-12-14#!@X`Sam Odio2009-12-15&#!@X`Lecole Cole2009-12-15*+!@X`Ralph Pursifull2009-12-16'%!@@ =pRandal South2009-12-16'%!@X`Randy Thelen2009-12-16&#!@X`Jason Abele2009-12-16('!@X`Keith Randall2009-12-1607!@X`Prasanth Ramachandran2009-12-164?!# =qTransfer to Dojo Checking2009-12-17,/!@X`Kaelin Colclasure2009-12-17+-!@X`Teshager Tesfaye2009-12-18('!@X`Andrew Benton2009-12-18'%!@X`Laura Klemme2009-12-18+-!@X`Chris Countryman2009-12-18('!@X`Timothy Burks2009-12-18. 3!@X`Benjamin Silbermann2009-12-19& #!@X`Andrew Chen2009-12-19% !!@X`Don Peters2009-12-19* +!@"\(Justin Mccarthy2009-12-20- 1!@X`Katherine Levinson2009-12-20 VvL#uL yQ*}V$3!@X`Ton Luong2009-12-10*2+!@X`Dave Koberstein2009-12-10%1!!@X`Mike Lundy2009-12-10(0'!@X`Theodore Reed2009-12-10*/+!@X`Carlos Mcevilly2009-12-10$.!@X`Danny Roa2009-12-11%-!!@Ch\)Adam Smith2009-12-11*,+!@X Martin Williams2009-12-11++-!@Ch\)Caryl Westerberg2009-12-11!*!@X`Fred T2009-12-11%)!!@X`Moorthi Pv2009-12-12)()!@X`Michael Rooney2009-12-12&'#!@X`Bill Rainey2009-12-12'&%!@X`Scott Haines2009-12-12(%'!@X`Jesse Andrews2009-12-12($'!@X`Brian Johnson2009-12-13+#-!@X`Sachenka Mezzich2009-12-13&"#!@X`Alan Keefer2009-12-13'!%!@X`Anurag Gupta2009-12-13, /!@X`Christopher Rasch2009-12-13,/!@X`Erik Brynjolfsson2009-12-13))!@X`Andrew Wooster2009-12-13 ZP'tFpF"Z&I#!@XLLaura Rubin2009-12-01'H%!@XLTom Harrison2009-12-02 G!@XLNinua2009-12-02$F!@XLMax Hodak2009-12-02(E'!@XLMariya Genzel2009-12-02!D!>LPayPal2009-12-02'C%!@XLFist In Hand2009-12-03#B!@XLJim Puls2009-12-03)A)!@X`Allison Miller2009-12-04$@!@X`Matt Heck2009-12-05/?C!dTransfer from Dojo Checking2009-12-05(>'!@X`Mike Liebhold2009-12-05+=-!@X`Mark Hartenstein2009-12-05&<#!@X`Otavio Good2009-12-054;?!fffffTransfer to Dojo Checking2009-12-06$:!@X`Adamsmith2009-12-06)9)!@X`Nathan Schmidt2009-12-06&8#!@X`Daniel Kwon2009-12-07,7/!@X Michael Yamashita2009-12-08*6+!@X`Matthew Hancher2009-12-08(5'!@X`Greg Makowski2009-12-09&4#!@X`Amit Sarkar2009-12-09 6vK sIyR(_6&`#!@XLCarlos Puig2009-11-28#_!@XLHats Llc2009-11-28&^#!@XLRohit Khare2009-11-28&]#!@XLIsocket Llc2009-11-28&\#!@XLDavid Mills2009-11-28%[!!@XLAndy Smith2009-11-29'Z%!@XLKenneth Laws2009-11-29$Y!@XLJason May2009-11-29#X!@XLRuss Fan2009-11-29'W%!@XLDennis Wingo2009-11-29$V!@XLBill Ward2009-11-29)U)!@XLNathan Saichek2009-11-29*T+!@XLCharles Merriam2009-11-29'S%!@XLTimothy Fitz2009-11-29'R%!@XLEdward Leake2009-11-29'Q%!@XLTyler Neylon2009-11-30(P'!@XLJohn Hamilton2009-11-30+O-!@XLJelena Jovanovic2009-11-30(N'!@XLDon Macaskill2009-11-30(M'!@XLMike Trinkala2009-12-01-L1!@XLFrederick Kautz Iv2009-12-01(K'!@XLAdam Glickman2009-12-01,J/!@XLNahlyee Van Brunt2009-12-01 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{      :i=a9]3a:$v!@XLJose Zero2009-11-22%u!!@XLChip Vanek2009-11-22$t!@XLPrgmr Com2009-11-22%s!!@XLJames Auer2009-11-22+r-!@XLGordon Mccreight2009-11-23*q+!@XLChingchun Chien2009-11-23'p%!@XLAppcelerator2009-11-24,o/!@XLJessy Cowan Sharp2009-11-24$n!@XLSing Wong2009-11-24)m)!@XLNat C Voorhies2009-11-25&l#!@XLWill Bunker2009-11-25.k3!@XLElizabeth Streckert2009-11-25%j!!@XLAjay Kamat2009-11-25+i-!@XLJ Patrick Bedell2009-11-25+h-!@XLChris Countryman2009-11-26(g'!@XLSteven Chanin2009-11-26+f-!@XLGabe Da Silveira2009-11-27$e!@XLDon Drake2009-11-27)d)!@XLBrady Mitchell2009-11-28*c+!@XLMartin Williams2009-11-28;bM!@XLFountainblue Consulting Services2009-11-28)a)!@XLScott Herscher2009-11-28 G~T*uMsEtG* +!@XLRalph Pursifull2009-11-16$ !@XLRon Smith2009-11-16& #!@XLJason Abele2009-11-16' %!@XLJames Mannix2009-11-16,/!@XLKaelin Colclasure2009-11-17%/!Kaelin Colclasure2009-11-17+-!@XLTeshager Tesfaye2009-11-18('!@XLTimothy Burks2009-11-18'%!@XLLaura Klemme2009-11-18('!@XLTheodore Reed2009-11-18&#!@XLAndrew Chen2009-11-19.3!@XLBenjamin Silbermann2009-11-19%!!@XLDon Peters2009-11-194?!u\)Transfer to Dojo Checking2009-11-19-~1!@XLKatherine Levinson2009-11-20$}!@XLSonicswap2009-11-21$|!@XLSonicswap2009-11-21'{%!@XLRichard Kiss2009-11-21'z%!@XLAndrew Evans2009-11-21$y!@XLSonicswap2009-11-21-x1!@XLMichael Rosenblatt2009-11-21(w'!@XLChris Agerton2009-11-22 >xO)yJvJf>%"!!@X333333Mike Lundy2009-11-10*!+!@X333333Dave Koberstein2009-11-10* +!@XLCarlos Mcevilly2009-11-104?!\(Transfer to Dojo Checking2009-11-11$!@X333333Danny Roa2009-11-11))!@X333333Michael Rooney2009-11-12))!@'!@X333333Don Macaskill2009-10-30'=%!@X333333Tyler Neylon2009-10-30'<%!@X333333Timothy Fitz2009-10-30,;/!@X333333Nahlyee Van Brunt2009-10-30(:'!@X333333John Hamilton2009-10-30 bRRY`gnu|$+29@GNU\cjqx  '.5<CJQX_fmt{ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwx ?mB ].V/f?$e!@X333333Sonicswap2009-10-21$d!@X333333Sonicswap2009-10-21(c'!@X333333Chris Agerton2009-10-22$b!@X333333Prgmr Com2009-10-22%a!!@X333333Chip Vanek2009-10-22%`!!@X333333James Auer2009-10-22$_!@X333333Jose Zero2009-10-22+^-!@X333333Gordon Mccreight2009-10-23*]+!@X333333Chingchun Chien2009-10-23$\!@X333333Sing Wong2009-10-24'[%!@X333333Appcelerator2009-10-24)Z)!@"RHans Henriquez2009-10-24,Y/!@X333333Jessy Cowan Sharp2009-10-24)X)!@X333333Nat C Voorhies2009-10-25.W3!@X333333Elizabeth Streckert2009-10-25&V#!@X333333Will Bunker2009-10-25%U!!@X333333Ajay Kamat2009-10-254T?!|QTransfer to Dojo Checking2009-10-25(S'!@X333333Steven Chanin2009-10-26+R-!@X333333Gabe Da Silveira2009-10-27$Q!@X333333Don Drake2009-10-27;PM!@X333333Fountainblue Consulting Services2009-10-28 \|S+yK!wH$~\{!!Check 10282010-07-21%z!!@(\VistaPrint2010-07-26%y!!1p =VistaPrint2010-07-26%x!!vfffffCheck 10522010-07-28+w-!dfffffSpeakeasy Wa Mcc2010-08-02!v!p$(\Costco2010-08-05,u/!C\(\Fry's Electronics2010-08-05*t+!@(lInitial Balance2009-10-16's%!@X333333Randy Thelen2009-10-16!r'!Drew Perttula2009-10-16,q/!@X333333Kaelin Colclasure2009-10-17'p%!@X333333Laura Klemme2009-10-18+o-!@X333333Chris Countryman2009-10-18(n'!@X333333Timothy Burks2009-10-18+m-!@X333333Teshager Tesfaye2009-10-18.l3!@X333333Benjamin Silbermann2009-10-19%k!!@X333333Don Peters2009-10-19%j/!Kaelin Colclasure2009-10-19&i#!@X333333Andrew Chen2009-10-19-h1!@X333333Katherine Levinson2009-10-20'g%!@X333333Richard Kiss2009-10-21'f%!@X333333Andrew Evans2009-10-21 TTT)h=b> ,|;!HTim Gruyes Recurringxxx2010-07-2119!(\Pacific Gas & Electric2010-05-19,;!HTim Gruyes Recurringnot2010-05-21!!T3 =pAmazon2010-05-241E!@Transfer from PayPal Balance2010-05-25! !V\(Costco2010-05-26+ -!dfffffSpeakeasy Wa Mcc2010-06-01) )!3ROrchard Supply2010-06-08! !1G{Amazon2010-06-15, ;!HTim Gruyes Recurringxxx2010-06-22+-!dfffffSpeakeasy Wa Mcc2010-07-01(3!6Paypal Transfer Saj2010-07-02#+!Dri Www Element2010-07-06!!CQCostco2010-07-12!!ffffffCostco2010-07-12!!Check 10262010-07-15.3!@WEQPaypal Transfer Saj2010-07-16('!SzGRobot Shop Cd2010-07-16('!\(International2010-07-16!!Check 10512010-07-19(~3!#(Paypal Transfer Saj2010-07-211}9!azHPacific Gas & Electric2010-07-21 @_: @l;d0o,;!HTim Gruyes Recurringnot2010-04-21%(!!Check 10202010-03-19'!Deposit2010-03-22%&-!ATM Cash Deposit2010-03-22 %#!,ATM Deposit2010-03-22,$;!HTim Gruyes Recurringnot2010/03/231#9!(\Pacific Gas & Electric2010-03-237"E!@\(Transfer from PayPal Balance2010-03-25!!Wal-Mart2010-03-29% -!ATM Cash Deposit2010-03-31+-!dfffffSpeakeasy Wa Mcc2010-03-31%-!ATM Cash Deposit2010-04-08.3!@*fffffPaypal Transfer Saj2010-04-13!!tQCostco2010-04-14!!Check 10242010-04-1519!\(Pacific Gas & Electric2010-04-19 #! ATM Deposit2010-04-23.3!@f=pPaypal Transfer Saj2010-04-26"!+\(Safeway2010-04-26+-!dfffffSpeakeasy Wa Mcc2010-05-03%!!e (\VistaPrint2010-05-10!!DCheck 10222010-05-11&1!Rewards Annual Fee2010-05-17 T$+29@GNU\cjqx  '.5<CJQX_fmt{z{|}~ BpLBR*Y%q,0;!HTim Gruyes Recurringnot2010-02-237<E!@AG{Transfer from PayPal Balance2010-01-19.;3!ft(\Industrial Lock Svc2010-01-19%:!!\(Check 10182010-01-199!*.zGCVS2010-01-19189! =pPacific Gas & Electric2010-01-21,7;!HTim Gruyes Recurringnot2010-01-2176E!@pp Transfer from PayPal Balance2010-01-27+5-!c =pSpeakeasy Wa Mcc2010-02-0174E!@QGzTransfer from PayPal Balance2010-02-04%3/!Online Dep Detail2010-02-0872E!@zHTransfer from PayPal Balance2010-02-16119!QPacific Gas & Electric2010-02-16!/!VQLowe's2010-02-25+.-!vw33333Speakeasy Wa Mcc2010-03-037-E!@Transfer from PayPal Balance2010-03-03!,!U<(\Costco2010-03-051+E! Transfer from PayPal Balance2010-03-10*!!Check 10192010-03-117)E!@p(Transfer from PayPal Balance2010-03-17 LW)L lH$b@{,B;!HTim Gruyes Recurringnot2009-12-22*S+!jJG{Yang Chung Line2009-12-02.RA!Transfer to PayPal Balance2009-12-03*Q+!(\(\Jack in the Box2009-12-077PE!@fffffTransfer from PayPal Balance2009-12-08O!!HCheck 10152009-12-08N!!Check 10112009-12-08M!!Check 10162009-12-091L9!|zGPacific Gas & Electric2009-12-11$K-!'ATM Cash Deposit2009-12-16 J#!%ATM Deposit2009-12-16!I'!2Pur Rtrn Home2009-12-17!H!k\)Costco2009-12-187GE!@# =qTransfer from PayPal Balance2009-12-18!F!UQCostco2009-12-18"E!7\(Safeway2009-12-21D!Return2009-12-21C!Return2009-12-21+A-!c =pSpeakeasy Wa Mcc2009-12-317@E!@yTransfer from PayPal Balance2010-01-04%?-!ATM Cash Deposit2010-01-13%>!!Y!RCheck 10172010-01-14=!Deposit2010-01-19 8])nF Z5W8j!CDeposit2009-10-201i9!QPacific Gas & Electric2009-10-20"h! \(Kinko's2009-10-21"g!\(\Kinko's2009-10-237fE!@|QTransfer from PayPal Balance2009-10-27#e!(\)Nob Hill2009-10-27"d)!Sou Home Desou2009-10-29'c3!Monthly Service Fee2009-10-30b!!HCheck 10092009-11-02%a!!Z\(Check 10072009-11-02+`-!c =pSpeakeasy Wa Mcc2009-11-02!_!LzGCostco2009-11-03#^!+B\(Rite Aid2009-11-03%]-!Google Bp Settle2009-11-03\!Deposit2009-11-137[E!@\(Transfer from PayPal Balance2009-11-13%Z!!W$zGCheck 10102009-11-167YE!@u\)Transfer from PayPal Balance2009-11-201X9!33333Pacific Gas & Electric2009-11-24%W!!Pp =qCheck 10132009-11-27(V'!MzG{Smart & Final2009-11-30+U-!c =pSpeakeasy Wa Mcc2009-12-01T!USPS2009-12-01 9vN&Z7fDj9.3!@=p Paypal Transfer Saj2009-09-23!$=p =USPS2009-09-23%!!j=p Check 10012009-09-24!!Check 10022009-09-25%~!!Q Check 10032009-09-25}!Check2009-09-28'|3!Monthly Service Fee2009-09-30{!USPS2009-10-01.z3!@dPaypal Transfer Saj2009-10-01+y-!c =pSpeakeasy Wa Mcc2009-10-01%x-!Google Bp Settle2009-10-02w!!Check 10052009-10-05%v!!R33333Check 10042009-10-06 u#! ATM Deposit2009-10-06&t#!@@=p ATM Deposit2009-10-06$s-!oATM Cash Deposit2009-10-06r!Check2009-10-08/q5!@4\(Pur Rtrn Smartnfinal2009-10-09+p-!@9YPur Rtrn Diddams2009-10-14%o!!T|(\Check 10062009-10-15%n-!Golden Eagle Ins2009-10-16.m3!@QPaypal Transfer Saj2009-10-16.l3!d|(\Industrial Lock Svc2009-10-19%k!!l1GzCheck 10082009-10-19 BW3lAwIsB.3!@33333Paypal Transfer Saj2009-09-02!Check2009-09-04('!a+33333Pacific Coast2009-09-08.3!@&fffffPaypal Transfer Saj2009-09-08+-!s| =qSpeakeasy Wa Mcc2009-09-08,/!S,Fry's Electronics2009-09-10+9!Pacific Gas & Electric2009-09-14$+!VDeposit Made In2009-09-14#!Nob Hill2009-09-18"!W'zHKinko's2009-09-18('!@=p Jo-Ann Stores2009-09-21*7!oStuart Rental Company2009-09-21( '!6\(Smart & Final2009-09-21& #!\GzHDiddams Mcc2009-09-21& #!VzGDiddams Mcc2009-09-21( 5!KWIK Key Lock & Safe2009-09-21" !QSafeway2009-09-21"!OEQSafeway2009-09-21!!rRCostco2009-09-21-1![NQSou Orchard Supsou2009-09-22))!F+QOrchard Supply2009-09-22-1!HzGHarland Clarke Acc2009-09-22!Check2009-09-22 cKx  '.5<CJQX_fmt{qjc\UNG@92+$|ung`YRK10/.-,+*)('&%$#"!       SyHtV2~[7 S*0+!@g\Initial Balance2009-07-29'/1!Withdrawal Made In2009-07-29..3!@fffffPaypal Transfer Saj2009-07-29--1!PwzHSou Orchard Supsou2009-07-30),)!Ww =pSou Home Desou2009-08-03!+!gÅQCostco2009-08-03 *#!ATM Deposit2009-08-13)!Lowe's2009-08-13.(3!@fffffPaypal Transfer Saj2009-08-131'9!m\(Pacific Gas & Electric2009-08-17.&3!@&fffffPaypal Transfer Saj2009-08-17!%%! Transfer Sav2009-08-19$!?Deposit2009-08-19)#)!CٙSou Home Desou2009-08-24("'!SfffffSmart & Final2009-08-24$!-!}ATM Cash Deposit2009-08-24$ -! ATM Cash Deposit2009-08-24,/!cp =Fry's Electronics2009-08-24.3!@=p Paypal Transfer Saj2009-08-26#)!(Pur Rtrn Lowes2009-08-26!QUSPS2009-08-28!`Check2009-08-31!USPS2009-09-01 *1+!mQInitial balance2010-08-11wxbanker-0.9.1/wxbanker/data/fixtures/comdirect.csv0000644000175000017500000000233112243601243022371 0ustar mrooneymrooney "comdirect bank AG" "UMSTZE: MAX MUSTERMANN" "Erstellt am: 10.03.2010, 10:40 Uhr" "Kunden-Nummer:";"1234567" "BLZ:";"20041234" "Kontostand (Girokonto):";"1.234,56 EUR" "Kontostand (VR-Konto):";"0,00 EUR" "Umstze Girokonto";" - Zeitraum: 90 Tage" "Neuer Kontostand";"+1.234,56" "Buchungstag";"Valuta";"Vorgang";"Buchungstext";"Umsatz in EUR" "09.03.2010";"09.03.2010";"Lastschrift Einzug";"Auftraggeber: FOO.DE Buchungstext: FOO.DE 12345467891234 Ref. AB123456789/00000 ";"-20,42" "09.03.2010";"09.03.2010";"bertrag/berweisung";"Auftraggeber: Max Mustermann Buchungstext: Max Mustermann ABCD1234";"190,00" "08.03.2010";"08.03.2010";"Lastschrift Einzug";"Auftraggeber: XYZ SAGT DANKE Buchungstext: XYZ SAGT DANKE EC 123456789 06.03 14.53 CE0 Ref. ABCDFER213456789/1480 ";"-32,27" "05.03.2010";"05.03.2010";"bertrag/berweisung";"Empfnger: Max Mustermann Kto/IBAN: 123456789 BLZ/BIC: 123456789 Buchungstext: MAX MUSTERMANN COMDIREKT BERTRAG AUF ";"-1500,00" "05.03.2010";"05.03.2010";"Kontobertrag";"Auftraggeber: Mustermann, Max Kto/IBAN: 123456789 BLZ/BIC: 123456789 Buchungstext: MUSTERMANN, MAX BERTRAG AUF GIROKONTO KDN-REF 123456789 Ref. ABCDFER213456789/1 ";"1500,00" "Alter Kontostand";"+2.345,67" wxbanker-0.9.1/wxbanker/data/fixtures/mint.csv0000644000175000017500000000055412243601243021374 0ustar mrooneymrooneyDate,Description,Original Description,Amount,Transaction Type,Category,Account Name,Labels,Notes 7/21/2009,Teavana San Mateo,TEAVANA #40 SAN MATEO CA07/19TEAVANA #,3.27,debit,Coffee Shops,CHASE CHECKING,, 7/20/2009,Trader Joe's,TRADER JOE'S # 067 SAN M07/17TRADER JO,5.48,debit,Groceries,CHASE CHECKING,, 7/17/2009,Work,Work,38.21,credit,Paycheck,CHASE CHECKING,, wxbanker-0.9.1/wxbanker/data/fixtures/Sparkasse.csv0000644000175000017500000000150312243601243022354 0ustar mrooneymrooney"Auftragskonto";"Buchungstag";"Valutadatum";"Buchungstext";"Verwendungszweck";"Beg�nstigter/Zahlungspflichtiger";"Kontonummer";"BLZ";"Betrag";"W�hrung";"Info" 123456789;20.07.09;20.07.09;"GELDAUTOMAT";"19.07/00.09UHR PLATZ-PL EUR 100,00";"GA NR00002327 BLZ36050105 3";900012345;36051234;-100;"EUR";"Umsatz gebucht" 123456789;17.07.09;17.07.09;"LASTSCHRIFT";"###";"PHONE CORP";12345;70021234;-31,24;"EUR";"Umsatz gebucht" 123456789;16.07.09;16.07.09;"SONSTIGER EINZUG";"EC 10000123 15.07 12.15 CE3";"SHELL 1234 GOCKEL";16412345;50231234;-36,5;"EUR";"Umsatz gebucht" 123456789;15.07.09;15.07.09;"LASTSCHRIFT";"61/50/123123 RAP 15.07.09";"BLA";1234567;37021234;-103;"EUR";"Umsatz gebucht" 123456789;14.07.09;14.07.09;"SONSTIGER EINZUG";"EC 16013123 13.07 16.39 CE3";"BLUB SAGT DANKE";1234567;43041234;-50;"EUR";"Umsatz gebucht" wxbanker-0.9.1/wxbanker/data/pstats_viewer.py0000644000175000017500000001714112243601243021310 0ustar mrooneymrooneyfrom BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler from functools import partial from StringIO import StringIO import os.path import pstats import sys import re import threading import traceback import time import urlparse import webbrowser PORT = 4040 def htmlquote(fn): return fn.replace('&', '&').replace('<', '<').replace('>', '>') def shrink(s): if len(s) < 40: return s return s[:20] + '...' + s[-20:] def formatfunc(func): file, line, func_name = func return '%s:%s:%s' % (os.path.basename(file), line, htmlquote(shrink(func_name))) def formatTime(dt): return '%.2fs' % dt def formatTimeAndPercent(dt, total): percent = "(%.1f%%)" % (100.0 * dt / total) if percent == '(0.0%)': percent = '' return '%s %s' % (formatTime(dt), percent) def wrapTag(tag, body): return '<%s>%s' % (tag, body, tag) class MyHandler(BaseHTTPRequestHandler): def __init__(self, stats=None, *args, **kw): self.stats = stats self.stats.stream = StringIO() self.stats.calc_callees() self.total_time = self.stats.total_tt (self.filename,) = self.stats.files self.width, self.print_list = self.stats.get_print_list(()) self.func_to_id = {} self.id_to_func = {} i = 0 for func in self.print_list: self.id_to_func[i] = func self.func_to_id[func] = i i += 1 BaseHTTPRequestHandler.__init__(self, *args, **kw) def do_GET(self): path, query = urlparse.urlsplit(self.path)[2:4] self.query = {} for elt in query.split(';'): if not elt: continue key, value = elt.split('=', 1) self.query[key] = value for methodName in dir(self): method = getattr(self, methodName) if method.__doc__ is None: continue if method.__doc__.startswith('handle:'): handle, path_re = method.__doc__.split(':') path_re = path_re.strip() mo = re.match(path_re, path) if mo is None: #print 'did not handle %s with %s' % (path, path_re) continue print 'handling %s with %s (%s)', (path, path_re, mo.groups()) try: temp = StringIO() original_wfile = self.wfile self.wfile = temp try: method(*mo.groups()) finally: self.wfile = original_wfile self.send_response(200) self.send_header('Content-Type', 'text/html') self.send_header('Cache-Control', 'no-cache') self.end_headers() self.wfile.write(temp.getvalue()) except Exception: self.send_response(500) self.send_header('Content-Type', 'text/plain') self.end_headers() traceback.print_exc(file=self.wfile) return print 'no handler for %s' % path self.send_response(404) def getFunctionLink(self, func): _, _, func_name = func title = func_name return '%s' % (title, self.func_to_id[func], formatfunc(func)) def index(self): 'handle: /$' table = [] sort_index = ['cc', 'nc', 'tt', 'ct'].index(self.query.get('sort', 'ct')) print 'sort_index', sort_index self.print_list.sort( key=lambda func: self.stats.stats[func][sort_index], reverse=True) for func in self.print_list: file, line, func_name = func primitive_calls, total_calls, exclusive_time, inclusive_time, callers = self.stats.stats[func] row = wrapTag('tr', ''.join(wrapTag('td', cell) for cell in ( self.getFunctionLink(func), formatTimeAndPercent(exclusive_time, self.total_time), formatTimeAndPercent(inclusive_time, self.total_time), primitive_calls, total_calls, formatTime(exclusive_time / primitive_calls), formatTime(inclusive_time / primitive_calls)))) table.append(row) data = '''\

%s

  • Total time: %s
%s
file:line:function exclusive time inclusive time primitive calls total calls exclusive per call inclusive per call
''' % (self.filename, formatTime(self.total_time), '\n'.join(table)) self.wfile.write(data) def func(self, id): 'handle: /func/(.*)$' func_id = int(id) func = self.id_to_func[func_id] f_cc, f_nc, f_tt, f_ct, callers = self.stats.stats[func] callees = self.stats.all_callees[func] def sortedByInclusive(items): sortable = [(ct, (f, (cc, nc, tt, ct))) for f, (cc, nc, tt, ct) in items] return [y for x, y in reversed(sorted(sortable))] def buildFunctionTable(items): callersTable = [] for caller, (cc, nc, tt, ct) in sortedByInclusive(items): callersTable.append(wrapTag('tr', ''.join(wrapTag('td', cell) for cell in ( self.getFunctionLink(caller), formatTimeAndPercent(tt, self.total_time), formatTimeAndPercent(ct, self.total_time), cc, nc, formatTime(tt / cc), formatTime(ct / cc))))) return '\n'.join(callersTable) caller_stats = [(c, self.stats.stats[c][:4]) for c in callers] callersTable = buildFunctionTable(caller_stats) calleesTable = buildFunctionTable(callees.items()) page = '''\ Index

%s

  • Primitive calls: %s
  • Total calls: %s
  • Exclusive time: %s
  • Inclusive time: %s

Callers

%s
Function Exclusive time Inclusive time Primitive calls Total calls Exclusive per call Inclusive per call

Callees

%s
Function Exclusive time Inclusive time Primitive calls Total calls Exclusive per call Inclusive per call
''' % (formatfunc(func), f_cc, f_nc, f_tt, f_ct, callersTable, calleesTable) print >> self.wfile, page def launch_browser(port): time.sleep(1) webbrowser.open('http://localhost:%s' % port) def startThread(fn): thread = threading.Thread(target=fn) thread.setDaemon(True) thread.start() return thread def main(argv): statsfile = argv[1] port = argv[2:] if port == []: port = PORT else: port = int(port[0]) stats = pstats.Stats(statsfile) httpd = HTTPServer( ('', port), lambda *a, **kw: MyHandler(stats, *a, **kw)) serve_thread = startThread(httpd.serve_forever) launch_thread = startThread(lambda: launch_browser(port)) while serve_thread.isAlive(): serve_thread.join(timeout=1) if __name__ == '__main__': main(argv=sys.argv) wxbanker-0.9.1/wxbanker/debug.py0000644000175000017500000000163612243601243016570 0ustar mrooneymrooney# https://launchpad.net/wxbanker # debug.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import sys on = "--debug" in sys.argv def debug(*args): if on: for a in args: print a, print ""wxbanker-0.9.1/wxbanker/fileservice.py0000644000175000017500000000547412243601243020006 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # fileservice.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see .% import os, sys try: import xdg from xdg import BaseDirectory except ImportError: xdg = None def __getFilePath(filename, xdgListName): # Store files in the source directory unless we can do better. path = os.path.join(os.path.dirname(__file__), filename) if not "--use-local" in sys.argv: if xdg: base = getattr(BaseDirectory, xdgListName)[0] pathdir = os.path.join(base, "wxbanker") elif "HOME" in os.environ: # We don't have XDG but we are on Unix, perhaps OSX. pathdir = os.path.join(os.environ["HOME"], ".wxbanker") elif "APPDATA" in os.environ: # Windows! appdata = os.environ["APPDATA"] if type(appdata) != unicode: import locale appdata = unicode(appdata, locale.getlocale()[1]) pathdir = os.path.join(appdata, "wxbanker") else: raise Exception("Unable to find a home for user data!") # Create the directory if it doesn't exist if not os.path.exists(pathdir): os.makedirs(pathdir) # mkdirs = mkdir -p, since ~/.config might not exist. path = os.path.join(pathdir, filename) return path def getDataFilePath(filename): return __getFilePath(filename, xdgListName="xdg_data_dirs") def getConfigFilePath(filename): return __getFilePath(filename, xdgListName="xdg_config_dirs") def getSharedFilePath(*pathargs): paths = [ # The COPYRIGHT.txt is one directory up in source. os.path.join(os.path.dirname(os.path.dirname(__file__))), os.path.join(os.path.dirname(__file__), "data"), "/usr/local/share/wxbanker", "/usr/share/wxbanker", ] for path in paths: potentialLocation = os.path.join(path, *pathargs) if os.path.exists(potentialLocation): return potentialLocation raise Exception("Unable to find shared data file '%s'. Looked in %s" % (pathargs, paths)) wxbanker-0.9.1/wxbanker/helpers.py0000644000175000017500000000224012243601243017134 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # helpers.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx, datetime, time def pydate2wxdate(date): tt = date.timetuple() dmy = (tt[2], tt[1]-1, tt[0]) return wx.DateTimeFromDMY(*dmy) def wxdate2pydate(date): return datetime.date(date.Year, date.Month+1, date.Day) class Timer(): def __enter__(self): self.start = time.time() def __exit__(self, *args): print time.time() - self.startwxbanker-0.9.1/wxbanker/lib/0000755000175000017500000000000012243601243015670 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/lib/__init__.py0000644000175000017500000000000012243601243017767 0ustar mrooneymrooneywxbanker-0.9.1/wxbanker/lib/mint/0000755000175000017500000000000012243601243016637 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/lib/mint/__init__.py0000644000175000017500000000000012243601243020736 0ustar mrooneymrooneywxbanker-0.9.1/wxbanker/lib/mint/api.py0000644000175000017500000000413312243601243017763 0ustar mrooneymrooneyfrom cookielib import CookieJar, DefaultCookiePolicy import json import urllib2, urllib from pyquery import PyQuery as pq def enable_cookies(): cj = CookieJar(DefaultCookiePolicy(rfc2965=True)) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) def url_get(url, postVars=None): try: con = urllib2.urlopen(url, postVars) except Exception: result = None else: result = con.read() return result def url_post(url, varDict): return url_get(url, urllib.urlencode(varDict)) def get_accounts(email, password): enable_cookies() # login post_args = {"username": email, "password": password, "task": "L", "nextPage": ""} response = url_post("https://wwws.mint.com/loginUserSubmit.xevent", post_args) if "javascript-token" not in response.lower(): raise Exception("Mint.com login failed") # grab token d = pq(response) token = d("input#javascript-token")[0].value # issue service request request_id = "115485" # magic number? random number? post_args = {"input": json.dumps([ {"args": { "types": [ "BANK", "CREDIT", "INVESTMENT", "LOAN", "MORTGAGE", "OTHER_PROPERTY", "REAL_ESTATE", "VEHICLE", "UNCLASSIFIED" ] }, "id": request_id, "service": "MintAccountService", "task": "getAccountsSorted"} ])} json_response = url_post("https://wwws.mint.com/bundledServiceController.xevent?token="+token, post_args) response = json.loads(json_response)["response"] # turn into correct format accounts = response[request_id]["response"] return accounts if __name__ == "__main__": import getpass, sys if len(sys.argv) >= 3: email, password = sys.argv[1:] else: email = raw_input("Mint email: ") password = getpass.getpass("Password: ") accounts = get_accounts(email, password) print json.dumps(accounts, indent=2) wxbanker-0.9.1/wxbanker/localization.py0000644000175000017500000000422112243601243020163 0ustar mrooneymrooney# https://launchpad.net/wxbanker # localization.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . # Set the locale to the system default. import locale, os, gettext, sys, wx locale.setlocale(locale.LC_ALL, '') # Define the domain and localedir. APP = 'wxbanker' # Figure out the directory... if os.path.exists('/usr/share/locale/es/LC_MESSAGES/wxbanker.mo'): DIR = '/usr/share/locale' elif os.path.exists('/usr/local/share/locale/es/LC_MESSAGES/wxbanker.mo'): DIR = '/usr/local/share/locale' else: DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'locale') # Install gettext. gettext.install(APP, DIR, unicode=True) wxlang = wx.LANGUAGE_DEFAULT # Check if the user forced a language with --lang=XX. larg = '--lang=' for arg in sys.argv[1:]: if arg.startswith(larg): lang = arg[len(larg):] trans = gettext.translation(APP, DIR, languages=[lang]) trans.install() # Attempt to localize wx with this language as well. if lang.lower().endswith(".utf8"): lang = lang[:-5] # Strip that off for wx. pylang = wx.Locale.FindLanguageInfo(lang) if pylang: wxlang = pylang.Language break def initWxLocale(): """ Initialize the wxPython locale so stock strings are translated. Call this AFTER the wx.App is initialized to avoid crashes. """ # Store it as a module variable so it doesn't go out of scope! global wxlocale wxlocale = wx.Locale(wxlang) wxbanker-0.9.1/wxbanker/main.py0000644000175000017500000002314612243601243016426 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # wxbanker.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import os # wxPython try: import wxversion except ImportError: # Maybe we don't have wxversion but still have wx >= 2.8? import wx, wx.aui else: # Okay, let's try to get >= 2.8 wxversion.ensureMinimal("2.8") import wx, wx.aui # Handle PubSub API change in 2.9.4.0 try: import wx.lib.pubsub.setupv1 except ImportError: pass from wx.lib.pubsub import Publisher # wxBanker from wxbanker.menubar import BankMenuBar from wxbanker.brandedframe import BrandedFrame from wxbanker import localization, messagepanel, debug from wxbanker import managetab class BankerPanel(wx.Panel): def __init__(self, parent, bankController): wx.Panel.__init__(self, parent) self.bankController = bankController self.mainPanel = managetab.MainPanel(self, bankController) Publisher.subscribe(self.onRecurringTransactionAdded, "recurringtransaction.created") Publisher.subscribe(self.onRecurringTransactionUpdated, "recurringtransaction.updated") self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(self.mainPanel, 1, wx.EXPAND) wx.CallLater(1000, self.CheckRecurringTransactions) def AddMessagePanel(self, panel): self.Sizer.Insert(0, panel, 0, wx.EXPAND) self.Layout() def onRecurringTransactionUpdated(self, message): # If a recurring transaction was updated, perhaps there are more to enter. self.CheckRecurringTransactions() def CheckRecurringTransactions(self): recurrings = self.bankController.Model.GetRecurringTransactions() # Figure out how many due recurring transactions there are. untransacted = [] totalTransactions = 0 for recurring in recurrings: dates = recurring.GetUntransactedDates() if dates: untransacted.append((recurring, dates)) totalTransactions += len(dates) # If there aren't any untransacted transactions, we are done. if not untransacted: return 0 # Generate an appropriate message. lines = [] if len(untransacted) == 1: recurring, dates = untransacted[0] message = _('The recurring transaction "%(description)s" has %(num)i transactions ready for %(amount)s on %(datelist)s.') amount = recurring.RenderAmount() datelist = ", ".join([str(d) for d in dates]) message = message % {'description': recurring.Description, 'amount': amount, 'num': len(dates), 'datelist': datelist} else: message = _('%(num)i recurring transactions have a total of %(totalnum)i transactions ready.') message = message % {'num': len(untransacted), 'totalnum': totalTransactions} for recurring, dates in untransacted: lines.append(recurring.GetDueString()) # Create the message panel. mpanel = messagepanel.MessagePanel(self, message) # If there are lines to display, add the button and callback if lines: mpanel.AddLines(lines) mpanel.PushButton(_("Preview"), mpanel.ToggleLines) # Create the callback to perform the transactions. def performer(event=None): for recurring, dates in untransacted: recurring.PerformTransactions() mpanel.Dismiss() # Add a button which will enter the transactions on a click. mpanel.PushButton(_("Perform"), performer) # Show the message. self.AddMessagePanel(mpanel) return len(recurrings) def onRecurringTransactionAdded(self, message): account, recurring = message.data dates = recurring.GetUntransactedDates() # If there are transactions due, inform the user via the normal route. if dates: self.CheckRecurringTransactions() # Otherwise, just inform the user it was added, and the first date. else: message = _("Recurring transaction successfully added.") firstDate = recurring.GetNext() message += " " + _("The first transaction will occur on %(date)s") % {"date": firstDate} mpanel = messagepanel.MessagePanel(self, message) self.AddMessagePanel(mpanel) class BankerFrame(BrandedFrame): def __init__(self, bankController, welcome): # Load our window settings. config = wx.Config.Get() size = config.ReadInt('SIZE_X'), config.ReadInt('SIZE_Y') pos = config.ReadInt('POS_X'), config.ReadInt('POS_Y') BrandedFrame.__init__(self, None, title="wxBanker", size=size, pos=pos) self.Panel = BankerPanel(self, bankController) Publisher.subscribe(self.onQuit, "quit") Publisher.subscribe(self.onWarning, "warning") if welcome: Publisher.subscribe(self.onFirstRun, "first run") self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_MOVE, self.OnMove) self.Bind(wx.EVT_CLOSE, self.OnClose) menuBar = BankMenuBar(bankController) self.SetMenuBar(menuBar) #self.CreateStatusBar() self.Bind(wx.EVT_MENU, menuBar.onMenuEvent) def OnMove(self, event): config = wx.Config.Get() x, y = self.GetPosition() config.WriteInt("POS_X", x) config.WriteInt("POS_Y", y) event.Skip() def OnSize(self, event): config = wx.Config.Get() if not self.IsMaximized(): x, y = self.GetSize() config.WriteInt('SIZE_X', x) config.WriteInt('SIZE_Y', y) config.WriteBool('IsMaximized', self.IsMaximized()) event.Skip() def OnClose(self, event): """This gets called on Alt+F4.""" event.Skip() # This must be first, so handlers can override it. Publisher.sendMessage("exiting", event) def onQuit(self, message): """The subscriber to the pubsub event which anyone can trigger.""" # This will trigger the event, triggering OnClose above. self.Close() def onFirstRun(self, message): welcomeMsg = _("It looks like this is your first time using wxBanker!") welcomeMsg += "\n\n" + _("To get started, add an account using the account control in the top left corner.") welcomeMsg += " " + _("The buttons in the account control allow you to add, rename, configure, and remove an account, respectively.") welcomeMsg += "\n\n" + _("Once you have created an account you can add transactions to it (such as your initial balance) using the controls below the grid on the bottom right.") welcomeMsg += "\n\n" + _("Have fun!") #wx.TipWindow(self, welcomeMsg, maxLength=300) dlg = wx.MessageDialog(self, welcomeMsg, _("Welcome!"), style=wx.OK|wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def onWarning(self, message): warning = message.topic[1] if warning == "dirty exit": event = message.data title = _("Save changes?") msg = _("You have made changes since the last save. Would you like to save before exiting?") msg += "\n\n" + _("Note that enabling auto-save from the File menu will eliminate the need for manual saving.") dlg = wx.MessageDialog(self, msg, title, style=wx.CANCEL|wx.YES_NO|wx.ICON_WARNING) result = dlg.ShowModal() if result == wx.ID_YES: Publisher.sendMessage("user.saved") elif result == wx.ID_CANCEL: # The user cancelled the close, so cancel the event skip. event.Skip(False) dlg.Destroy() def init(path=None, welcome=True): import wx, sys from wxbanker import fileservice from wxbanker.controller import Controller bankController = Controller(path) # We can initialize the wx locale now that the wx.App is initialized. localization.initWxLocale() # Push our custom art provider. import wx.lib.art.img2pyartprov as img2pyartprov from wxbanker.art import silk, transparent for provider in (silk, transparent): wx.ArtProvider.Push(img2pyartprov.Img2PyArtProvider(provider)) # Initialize the wxBanker frame! frame = BankerFrame(bankController, welcome) # Greet the user if it appears this is their first time using wxBanker. config = wx.Config.Get() firstTime = not config.ReadBool("RUN_BEFORE") if firstTime: Publisher.sendMessage("first run") config.WriteBool("RUN_BEFORE", True) return bankController.wxApp def main(): app = init() app.TopWindow.Show() import sys if '--inspect' in sys.argv: import wx.lib.inspection wx.lib.inspection.InspectionTool().Show() app.MainLoop() if __name__ == "__main__": main() wxbanker-0.9.1/wxbanker/managetab.py0000644000175000017500000001410712243601243017416 0ustar mrooneymrooney# https://launchpad.net/wxbanker # managetab.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx, wx.grid as gridlib import datetime from wxbanker import searchctrl, accountlistctrl, transactionctrl from wxbanker.transactionolv import TransactionOLV as TransactionCtrl from wxbanker.calculator import CollapsableWidget, SimpleCalculator from wx.lib.pubsub import Publisher from wxbanker import localization, summarytab from wxbanker.plots.plotfactory import PlotFactory class MainPanel(wx.Panel): """ This panel contains the list of accounts on the left and the transaction panel on the right. """ def __init__(self, parent, bankController): wx.Panel.__init__(self, parent) ## Left side, the account list and calculator self.leftPanel = leftPanel = wx.Panel(self) leftPanel.Sizer = wx.BoxSizer(wx.VERTICAL) self.accountCtrl = accountCtrl = accountlistctrl.AccountListCtrl(leftPanel, bankController) calcWidget = CollapsableWidget(leftPanel, SimpleCalculator, (_("Show Calculator"), _("Hide Calculator"))) leftPanel.Sizer.Add(accountCtrl, 0, wx.EXPAND) leftPanel.Sizer.AddStretchSpacer(1) leftPanel.Sizer.Add(calcWidget, 0, wx.EXPAND) # Force the calculator widget (and parent) to take on the desired size. for widget in [calcWidget.widget, leftPanel]: widget.SetMinSize((accountCtrl.BestSize[0], -1)) ## Right side, the transaction panel: self.tabPanel = TabPanel(self, bankController) self.Sizer = topSizer = wx.BoxSizer() topSizer.Add(leftPanel, 0, wx.EXPAND|wx.ALL, 5) topSizer.Add(self.tabPanel, 1, wx.EXPAND|wx.ALL, 0) # Subscribe to messages that interest us. Publisher.subscribe(self.onChangeAccount, "view.account changed") Publisher.subscribe(self.onCalculatorToggled, "CALCULATOR.TOGGLED") # Select the last-selected account. # Windows needs a delay, to work around LP #339860. wx.CallLater(50, Publisher.sendMessage, "user.account changed", bankController.Model.GetLastAccount()) self.Layout() # Ensure the calculator is displayed as desired. calcWidget.SetExpanded(wx.Config.Get().ReadBool("SHOW_CALC")) def onCalculatorToggled(self, message): """ Re-layout ourself so the calcWidget always fits properly at the bottom. """ self.leftPanel.Layout() shown = message.data == "HIDE" # backwards, HIDE means it is now shown. wx.Config.Get().WriteBool("SHOW_CALC", shown) def onChangeAccount(self, message): account = message.data self.tabPanel.transactionPanel.setAccount(account) def getCurrentAccount(self): return self.accountCtrl.GetCurrentAccount() class TabPanel(wx.Panel): def __init__(self, parent, bankController): wx.Panel.__init__(self, parent) self.bankController = bankController # The notebook self.notebook = notebook = wx.aui.AuiNotebook(self, style=wx.aui.AUI_NB_TOP) self.transactionPanel = TransactionPanel(self, bankController) notebook.AddPage(self.transactionPanel, _("Transactions")) self.currentPage = self.transactionPanel self.AddSummaryTab() self.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING, self.onTabSwitching) # Layout self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(self.notebook, 1, wx.EXPAND) def AddSummaryTab(self, factoryName=None): plotFactory = PlotFactory.getFactory(factoryName) if plotFactory is not None: summaryPanel = summarytab.SummaryPanel(self.notebook, plotFactory, self.bankController) self.notebook.AddPage(summaryPanel, _("Summary")) def onTabSwitching(self, event): tabIndex = event.Selection # Tell the previvous page we are leaving it. self.currentPage.onExit() # Tell the panel we are entering it. self.currentPage = self.notebook.GetPage(tabIndex) self.currentPage.onEnter() class TransactionPanel(wx.Panel): def __init__(self, parent, bankController): wx.Panel.__init__(self, parent) self.searchActive = False subpanel = wx.Panel(self) # The search control self.searchCtrl = searchctrl.SearchCtrl(self, bankController) self.transactionCtrl = transactionCtrl = TransactionCtrl(subpanel, bankController) self.newTransCtrl = newTransCtrl = transactionctrl.TransactionCtrl(self) subpanel.Sizer = wx.BoxSizer() subpanel.Sizer.Add(transactionCtrl, 1, wx.EXPAND) self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(self.searchCtrl, 0, wx.ALIGN_RIGHT|wx.RIGHT, 6) self.Sizer.Add(subpanel, 1, wx.EXPAND) self.Sizer.Add(newTransCtrl, 0, wx.EXPAND|wx.LEFT, 6) self.Sizer.AddSpacer(3) for message in ["account.created", "account.removed"]: Publisher.subscribe(self.onSearchInvalidatingChange, message) def setAccount(self, *args, **kwargs): self.transactionCtrl.setAccount(*args, **kwargs) def onSearchInvalidatingChange(self, event): """ Some event has occurred which trumps any active search, so make the required changes to state. These events will handle all other logic. """ self.searchActive = False def onEnter(self): pass def onExit(self): pass wxbanker-0.9.1/wxbanker/menubar.py0000644000175000017500000003160112243601243017126 0ustar mrooneymrooney# -*- coding: iso-8859-15 -*- # # https://launchpad.net/wxbanker # menubar.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx, webbrowser, os from wx.lib.wordwrap import wordwrap from wx.lib.pubsub import Publisher from wxbanker import version, localization, debug, fileservice, brandedframe from wxbanker.currencies import CurrencyStrings from wxbanker.csvimportframe import CsvImportFrame from wxbanker.csvexporter import CsvExporter class BankMenuBar(wx.MenuBar): ID_AUTOSAVE = wx.NewId() ID_VIEW_ALLACCOUNTS = wx.NewId() ID_VIEW_PREVACCOUNT = wx.NewId() ID_VIEW_NEXTACCOUNT = wx.NewId() ID_SHOWZERO = wx.NewId() ID_FAQ = wx.NewId() ID_QUESTION = wx.NewId() ID_REPORTBUG = wx.NewId() ID_REQUESTFEATURE = wx.NewId() ID_TRANSLATE = wx.NewId() IDS_CURRENCIES = [wx.NewId() for i in range(len(CurrencyStrings))] ID_SHOWCURRENCYNICK = wx.NewId() ID_MINTINTEGRATION = wx.NewId() ID_REQUESTCURRENCY = wx.NewId() ID_IMPORT_CSV = wx.NewId() ID_EXPORT_CSV = wx.NewId() def __init__(self, bankController, *args, **kwargs): wx.MenuBar.__init__(self, *args, **kwargs) self.bankController = bankController autosave = bankController.AutoSave showZero = bankController.ShowZeroBalanceAccounts showcurrnick = bankController.ShowCurrencyNick self.currencyStrings = CurrencyStrings[:] # File menu. fileMenu = wx.Menu() self.saveMenuItem = fileMenu.Append(wx.ID_SAVE) self.autoSaveMenuItem = fileMenu.AppendCheckItem(self.ID_AUTOSAVE, _("Auto-save"), _("Automatically save changes")) fileMenu.AppendSeparator() importCsvMenu = fileMenu.Append(self.ID_IMPORT_CSV, _("Import from CSV"), _("Import transactions from a CSV file")) exportCsvMenu = fileMenu.Append(self.ID_EXPORT_CSV, _("Export to CSV"), _("Export transactions to a CSV file")) fileMenu.AppendSeparator() quitItem = fileMenu.Append(wx.ID_EXIT) # View menu. viewMenu = wx.Menu() viewMenu.Append(self.ID_VIEW_PREVACCOUNT, _("Previous account")+"\tCtrl+J") viewMenu.Append(self.ID_VIEW_NEXTACCOUNT, _("Next account")+"\tCtrl+K") viewMenu.Append(self.ID_VIEW_ALLACCOUNTS, _("All accounts")+"\tCtrl+T") viewMenu.AppendSeparator() self.showZeroMenuItem = viewMenu.AppendCheckItem(self.ID_SHOWZERO, _("Show zero-balance accounts")+"\tCtrl+B", _("When disabled, accounts with a balance of $0.00 will be hidden from the list")) # Use the initial show-zero setting. self.showZeroMenuItem.Check(showZero) # Settings menu. settingsMenu = wx.Menu() ## TRANSLATORS: Put the ampersand (&) before the letter to use as the Alt shortcut. currencyMenu = wx.MenuItem(settingsMenu, -1, _("Base ¤cy"), _("Select currency for the 'All Accounts' balance")) currencyMenu.SetBitmap(wx.ArtProvider.GetBitmap("wxART_money")) # Add an entry for each available currency. currencies = wx.Menu() # Place the local detected one first, then the rest sorted. currencies.Append(self.IDS_CURRENCIES[0], self.currencyStrings[0]) currencies.AppendSeparator() for i, cstr in enumerate(sorted(self.currencyStrings[1:])): idIndex = self.currencyStrings.index(cstr) item = wx.MenuItem(currencies, self.IDS_CURRENCIES[idIndex], cstr) currencies.AppendItem(item) # Add an entry to request a new currency. requestCurrencyItem = wx.MenuItem(currencies, self.ID_REQUESTCURRENCY, _("Request a Currency")) requestCurrencyItem.Bitmap = wx.ArtProvider.GetBitmap("wxART_lightning") currencies.AppendSeparator() currencies.AppendItem(requestCurrencyItem) currencyMenu.SetSubMenu(currencies) settingsMenu.AppendItem(currencyMenu) self.showCurrencyNickItem = settingsMenu.AppendCheckItem(self.ID_SHOWCURRENCYNICK, _("Show currency names"), _("Show currency names with amounts")) self.mintEnabledItem = settingsMenu.AppendCheckItem(self.ID_MINTINTEGRATION, _("Integrate with Mint.com"), _("Sync account balances with an existing Mint.com account")) # Help menu. helpMenu = wx.Menu() ## TRANSLATORS: Put the ampersand (&) before the letter to use as the Alt shortcut. faqItem = wx.MenuItem(helpMenu, self.ID_FAQ, _("View &FAQs"), _("View Frequently Asked Questions online")) faqItem.Bitmap = wx.ArtProvider.GetBitmap("wxART_comments") helpMenu.AppendItem(faqItem) ## TRANSLATORS: Put the ampersand (&) before the letter to use as the Alt shortcut. questionItem = wx.MenuItem(helpMenu, self.ID_QUESTION, _("Ask a &Question"), _("Ask a question online")) questionItem.Bitmap = wx.ArtProvider.GetBitmap("wxART_user_comment") helpMenu.AppendItem(questionItem) ## TRANSLATORS: Put the ampersand (&) before the letter to use as the Alt shortcut. bugItem = wx.MenuItem(helpMenu, self.ID_REPORTBUG, _("&Report a Bug"), _("Report a bug to the developer online")) bugItem.Bitmap = wx.ArtProvider.GetBitmap("wxART_bug") helpMenu.AppendItem(bugItem) ## TRANSLATORS: Put the ampersand (&) before the letter to use as the Alt shortcut. featureItem = wx.MenuItem(helpMenu, self.ID_REQUESTFEATURE, _("Request a Fea&ture"), _("Request a new feature to be implemented")) featureItem.Bitmap = wx.ArtProvider.GetBitmap("wxART_lightbulb") helpMenu.AppendItem(featureItem) ## TRANSLATORS: Put the ampersand (&) before the letter to use as the Alt shortcut. translateItem = wx.MenuItem(helpMenu, self.ID_TRANSLATE, _("Tran&slate wxBanker"), _("Translate wxBanker to another language")) translateItem.Bitmap = wx.ArtProvider.GetBitmap("wxART_flag_blue") helpMenu.AppendItem(translateItem) helpMenu.AppendSeparator() ## TRANSLATORS: Put the ampersand (&) before the letter to use as the Alt shortcut. aboutItem = helpMenu.Append(wx.ID_ABOUT, _("&About"), _("More information about wxBanker")) # Add everything to the main menu. self.Append(fileMenu, _("&File")) self.Append(viewMenu, _("&View")) self.Append(settingsMenu, _("&Settings")) self.Append(helpMenu, _("&Help")) self.Bind(wx.EVT_MENU, self.onClickAbout) helpMenu.Bind(wx.EVT_MENU, self.onClickAbout) self.toggleAutoSave(autosave) self.toggleShowCurrencyNick(showcurrnick) Publisher.subscribe(self.onAutoSaveToggled, "controller.autosave_toggled") Publisher.subscribe(self.onShowZeroToggled, "controller.showzero_toggled") Publisher.subscribe(self.onShowCurrencyNickToggled, "controller.show_currency_nick_toggled") # Subscribe to a Mint update event, which tells us the checkbox should be enabled after startup. Publisher.subscribe(self.onMintUpdate, "mint.updated") def onMenuEvent(self, event): ID = event.Id if ID in self.IDS_CURRENCIES: self.onSelectCurrency(self.IDS_CURRENCIES.index(ID)) else: handler = { wx.ID_SAVE: self.onClickSave, self.ID_AUTOSAVE: self.onClickAutoSave, self.ID_VIEW_ALLACCOUNTS: self.onClickViewAll, self.ID_VIEW_PREVACCOUNT: self.onClickPrevAccount, self.ID_VIEW_NEXTACCOUNT: self.onClickNextAccount, self.ID_SHOWZERO: self.onClickShowZero, wx.ID_EXIT: self.onClickQuit, self.ID_FAQ: self.onClickFAQs, self.ID_QUESTION: self.onClickAskQuestion, self.ID_REPORTBUG: self.onClickReportBug, self.ID_REQUESTFEATURE: self.onClickRequestFeature, self.ID_TRANSLATE: self.onClickTranslate, self.ID_IMPORT_CSV: self.onClickImportCsv, self.ID_EXPORT_CSV: self.onClickExportCsv, wx.ID_ABOUT: self.onClickAbout, self.ID_REQUESTCURRENCY: self.onClickRequestCurrency, self.ID_SHOWCURRENCYNICK: self.onClickShowCurrencyNick, self.ID_MINTINTEGRATION: self.onClickMintIntegration, }.get(ID, lambda e: e.Skip()) handler(event) def onMintUpdate(self, message): self.toggleMintEnabled(True) def onAutoSaveToggled(self, message): self.toggleAutoSave(message.data) def onShowZeroToggled(self, message): self.toggleShowZero(message.data) def toggleAutoSave(self, autosave): self.autoSaveMenuItem.Check(autosave) self.saveMenuItem.Enable(not autosave) def toggleShowZero(self, showzero): self.showZeroMenuItem.Check(showzero) def onShowCurrencyNickToggled(self, message): self.toggleShowCurrencyNick(message.data) def toggleShowCurrencyNick(self, showcurr): self.showCurrencyNickItem.Check(showcurr) def toggleMintEnabled(self, enabled): self.mintEnabledItem.Check(enabled) def onClickSave(self, event): Publisher.sendMessage("user.saved") def onClickAutoSave(self, event): Publisher.sendMessage("user.autosave_toggled", event.Checked()) def onClickPrevAccount(self, event): Publisher.sendMessage("user.previous account") def onClickNextAccount(self, event): Publisher.sendMessage("user.next account") def onClickViewAll(self, event): Publisher.sendMessage("user.account changed", None) def onClickShowZero(self, event): Publisher.sendMessage("user.showzero_toggled", event.Checked()) def onClickQuit(self, event): Publisher.sendMessage("quit") def onSelectCurrency(self, currencyIndex): Publisher.sendMessage("user.global_currency_changed", currencyIndex) def onClickFAQs(self, event): webbrowser.open("https://answers.launchpad.net/wxbanker/+faqs") def onClickAskQuestion(self, event): webbrowser.open("https://launchpad.net/wxbanker/+addquestion") def onClickReportBug(self, event): webbrowser.open("https://launchpad.net/wxbanker/+filebug") def onClickRequestFeature(self, event): webbrowser.open("https://blueprints.launchpad.net/wxbanker") def onClickTranslate(self, event): webbrowser.open("https://translations.launchpad.net/wxbanker") def onClickRequestCurrency(self, event): webbrowser.open("https://answers.launchpad.net/wxbanker/+faq/477") def onClickShowCurrencyNick(self, event): Publisher.sendMessage("user.show_currency_nick_toggled", event.Checked()) def onClickMintIntegration(self, event): Publisher.sendMessage("user.mint.toggled", event.Checked()) def onClickAbout(self, event): info = wx.AboutDialogInfo() info.Name = "wxBanker" info.Version = str(version.NUMBER) #info.Icon = brandedframe.getIcon() info.Copyright = _("Copyright") + " 2007-2010 Mike Rooney (mrooney@ubuntu.com)" info.Description = _("Simple personal finance.") info.WebSite = ("https://launchpad.net/wxbanker", "https://launchpad.net/wxbanker") info.Developers = [ 'Mike Rooney (mrooney@ubuntu.com)', 'Karel Kolman (kolmis@gmail.com)', ] info.Artists = [ 'Mark James (www.famfamfam.com/lab/icons/silk/)', ] translators = [ "sl: Primo Jere ", "es: Diego J. Romero Lpez ", "hi: Ankur Kachru ", "pl: Tomasz 'Zen' Napierala ", "fr: Steve Dodier ", "de: Patrick Eigensatz ", ] info.Translators = [unicode(s, 'iso-8859-15') for s in translators] info.License = open(fileservice.getSharedFilePath("COPYING.txt")).read() wx.AboutBox(info) def onClickImportCsv(self, event): CsvImportFrame() def onClickExportCsv(self, event): dlg = wx.FileDialog(None, style=wx.FD_SAVE) result = dlg.ShowModal() if result == wx.ID_OK: csvpath = dlg.GetPath() CsvExporter.Export(self.bankController.Model, csvpath) wxbanker-0.9.1/wxbanker/messagepanel.py0000644000175000017500000001050212243601243020136 0ustar mrooneymrooney# https://launchpad.net/wxbanker # wxbanker.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx class MessagePanel(wx.Panel): def __init__(self, parent, message): wx.Panel.__init__(self, parent) self.Freeze() # The flags to use based on whether or not lines are shown. self.Flags = {False: wx.EXPAND|wx.ALL, True: wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP} self.BackgroundColour = wx.BLACK self.Panel = panel = wx.Panel(self) self.LinesPanel = wx.Panel(self) self.LinesPanel.Sizer = wx.BoxSizer(wx.VERTICAL) #self.Panel.BackgroundColour = self.LinesPanel.BackgroundColour = (0, 200, 100) self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(panel, 1, self.Flags[False], 1) self.Sizer.Add(self.LinesPanel, 0, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, 1) self.LinesPanel.Hide() self.Panel.Sizer = psizer = wx.BoxSizer() self.MessageText = wx.StaticText(panel, label=message) psizer.Add(self.MessageText, 0, wx.ALIGN_CENTER|wx.LEFT, 3) psizer.AddStretchSpacer(1) # Note at what position the buttons start, we'll use this in SizeMessage. self.BUTTON_START = len(psizer.Children) # Add the "Dismiss" button to get rid of the message. self.PushButton(_("Dismiss"), self.OnDismiss) self.BestWidth, self.BestHeight = self.Panel.BestSize self.CurrentHeight = 0 self.Panel.SetInitialSize((self.BestWidth, self.CurrentHeight)) # We are done moving stuff around, so thaw. self.Thaw() self.ExpandPanel() def SizeMessage(self): """Make sure the message text gets clipped appropriately.""" # Figure out how wide it should be. availableSize = self.Parent.Size[0] - 5 # Allow a bit of pading. buttons = list(self.Panel.Sizer.Children)[2:] for button in buttons: availableSize -= button.Size[0] # Figure out the correct height. height = self.GetTextExtent(self.MessageText.Label[:5])[1] self.MessageText.SetInitialSize((availableSize, height)) def ExpandPanel(self): self.CurrentHeight += 5 if self.CurrentHeight >= self.BestHeight: self.CurrentHeight = self.BestHeight else: wx.CallLater(50, self.ExpandPanel) self.Panel.SetInitialSize((self.BestWidth, self.CurrentHeight)) self.Parent.Layout() def AddLines(self, lines): sizer = self.LinesPanel.Sizer for line in lines: sizer.Add(wx.StaticText(self.LinesPanel, label=line), 0, wx.LEFT, 10) def ToggleLines(self, lines): self.Freeze() show = not self.LinesPanel.IsShown() self.LinesPanel.Show(show) # Handle the border, the top panel can't have a bottom border if there are lines under it! self.Sizer.GetItem(0).SetFlag(self.Flags[show]) self.Thaw() self.Parent.Layout() def PushButton(self, label, callback): """Create and prepend a button with label `label` which will call `callback` on a click.""" button = wx.Button(self.Panel, label=label) button.Bind(wx.EVT_BUTTON, callback) self.Panel.Sizer.Insert(self.BUTTON_START, button, 0, wx.ALIGN_CENTER) self.SizeMessage() self.Layout() def Dismiss(self): # We can't Layout after a Destroy, so Hide, Layout, then Destroy. self.Hide() self.Parent.Layout() self.Destroy() def OnDismiss(self, event): self.Dismiss() wxbanker-0.9.1/wxbanker/mint/0000755000175000017500000000000012243601243016071 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/mint/__init__.py0000644000175000017500000000000012243601243020170 0ustar mrooneymrooneywxbanker-0.9.1/wxbanker/mint/api.py0000644000175000017500000000610012243601243017211 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # mint.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wx.lib.pubsub import Publisher from wxbanker.lib.mint import api as mintapi from wxbanker.mint.kring import Keyring class Mint: """A collection of methods for interfacing with a MintConnection.""" _CachedAccounts = None @classmethod def IsLoggedIn(cls): return cls._CachedAccounts is not None @classmethod def Login(cls, username, password, notify=True): if cls.IsLoggedIn(): return accounts = {} for account in mintapi.get_accounts(username, password): account['balance'] = account['value'] # convert to wxBanker speak accounts[account['accountId']] = account cls._CachedAccounts = accounts if notify: Publisher.sendMessage("mint.updated") @classmethod def LoginFromKeyring(cls, notify=True): if Keyring is None: raise Exception("Keyring was unable to be imported") keyring = Keyring() if keyring.get_credentials() is None: raise Exception("Keyring does not have Mint.com credentials") user, passwd = keyring.get_credentials() return cls.Login(user, passwd, notify) @classmethod def GetAccounts(cls): """Returns a dictionary like {account_id: {'name': name, 'balance': balance}}""" return cls._CachedAccounts @classmethod def GetAccount(cls, accountid): account = cls.GetAccounts().get(accountid) if account is None: raise Exception("No such account with ID: %r. Valid accounts: %s" % (accountid, accounts)) return account @classmethod def GetAccountBalance(cls, accountid): return cls.GetAccount(accountid)['balance'] @staticmethod def GetAccountTransactionsCSV(accountid): #TODO: update for new Mint. return web.read("https://wwws.mint.com/transactionDownload.event?accountId=%s&comparableType=8&offset=0" % accountid) def main(): import pprint, getpass username = raw_input("Username: ") password = getpass.getpass("Password: ") #Mint.LoginFromKeyring() Mint.Login(username, password) accounts = Mint.GetAccounts() for account in accounts: print account, accounts[account] if __name__ == "__main__": main() wxbanker-0.9.1/wxbanker/mint/kring.py0000644000175000017500000000310312243601243017552 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # kring.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import keyring class Keyring(object): def __init__(self): self._name = "wxBanker Mint.com Credentials" self._sep = "////////" def get_credentials(self): creds = keyring.get_password(self._name, "wxbanker") if creds is None: return creds sep_pos = creds.find(self._sep) user, passwd = creds[:sep_pos], creds[sep_pos+len(self._sep):] return user, passwd def set_credentials(self, user, pw): # Ensure the arguments are simple strings; it can't handle unicode. user, pw = str(user), str(pw) if self.get_credentials() == (user, pw): return keyring.set_password(self._name, "wxbanker", "%s%s%s" % (user, self._sep, pw)) wxbanker-0.9.1/wxbanker/mint/web.py0000644000175000017500000000244212243601243017222 0ustar mrooneymrooney# https://launchpad.net/wxbanker # urllib3.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from cookielib import CookieJar, DefaultCookiePolicy import urllib2, urllib def enablecookies(): cj = CookieJar( DefaultCookiePolicy(rfc2965=True) ) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) def read(url, postVars=None): try: con = urllib2.urlopen(url, postVars) except Exception: result = None else: result = con.read() return result def post(url, varDict): return read(url, urllib.urlencode(varDict)) wxbanker-0.9.1/wxbanker/mintwrapper.py0000644000175000017500000000512712243601243020051 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # mintwrapper.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.csvimporter import CsvImporterProfileManager, CsvImporter from wxbanker.mint.api import Mint from wxbanker import bankexceptions, controller def ImportAccounts(model): """For each account in Mint, create one in wxBanker with all known transactions.""" mintSettings = CsvImporterProfileManager().getProfile("mint") importer = CsvImporter() for mintId, item in Mint.GetAccounts().items(): accountName, balance = item['name'], item['balance'] # Create an account, grab the transactions, and add them. try: account = model.CreateAccount(accountName) except bankexceptions.AccountAlreadyExistsException: #account = model.CreateAccount("%s (%s)" % (accountName, mintId)) print "Account '%s' already exists...skipping." % accountName continue csv = Mint.GetAccountTransactionsCSV(mintId) container = importer.getTransactionsFromCSV(csv, mintSettings) transactions = container.Transactions account.AddTransactions(transactions) # Now we have to add an initial transaction for the initial balance. if transactions: firstTransaction = sorted(transactions)[0] initialDate = firstTransaction.Date initialBalance = balance - account.Balance account.AddTransaction(initialBalance, "Initial Balance", initialDate) print "Imported account %s with %i transactions" % (accountName, len(transactions)) def doImport(): import getpass bankController = controller.Controller() username = raw_input("Mint email: ") password = getpass.getpass("Password: ") ImportAccounts(bankController.Model) if __name__ == "__main__": doImport() wxbanker-0.9.1/wxbanker/newtransactionctrl.py0000644000175000017500000004672412243601243021435 0ustar mrooneymrooney# https://launchpad.net/wxbanker # newtransactionctrl.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx, datetime from wx.lib.pubsub import Publisher from wxbanker import bankcontrols, bankobjects, helpers, localization import gettext class TransferRow(bankcontrols.GBRow): def __init__(self, parent, row): bankcontrols.GBRow.__init__(self, parent, row) self.accountDict = {} self.nullChoice = ["----------"] self.fromtoBox = wx.Choice(parent, choices=[_("from"), _("to")]) self.accountSelection = wx.Choice(parent, choices=[]) hSizer = wx.BoxSizer() hSizer.Add(wx.StaticText(parent, label=_("Transfer")), flag=wx.ALIGN_CENTER_VERTICAL) hSizer.AddSpacer(3) hSizer.Add(self.fromtoBox, flag=wx.ALIGN_CENTER_VERTICAL) self.AddNext(hSizer) self.AddNext(self.accountSelection) Publisher.subscribe(self.onAccountChanged, "view.account changed") def GetSelectedAccount(self): stringSel = self.accountSelection.GetStringSelection() if stringSel == "": return None return self.accountDict[stringSel] def GetAccounts(self, currentAccount): otherAccount = self.GetSelectedAccount() if self.fromtoBox.Selection == 0: source, destination = otherAccount, currentAccount else: source, destination = currentAccount, otherAccount return source, destination def onAccountChanged(self, message): account = message.data self.Update(account) def Update(self, selectedAccount): if selectedAccount: self.accountDict = {} for account in selectedAccount.GetSiblings(): self.accountDict[account.Name] = account choices = self.accountDict.keys() else: choices = self.nullChoice # Update the choices, and make sure to sort them! choices.sort() self.accountSelection.SetItems(choices) # If there are choices, select the first one by default. if choices: self.accountSelection.SetSelection(0) def FromRecurring(self, rt): self.fromtoBox.Disable() self.Update(rt.Parent) if rt.Source: self.accountSelection.SetStringSelection(rt.Source.Name) def ToRecurring(self, rt): if self.Parent.IsTransfer(): rt.Source = self.GetSelectedAccount() else: rt.Source = None class RecurringRow(bankcontrols.GBRow): def __init__(self, parent, row): bankcontrols.GBRow.__init__(self, parent, row, name="RecurringPanel") # The daily option is useful if you have something which happens every 30 days, for example. # Some billing cycles work this way, and the date slowly shifts down monthly. self.repeatsCombo = wx.Choice(parent, choices=(_("Daily"), _("Weekly"), _("Monthly"), _("Yearly"))) # Set the default to weekly. self.repeatsCombo.SetSelection(1) self.everyText = wx.StaticText(parent) self.everySpin = wx.SpinCtrl(parent, min=1, max=130, initial=1) self.everySpin.MinSize = (50, -1) bankcontrols.fixMinWidth(self.everyText, (_(x) for x in ("days", "weeks", "months", "years"))) self.endDateCtrl = bankcontrols.DateCtrlFactory(parent) self.endsNeverRadio = wx.RadioButton(parent, label=_("Never"), style=wx.RB_GROUP) self.endsSometimeRadio = wx.RadioButton(parent, label=("On:"), name="EndsSometimeRadio") # Make 'Never' the default. self.endsNeverRadio.SetValue(True) self.ResetEndDate() # The vertical sizer for when the recurring transaction stops ocurring. endsSizer = wx.BoxSizer(wx.VERTICAL) endsSizer.Add(self.endsNeverRadio) endsDateSizer = wx.BoxSizer() endsDateSizer.Add(self.endsSometimeRadio) endsDateSizer.Add(self.endDateCtrl) endsSizer.Add(endsDateSizer) # Create the sizer for the "Every" column and "End". # This all is best as one item which spans the last two cols, otherwise the # description column will be forced to be too wide in a small width window. everySizer = wx.BoxSizer() everySizer.Add(self.repeatsCombo, flag=wx.ALIGN_CENTER) everySizer.AddSpacer(10) everySizer.Add(wx.StaticText(parent, label=_("every")), flag=wx.ALIGN_CENTER) everySizer.AddSpacer(3) everySizer.Add(self.everySpin, flag=wx.ALIGN_CENTER) everySizer.AddSpacer(3) everySizer.Add(self.everyText, flag=wx.ALIGN_CENTER) everySizer.Add(wx.StaticText(parent, label=_("Ends:")), flag=wx.ALIGN_CENTER) everySizer.AddSpacer(3) everySizer.Add(endsSizer) # Add all the columns self.AddNext(wx.StaticText(parent, label=_("Repeats:"))) self.AddNext(everySizer, span=(1,2)) self.everySpin.Bind(wx.EVT_SPINCTRL, self.Update) self.repeatsCombo.Bind(wx.EVT_CHOICE, self.Update) # Don't generically bind to the parent, the transfer is a choice too. parent.Bind(wx.EVT_CHECKBOX, self.Update) parent.Bind(wx.EVT_RADIOBUTTON, self.Update) def ResetEndDate(self): self.endDateCtrl.Value = wx.DateTime.Today() + wx.DateSpan(days=-1, years=1) def GetSettings(self): repeatType = self.repeatsCombo.GetSelection() repeatEvery = self.everySpin.GetValue() if self.endsNeverRadio.GetValue(): end = None else: end = helpers.wxdate2pydate(self.endDateCtrl.GetValue()) return repeatType, repeatEvery, end def Update(self, event=None): self.Freeze() self.Parent.ShowWeekly(False) repeatType, every, end = self.GetSettings() if repeatType == 0: everyText = gettext.ngettext("day", "days",every) elif repeatType == 1: everyText = gettext.ngettext("week", "weeks", every) self.Parent.ShowWeekly(True) elif repeatType == 2: everyText = gettext.ngettext("month", "months", every) elif repeatType == 3: everyText = gettext.ngettext("year", "years", every) self.ToRecurring() self.everyText.Label = everyText self.Parent.UpdateSummary() self.Thaw() self.Parent.Parent.Layout() def FromRecurring(self, rt): """Given a RecurringTransaction, make our settings mirror it.""" self.repeatsCombo.SetSelection(rt.RepeatType) self.everySpin.SetValue(rt.RepeatEvery) end = rt.EndDate if end: self.endsSometimeRadio.SetValue(True) self.endDateCtrl.SetValue(helpers.pydate2wxdate(end)) else: self.ResetEndDate() self.endsNeverRadio.SetValue(True) self.Update() def ToRecurring(self): """Given a RecurringTransaction, make it equivalent to the settings here.""" repeatType, repeatEvery, repeatsOn, end = self.Parent.GetSettings() self.Parent.recurringObj.Update(repeatType, repeatEvery, repeatsOn, end) class WeeklyRecurringRow(bankcontrols.GBRow): def __init__(self, parent, row): bankcontrols.GBRow.__init__(self, parent, row) self.repeatsOnChecksWeekly = [] self.repeatsOnSizerWeekly = wx.BoxSizer() today = datetime.date.today().weekday() days = (_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun")) for i, label in enumerate(days): cb = wx.CheckBox(parent, label=label) cb.SetValue(i==today) self.repeatsOnChecksWeekly.append(cb) self.repeatsOnSizerWeekly.Add(cb, 0, wx.ALIGN_CENTER|wx.LEFT, 5) self.AddNext(wx.StaticText(parent, label=_("Repeats on days:"))) self.AddNext(self.repeatsOnSizerWeekly, span=(1,2)) def GetSettings(self): repeatsOn = [int(check.Value) for check in self.repeatsOnChecksWeekly] return repeatsOn def SetCheck(self, i, value): self.repeatsOnChecksWeekly[i].Value = value def FromRecurring(self, rt): if rt.IsWeekly(): for i, value in enumerate(rt.RepeatOn): self.SetCheck(i, value) class NewTransactionRow(bankcontrols.GBRow): def __init__(self, parent, row, editing=None): bankcontrols.GBRow.__init__(self, parent, row, name="NewTransactionCtrl") self.CurrentAccount = editing self.isInitialAccountSet = False self.dateCtrl = bankcontrols.DateCtrlFactory(parent) self.startText = wx.StaticText(parent, label=_("Starts:")) # The Description and Amount controls. handler = self.dateCtrl.customKeyHandler self.descCtrl = bankcontrols.HintedTextCtrl(parent, size=(140, -1), style=wx.TE_PROCESS_ENTER, hint=_("Description"), icon="wxART_page_edit", handler=handler) self.amountCtrl = bankcontrols.HintedTextCtrl(parent, size=(90, -1), style=wx.TE_PROCESS_ENTER|wx.TE_RIGHT, hint=_("Amount"), icon="wxART_money_dollar", handler=handler) # The add button. self.newButton = bankcontrols.FlashableButton(parent, bitmap=wx.ArtProvider.GetBitmap('wxART_money_add')) self.newButton.SetToolTipString(_("Enter this transaction")) checkSizer = wx.BoxSizer(wx.VERTICAL) # The transfer check. self.transferCheck = wx.CheckBox(parent, label=_("Transfer")) checkSizer.Add(self.transferCheck, 0, wx.RIGHT, 6) # The recurs check. self.recursCheck = wx.CheckBox(parent, label=_("Recurring")) checkSizer.Add(self.recursCheck, 0, wx.RIGHT, 6) # Checkboxes seem to have an overly large horizontal margin that looks bad. for check in (self.transferCheck, self.recursCheck): x, y = check.BestSize check.SetMinSize((x, y-4)) # Set up the layout. dateSizer = wx.BoxSizer() dateSizer.Add(self.startText, flag=wx.ALIGN_CENTER) dateSizer.Add(wx.StaticBitmap(parent, bitmap=wx.ArtProvider.GetBitmap('wxART_date')), 0, wx.ALIGN_CENTER|wx.RIGHT, 2) dateSizer.Add(self.dateCtrl, flag=wx.ALIGN_CENTER|wx.EXPAND) self.startText.Hide() hSizer = wx.BoxSizer() hSizer.Add(self.amountCtrl, 0, wx.ALIGN_CENTER) hSizer.AddSpacer(5) hSizer.Add(self.newButton, 0, wx.ALIGN_CENTER) hSizer.AddSpacer(5) hSizer.Add(checkSizer, 0, wx.ALIGN_CENTER) descSizer = wx.BoxSizer() descSizer.Add(self.descCtrl, 1, flag=wx.ALIGN_CENTER) self.AddNext(dateSizer) self.AddNext(descSizer, flag=wx.EXPAND) self.AddNext(hSizer) # Initialize necessary bindings. parent.Bind(wx.EVT_TEXT_ENTER, self.onNewTransaction) # Gives us enter from description/amount. self.newButton.Bind(wx.EVT_BUTTON, self.onNewTransaction) self.recursCheck.Bind(wx.EVT_CHECKBOX, self.onRecurringCheck) self.transferCheck.Bind(wx.EVT_CHECKBOX, self.onTransferCheck) try: self.amountCtrl.Children[0].Bind(wx.EVT_CHAR, self.onAmountChar) except IndexError: # On OSX for example, a SearchCtrl is native and has no Children. pass try: dateTextCtrl = self.dateCtrl.Children[0].Children[0] except IndexError: # This will fail on MSW + wxPython < 2.8.8.0, nothing we can do. pass else: # Bind to DateCtrl Enter (LP: 252454). dateTextCtrl.WindowStyleFlag |= wx.TE_PROCESS_ENTER dateTextCtrl.Bind(wx.EVT_TEXT_ENTER, self.onDateEnter) # If we are editing, it is inherently a recurring transaction. if editing: self.recursCheck.Hide() self.newButton.Hide() else: # Only subscribe to the event and set focus if it is the permanent control (LP: #623238) Publisher.subscribe(self.onAccountChanged, "view.account changed") wx.CallLater(50, self.initialFocus) def onRecurringCheck(self, event=None): Publisher.sendMessage("newtransaction.%i.recurringtoggled"%id(self), self.recursCheck.IsChecked()) ##self.startText.Show(recurring) #WXTODO: perhaps remove startText? def onTransferCheck(self, event=None): Publisher.sendMessage("newtransaction.%i.transfertoggled"%id(self), self.transferCheck.IsChecked()) def onDateEnter(self, event): # Force a focus-out/tab to work around LP #311934. self.dateCtrl.Navigate() self.onNewTransaction() def onAccountChanged(self, message): account = message.data self.CurrentAccount = account # Flash the add transaction button if there are no transactions in this account. # We could see if there are siblings, but they might not have transactions either. if account and not account.Transactions: self.newButton.StartFlashing() # For a new account, set the description to "Initial balance" as a suggestion/hint (LP: #520285) self.descCtrl.UpdateValue(_("Initial balance")) else: self.newButton.StopFlashing() # Reset the focus assuming an account was selected; otherwise the new focus can't be acted on. if self.isInitialAccountSet: # Also, don't focus if the transaction tab isn't being viewed, otherwise it snaps us back from viewing graphs. if account and self.Parent.IsShownOnScreen(): self.defaultFocus() else: self.isInitialAccountSet = True def onAmountChar(self, event): wx.CallAfter(self.updateAddIcon) event.Skip() def updateAddIcon(self, removeFirst=True): amountText = self.amountCtrl.Value if amountText and amountText[0] == '-': BMP = wx.ArtProvider.GetBitmap('wxART_money_delete') else: BMP = wx.ArtProvider.GetBitmap('wxART_money_add') self.newButton.SetBitmapLabel(BMP) def getValues(self): # Grab the raw values we will need to parse. date = helpers.wxdate2pydate(self.dateCtrl.Value) desc = self.descCtrl.Value amount = self.amountCtrl.Value # Parse the amount. try: amount = self.CurrentAccount.ParseAmount(amount) except ValueError: if amount == "": baseStr = _("No amount entered in the 'Amount' field.") else: baseStr = _("'%s' is not a valid amount.") % amount dlg = wx.MessageDialog(self.Parent, baseStr + " " + _("Please enter a number such as 12.34 or -20."), _("Invalid Transaction Amount"), wx.OK | wx.ICON_ERROR) dlg.ShowModal() return return amount, desc, date def onNewTransaction(self, event=None): # First, ensure an account is selected. destAccount = self.CurrentAccount if destAccount is None: dlg = wx.MessageDialog(self.Parent, _("Please select an account and then try again."), _("No account selected"), wx.OK | wx.ICON_ERROR) dlg.ShowModal() return # Grab the transaction values from the control. result = self.getValues() if result is None: # Validation failed, user was informed. return amount, desc, date = result # If a search is active, we have to ask the user what they want to do. if self.Parent.Parent.searchActive: msg = _("A search is currently active.") + " " + _('Would you like to clear the current search and make this transaction in "%s"?') % (destAccount.Name) dlg = wx.MessageDialog(self.Parent, msg, _("Clear search?"), style=wx.YES_NO|wx.ICON_WARNING) result = dlg.ShowModal() if result == wx.ID_YES: Publisher.sendMessage("SEARCH.CANCELLED") else: return sourceAccount = None # If the transfer box is checked, this is a transfer! if self.transferCheck.Value: result = self.Parent.transferRow.GetAccounts(destAccount) if result is None: dlg = wx.MessageDialog(self.Parent, _("This transaction is marked as a transfer. Please select the transfer account."), _("No account selected"), wx.OK | wx.ICON_ERROR) dlg.ShowModal() return sourceAccount, destAccount = result # Now let's see if this is a recurring transaction if self.recursCheck.GetValue(): settings = self.Parent.GetSettings() args = [amount, desc, date] + list(settings) + [sourceAccount] destAccount.AddRecurringTransaction(*args) else: destAccount.AddTransaction(amount, desc, date, sourceAccount) # A transaction was added, we can stop flashing if we were. self.newButton.StopFlashing() # Reset the controls and focus to their default values. self.clear() def FromRecurring(self, rt): self.descCtrl.Value = rt.Description self.amountCtrl.Value = "%.2f" % rt.Amount self.dateCtrl.Value = helpers.pydate2wxdate(rt.Date) self.transferCheck.Value = bool(rt.Source) def ToRecurring(self, rt): result = self.getValues() if result: amount, desc, date = result rt.Amount, rt.Description, rt.Date = amount, desc, date def onTransferTip(self, event): tipStr = _("If this box is checked when adding a transaction, you will be prompted for the account to use as the source of the transfer.")+"\n\n"+\ _("For example, checking this box and entering a transaction of $50 into this account will also subtract $50 from the account that you choose as the source.") wx.TipWindow(self, tipStr, maxLength=200) def clear(self): # Reset the controls. self.descCtrl.Value = '' self.amountCtrl.Value = '' self.transferCheck.Value = False self.recursCheck.Value = False self.onTransferCheck() self.onRecurringCheck() self.defaultFocus() def initialFocus(self): """Set the focus to what it should be when initially starting the application.""" self.dateCtrl.SetFocus() def defaultFocus(self): # Give focus to the description ctrl so the user can enter another transaction. # By default a focus will select the field, but that's annoying in this case, so restore the state. preSelection = self.descCtrl.GetSelection() self.descCtrl.SetFocus() self.descCtrl.SetSelection(*preSelection) wxbanker-0.9.1/wxbanker/ObjectListView/0000755000175000017500000000000012243601243020017 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/ObjectListView/__init__.py0000644000175000017500000000443112243601243022132 0ustar mrooneymrooney# -*- coding: utf-8 -*- #---------------------------------------------------------------------------- # Name: ObjectListView module initialization # Author: Phillip Piper # Created: 29 February 2008 # SVN-ID: $Id$ # Copyright: (c) 2008 by Phillip Piper # License: wxWindows license #---------------------------------------------------------------------------- # Change log: # 2008/08/02 JPP Added list printing material # 2008/07/24 JPP Added list group related material # 2008/06/19 JPP Added sort event related material # 2008/04/11 JPP Initial Version """ An ObjectListView provides a more convienent and powerful interface to a ListCtrl. """ __version__ = '1.2' __copyright__ = "Copyright (c) 2008 Phillip Piper (phillip_piper@bigfoot.com)" from ObjectListView import ObjectListView, VirtualObjectListView, ColumnDefn, FastObjectListView, GroupListView, ListGroup, BatchedUpdate from OLVEvent import CellEditFinishedEvent, CellEditFinishingEvent, CellEditStartedEvent, CellEditStartingEvent, SortEvent from OLVEvent import EVT_CELL_EDIT_STARTING, EVT_CELL_EDIT_STARTED, EVT_CELL_EDIT_FINISHING, EVT_CELL_EDIT_FINISHED, EVT_SORT from OLVEvent import EVT_COLLAPSING, EVT_COLLAPSED, EVT_EXPANDING, EVT_EXPANDED, EVT_GROUP_CREATING, EVT_GROUP_SORT from CellEditor import CellEditorRegistry, MakeAutoCompleteTextBox, MakeAutoCompleteComboBox from ListCtrlPrinter import ListCtrlPrinter, ReportFormat, BlockFormat, LineDecoration, RectangleDecoration, ImageDecoration import Filter __all__ = [ "BatchedUpdate", "BlockFormat", "CellEditFinishedEvent", "CellEditFinishingEvent", "CellEditorRegistry", "CellEditStartedEvent", "CellEditStartingEvent", "ColumnDefn", "EVT_CELL_EDIT_FINISHED", "EVT_CELL_EDIT_FINISHING", "EVT_CELL_EDIT_STARTED", "EVT_CELL_EDIT_STARTING", "EVT_COLLAPSED", "EVT_COLLAPSING", "EVT_EXPANDED", "EVT_EXPANDING", "EVT_GROUP_CREATING", "EVT_GROUP_SORT" "EVT_SORT", "Filter", "FastObjectListView", "GroupListView", "ListGroup", "ImageDecoration", "MakeAutoCompleteTextBox", "MakeAutoCompleteComboBox", "ListGroup", "ObjectListView", "ListCtrlPrinter", "RectangleDecoration", "ReportFormat", "SortEvent", "VirtualObjectListView", ] wxbanker-0.9.1/wxbanker/ObjectListView/CellEditor.py0000644000175000017500000004715212243601243022430 0ustar mrooneymrooney# -*- coding: utf-8 -*- #---------------------------------------------------------------------------- # Name: CellEditor.py # Author: Phillip Piper # Created: 3 April 2008 # SVN-ID: $Id$ # Copyright: (c) 2008 by Phillip Piper, 2008 # License: wxWindows license #---------------------------------------------------------------------------- # Change log: # 2008/05/26 JPP Fixed pyLint annoyances # 2008/04/04 JPP Initial version complete #---------------------------------------------------------------------------- # To do: # - there has to be a better DateTimeEditor somewhere!! """ The *CellEditor* module provides some editors for standard types that can be installed in an *ObjectListView*. It also provides a *Registry* that maps between standard types and functions that will create editors for that type. Cell Editors A cell editor can be any subclass of wx.Window provided that it supports the following protocol: SetValue(self, value) The editor should show the given value for editing GetValue(self) The editor should return the value that it holds. Return None to indicate an invalid value. The returned value should be of the correct type, i.e. don't return a string if the editor was registered for the bool type. The editor should invoke FinishCellEdit() on its parent ObjectListView when it loses focus or when the user commits the change by pressing Return or Enter. The editor should invoke CancelCellEdit() on its parent ObjectListView when the user presses Escape. Editor Registry The editor registry remembers a function that will be called to create an editor for a given type. """ __author__ = "Phillip Piper" __date__ = "3 May 2008" __version__ = "1.0" import datetime import wx #====================================================================== # Editor Registry # Module level variable _cellEditorRegistrySingleton = None def CellEditorRegistry(): """ Return the registry that is managing type to creator functions """ global _cellEditorRegistrySingleton if _cellEditorRegistrySingleton is None: _cellEditorRegistrySingleton = EditorRegistry() return _cellEditorRegistrySingleton class EditorRegistry: """ An *EditorRegistry* manages a mapping of types onto creator functions. When called, creator functions will create the appropriate kind of cell editor """ def __init__(self): self.typeToFunctionMap = {} # Standard types and their creator functions self.typeToFunctionMap[str] = self._MakeStringEditor self.typeToFunctionMap[unicode] = self._MakeStringEditor self.typeToFunctionMap[bool] = self._MakeBoolEditor self.typeToFunctionMap[int] = self._MakeIntegerEditor self.typeToFunctionMap[long] = self._MakeLongEditor self.typeToFunctionMap[float] = self._MakeFloatEditor self.typeToFunctionMap[datetime.datetime] = self._MakeDateTimeEditor self.typeToFunctionMap[datetime.date] = self._MakeDateEditor self.typeToFunctionMap[datetime.time] = self._MakeTimeEditor # TODO: Install editors for mxDateTime if installed def GetCreatorFunction(self, aValue): """ Return the creator function that is register for the type of the given value. Return None if there is no registered function for the type. """ return self.typeToFunctionMap.get(type(aValue), None) def RegisterCreatorFunction(self, aType, aFunction): """ Register the given function to be called when we need an editor for the given type. The function must accept three parameter: an ObjectListView, row index, and subitem index. It should return a wxWindow that is parented on the listview, and that responds to: - SetValue(newValue) - GetValue() to return the value shown in the editor """ self.typeToFunctionMap[aType] = aFunction #---------------------------------------------------------------------------- # Creator functions for standard types @staticmethod def _MakeStringEditor(olv, rowIndex, subItemIndex): return BaseCellTextEditor(olv, subItemIndex) @staticmethod def _MakeBoolEditor(olv, rowIndex, subItemIndex): return BooleanEditor(olv) @staticmethod def _MakeIntegerEditor(olv, rowIndex, subItemIndex): return IntEditor(olv, subItemIndex, validator=NumericValidator()) @staticmethod def _MakeLongEditor(olv, rowIndex, subItemIndex): return LongEditor(olv, subItemIndex) @staticmethod def _MakeFloatEditor(olv, rowIndex, subItemIndex): return FloatEditor(olv, subItemIndex, validator=NumericValidator("0123456789-+eE.")) @staticmethod def _MakeDateTimeEditor(olv, rowIndex, subItemIndex): dte = DateTimeEditor(olv, subItemIndex) column = olv.columns[subItemIndex] if isinstance(column.stringConverter, basestring): dte.formatString = column.stringConverter return dte @staticmethod def _MakeDateEditor(olv, rowIndex, subItemIndex): dte = DateEditor(olv, style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY | wx.WANTS_CHARS) #dte.SetValidator(MyValidator(olv)) return dte @staticmethod def _MakeTimeEditor(olv, rowIndex, subItemIndex): editor = TimeEditor(olv, subItemIndex) column = olv.columns[subItemIndex] if isinstance(column.stringConverter, basestring): editor.formatString = column.stringConverter return editor #====================================================================== # Cell editors class BooleanEditor(wx.Choice): """This is a simple editor to edit a boolean value that can be used in an ObjectListView""" def __init__(self, *args, **kwargs): kwargs["choices"] = ["True", "False"] wx.Choice.__init__(self, size=(0,0), *args, **kwargs) def GetValue(self): "Get the value from the editor" return self.GetSelection() == 0 def SetValue(self, value): "Put a new value into the editor" if value: self.Select(0) else: self.Select(1) #---------------------------------------------------------------------------- class BaseCellTextEditor(wx.TextCtrl): """This is a base text editor for text-like editors used in an ObjectListView""" def __init__(self, olv, subItemIndex, **kwargs): style = wx.TE_PROCESS_ENTER | wx.TE_PROCESS_TAB # Allow for odd case where parent isn't an ObjectListView if hasattr(olv, "columns"): if olv.HasFlag(wx.LC_ICON): style |= (wx.TE_CENTRE | wx.TE_MULTILINE) else: style |= olv.columns[subItemIndex].GetAlignmentForText() wx.TextCtrl.__init__(self, olv, style=style, size=(0,0), **kwargs) # With the MULTILINE flag, the text control always has a vertical # scrollbar, which looks stupid. I don't know how to get rid of it. # This doesn't do it: # self.ToggleWindowStyle(wx.VSCROLL) #---------------------------------------------------------------------------- class IntEditor(BaseCellTextEditor): """This is a text editor for integers for use in an ObjectListView""" def GetValue(self): "Get the value from the editor" s = wx.TextCtrl.GetValue(self).strip() try: return int(s) except ValueError: return None def SetValue(self, value): "Put a new value into the editor" if isinstance(value, int): value = repr(value) wx.TextCtrl.SetValue(self, value) #---------------------------------------------------------------------------- class LongEditor(BaseCellTextEditor): """This is a text editor for long values for use in an ObjectListView""" def GetValue(self): "Get the value from the editor" s = wx.TextCtrl.GetValue(self).strip() try: return long(s) except ValueError: return None def SetValue(self, value): "Put a new value into the editor" if isinstance(value, long): value = repr(value) wx.TextCtrl.SetValue(self, value) #---------------------------------------------------------------------------- class FloatEditor(BaseCellTextEditor): """This is a text editor for floats for use in an ObjectListView. Because of the trouble of precisely converting floats to strings, this editor sometimes behaves a little strangely.""" def GetValue(self): "Get the value from the editor" s = wx.TextCtrl.GetValue(self).strip() try: return float(s) except ValueError: return None def SetValue(self, value): "Put a new value into the editor" if isinstance(value, float): value = repr(value) wx.TextCtrl.SetValue(self, value) #---------------------------------------------------------------------------- class DateTimeEditor(BaseCellTextEditor): """ A DateTimeEditor allows the user to enter a date/time combination, where the time is optional and many formats of date and time are allowed. The control accepts these date formats (in all cases, the year can be only 2 digits): - '31/12/2008' - '2008/12/31' - '12/31/2008' - '31 December 2008' - '31 Dec 2008' - 'Dec 31 2008' - 'December 31 2008' Slash character can also be '-' or ' '. Consecutive whitespace are collapsed. The control accepts these time formats: - '23:59:59' - '11:59:59pm' - '23:59' - '11:59pm' - '11pm' The colons are required. The am/pm is case insensitive. The implementation uses a brute force approach to parsing the data. """ # Acceptable formats: # '31/12/2008', '2008/12/31', '12/31/2008', '31 December 2008', '31 Dec 2008', 'Dec 31 2007' # second line is the same but with two-digit year. # slash character can also be '-' or ' '. Consecutive whitespace are collapsed. STD_DATE_FORMATS = ['%d %m %Y', '%Y %m %d', '%m %d %Y', '%d %B %Y', '%d %b %Y', '%b %d %Y', '%B %d %Y', '%d %m %y', '%y %m %d', '%m %d %y', '%d %B %y', '%d %b %y', '%b %d %y', '%B %d %y'] STD_DATE_WITHOUT_YEAR_FORMATS = ['%d %m', '%m %d', '%d %B', '%d %b', '%B %d', '%b %d'] # Acceptable formats: '23:59:59', '11:59:59pm', '23:59', '11:59pm', '11pm' STD_TIME_FORMATS = ['%H:%M:%S', '%I:%M:%S %p', '%H:%M', '%I:%M %p', '%I %p'] # These separators are treated as whitespace STD_SEPARATORS = "/-," def __init__(self, *args, **kwargs): BaseCellTextEditor.__init__(self, *args, **kwargs) self.formatString = "%X %x" self.allDateTimeFormats = [] for dtFmt in self.STD_DATE_FORMATS: self.allDateTimeFormats.append(dtFmt) for timeFmt in self.STD_TIME_FORMATS: self.allDateTimeFormats.append("%s %s" % (dtFmt, timeFmt)) self.allDateTimeWithoutYearFormats = [] for dtFmt in self.STD_DATE_WITHOUT_YEAR_FORMATS: self.allDateTimeWithoutYearFormats.append(dtFmt) for timeFmt in self.STD_TIME_FORMATS: self.allDateTimeWithoutYearFormats.append("%s %s" % (dtFmt, timeFmt)) def SetValue(self, value): "Put a new value into the editor" if isinstance(value, datetime.datetime): value = value.strftime(self.formatString) wx.TextCtrl.SetValue(self, value) def GetValue(self): "Get the value from the editor" s = wx.TextCtrl.GetValue(self).strip() return self._ParseDateTime(s) def _ParseDateTime(self, s): # Try the installed format string first try: return datetime.datetime.strptime(s, self.formatString) except ValueError: pass for x in self.STD_SEPARATORS: s = s.replace(x, " ") # Because of the logic of strptime, we have to check shorter patterns first. # For example: # "31 12" matches "%d %m %y" => datetime(2012, 1, 3, 0, 0) ?? # but we want: # "31 12" to match "%d %m" => datetime(1900, 12, 31, 0, 0) # JPP 4/4/2008 Python 2.5.1 for fmt in self.allDateTimeWithoutYearFormats: try: dt = datetime.datetime.strptime(s, fmt) return dt.replace(year=datetime.datetime.today().year) except ValueError: pass for fmt in self.allDateTimeFormats: try: return datetime.datetime.strptime(s, fmt) except ValueError: pass return None #---------------------------------------------------------------------------- class NumericValidator(wx.PyValidator): """This validator only accepts numeric keys""" def __init__(self, acceptableChars="0123456789+-"): wx.PyValidator.__init__(self) self.Bind(wx.EVT_CHAR, self._OnChar) self.acceptableChars = acceptableChars self.acceptableCodes = [ord(x) for x in self.acceptableChars] stdEditKeys = [wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER, wx.WXK_ESCAPE, wx.WXK_CANCEL, wx.WXK_TAB, wx.WXK_BACK, wx.WXK_DELETE, wx.WXK_HOME, wx.WXK_END, wx.WXK_LEFT, wx.WXK_RIGHT] self.acceptableCodes.extend(stdEditKeys) def Clone(self): "Make a new copy of this validator" return NumericValidator(self.acceptableChars) def _OnChar(self, event): "Handle the OnChar event by rejecting non-numerics" if event.GetModifiers() != 0 and event.GetModifiers() != wx.MOD_SHIFT: event.Skip() return if event.GetKeyCode() in self.acceptableCodes: event.Skip() return wx.Bell() #---------------------------------------------------------------------------- class DateEditor(wx.DatePickerCtrl): """ This control uses standard datetime. wx.DatePickerCtrl works only with wx.DateTime, but they are strange beasts. wx.DataTime use 0 indexed months, i.e. January==0 and December==11. """ def __init__(self, *args, **kwargs): wx.DatePickerCtrl.__init__(self, size=(0,0), *args, **kwargs) self.SetValue(None) def SetValue(self, value): if value: dt = wx.DateTime() dt.Set(value.day, value.month-1, value.year) else: dt = wx.DateTime.Today() wx.DatePickerCtrl.SetValue(self, dt) def GetValue(self): "Get the value from the editor" dt = wx.DatePickerCtrl.GetValue(self) if dt.IsOk(): return datetime.date(dt.Year, dt.Month+1, dt.Day) else: return None #---------------------------------------------------------------------------- class TimeEditor(BaseCellTextEditor): """A text editor that expects and return time values""" # Acceptable formats: '23:59', '11:59pm', '11pm' STD_TIME_FORMATS = ['%X', '%H:%M', '%I:%M %p', '%I %p'] def __init__(self, *args, **kwargs): BaseCellTextEditor.__init__(self, *args, **kwargs) self.formatString = "%X" def SetValue(self, value): "Put a new value into the editor" value = value or "" if isinstance(value, datetime.time): value = value.strftime(self.formatString) wx.TextCtrl.SetValue(self, value) def GetValue(self): "Get the value from the editor" s = wx.TextCtrl.GetValue(self).strip() fmts = self.STD_TIME_FORMATS[:] if self.formatString not in fmts: fmts.insert(0, self.formatString) for fmt in fmts: try: dt = datetime.datetime.strptime(s, fmt) return dt.time() except ValueError: pass return None #====================================================================== # Auto complete controls def MakeAutoCompleteTextBox(olv, columnIndex, maxObjectsToConsider=10000): """ Return a TextCtrl that lets the user choose from all existing values in this column. Do not call for large lists """ col = olv.columns[columnIndex] #THINK: We could make this time based, i.e. it escapes after 1 second. maxObjectsToConsider = min(maxObjectsToConsider, olv.GetItemCount()) options = set(col.GetStringValue(olv.GetObjectAt(i)) for i in range(maxObjectsToConsider)) tb = BaseCellTextEditor(olv, columnIndex) AutoCompleteHelper(tb, list(options)) return tb def MakeAutoCompleteComboBox(olv, columnIndex, maxObjectsToConsider=10000): """ Return a ComboBox that lets the user choose from all existing values in this column. Do not call for large lists """ col = olv.columns[columnIndex] maxObjectsToConsider = min(maxObjectsToConsider, olv.GetItemCount()) options = set(col.GetStringValue(olv.GetObjectAt(i)) for i in range(maxObjectsToConsider)) cb = wx.ComboBox(olv, choices=list(options), style=wx.CB_DROPDOWN|wx.CB_SORT|wx.TE_PROCESS_ENTER) AutoCompleteHelper(cb) return cb #------------------------------------------------------------------------- class AutoCompleteHelper(object): """ This class operates on a text control or combobox, and automatically completes the text typed by the user from a list of entries in a given list. """ def __init__(self, control, possibleValues=None): self.control = control self.lastUserEnteredString = self.control.GetValue() self.control.Bind(wx.EVT_TEXT, self._OnTextEvent) if isinstance(self.control, wx.ComboBox): self.possibleValues = self.control.GetStrings() else: self.possibleValues = possibleValues or [] self.lowerCasePossibleValues = [x.lower() for x in self.possibleValues] def _OnTextEvent(self, evt): evt.Skip() # After the SetValue() we want to ignore this event. If we get this event # and the value hasn't been modified, we know it was a SetValue() call. if hasattr(self.control, "IsModified") and not self.control.IsModified(): return # If the text has changed more than the user just typing one letter, # then don't try to autocomplete it. if len(evt.GetString()) != len(self.lastUserEnteredString)+1: self.lastUserEnteredString = evt.GetString() return self.lastUserEnteredString = evt.GetString() s = evt.GetString().lower() for i, x in enumerate(self.lowerCasePossibleValues): if x.startswith(s): self._AutocompleteWith(self.possibleValues[i]) break def _AutocompleteWith(self, newValue): """Suggest the given value by autocompleting it.""" # GetInsertionPoint() doesn't seem reliable under linux insertIndex = len(self.control.GetValue()) self.control.SetValue(newValue) if isinstance(self.control, wx.ComboBox): self.control.SetMark(insertIndex, len(newValue)) else: # Seems that under linux, selecting only seems to work here if we do it # outside of the text event wx.CallAfter(self.control.SetSelection, insertIndex, len(newValue)) wxbanker-0.9.1/wxbanker/ObjectListView/Filter.py0000644000175000017500000001046612243601243021625 0ustar mrooneymrooney# -*- coding: utf-8 -*- #---------------------------------------------------------------------------- # Name: Filter.py # Author: Phillip Piper # Created: 26 August 2008 # Copyright: (c) 2008 Phillip Piper # SVN-ID: $Id$ # License: wxWindows license #---------------------------------------------------------------------------- # Change log: # 2008/08/26 JPP First version #---------------------------------------------------------------------------- # To do: # """ Filters provide a structured mechanism to display only some of the model objects given to an ObjectListView. Only those model objects which are 'chosen' by an installed filter will be presented to the user. Filters are simple callable objects which accept a single parameter, which is the list of model objects to be filtered, and returns a collection of those objects which will be presented to the user. This module provides some standard filters. Filters almost always impose a performance penalty on the ObjectListView. The penalty is normally O(n) since the filter normally examines each model object to see if it should be included. Head() and Tail() are exceptions to this observation. """ def Predicate(predicate): """ Display only those objects that match the given predicate Example:: self.olv.SetFilter(Filter.Predicate(lambda x: x.IsOverdue())) """ return lambda modelObjects: [x for x in modelObjects if predicate(x)] def Head(num): """ Display at most the first N of the model objects Example:: self.olv.SetFilter(Filter.Head(1000)) """ return lambda modelObjects: modelObjects[:num] def Tail(num): """ Display at most the last N of the model objects Example:: self.olv.SetFilter(Filter.Tail(1000)) """ return lambda modelObjects: modelObjects[-num:] class TextSearch(object): """ Return only model objects that match a given string. If columns is not empty, only those columns will be considered when searching for the string. Otherwise, all columns will be searched. Example:: self.olv.SetFilter(Filter.TextSearch(self.olv, text="findthis")) self.olv.RepopulateList() """ def __init__(self, objectListView, columns=(), text=""): """ Create a filter that includes on modelObject that have 'self.text' somewhere in the given columns. """ self.objectListView = objectListView self.columns = columns self.text = text def __call__(self, modelObjects): """ Return the model objects that contain our text in one of the columns to consider """ if not self.text: return modelObjects # In non-report views, we can only search the primary column if self.objectListView.InReportView(): cols = self.columns or self.objectListView.columns else: cols = [self.objectListView.columns[0]] textToFind = self.text.lower() def _containsText(modelObject): for col in cols: if textToFind in col.GetStringValue(modelObject).lower(): return True return False return [x for x in modelObjects if _containsText(x)] def SetText(self, text): """ Set the text that this filter will match. Set this to None or "" to disable the filter. """ self.text = text class Chain(object): """ Return only model objects that match all of the given filters. Example:: # Show at most 100 people whose salary is over 50,000 salaryFilter = Filter.Predicate(lambda person: person.GetSalary() > 50000) self.olv.SetFilter(Filter.Chain(salaryFilter, Filter.Tail(100))) self.olv.RepopulateList() """ def __init__(self, *filters): """ Create a filter that performs all the given filters. The order of the filters is important. """ self.filters = filters def __call__(self, modelObjects): """ Return the model objects that match all of our filters """ for filter in self.filters: modelObjects = filter(modelObjects) return modelObjects wxbanker-0.9.1/wxbanker/ObjectListView/ListCtrlPrinter.py0000644000175000017500000026636412243601243023516 0ustar mrooneymrooney# -*- coding: utf-8 -*- #!/usr/bin/env python #---------------------------------------------------------------------------- # Name: ListCtrlPrinter.py # Author: Phillip Piper # Created: 17 July 2008 # SVN-ID: $Id$ # Copyright: (c) 2008 by Phillip Piper, 2008 # License: wxWindows license #---------------------------------------------------------------------------- # Change log: # 2008/07/17 JPP Inspired beginning #---------------------------------------------------------------------------- # To do: # - persistence of ReportFormat # - allow cell contents to be vertically aligned # - in light of several of the "to dos", consider having CellBlockFormat object # - write a data abstraction layer between the printer and the ListCtrl. # This layer could understand ObjectListViews and be more efficient. # - consider if this could be made to work with a wx.Grid (needs data abstraction layer) # Known issues: # - the 'space' setting on decorations is not intuitive """ An ``ListCtrlPrinter`` takes an ``ObjectListView`` or ``wx.ListCtrl`` and turns it into a pretty report. As always, the goal is for this to be as easy to use as possible. A typical usage should be as simple as:: printer = ListCtrlPrinter(self.myOlv, "My Report Title") printer.PrintPreview() This will produce a report with reasonable formatting. The formatting of a report is controlled completely by the ReportFormat object of the ListCtrlPrinter. To change the appearance of the report, you change the settings in this object. A report consists of various sections (called "blocks") and each of these blocks has a matching BlockFormat object in the ReportFormat. So, to modify the format of the page header, you change the ReportFormat.PageHeader object. A ReportFormat object has the following properties which control the appearance of the matching sections of the report: * PageHeader * ListHeader * ColumnHeader * GroupTitle * Row * ListFooter * PageFooter * Page These properties return BlockFormat objects, which have the following properties: * AlwaysCenter * CanWrap * Font * Padding * TextAlignment * TextColor * CellPadding * GridPen Implementation ============== A ``ListCtrlPrinter`` is a *Facade* over two classes: - ``ListCtrlPrintout``, which handles the interface to the wx printing subsystem - ``ReportEngine``, which does the actual work of creating the report The ``ListCtrlPrintout`` handles all the details of the wx printing subsystem. In particular, it configures the printing DC so that its origin and scale are correct. This enables the ``ReportEngine`` to simply render the report without knowing the characteristics of the underlying printer DPI, unprintable region, or the scale of a print preview. When The ``ListCtrlPrintout`` encounters some action that is cannot perform (like actually rendering a page) it calls back into ``ListCtrlPrinter`` (which simply forwards to the ``ReportEngine``). The ``ReportEngine`` uses a block structure approach to reports. Each element of a report is a "block", which stacks vertically with other blocks. When a block is printed, it can either render itself into a given DC or it can replace itself in the report structure with one or more other blocks. A ``TextBlock`` renders itself by drawing into the DC. In contrast, the block that prints a ``ListCtrl`` replaces itself with a ``ListHeaderBlock``, a ``ColumnHeaderBlock``, ``ListRowsBlock`` and finally a ``ListFooterBlock``. The blocks describe the structure of the report. The formatting of a report is controlled by ``BlockFormat`` objects. The ``ReportFormat`` contains a ``BlockFormat`` object for each formattable section of the report. Each section must be formatted in same fashion, i.e. all column headers will look the same, all page footer will look the same. There is no way to make the first footer look one way, and the second look a different way. """ import datetime import math import wx from wxbanker.ObjectListView.WordWrapRenderer import WordWrapRenderer #---------------------------------------------------------------------------- class ListCtrlPrinter(object): """ An ListCtrlPrinter creates a pretty report from an ObjectListView/ListCtrl. """ def __init__(self, listCtrl=None, title="ListCtrl Printing"): """ """ self.printout = ListCtrlPrintout(self) self.engine = ReportEngine() if listCtrl is not None: self.AddListCtrl(listCtrl, title) #---------------------------------------------------------------------------- # Accessing def GetPageFooter(self): """ Return a 3-tuple of the texts that will be shown in left, center, and right cells of the page footer """ return self.engine.pageFooter def SetPageFooter(self, leftText="", centerText="", rightText=""): """ Set the texts that will be shown in various cells of the page footer. leftText can be a string or a 3-tuple of strings. """ if isinstance(leftText, (tuple, list)): self.engine.pageFooter = leftText else: self.engine.pageFooter = (leftText, centerText, rightText) def GetPageHeader(self): """ Return a 3-tuple of the texts that will be shown in left, center, and right cells of the page header """ return self.engine.pageHeader def SetPageHeader(self, leftText="", centerText="", rightText=""): """ Set the texts that will be shown in various cells of the page header """ if isinstance(leftText, (tuple, list)): self.engine.pageHeader = leftText else: self.engine.pageHeader = (leftText, centerText, rightText) def GetPrintData(self): """ Return the wx.PrintData that controls the printing of this report """ return self.printout.printData def GetReportFormat(self): """ Return the ReportFormat object that controls the appearance of this printout """ return self.engine.reportFormat def SetReportFormat(self, fmt): """ Set the ReportFormat object that controls the appearance of this printout """ self.engine.reportFormat = fmt def GetWatermark(self, txt): """ Get the text that will be printed as a watermark on the report """ return self.engine.watermark def SetWatermark(self, txt): """ Set the text that will be printed as a watermark on the report """ self.engine.watermark = txt ReportFormat = property(GetReportFormat, SetReportFormat) PageFooter = property(GetPageFooter, SetPageFooter) PageHeader = property(GetPageHeader, SetPageHeader) PrintData = property(GetPrintData) Watermark = property(GetWatermark, SetWatermark) #---------------------------------------------------------------------------- # Setup def AddListCtrl(self, listCtrl, title=None): """ Add the given list to those that will be printed by this report. """ self.engine.AddListCtrl(listCtrl, title) def Clear(self): """ Remove all ListCtrls from this printer """ self.engine.ClearListCtrls() #---------------------------------------------------------------------------- # Printing Commands def PageSetup(self, parent=None): """ Show a Page Setup dialog that will change the configuration of this printout """ self.printout.PageSetup(parent) def PrintPreview(self, parent=None, title="ListCtrl Print Preview", bounds=(20, 50, 800, 800)): """ Show a Print Preview of this report """ self.printout.PrintPreview(parent, title, bounds) def Print(self, parent=None): """ Print this report to the selected printer """ self.printout.DoPrint(parent) #---------------------------------------------------------------------------- # Callbacks # These methods are invoked by the ListCtrlPrintout when required def CalculateTotalPages(self, dc, bounds): """ Do the work of calculating how many pages this report will occupy? This is expensive because it basically prints the whole report. """ return self.engine.CalculateTotalPages(dc, bounds) def StartPrinting(self): """ A new print job is about to begin. """ self.engine.StartPrinting() def PrintPage(self, dc, pageNumber, bounds): """ Print the given page on the given device context. """ self.engine.PrintPage(dc, pageNumber, bounds) #---------------------------------------------------------------------------- class ReportEngine(object): """ A ReportEngine handles all the work of actually producing a report. Public instance variables (all others should be treated as private): * dateFormat When the current date/time is substituted into report text, how should the datetime be formatted? This must be a valid format string for the strftime() method. Default: "%x %X" """ def __init__(self): """ """ self.currentPage = -1 self.totalPages = -1 self.blocks = list() self.blockInsertionIndex = 0 self.listCtrls = list() self.dateFormat = "%x %X" self.reportFormat = ReportFormat.Normal() self.watermark = "" self.pageHeader = list() self.pageFooter = list() #self.isPrintSelectionOnly = False # not currently implemented # If this is False, no drawing should be done. The engine is either counting # pages, or skipping to a specific page self.shouldDrawBlocks = True #---------------------------------------------------------------------------- # Accessing def GetNamedFormat(self, name): """ Return the given format """ return self.reportFormat.GetNamedFormat(name) def GetTotalPages(self): """ Return the total number of pages that this report will produce. CalculateTotalPages() must be called before this is accurate. """ return self.totalPages def GetSubstitutionInfo(self): """ Return a dictionary that can be used for substituting values into strings """ dateString = datetime.datetime.now().strftime(self.dateFormat) info = { "currentPage": self.currentPage, "date": dateString, "totalPages": self.totalPages, } return info #---------------------------------------------------------------------------- # Calculating def CalculateTotalPages(self, dc, bounds): """ Do the work of calculating how many pages this report will occupy? This is expensive because it basically prints the whole report. """ self.StartPrinting() self.totalPages = 1 self.shouldDrawBlocks = False while self.PrintOnePage(dc, self.totalPages, bounds): self.totalPages += 1 self.shouldDrawBlocks = True return self.totalPages #---------------------------------------------------------------------------- # Commands def AddBlock(self, block): """ Add the given block at the current insertion point """ self.blocks.insert(self.blockInsertionIndex, block) self.blockInsertionIndex += 1 block.engine = self def AddListCtrl(self, listCtrl, title=None): """ Add the given list to those that will be printed by this report. """ if listCtrl.InReportView(): self.listCtrls.append([listCtrl, title]) def ClearListCtrls(self): """ Remove all ListCtrls from this report. """ self.listCtrls = list() def DropCurrentBlock(self): """ Remove the current block from our list of blocks """ self.blocks.pop(0) self.blockInsertionIndex = 1 #---------------------------------------------------------------------------- # Printing def StartPrinting(self): """ Initial a print job on this engine """ self.currentPage = 0 self.blockInsertionIndex = 0 self.blocks = list() self.AddBlock(ReportBlock()) self.runningBlocks = list() self.AddRunningBlock(PageHeaderBlock()) self.AddRunningBlock(PageFooterBlock()) if self.watermark: self._CreateReplaceWatermarkDecoration() def AddRunningBlock(self, block): """ A running block is printed on every page until it is removed """ self.runningBlocks.append(block) block.engine = self def RemoveRunningBlock(self, block): """ A running block is printed on every page until it is removed """ self.runningBlocks.remove(block) def PrintPage(self, dc, pageNumber, bounds): """ Print the given page on the given device context. """ # If the request page isn't next in order, we have to restart # the printing process and advance until we reach the desired page. if pageNumber != self.currentPage + 1: self.StartPrinting() self.shouldDrawBlocks = False for i in range(1, pageNumber): self.PrintOnePage(dc, i, bounds) self.shouldDrawBlocks = True return self.PrintOnePage(dc, pageNumber, bounds) def PrintOnePage(self, dc, pageNumber, bounds): """ Print the current page on the given device context. Return true if there is still more to print. """ # Initialize state self.currentPage = pageNumber self.pageBounds = list(bounds) self.workBounds = list(self.pageBounds) self.SubtractDecorations(dc) # Print page adornments, including under-text decorations self.DrawPageDecorations(dc, False) for x in self.runningBlocks: x.Print(dc) # Print blocks until they won't fit or we run out of blocks while len(self.blocks) and self.blocks[0].Print(dc): self.DropCurrentBlock() # Finally, print over-the-text decorations self.DrawPageDecorations(dc, True) return len(self.blocks) > 0 def SubtractDecorations(self, dc): """ # Subtract the area used from the work area """ fmt = self.GetNamedFormat("Page") self.workBounds = fmt.SubtractDecorations(dc, self.workBounds) def DrawPageDecorations(self, dc, over): """ Draw the page decorations """ if not self.shouldDrawBlocks: return fmt = self.GetNamedFormat("Page") bounds = list(self.pageBounds) fmt.DrawDecorations(dc, bounds, self, over) def _CreateReplaceWatermarkDecoration(self): """ Create a watermark decoration, replacing any existing watermark """ pageFmt = self.GetNamedFormat("Page") pageFmt.decorations = [x for x in pageFmt.decorations if not isinstance(x, WatermarkDecoration)] watermarkFmt = self.GetNamedFormat("Watermark") pageFmt.Add(WatermarkDecoration(self.watermark, font=watermarkFmt.Font, color=watermarkFmt.TextColor, angle=watermarkFmt.Angle, over=watermarkFmt.Over)) #---------------------------------------------------------------------------- class ListCtrlPrintout(wx.Printout): """ An ListCtrlPrintout is the interface between the wx printing system and ListCtrlPrinter. """ def __init__(self, olvPrinter, margins=None): """ """ wx.Printout.__init__(self) self.olvPrinter = olvPrinter self.margins = margins or (wx.Point(15, 15), wx.Point(15, 15)) self.totalPages = -1 self.printData = wx.PrintData() self.printData.SetPrinterName("") # Use default printer self.printData.SetPaperId(wx.PAPER_A4) self.printData.SetPrintMode(wx.PRINT_MODE_PRINTER) #---------------------------------------------------------------------------- # Accessing def HasPage(self, page): """ Return true if this printout has the given page number """ return page <= self.totalPages def GetPageInfo(self): """ Return a 4-tuple indicating the ... """ return (1, self.totalPages, 1, 1) def GetPrintPreview(self): """ Get a wxPrintPreview of this report """ data = wx.PrintDialogData(self.printData) forViewing = ListCtrlPrintout(self.olvPrinter, self.margins) forPrinter = ListCtrlPrintout(self.olvPrinter, self.margins) preview = wx.PrintPreview(forViewing, forPrinter, data) return preview #---------------------------------------------------------------------------- # Commands def PageSetup(self, parent): """ Show a Page Setup dialog that will change the configuration of this printout """ data = wx.PageSetupDialogData() data.SetPrintData(self.printData) data.SetDefaultMinMargins(True) data.SetMarginTopLeft(self.margins[0]) data.SetMarginBottomRight(self.margins[1]) dlg = wx.PageSetupDialog(parent, data) if dlg.ShowModal() == wx.ID_OK: data = dlg.GetPageSetupData() self.printData = wx.PrintData(data.GetPrintData()) self.printData.SetPaperId(data.GetPaperId()) self.margins = (data.GetMarginTopLeft(), data.GetMarginBottomRight()) dlg.Destroy() def PrintPreview(self, parent, title, bounds): """ Show a Print Preview of this report """ self.preview = self.GetPrintPreview() if not self.preview.Ok(): return False pfrm = wx.PreviewFrame(self.preview, parent, title) pfrm.Initialize() pfrm.SetPosition(bounds[0:2]) pfrm.SetSize(bounds[2:4]) pfrm.Show(True) return True def DoPrint(self, parent): """ Send the report to the configured printer """ try: pdd = wx.PrintDialogData(self.printData) printer = wx.Printer(pdd) if printer.Print(parent, self, True): self.printData = wx.PrintData(printer.GetPrintDialogData().GetPrintData()) else: wx.MessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wx.OK) finally: pdd.Destroy() #---------------------------------------------------------------------------- # Event handlers def OnPreparePrinting(self): """ Prepare for printing. This event is sent before any of the others """ dc = self.GetDC() self.SetScaleAndBounds(dc) self.totalPages = self.olvPrinter.CalculateTotalPages(dc, self.bounds) self.olvPrinter.StartPrinting() def OnBeginDocument(self, start, end): """ Begin printing one copy of the document. Return False to cancel the job """ return super(ListCtrlPrintout, self).OnBeginDocument(start, end) def OnEndDocument(self): super(ListCtrlPrintout, self).OnEndDocument() def OnBeginPrinting(self): super(ListCtrlPrintout, self).OnBeginPrinting() def OnEndPrinting(self): super(ListCtrlPrintout, self).OnEndPrinting() def OnPrintPage(self, page): """ Do the work of printing the given page number. """ # We bounce this back to the printer facade dc = self.GetDC() self.SetScaleAndBounds(dc) return self.olvPrinter.PrintPage(dc, page, self.bounds) def SetScaleAndBounds(self, dc): """ Calculate the scale required for our printout to match what appears on screen, and the bounds that will be effective at that scale and margins """ # This code comes from Robin Dunn's "wxPython In Action." # Without that, I would never have figured this out. ppiPrinterX, ppiPrinterY = self.GetPPIPrinter() ppiScreenX, ppiScreenY = self.GetPPIScreen() logicalScale = float(ppiPrinterX) / float(ppiScreenX) pw, ph = self.GetPageSizePixels() dw, dh = dc.GetSize() scale = logicalScale * float(dw)/float(pw) dc.SetUserScale(scale, scale) # Now calculate our boundries logicalUnitsMM = float(ppiPrinterX) / (logicalScale*25.4) topLeft, bottomRight = self.margins left = round(topLeft.x * logicalUnitsMM) top = round(topLeft.y * logicalUnitsMM) right = round(dc.DeviceToLogicalYRel(dw) - bottomRight.x * logicalUnitsMM) bottom = round(dc.DeviceToLogicalYRel(dh) - bottomRight.y * logicalUnitsMM) self.bounds = (left, top, right-left, bottom-top) #---------------------------------------------------------------------------- class ReportFormat(object): """ A ReportFormat defines completely how a report is formatted. It holds a collection of BlockFormat objects which control the formatting of individual blocks of the report Public instance variables: * IncludeImages Should images from the ListCtrl be printed in the report? Default: *True* * IsColumnHeadingsOnEachPage Will the column headers be printed at the top of each page? Default: *True* * IsShrinkToFit Will the columns be shrunk so they all fit into the width of one page? Default: *False* * UseListCtrlTextFormat If this is True, the text format (i.e. font and text color) of each row will be taken from the ListCtrl, rather than from the *Cell* format. Default: *False* """ def __init__(self): """ """ # Initialize the formats that control the various portions of the report self.Page = BlockFormat() self.PageHeader = BlockFormat() self.ListHeader = BlockFormat() self.GroupTitle = BlockFormat() self.ColumnHeader = BlockFormat() self.Row = BlockFormat() self.ListFooter = BlockFormat() self.PageFooter = BlockFormat() self.Watermark = BlockFormat() self.IncludeImages = True self.IsColumnHeadingsOnEachPage = False self.IsShrinkToFit = False self.UseListCtrlTextFormat = True # Initialize the watermark format to default values self.WatermarkFormat() #---------------------------------------------------------------------------- # Accessing def GetNamedFormat(self, name): """ Return the format used in to format a block with the given name. """ return getattr(self, name) #---------------------------------------------------------------------------- # Commands def WatermarkFormat(self, font=None, color=None, angle=30, over=False): """ Change the format of the watermark printed on this report. The actual text of the water mark is set by `ListCtrlPrinter.Watermark` property. """ defaultFaceName = "Stencil" self.Watermark.Font = font or wx.FFont(96, wx.FONTFAMILY_DEFAULT, 0, defaultFaceName) self.Watermark.TextColor = color or wx.Colour(204, 204, 204) self.Watermark.Angle = angle self.Watermark.Over = over #---------------------------------------------------------------------------- # Standard formats # These are meant to be illustrative rather than definitive @staticmethod def Minimal(headerFontName="Arial", rowFontName="Times New Roman"): """ Return a minimal format for a report """ fmt = ReportFormat() fmt.IsShrinkToFit = False fmt.PageHeader.Font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face=headerFontName) fmt.PageHeader.Line(wx.BOTTOM, wx.BLACK, 1, space=5) fmt.PageHeader.Padding = (0, 0, 0, 12) fmt.ListHeader.Font = wx.FFont(18, wx.FONTFAMILY_DEFAULT, face=headerFontName) fmt.ListHeader.Padding = (0, 12, 0, 12) fmt.ListHeader.Line(wx.BOTTOM, wx.BLACK, 1, space=5) fmt.GroupTitle.Font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face=headerFontName) fmt.GroupTitle.Padding = (0, 12, 0, 12) fmt.GroupTitle.Line(wx.BOTTOM, wx.BLACK, 1, space=5) fmt.PageFooter.Font = wx.FFont(10, wx.FONTFAMILY_DEFAULT, face=headerFontName) fmt.PageFooter.Line(wx.TOP, wx.BLACK, 1, space=3) fmt.PageFooter.Padding = (0, 16, 0, 0) fmt.ColumnHeader.Font = wx.FFont(14, wx.FONTFAMILY_DEFAULT, wx.FONTFLAG_BOLD, face=headerFontName) fmt.ColumnHeader.Padding = (0, 12, 0, 12) fmt.ColumnHeader.CellPadding = 5 fmt.ColumnHeader.Line(wx.BOTTOM, wx.Colour(192, 192, 192), 1, space=3) fmt.ColumnHeader.AlwaysCenter = True fmt.Row.Font = wx.FFont(10, wx.FONTFAMILY_DEFAULT, face=rowFontName) fmt.Row.CellPadding = 5 fmt.Row.Line(wx.BOTTOM, wx.Colour(192, 192, 192), 1, space=3) fmt.Row.CanWrap = True return fmt @staticmethod def Normal(headerFontName="Gill Sans", rowFontName="Times New Roman"): """ Return a reasonable default format for a report """ fmt = ReportFormat() fmt.IsShrinkToFit = True fmt.PageHeader.Font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face=headerFontName) fmt.PageHeader.Line(wx.BOTTOM, wx.BLUE, 2, space=5) fmt.PageHeader.Padding = (0, 0, 0, 12) fmt.ListHeader.Font = wx.FFont(26, wx.FONTFAMILY_SWISS, wx.FONTFLAG_BOLD, face=headerFontName) fmt.ListHeader.TextColor = wx.WHITE fmt.ListHeader.Padding = (0, 12, 0, 12) fmt.ListHeader.TextAlignment = wx.ALIGN_LEFT fmt.ListHeader.Background(wx.BLUE, wx.WHITE, space=(16, 4, 0, 4)) fmt.GroupTitle.Font = wx.FFont(14, wx.FONTFAMILY_DEFAULT, face=headerFontName) fmt.GroupTitle.Line(wx.BOTTOM, wx.BLUE, 4, toColor=wx.WHITE, space=5) fmt.GroupTitle.Padding = (0, 12, 0, 12) fmt.PageFooter.Font = wx.FFont(10, wx.FONTFAMILY_DEFAULT, face=headerFontName) fmt.PageFooter.Background(wx.WHITE, wx.BLUE, space=(0, 4, 0, 4)) fmt.ColumnHeader.Font = wx.FFont(14, wx.FONTFAMILY_DEFAULT, wx.FONTFLAG_BOLD, face=headerFontName) fmt.ColumnHeader.CellPadding = 2 fmt.ColumnHeader.Background(wx.Colour(192, 192, 192)) fmt.ColumnHeader.GridPen = wx.Pen(wx.WHITE, 1) fmt.ColumnHeader.Padding = (0, 0, 0, 12) fmt.ColumnHeader.AlwaysCenter = True fmt.Row.Font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face=rowFontName) fmt.Row.Line(wx.BOTTOM, pen=wx.Pen(wx.BLUE, 1, wx.DOT), space=3) fmt.Row.CellPadding = 2 fmt.Row.CanWrap = True return fmt @staticmethod def TooMuch(headerFontName="Chiller", rowFontName="Gill Sans"): """ Return a reasonable default format for a report """ fmt = ReportFormat() fmt.IsShrinkToFit = False fmt.PageHeader.Font = wx.FFont(12, wx.FONTFAMILY_DECORATIVE, wx.FONTFLAG_BOLD, face=headerFontName) fmt.PageHeader.TextColor = wx.WHITE fmt.PageHeader.Background(wx.GREEN, wx.RED, space=(16, 4, 0, 4)) fmt.PageHeader.Padding = (0, 0, 0, 12) fmt.ListHeader.Font = wx.FFont(24, wx.FONTFAMILY_DECORATIVE, face=headerFontName) fmt.ListHeader.TextColor = wx.WHITE fmt.ListHeader.Padding = (0, 12, 0, 12) fmt.ListHeader.TextAlignment = wx.ALIGN_CENTER fmt.ListHeader.Background(wx.RED, wx.GREEN, space=(16, 4, 0, 4)) fmt.GroupTitle.Font = wx.FFont(14, wx.FONTFAMILY_DECORATIVE, wx.FONTFLAG_BOLD, face=headerFontName) fmt.GroupTitle.TextColor = wx.BLUE fmt.GroupTitle.Padding = (0, 12, 0, 12) fmt.GroupTitle.Line(wx.BOTTOM, wx.GREEN, 4, toColor=wx.WHITE, space=5) fmt.PageFooter.Font = wx.FFont(10, wx.FONTFAMILY_DECORATIVE, face=headerFontName) fmt.PageFooter.Line(wx.TOP, wx.GREEN, 2, toColor=wx.RED, space=3) fmt.PageFooter.Padding = (0, 16, 0, 0) fmt.ColumnHeader.Font = wx.FFont(14, wx.FONTFAMILY_SWISS, wx.FONTFLAG_BOLD, face=headerFontName) fmt.ColumnHeader.Background(wx.Colour(255, 215, 0)) fmt.ColumnHeader.CellPadding = 5 fmt.ColumnHeader.GridPen = wx.Pen(wx.Colour(192, 192, 192), 1) fmt.Row.Font = wx.FFont(12, wx.FONTFAMILY_SWISS, face=rowFontName) fmt.Row.CellPadding = 5 fmt.Row.GridPen = wx.Pen(wx.BLUE, 1, wx.DOT) fmt.Row.CanWrap = True fmt.Watermark.TextColor = wx.Colour(233, 150, 122) return fmt #---------------------------------------------------------------------------- class BlockFormat(object): """ A block format defines how a Block is formatted. These properties control the formatting of the matching Block: * CanWrap If the text for this block cannot fit horizontally, should be wrap to a new line (True) or should it be truncated (False)? * Font What font should be used to draw the text of this block * Padding How much padding should be applied to the block before the text or other decorations are drawn? This can be a numeric (which will be applied to all sides) or it can be a collection of the paddings to be applied to the various sides: (left, top, right, bottom). * TextAlignment How should text be aligned within this block? Can be wx.ALIGN_LEFT, wx.ALIGN_CENTER, or wx.ALIGN_RIGHT. * TextColor In what color should be text be drawn? The blocks that are based on cells (PageHeader, ColumnHeader, Row, PageFooter) can also have the following properties set: * AlwaysCenter Will the text in the cells be center aligned, regardless of other settings? * CellPadding How much padding should be applied to this cell before the text or other decorations are drawn? This can be a numeric (which will be applied to all sides) or it can be a collection of the paddings to be applied to the various sides: (left, top, right, bottom). * GridPen What Pen will be used to draw the grid lines of the cells? In addition to these properties, there are some methods which add various decorations to the blocks: * Background(color=wx.BLUE, toColor=None, space=0) This gives the block a solid color background (or a gradient background if *toColor* is not None). If *space* is not 0, *space* pixels will be subtracted from all sides from the space available to the block. * Frame(pen=None, space=0) Draw a rectangle around the block in the given pen * Line(side=wx.BOTTOM, color=wx.BLACK, width=1, toColor=None, space=0, pen=None) Draw a line on a given side of the block. If a pen is given, that is used to draw the line (and the other parameters are ignored), otherwise a solid line (or a gradient line is *toColor* is not None) of *width* pixels is drawn. """ def __init__(self): """ """ self.padding = None self.decorations = list() self.font = wx.FFont(11, wx.FONTFAMILY_SWISS, face="Gill Sans") self.textColor = None self.textAlignment = wx.ALIGN_LEFT self.alwaysCenter = False self.canWrap = False #THINK: These attributes are only for grids. Should we have a GridBlockFormat object? self.cellPadding = None self.gridPen = None #---------------------------------------------------------------------------- # Accessing def GetFont(self): """ Return the font used by this format """ return self.font def SetFont(self, font): """ Set the font used by this format """ self.font = font def GetTextAlignment(self): """ Return the alignment of text in this format """ return self.textAlignment def SetTextAlignment(self, alignment): """ Set the alignment of text in this format """ self.textAlignment = alignment def GetTextColor(self): """ Return the color of text in this format """ return self.textColor def SetTextColor(self, color): """ Set the color of text in this format """ self.textColor = color def GetPadding(self): """ Get the padding around this format """ return self.padding def SetPadding(self, padding): """ Set the padding around this format Padding is either a single numeric (indicating the values on all sides) or a collection of paddings [left, top, right, bottom] """ self.padding = self._MakePadding(padding) def GetCellPadding(self): """ Get the padding around cells in this format """ return self.cellPadding def SetCellPadding(self, padding): """ Set the padding around cells in this format Padding is either a single numeric (indicating the values on all sides) or a collection of paddings [left, top, right, bottom] """ self.cellPadding = self._MakePadding(padding) def GetGridPen(self): """ Return the pen used to draw a grid in this format """ return self.gridPen def SetGridPen(self, pen): """ Set the pen used to draw a grid in this format """ self.gridPen = pen if self.gridPen: # Other styles don't produce nice joins self.gridPen.SetCap(wx.CAP_BUTT) self.gridPen.SetJoin(wx.JOIN_MITER) def _MakePadding(self, padding): try: if len(padding) < 4: return (tuple(padding) + (0, 0, 0, 0))[:4] else: return padding except TypeError: return (padding,) * 4 def GetAlwaysCenter(self): """ Return if the text controlled by this format should always be centered? """ return self.alwaysCenter def SetAlwaysCenter(self, value): """ Remember if the text controlled by this format should always be centered? """ self.alwaysCenter = value def GetCanWrap(self): """ Return if the text controlled by this format can wrap to cover more than one line? """ return self.canWrap def SetCanWrap(self, value): """ Remember if the text controlled by this format can wrap to cover more than one line? """ self.canWrap = value Font = property(GetFont, SetFont) Padding = property(GetPadding, SetPadding) TextAlignment = property(GetTextAlignment, SetTextAlignment) TextColor = property(GetTextColor, SetTextColor) CellPadding = property(GetCellPadding, SetCellPadding) GridPen = property(GetGridPen, SetGridPen) AlwaysCenter = property(GetAlwaysCenter, SetAlwaysCenter) CanWrap = property(GetCanWrap, SetCanWrap) # Misspellers of the world Untie! # Ok, ok... there're not really misspellings - just alternatives :) TextAlign = property(GetTextAlignment, SetTextAlignment) TextColour = property(GetTextColor, SetTextColor) #---------------------------------------------------------------------------- # Calculations def CalculateCellPadding(self): """ Return a four-tuple that indicates pixel padding (left, top, right, bottom) around cells in this format """ if self.CellPadding: cellPadding = list(self.CellPadding) else: cellPadding = 0, 0, 0, 0 if self.GridPen: penFactor = int((self.GridPen.GetWidth()+1)/2) cellPadding = [x + penFactor for x in cellPadding] return cellPadding #---------------------------------------------------------------------------- # Decorations def Add(self, decoration): """ Add the given decoration to those adorning blocks with this format """ self.decorations.append(decoration) def Line(self, side=wx.BOTTOM, color=wx.BLACK, width=1, toColor=None, space=0, pen=None): """ Add a line to our decorations. If a pen is given, we use a straight Line decoration, otherwise we use a coloured rectangle """ if pen: self.Add(LineDecoration(side, pen, space)) else: self.Add(RectangleDecoration(side, None, color, toColor, width, space)) def Background(self, color=wx.BLUE, toColor=None, space=0): """ Add a coloured background to the block """ self.Add(RectangleDecoration(color=color, toColor=toColor, space=space)) def Frame(self, pen=None, space=0): """ Add a rectangle around this block """ self.Add(RectangleDecoration(pen=pen, space=space)) #---------------------------------------------------------------------------- # Commands def SubtractPadding(self, bounds): """ Subtract any padding used by this format from the given bounds """ if self.padding is None: return bounds else: return RectUtils.InsetRect(bounds, self.padding) def SubtractDecorations(self, dc, bounds): """ Subtract any space used by our decorations from the given bounds """ for x in self.decorations: bounds = x.SubtractFrom(dc, bounds) return bounds def DrawDecorations(self, dc, bounds, block, over): """ Draw our decorations on the given block """ for x in self.decorations: if x.IsDrawOver() == over: x.DrawDecoration(dc, bounds, block) #---------------------------------------------------------------------------- class Block(object): """ A Block is a portion of a report that will stack vertically with other Block. A report consists of several Blocks. """ def __init__(self, engine=None): self.engine = engine # This is also set when the block is added to a print engine #---------------------------------------------------------------------------- # Accessing def GetFont(self): """ Return Font that should be used to draw text in this block """ return self.GetFormat().GetFont() def GetTextColor(self): """ Return Colour that should be used to draw text in this block """ return self.GetFormat().GetTextColor() def GetFormat(self): """ Return the BlockFormat object that controls the formatting of this block """ return self.engine.GetNamedFormat(self.__class__.__name__[:-5]) def GetReducedBlockBounds(self, dc, bounds=None): """ Return the bounds of this block once padding and decoration have taken their toll. """ bounds = bounds or list(self.GetWorkBounds()) fmt = self.GetFormat() bounds = fmt.SubtractPadding(bounds) bounds = fmt.SubtractDecorations(dc, bounds) return bounds def GetWorkBounds(self): """ Return the boundaries of the work area for this block """ return self.engine.workBounds def IsColumnHeadingsOnEachPage(self): """ Should the column headers be report at the top of each new page? """ return self.engine.reportFormat.IsColumnHeadingsOnEachPage def IncludeImages(self): """ Should the images from the ListCtrl be printed in the report? """ return self.engine.reportFormat.IncludeImages def IsShrinkToFit(self): """ Should row blocks be shrunk to fit within the width of a page? """ return self.engine.reportFormat.IsShrinkToFit def IsUseSubstitution(self): """ Should the text values printed by this block have substitutions performed before being printed? This allows, for example, footers to have '%(currentPage)d of %(totalPages)d' """ return True #---------------------------------------------------------------------------- # Calculating def CalculateExtrasHeight(self, dc): """ Return the height of the padding and decorations themselves """ return 0 - RectUtils.Height(self.GetReducedBlockBounds(dc, [0, 0, 0, 0])) def CalculateExtrasWidth(self, dc): """ Return the width of the padding and decorations themselves """ return 0 - RectUtils.Width(self.GetReducedBlockBounds(dc, [0, 0, 0, 0])) def CalculateHeight(self, dc): """ Return the heights of this block in pixels """ return -1 def CalculateTextHeight(self, dc, txt, bounds=None, font=None): """ Return the height of the given txt in pixels """ bounds = bounds or self.GetReducedBlockBounds(dc) font = font or self.GetFont() dc.SetFont(font) if self.GetFormat().CanWrap: return WordWrapRenderer.CalculateHeight(dc, txt, RectUtils.Width(bounds)) else: # Calculate the height of one line. The 1000 pixel width # ensures that 'Wy' doesn't wrap, which might happen if bounds is narrow return WordWrapRenderer.CalculateHeight(dc, "Wy", 1000) def CanFit(self, height): """ Can this block fit into the remaining work area on the page? """ return height <= RectUtils.Height(self.GetWorkBounds()) #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ if not self.ShouldPrint(): return True bounds = self.CalculateBounds(dc) if not self.CanFit(RectUtils.Height(bounds)): return False if self.engine.shouldDrawBlocks: self.PreDraw(dc, bounds) self.Draw(dc, bounds) self.PostDraw(dc, bounds) self.ChangeWorkBoundsBy(RectUtils.Height(bounds)) return True def ShouldPrint(self): """ Should this block be printed? """ # If this block does not have a format, it is simply skipped return self.GetFormat() is not None def CalculateBounds(self, dc): """ Calculate the bounds of this block """ height = self.CalculateHeight(dc) bounds = list(self.GetWorkBounds()) bounds = RectUtils.SetHeight(bounds, height) return bounds def ChangeWorkBoundsBy(self, amt): """ Move the top of our work bounds down by the given amount """ RectUtils.MoveTopBy(self.engine.workBounds, amt) def Draw(self, dc, bounds): """ Draw this block and its decorations allowing for any padding """ fmt = self.GetFormat() decorationBounds = fmt.SubtractPadding(bounds) fmt.DrawDecorations(dc, decorationBounds, self, False) textBounds = fmt.SubtractDecorations(dc, list(decorationBounds)) self.DrawSelf(dc, textBounds) fmt.DrawDecorations(dc, decorationBounds, self, True) def PreDraw(self, dc, bounds): """ Executed before any drawing is done """ pass def DrawSelf(self, dc, bounds): """ Do the actual work of rendering this block. """ pass def PostDraw(self, dc, bounds): """ Executed after drawing has completed """ pass def DrawText(self, dc, txt, bounds, font=None, alignment=wx.ALIGN_LEFT, valignment=wx.ALIGN_CENTRE, image=None, color=None, canWrap=True, imageIndex=-1, listCtrl=None): """ Draw the given text in the given DC according to the given characteristics. This is the workhorse text drawing method for our reporting engine. The *font*, *alignment*, and *color* attributes are applied to the drawn text. If *image* is not None, it will be drawn to the left of the text. All text is indented by the width of the image, even if the text is multi-line. If *imageIndex* is 0 or more and *listCtrl* is not None, the corresponding image from the ListCtrl's small image list will be drawn to the left of the text. If *canWrap* is True, the text will be wrapped to fit within the given bounds. If it is False, then the first line of *txt* will be truncated at the edge of the given *bounds*. """ GAP_BETWEEN_IMAGE_AND_TEXT = 4 def _CalcBitmapPosition(r, height): if valignment == wx.ALIGN_TOP: return RectUtils.Top(r) elif valignment == wx.ALIGN_CENTER: return RectUtils.CenterY(r) - height / 2 elif valignment == wx.ALIGN_BOTTOM: return RectUtils.Bottom(r) - height else: return RectUtils.Top(r) # Draw any image if image: y = _CalcBitmapPosition(bounds, image.Height) dc.DrawBitmap(image, RectUtils.Left(bounds), y) RectUtils.MoveLeftBy(bounds, image.GetWidth()+GAP_BETWEEN_IMAGE_AND_TEXT) elif listCtrl and imageIndex >=0: imageList = listCtrl.GetImageList(wx.IMAGE_LIST_SMALL) y = _CalcBitmapPosition(bounds, imageList.GetSize(0)[1]) imageList.Draw(imageIndex, dc, RectUtils.Left(bounds), y, wx.IMAGELIST_DRAW_TRANSPARENT) RectUtils.MoveLeftBy(bounds, imageList.GetSize(0)[0]+GAP_BETWEEN_IMAGE_AND_TEXT) # Draw the text dc.SetFont(font or self.GetFont()) dc.SetTextForeground(color or self.GetTextColor() or wx.BLACK) if canWrap: WordWrapRenderer.DrawString(dc, txt, bounds, alignment, valignment) else: WordWrapRenderer.DrawTruncatedString(dc, txt, bounds, alignment, valignment) def PerformSubstitutions(self, strings): """ Substituted % markers in the given collection of strings. """ info = self.engine.GetSubstitutionInfo() try: # 'strings' could be a single string or a list of strings try: return strings % info except TypeError: return [x % info for x in strings] except ValueError: # We don't die if we get a substitution error - we just ignore it return strings #---------------------------------------------------------------------------- class TextBlock(Block): """ A TextBlock prints a string objects. """ def ShouldPrint(self): """ Should this block be printed? """ # If the block has no text, it should not be printed if self.GetText(): return Block.ShouldPrint(self) else: return False def GetText(self): return "Missing GetText() in class %s" % self.__class__.__name__ def GetSubstitutedText(self): """ Return the text for this block after all markers have been substituted """ if self.IsUseSubstitution(): return self.PerformSubstitutions(self.GetText()) else: return self.GetText() def CalculateHeight(self, dc): """ Return the heights of this block in pixels """ textHeight = self.CalculateTextHeight(dc, self.GetSubstitutedText()) extras = self.CalculateExtrasHeight(dc) return textHeight + extras def DrawSelf(self, dc, bounds): """ Do the actual work of rendering this block. """ fmt = self.GetFormat() self.DrawText(dc, self.GetSubstitutedText(), bounds, canWrap=fmt.CanWrap, alignment=fmt.TextAlignment) #---------------------------------------------------------------------------- class CellBlock(Block): """ A CellBlock is a Block whose data is presented in a cell format. """ def __init__(self): self.scale = 1 self.oldScale = 1 #---------------------------------------------------------------------------- # Accessing - Subclasses should override def GetCellWidths(self): """ Return a list of the widths of the cells in this block. """ return list() def GetTexts(self): """ Return a list of the texts that should be drawn with the cells """ return list() def GetAlignments(self): """ Return a list indicating how the text within each cell is aligned. """ return list() def GetImages(self): """ Return a list of the images that should be drawn in each cell """ return list() #---------------------------------------------------------------------------- # Accessing def GetCombinedLists(self): """ Return a collection of Buckets that hold all the values of the subclass-overridable collections above """ buckets = [Bucket(cellWidth=x, text="", align=None, image=None) for x in self.GetCellWidths()] for (i, x) in enumerate(self.GetSubstitutedTexts()): buckets[i].text = x for (i, x) in enumerate(self.GetAlignments()): buckets[i].align = x if self.IncludeImages(): for (i, x) in enumerate(self.GetImages()): buckets[i].image = x # Calculate where the cell contents should be drawn cellPadding = self.GetFormat().CalculateCellPadding() for x in buckets: x.innerCellWidth = max(0, x.cellWidth - (cellPadding[0] + cellPadding[2])) return buckets def GetListCtrl(self): """ Return the ListCtrl that is behind this cell block. """ return None def GetSubstitutedTexts(self): """ Return a list of the texts that should be drawn with the cells """ if self.IsUseSubstitution(): return self.PerformSubstitutions(self.GetTexts()) else: return self.GetTexts() #---------------------------------------------------------------------------- # Calculating def CalculateHeight(self, dc): """ Return the heights of this block in pixels """ GAP_BETWEEN_IMAGE_AND_TEXT = 4 # If cells can wrap, figure out the tallest, otherwise we just figure out the height of one line if self.GetFormat().CanWrap: font = self.GetFont() height = 0 for x in self.GetCombinedLists(): textWidth = x.innerCellWidth if self.GetListCtrl() and x.image != -1: imageList = self.GetListCtrl().GetImageList(wx.IMAGE_LIST_SMALL) textWidth -= imageList.GetSize(0)[0]+GAP_BETWEEN_IMAGE_AND_TEXT bounds = [0, 0, textWidth, 99999] height = max(height, self.CalculateTextHeight(dc, x.text, bounds, font)) else: height = self.CalculateTextHeight(dc, "Wy") # We also have to allow for cell padding, on top of the normal padding and decorations cellPadding = self.GetFormat().CalculateCellPadding() return height + cellPadding[1] + cellPadding[3] + self.CalculateExtrasHeight(dc) def CalculateWidth(self, dc): """ Calculate the total width of this block (cells plus padding) """ return sum(x.cellWidth for x in self.GetCombinedLists()) + self.CalculateExtrasWidth(dc) #---------------------------------------------------------------------------- # Commands def CalculateBounds(self, dc): """ Calculate the bounds of this block """ height = self.CalculateHeight(dc) bounds = list(self.GetWorkBounds()) bounds = RectUtils.SetHeight(bounds, height) bounds = RectUtils.SetWidth(bounds, self.CalculateWidth(dc)) bounds = RectUtils.MultiplyOrigin(bounds, 1 / self.scale) return bounds #def CanFit(self, height): # height *= self.scale # return Block.CanFit(self, height) def ChangeWorkBoundsBy(self, height): """ Change our workbounds by our scaled height """ Block.ChangeWorkBoundsBy(self, height * self.scale) def PreDraw(self, dc, bounds): """ Apply our scale before performing any drawing """ self.oldScale = dc.GetUserScale() dc.SetUserScale(self.scale * self.oldScale[0], self.scale * self.oldScale[1]) def PostDraw(self, dc, bounds): """ Restore the scaling to what it used to be """ dc.SetUserScale(*self.oldScale) def DrawSelf(self, dc, bounds): """ Do the actual work of rendering this block. """ cellFmt = self.GetFormat() cellPadding = cellFmt.CalculateCellPadding() combined = self.GetCombinedLists() # Calculate cell boundaries cell = list(bounds) RectUtils.SetWidth(cell, 0) for x in combined: RectUtils.SetLeft(cell, RectUtils.Right(cell)) RectUtils.SetWidth(cell, x.cellWidth) x.cell = list(cell) # Draw each cell font = self.GetFont() for x in combined: cellBounds = RectUtils.InsetRect(x.cell, cellPadding) self.DrawText(dc, x.text, cellBounds, font, x.align, imageIndex=x.image, canWrap=cellFmt.CanWrap, listCtrl=self.GetListCtrl()) if cellFmt.GridPen and combined: dc.SetPen(cellFmt.GridPen) dc.SetBrush(wx.TRANSPARENT_BRUSH) top = RectUtils.Top(bounds) bottom = RectUtils.Bottom(bounds) # Draw the interior dividers for x in combined[:-1]: right = RectUtils.Right(x.cell) dc.DrawLine(right, top, right, bottom) # Draw the surrounding frame left = RectUtils.Left(combined[0].cell) right = RectUtils.Right(combined[-1].cell) dc.DrawRectangle(left, top, right-left, bottom-top) #---------------------------------------------------------------------------- class ThreeCellBlock(CellBlock): """ A ThreeCellBlock divides its space evenly into three cells. """ def GetCellWidths(self): """ Return a list of the widths of the cells in this block """ # We divide the available space between the non-empty cells numNonEmptyTexts = sum(1 for x in self.GetTexts() if x) if not numNonEmptyTexts: return (0, 0, 0) widths = list() width = round(RectUtils.Width(self.GetWorkBounds()) / numNonEmptyTexts) for x in self.GetTexts(): if x: widths.append(width) else: widths.append(0) return widths def GetAlignments(self): """ Return a list indicating how the text within each cell is aligned. """ return (wx.ALIGN_LEFT, wx.ALIGN_CENTER_HORIZONTAL, wx.ALIGN_RIGHT) #---------------------------------------------------------------------------- class ReportBlock(Block): """ A ReportBlock is boot strap Block that represents an entire report. """ #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ if not self.engine.listCtrls: return True # Print each ListView. Each list but the first starts on a separate page self.engine.AddBlock(ListBlock(*self.engine.listCtrls[0])) for (lv, title) in self.engine.listCtrls[1:]: self.engine.AddBlock(PageBreakBlock()) self.engine.AddBlock(ListBlock(lv, title)) return True #---------------------------------------------------------------------------- class PageHeaderBlock(ThreeCellBlock): """ A PageHeaderBlock appears at the top of every page. """ def GetTexts(self): """ Return the array of texts to be printed in the cells """ return self.engine.pageHeader #---------------------------------------------------------------------------- class PageFooterBlock(ThreeCellBlock): """ A PageFooterBlock appears at the bottom of every page. """ def GetTexts(self): """ Return the array of texts to be printed in the cells """ return self.engine.pageFooter #---------------------------------------------------------------------------- # Printing def CalculateBounds(self, dc): """ Calculate the bounds of this block """ # Draw the footer at the bottom of the page height = self.CalculateHeight(dc) bounds = list(self.GetWorkBounds()) return [RectUtils.Left(bounds), RectUtils.Bottom(bounds) - height, RectUtils.Width(bounds), height] def ChangeWorkBoundsBy(self, height): """ The footer changes the bottom of the work bounds """ RectUtils.MoveBottomBy(self.engine.workBounds, -height) #---------------------------------------------------------------------------- class PageBreakBlock(Block): """ A PageBreakBlock acts a page break. """ #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ # Completely fill the remaining area on the page, forcing a page break bounds = self.GetWorkBounds() self.ChangeWorkBoundsBy(RectUtils.Height(bounds)) return True #---------------------------------------------------------------------------- class RunningBlockPusher(Block): """ A RunningBlockPusher pushes (or pops) a running block onto the stack when it is executed. """ def __init__(self, block, push=True): """ """ self.block = block self.push = push def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ if self.push: self.engine.AddRunningBlock(self.block) else: self.engine.RemoveRunningBlock(self.block) return True #---------------------------------------------------------------------------- class ListBlock(Block): """ A ListBlock handles the printing of an entire ListCtrl. """ def __init__(self, lv, title): self.lv = lv self.title = title #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ cellWidths = self.CalculateCellWidths() boundsWidth = RectUtils.Width(self.GetWorkBounds()) # Break the list into vertical slices. Each one but the first will be placed on a # new page. first = True for (left, right) in self.CalculateSlices(boundsWidth, cellWidths): if not first: self.engine.AddBlock(PageBreakBlock()) self.engine.AddBlock(ListHeaderBlock(self.lv, self.title)) self.engine.AddBlock(ListSliceBlock(self.lv, left, right, cellWidths)) self.engine.AddBlock(ListFooterBlock(self.lv, "")) first = False return True def CalculateCellWidths(self): """ Return a list of the widths of the cells in this lists """ columnHeaderFmt = self.engine.GetNamedFormat("ColumnHeader") cellPadding = columnHeaderFmt.CalculateCellPadding() padding = cellPadding[0] + cellPadding[2] return [self.lv.GetColumnWidth(i) + padding for i in range(self.lv.GetColumnCount())] def CalculateSlices(self, maxWidth, columnWidths): """ Return a list of integer pairs, where each pair represents the left and right columns that can fit into the width of one page """ firstColumn = 0 # If a GroupListView has a column just for the expand/collapse, don't include it if hasattr(self.lv, "useExpansionColumn") and self.lv.useExpansionColumn: firstColumn = 1 # If we are shrinking to fit or all the columns fit, just return all columns if self.IsShrinkToFit() or (sum(columnWidths)) <= maxWidth: return [ [firstColumn, len(columnWidths)-1] ] pairs = list() left = firstColumn right = firstColumn while right < len(columnWidths): if (sum(columnWidths[left:right+1])) > maxWidth: if left == right: pairs.append([left, right]) left += 1 right += 1 else: pairs.append([left, right-1]) left = right else: right += 1 if left < len(columnWidths): pairs.append([left, right-1]) return pairs #---------------------------------------------------------------------------- class ListHeaderBlock(TextBlock): """ A ListHeaderBlock is the title that comes before an ListCtrl. """ def __init__(self, lv, title): self.lv = lv self.title = title def GetText(self): """ Return the text that will be printed in this block """ return self.title #---------------------------------------------------------------------------- class ListFooterBlock(TextBlock): """ A ListFooterBlock is the text that comes after an ListCtrl. """ def __init__(self, lv, text): self.lv = lv self.text = text def GetText(self): """ Return the text that will be printed in this block """ return self.text #---------------------------------------------------------------------------- class GroupTitleBlock(TextBlock): """ A GroupTitleBlock is the title that comes before a list group. """ def __init__(self, lv, group): self.lv = lv self.group = group def GetText(self): """ Return the text that will be printed in this block """ return self.group.title #---------------------------------------------------------------------------- class ListSliceBlock(Block): """ A ListSliceBlock prints a vertical slice of an ListCtrl. """ def __init__(self, lv, left, right, allCellWidths): self.lv = lv self.left = left self.right = right self.allCellWidths = allCellWidths #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ # If we are shrinking our cells, calculate the shrink factor if self.IsShrinkToFit(): scale = self.CalculateShrinkToFit(dc) else: scale = 1 headerBlock = ColumnHeaderBlock(self.lv, self.left, self.right, scale, self.allCellWidths) self.engine.AddBlock(headerBlock) if self.IsColumnHeadingsOnEachPage(): self.engine.AddBlock(RunningBlockPusher(headerBlock)) # Are we printing a GroupListView? # We can't use isinstance() since ObjectListView may not be installed if hasattr(self.lv, "GetShowGroups") and self.lv.GetShowGroups(): self.engine.AddBlock(GroupListRowsBlock(self.lv, self.left, self.right, scale, self.allCellWidths)) else: self.engine.AddBlock(ListRowsBlock(self.lv, self.left, self.right, scale, self.allCellWidths)) if self.IsColumnHeadingsOnEachPage(): self.engine.AddBlock(RunningBlockPusher(headerBlock, False)) return True def CalculateShrinkToFit(self, dc): """ How much do we have to shrink our rows by to fit onto the page? """ block = ColumnHeaderBlock(self.lv, self.left, self.right, 1, self.allCellWidths) block.engine = self.engine rowWidth = block.CalculateWidth(dc) boundsWidth = RectUtils.Width(self.GetWorkBounds()) if rowWidth > boundsWidth: return float(boundsWidth) / float(rowWidth) else: return 1 #---------------------------------------------------------------------------- class ColumnBasedBlock(CellBlock): """ A ColumnBasedBlock is a cell block that takes its width from the columns of a ListCtrl. This is an abstract class """ def __init__(self, lv, left, right, scale, allCellWidths): self.lv = lv self.left = left self.right = right self.scale = scale self.allCellWidths = allCellWidths #---------------------------------------------------------------------------- # Accessing - Subclasses should override def GetListCtrl(self): """ Return the ListCtrl that is behind this cell block. """ return self.lv def GetCellWidths(self): """ Return the widths of the cells used in this block """ #return [self.allCellWidths[i] for i in range(self.left, self.right+1)] return self.allCellWidths[self.left:self.right+1] #---------------------------------------------------------------------------- # Utiltities def GetColumnAlignments(self, lv, left, right): """ Return the alignments of the given slice of columns """ listAlignments = [lv.GetColumn(i).GetAlign() for i in range(left, right+1)] mapping = { wx.LIST_FORMAT_LEFT: wx.ALIGN_LEFT, wx.LIST_FORMAT_RIGHT: wx.ALIGN_RIGHT, wx.LIST_FORMAT_CENTRE: wx.ALIGN_CENTRE, } return [mapping[x] for x in listAlignments] #---------------------------------------------------------------------------- class ColumnHeaderBlock(ColumnBasedBlock): """ A ColumnHeaderBlock prints a portion of the columns header in a ListCtrl. """ #---------------------------------------------------------------------------- # Accessing def GetTexts(self): """ Return a list of the texts that should be drawn with the cells """ return [self.lv.GetColumn(i).GetText() for i in range(self.left, self.right+1)] def GetAlignments(self): """ Return a list indicating how the text within each cell is aligned. """ if self.GetFormat().AlwaysCenter: return [wx.ALIGN_CENTRE for i in range(self.left, self.right+1)] else: return self.GetColumnAlignments(self.lv, self.left, self.right) def GetImages(self): """ Return a list of the images that should be drawn in each cell """ # For some reason, columns return 0 when they have no image, rather than -1 like they should images = list() for i in range(self.left, self.right+1): imageIndex = self.lv.GetColumn(i).GetImage() if imageIndex == 0: imageIndex = -1 images.append(imageIndex) return images def IsUseSubstitution(self): """ Should the text values printed by this block have substitutions performed before being printed? Normally, we don't want to substitute within values that comes from the ListCtrl. """ return False #---------------------------------------------------------------------------- class ListRowsBlock(Block): """ A ListRowsBlock prints rows of an ListCtrl. """ def __init__(self, lv, left, right, scale, allCellWidths): """ """ self.lv = lv self.left = left self.right = right self.scale = scale self.allCellWidths = allCellWidths self.currentIndex = 0 self.totalRows = self.lv.GetItemCount() #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ # This block works by printing a single row and then rescheduling itself # to print the remaining rows after the current row has finished. if self.currentIndex < self.totalRows: self.engine.AddBlock(RowBlock(self.lv, self.currentIndex, self.left, self.right, self.scale, self.allCellWidths)) self.currentIndex += 1 self.engine.AddBlock(self) return True #---------------------------------------------------------------------------- class GroupListRowsBlock(Block): """ A GroupListRowsBlock prints rows of an GroupListView. """ def __init__(self, lv, left, right, scale, allCellWidths): """ """ self.lv = lv # Must be a GroupListView self.left = left self.right = right self.scale = scale self.allCellWidths = allCellWidths self.currentIndex = 0 self.totalRows = self.lv.GetItemCount() #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ # This block works by printing a single row and then rescheduling itself # to print the remaining rows after the current row has finished. if self.currentIndex >= self.totalRows: return True # If GetObjectAt() return an object, then it's a normal row. # Otherwise, if the innerList object isn't None, it must be a ListGroup # We can't use isinstance(x, GroupListView) because ObjectListView may not be installed if self.lv.GetObjectAt(self.currentIndex): self.engine.AddBlock(RowBlock(self.lv, self.currentIndex, self.left, self.right, self.scale, self.allCellWidths)) elif self.lv.innerList[self.currentIndex]: self.engine.AddBlock(GroupTitleBlock(self.lv, self.lv.innerList[self.currentIndex])) # Schedule the printing of the remaining rows self.currentIndex += 1 self.engine.AddBlock(self) return True #---------------------------------------------------------------------------- class RowBlock(ColumnBasedBlock): """ A RowBlock prints a vertical slice of a single row of an ListCtrl. """ def __init__(self, lv, rowIndex, left, right, scale, allCellWidths): self.lv = lv self.rowIndex = rowIndex self.left = left self.right = right self.scale = scale self.allCellWidths = allCellWidths #---------------------------------------------------------------------------- # Accessing def GetFont(self): """ Return Font that should be used to draw text in this block """ font = None if self.engine.reportFormat.UseListCtrlTextFormat and self.GetListCtrl(): # Figure out what font is being used for this row in the list. # Unfortunately, there is no one way to find this information: virtual mode lists # have to be treated in a different manner from non-virtual lists. listCtrl = self.GetListCtrl() if listCtrl.IsVirtual(): attr = listCtrl.OnGetItemAttr(self.rowIndex) if attr and attr.HasFont(): font = attr.GetFont() else: font = listCtrl.GetItemFont(self.rowIndex) if font and font.IsOk(): return font else: return self.GetFormat().GetFont() def GetTextColor(self): """ Return Colour that should be used to draw text in this block """ color = None if self.engine.reportFormat.UseListCtrlTextFormat and self.GetListCtrl(): # Figure out what text colour is being used for this row in the list. # Unfortunately, there is no one way to find this information: virtual mode lists # have to be treated in a different manner from non-virtual lists. listCtrl = self.GetListCtrl() if listCtrl.IsVirtual(): attr = listCtrl.OnGetItemAttr(self.rowIndex) if attr and attr.HasTextColour(): color = attr.GetTextColour() else: color = listCtrl.GetItemTextColour(self.rowIndex) if color and color.IsOk(): return color else: return self.GetFormat().GetTextColor() def IsUseSubstitution(self): """ Should the text values printed by this block have substitutions performed before being printed? Normally, we don't want to substitute within values that comes from the ListCtrl. """ return False #---------------------------------------------------------------------------- # Overrides for CellBlock def GetTexts(self): """ Return a list of the texts that should be drawn with the cells """ return [self.lv.GetItem(self.rowIndex, i).GetText() for i in range(self.left, self.right+1)] def GetAlignments(self): """ Return a list indicating how the text within each cell is aligned. """ return self.GetColumnAlignments(self.lv, self.left, self.right) def GetImages(self): """ Return a list of the images that should be drawn in each cell """ return [self.lv.GetItem(self.rowIndex, i).GetImage() for i in range(self.left, self.right+1)] #def GetTexts(self): # """ # Return a list of the texts that should be drawn with the cells # """ # modelObjects = self.lv.GetObjectAt(self.rowIndex) # return [self.lv.GetStringValueAt(modelObjects, i) for i in range(self.left, self.right+1)] # #def GetAlignments(self): # """ # Return a list indicating how the text within each cell is aligned. # """ # return [self.lv.columns[i].GetAlignment() for i in range(self.left, self.right+1)] # #def GetImages(self): # """ # Return a list of the images that should be drawn in each cell # """ # modelObjects = self.lv.GetObjectAt(self.rowIndex) # return [self.lv.GetImageAt(modelObjects, i) for i in range(self.left, self.right+1)] #---------------------------------------------------------------------------- class Decoration(object): """ A Decoration add some visual effect to a Block (e.g. borders, background image, watermark). They can also reserve a chunk of their Blocks space for their own use. Decorations are added to a BlockFormat which is then applied to a ReportBlock. All the decorations for a block are drawn into the same area. If two decorations are added, they will draw over the top of each other. This is normally what is expected, but may sometimes be surprising. For example, if you add two Lines to the left of the same block, they will draw over the top of each other. """ #---------------------------------------------------------------------------- # Accessing def IsDrawOver(self): """ Return True if this decoration should be drawn over it's block. If not, it will be drawn underneath """ return False #---------------------------------------------------------------------------- # Commands def SubtractFrom(self, dc, bounds): """ Subtract the space used by this decoration from the given bounds """ return bounds def DrawDecoration(self, dc, bounds, block): """ Draw this decoration """ pass #---------------------------------------------------------------------------- class RectangleDecoration(Decoration): """ A RectangleDecoration draw a rectangle around or on the side of a block. The rectangle can be hollow, solid filled or gradient-filled. It can have a frame drawn as well. """ def __init__(self, side=None, pen=None, color=None, toColor=None, width=0, space=0): """ If color is None, the rectangle will be hollow. If toColor is None, the rectangle will be filled with "color" otherwise it will be gradient-filled. If pen is not None, the rectangle will be framed with that pen. If no side is given, the rectangle will be drawn around the block. In that case, space can be a list giving the space on each side. """ self.side = side self.pen = pen self.color = color self.toColor = toColor self.width = width self.space = space #---------------------------------------------------------------------------- # Commands def SubtractFrom(self, dc, bounds): """ Subtract the space used by this decoration from the given bounds """ if self.side is None: return RectUtils.InsetBy(RectUtils.InsetBy(bounds, self.space), self.width) inset = self.space + self.width if self.side == wx.LEFT: return RectUtils.MoveLeftBy(bounds, inset) if self.side == wx.RIGHT: return RectUtils.MoveRightBy(bounds, -inset) if self.side == wx.TOP: return RectUtils.MoveTopBy(bounds, inset) if self.side == wx.BOTTOM: return RectUtils.MoveBottomBy(bounds, -inset) return bounds def DrawDecoration(self, dc, bounds, block): """ Draw this decoration """ rect = self._CalculateRect(bounds) if self.color: if self.toColor is None: dc.SetPen(wx.TRANSPARENT_PEN) dc.SetBrush(wx.Brush(self.color)) dc.DrawRectangle(*rect) else: dc.GradientFillLinear(wx.Rect(*rect), self.color, self.toColor) if self.pen: dc.SetPen(self.pen) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawRectangle(*rect) def _CalculateRect(self, bounds): """ Calculate the rectangle that this decoration is going to paint """ if self.side is None: return bounds if self.side == wx.LEFT: return (RectUtils.Left(bounds), RectUtils.Top(bounds), self.width, RectUtils.Height(bounds)) if self.side == wx.RIGHT: return (RectUtils.Right(bounds) - self.width, RectUtils.Top(bounds), self.width, RectUtils.Height(bounds)) if self.side == wx.TOP: return (RectUtils.Left(bounds), RectUtils.Top(bounds), RectUtils.Width(bounds), self.width) if self.side == wx.BOTTOM: return (RectUtils.Left(bounds), RectUtils.Bottom(bounds) - self.width, RectUtils.Width(bounds), self.width) return bounds #---------------------------------------------------------------------------- class LineDecoration(Decoration): """ A LineDecoration draws a line on the side of a decoration. """ def __init__(self, side=wx.BOTTOM, pen=None, space=0): self.side = side self.pen = pen self.space = space #---------------------------------------------------------------------------- # Commands def SubtractFrom(self, dc, bounds): """ Subtract the space used by this decoration from the given bounds """ inset = self.space if self.pen is not None: inset += self.pen.GetWidth() if self.side == wx.LEFT: return RectUtils.MoveLeftBy(bounds, inset) if self.side == wx.RIGHT: return RectUtils.MoveRightBy(bounds, -inset) if self.side == wx.TOP: return RectUtils.MoveTopBy(bounds, inset) if self.side == wx.BOTTOM: return RectUtils.MoveBottomBy(bounds, -inset) return bounds def DrawDecoration(self, dc, bounds, block): """ Draw this decoration """ if self.pen == None: return if self.side == wx.LEFT: pt1 = RectUtils.TopLeft(bounds) pt2 = RectUtils.BottomLeft(bounds) elif self.side == wx.RIGHT: pt1 = RectUtils.TopRight(bounds) pt2 = RectUtils.BottomRight(bounds) elif self.side == wx.TOP: pt1 = RectUtils.TopLeft(bounds) pt2 = RectUtils.TopRight(bounds) elif self.side == wx.BOTTOM: pt1 = RectUtils.BottomLeft(bounds) pt2 = RectUtils.BottomRight(bounds) dc.SetPen(self.pen) dc.DrawLine(pt1[0], pt1[1], pt2[0], pt2[1]) #---------------------------------------------------------------------------- class WatermarkDecoration(Decoration): """ A WatermarkDecoration draws an angled line of text over each page. The watermark is rotated around the center of the page. If *over* is True, the watermark will be printed on top of the page. Otherwise, it will be printed under the page. """ def __init__(self, text, font=None, color=None, angle=30, over=True): """ """ self.text = text self.color = color or wx.Colour(128, 128, 128, 128) self.font = font or wx.FFont(128, wx.SWISS, 0) self.angle = angle self.over = over def IsDrawOver(self): """ Should this decoration be drawn over the rest of page? """ return self.over def DrawDecoration(self, dc, bounds, block): """ Draw the decoration """ dc.SetFont(self.font) dc.SetTextForeground(self.color) # Rotate the text around the center of the page cx, cy = RectUtils.Center(bounds) w, h = dc.GetTextExtent(self.text) x = cx - w/2 y = cy - h/2 + (w/2 * math.sin(math.radians(self.angle))) dc.DrawRotatedText(self.text, x, y, self.angle) #---------------------------------------------------------------------------- class ImageDecoration(Decoration): """ A ImageDecoration draws an image over (or under) the given block. NB: Printer contexts do not honor alpha channels. """ def __init__(self, image=None, horizontalAlign=wx.CENTER, verticalAlign=wx.CENTER, over=True): """ image must be either an wx.Image or a wx.Bitmap """ self.horizontalAlign = horizontalAlign self.verticalAlign = verticalAlign self.over = True self.bitmap = image if isinstance(image, wx.Image): self.bitmap = wx.BitmapFromImage(image) def DrawDecoration(self, dc, bounds, block): """ Draw the decoration """ if not self.bitmap: return if self.horizontalAlign == wx.LEFT: x = RectUtils.Left(bounds) elif self.horizontalAlign == wx.RIGHT: x = RectUtils.Right(bounds) - self.bitmap.Width else: x = RectUtils.CenterX(bounds) - self.bitmap.Width/2 if self.verticalAlign == wx.TOP: y = RectUtils.Top(bounds) elif self.verticalAlign == wx.BOTTOM: y = RectUtils.Bottom(bounds) - self.bitmap.Height else: y = RectUtils.CenterY(bounds) - self.bitmap.Height/2 dc.DrawBitmap(self.bitmap, x, y, True) #---------------------------------------------------------------------------- class Bucket(object): """ General purpose, hold-all data object """ def __init__(self, **kwargs): self.__dict__.update(kwargs) def __repr__(self): strs = ["%s=%r" % kv for kv in self.__dict__.items()] return "Bucket(" + ", ".join(strs) + ")" #---------------------------------------------------------------------------- class RectUtils: """ Static rectangle utilities. Rectangles are a list or tuple of 4-elements: [left, top, width, height] """ #---------------------------------------------------------------------------- # Accessing @staticmethod def Left(r): return r[0] @staticmethod def Top(r): return r[1] @staticmethod def Width(r): return r[2] @staticmethod def Height(r): return r[3] @staticmethod def Right(r): return r[0] + r[2] @staticmethod def Bottom(r): return r[1] + r[3] @staticmethod def TopLeft(r): return [r[0], r[1]] @staticmethod def TopRight(r): return [r[0] + r[2], r[1]] @staticmethod def BottomLeft(r): return [r[0], r[1] + r[3]] @staticmethod def BottomRight(r): return [r[0] + r[2], r[1] + r[3]] @staticmethod def CenterX(r): return r[0] + r[2]/2 @staticmethod def CenterY(r): return r[1] + r[3]/2 @staticmethod def Center(r): return [r[0] + r[2]/2, r[1] + r[3]/2] #---------------------------------------------------------------------------- # Modifying @staticmethod def SetLeft(r, l): r[0] = l return r @staticmethod def SetTop(r, t): r[1] = t return r @staticmethod def SetWidth(r, w): r[2] = w return r @staticmethod def SetHeight(r, h): r[3] = h return r @staticmethod def MoveLeftBy(r, delta): r[0] += delta r[2] -= delta return r @staticmethod def MoveTopBy(r, delta): r[1] += delta r[3] -= delta return r @staticmethod def MoveRightBy(r, delta): r[2] += delta return r @staticmethod def MoveBottomBy(r, delta): r[3] += delta return r #---------------------------------------------------------------------------- # Calculations @staticmethod def InsetBy(r, delta): if delta is None: return r try: delta[0] # is it indexable? return RectUtils.InsetRect(r, delta) except: return RectUtils.InsetRect(r, (delta, delta, delta, delta)) @staticmethod def InsetRect(r, r2): if r2 is None: return r else: return [r[0] + r2[0], r[1] + r2[1], r[2] - (r2[0] + r2[2]), r[3] - (r2[1] + r2[3])] @staticmethod def MultiplyOrigin(r, factor): return [r[0]*factor, r[1]*factor, r[2], r[3]] #---------------------------------------------------------------------------- # TESTING ONLY #---------------------------------------------------------------------------- if __name__ == '__main__': import wx from ObjectListView import ObjectListView, FastObjectListView, GroupListView, ColumnDefn # Where can we find the Example module? import sys sys.path.append("../Examples") import ExampleModel import ExampleImages class MyFrame(wx.Frame): def __init__(self, *args, **kwds): kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.panel = wx.Panel(self, -1) #self.lv = ObjectListView(self.panel, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) self.lv = GroupListView(self.panel, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) #self.lv = FastObjectListView(self.panel, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) sizer_2 = wx.BoxSizer(wx.VERTICAL) sizer_2.Add(self.lv, 1, wx.ALL|wx.EXPAND, 4) self.panel.SetSizer(sizer_2) self.panel.Layout() sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_1.Add(self.panel, 1, wx.EXPAND) self.SetSizer(sizer_1) self.Layout() musicImage = self.lv.AddImages(ExampleImages.getMusic16Bitmap(), ExampleImages.getMusic32Bitmap()) artistImage = self.lv.AddImages(ExampleImages.getUser16Bitmap(), ExampleImages.getUser32Bitmap()) self.lv.SetColumns([ ColumnDefn("Title", "left", 200, "title", imageGetter=musicImage), ColumnDefn("Artist", "left", 150, "artist", imageGetter=artistImage), ColumnDefn("Last Played", "left", 100, "lastPlayed"), ColumnDefn("Size", "center", 100, "sizeInBytes"), ColumnDefn("Rating", "center", 100, "rating"), ]) #self.lv.CreateCheckStateColumn() self.lv.SetSortColumn(self.lv.columns[2]) self.lv.SetObjects(ExampleModel.GetTracks()) wx.CallLater(50, self.run) def run(self): printer = ListCtrlPrinter(self.lv, "Playing with ListCtrl Printing") printer.ReportFormat = ReportFormat.Normal() printer.ReportFormat.WatermarkFormat(over=True) printer.ReportFormat.IsColumnHeadingsOnEachPage = True #printer.ReportFormat.Page.Add(ImageDecoration(ExampleImages.getGroup32Bitmap(), wx.RIGHT, wx.BOTTOM)) #printer.PageHeader("%(listTitle)s") # nice idea but not possible at the moment printer.PageHeader = "Playing with ListCtrl Printing" printer.PageFooter = ("Bright Ideas Software", "%(date)s", "%(currentPage)d of %(totalPages)d") printer.Watermark = "Sloth!" #printer.PageSetup() printer.PrintPreview(self) app = wx.PySimpleApp(0) wx.InitAllImageHandlers() frame_1 = MyFrame(None, -1, "") app.SetTopWindow(frame_1) frame_1.Show() app.MainLoop() wxbanker-0.9.1/wxbanker/ObjectListView/ObjectListView.py0000644000175000017500000044406712243601243023305 0ustar mrooneymrooney# -*- coding: utf-8 -*- #---------------------------------------------------------------------------- # Name: ObjectListView.py # Author: Phillip Piper # Created: 29 February 2008 # Copyright: (c) 2008 Phillip Piper # SVN-ID: $Id$ # License: wxWindows license #---------------------------------------------------------------------------- # Change log: # 2008/09/02 JPP - Added BatchedUpdate adaptor # - Improved speed of selecting and refreshing by keeping a map # of objects to indicies # - Added GetIndexOf() # - Removed flicker from FastObjectListView.AddObjects() and RefreshObjects() # 2008/08/27 JPP - Implemented filtering # - Added GetObjects() and GetFilteredObjects() # - Added resortNow parameter to SetSortColumn() # 2008/08/23 JPP - Added AddObjects()/RemoveObjects() and friends # - Removed duplicate code when building/refreshing/adding objects # - One step closer to secondary sort column support # 2008/08/18 JPP - Handle model objects that cannot be hashed # - Added CELL_EDIT_STARTED and CELL_EDIT_FINISHED events # 2008/08/16 JPP - Added ensureVisible parameter to SelectObject() # 2008/08/05 JPP - GroupListView is now implemented as a virtual list. Much faster! # v1.1 # 2008/07/19 JPP - Added GroupListView # - Broke common virtual list behaviour into AbstractVirtualListView # 2008/07/13 JPP - Added CopySelectionToClipboard and CopyObjectsToClipboard # 2008/07/08 JPP - Fixed several Linux specific bugs/limits # 2008/07/03 JPP - Allow headers to have images # v1.0.1 # 2008/06/22 JPP - Allowed for custom sorting, even on virtual lists # - Fixed bug where an imageGetter that returned 0 was treated # as if it returned -1 (i.e. no image) # 2008/06/17 JPP - Use binary searches when searching on sorted columns # 2008/06/16 JPP - Search by sorted column works, even on virtual lists # 2008/06/12 JPP - Added sortable parameter # - Renamed sortColumn to be sortColumnIndex to make it clear # - Allow returns in multiline cell editors # v1.0 # 2008/05/29 JPP Used named images internally # 2008/05/26 JPP Fixed pyLint annoyances # 2008/05/24 JPP Images can be referenced by name # 2008/05/17 JPP Checkboxes supported # 2008/04/18 JPP Cell editing complete # 2008/03/31 JPP Added space filling columns # 2008/03/29 JPP Added minimum, maximum and fixed widths for columns # 2008/03/22 JPP Added VirtualObjectListView and FastObjectListView # 2008/02/29 JPP Version converted from wax # 2006/11/03 JPP First version under wax #---------------------------------------------------------------------------- # To do: # - selectable columns, triggered on right click on header # - secondary sort column # - optionally preserve selection on RepopulateList # - get rid of scrollbar when editing label in icon view # - need a ChangeView() method to help when switching between views """ An `ObjectListView` provides a more convienent and powerful interface to a ListCtrl. The major features of an `ObjectListView` are: * Automatically transforms a collection of model objects into a ListCtrl. * Automatically sorts rows by their data type. * Easily edits the values shown in the ListCtrl. * Supports all ListCtrl views (report, list, large and small icons). * Columns can be fixed-width, have a minimum and/or maximum width, or be space-filling. * Displays a "list is empty" message when the list is empty (obviously). * Supports custom formatting of rows * Supports alternate rows background colors. * Supports checkbox columns * Supports searching (by typing) on the sorted column -- even on virtual lists. * Supports filtering of rows * The `FastObjectListView` version can build a list of 10,000 objects in less than 0.1 seconds. * The `VirtualObjectListView` version supports millions of rows through ListCtrl's virtual mode. * The `GroupListView` version partitions it's rows into collapsible groups. An `ObjectListView` works in a declarative manner: the programmer configures how it should work, then gives it the list of objects to display. The primary configuration is in the definitions of the columns. Columns are configured to know which aspect of their model they should display, how it should be formatted, and even how new values should be written back into the model. See `ColumnDefn` for more information. """ __author__ = "Phillip Piper" __date__ = "18 June 2008" __version__ = "1.1" import wx import datetime import itertools import locale import operator import string import time from wxbanker.ObjectListView import CellEditor, OLVEvent class ObjectListView(wx.ListCtrl): """ An object list displays various aspects of a list of objects in a multi-column list control. To use an ObjectListView, the programmer defines what columns are in the control and which bits of information each column should display. The programmer then calls `SetObjects` with the list of objects that the ObjectListView should display. The ObjectListView then builds the control. Columns hold much of the intelligence of this control. Columns define both the format (width, alignment), the aspect to be shown in the column, and the columns behaviour. See `ColumnDefn` for full details. These are public instance variables. (All other variables should be considered private.) * cellEditMode This control whether and how the cells of the control are editable. It can be set to one of the following values: CELLEDIT_NONE Cell editing is not allowed on the control This is the default. CELLEDIT_SINGLECLICK Single clicking on any subitem cell begins an edit operation on that cell. Single clicking on the primaru cell does *not* start an edit operation. It simply selects the row. Pressing F2 edits the primary cell. CELLEDIT_DOUBLECLICK Double clicking any cell starts an edit operation on that cell, including the primary cell. Pressing F2 edits the primary cell. CELLEDIT_F2ONLY Pressing F2 edits the primary cell. Tab/Shift-Tab can be used to edit other cells. Clicking does not start any editing. * evenRowsBackColor When `useAlternateBackColors` is true, even numbered rows will have this background color. * handleStandardKeys When this is True (the default), several standard keys will be handled as commands by the ObjectListView. If this is False, they will be ignored. Ctrl-A Select all model objects Ctrl-C Put a text version of the selected rows onto the clipboard (on Windows, this is will also put a HTML version into the clipboard) Left-Arrow, Right-Arrow [GroupListView only] This will collapse/expand all selected groups. * oddRowsBackColor When `useAlternateBackColors` is true, odd numbered rows will have this background color. * rowFormatter To further control the formatting of individual rows, this property can be set to a callable that expects two parameters: the listitem whose characteristics are to be set, and the model object being displayed on that row. The row formatter is called after the alternate back colours (if any) have been set. Remember: the background and text colours are overridden by system defaults while a row is selected. * typingSearchesSortColumn If this boolean is True (the default), when the user types into the list, the control will try to find a prefix match on the values in the sort column. If this is False, or the list is unsorted or if the sorted column is marked as not searchable (via `isSearchable` attribute), the primary column will be matched. * useAlternateBackColors If this property is true, even and odd rows will be given different background. The background colors are controlled by the properties `evenRowsBackColor` and `oddRowsBackColor`. This is true by default. """ CELLEDIT_NONE = 0 CELLEDIT_SINGLECLICK = 1 CELLEDIT_DOUBLECLICK = 2 CELLEDIT_F2ONLY = 3 """Names of standard images used within the ObjectListView. If you want to use your own image in place of a standard one, simple register it with AddNamedImages() using one of the following names.""" NAME_DOWN_IMAGE = "objectListView.downImage" NAME_UP_IMAGE = "objectListView.upImage" NAME_CHECKED_IMAGE = "objectListView.checkedImage" NAME_UNCHECKED_IMAGE = "objectListView.uncheckedImage" NAME_UNDETERMINED_IMAGE = "objectListView.undeterminedImage" NAME_EXPANDED_IMAGE = "objectListView.expandedImage" NAME_COLLAPSED_IMAGE = "objectListView.collapsedImage" """When typing into the list, a delay between keystrokes greater than this (in seconds) will be interpretted as a new search and any previous search text will be cleared""" SEARCH_KEYSTROKE_DELAY = 0.75 """When typing into a list and searching on an unsorted column, we don't even try to search if there are more than this many rows.""" MAX_ROWS_FOR_UNSORTED_SEARCH = 100000 def __init__(self, *args, **kwargs): """ Create an ObjectListView. Apart from the normal ListCtrl parameters, this constructor looks for any of the following optional parameters: * `cellEditMode` * `rowFormatter` * `sortable` * `useAlternateBackColors` The behaviour of these properties are described in the class documentation, except for `sortable.` `sortable` controls whether the rows of the control will be sorted when the user clicks on the header. This is true by default. If it is False, clicking the header will be nothing, and no images will be registered in the image lists. This parameter only has effect at creation time -- it has no impact after creation. """ # We have two collections of objects: our model objects and our working list # ("innerList"). The model objects are those given to use by the user; the working # list is what is actually used to populate the control. This separation let us # modify what is presented to the user without losing our base data. This allows # to (in the future) implement filtering or some other view-like capabilities. # Currently, for ObjectListView, these collections will be identical, but for a # GroupListView they are different. self.modelObjects = [] self.innerList = [] self.columns = [] self.sortColumnIndex = -1 self.sortAscending = True self.smallImageList = None self.normalImageList = None self.cellEditor = None self.cellBeingEdited = None self.selectionBeforeCellEdit = [] self.checkStateColumn = None self.handleStandardKeys = True self.searchPrefix = u"" self.whenLastTypingEvent = 0 self.filter = None self.objectToIndexMap = None self.rowFormatter = kwargs.pop("rowFormatter", None) self.useAlternateBackColors = kwargs.pop("useAlternateBackColors", True) self.sortable = kwargs.pop("sortable", True) self.cellEditMode = kwargs.pop("cellEditMode", self.CELLEDIT_NONE) self.typingSearchesSortColumn = kwargs.pop("typingSearchesSortColumn", True) self.evenRowsBackColor = wx.Colour(240, 248, 255) # ALICE BLUE self.oddRowsBackColor = wx.Colour(255, 250, 205) # LEMON CHIFFON wx.ListCtrl.__init__(self, *args, **kwargs) if self.sortable: self.EnableSorting() # NOTE: On Windows, ListCtrl's don't trigger EVT_LEFT_UP :( self.Bind(wx.EVT_CHAR, self._HandleChar) self.Bind(wx.EVT_LEFT_DOWN, self._HandleLeftDown) self.Bind(wx.EVT_LEFT_UP, self._HandleLeftClickOrDoubleClick) self.Bind(wx.EVT_LEFT_DCLICK, self._HandleLeftClickOrDoubleClick) self.Bind(wx.EVT_LIST_COL_BEGIN_DRAG, self._HandleColumnBeginDrag) self.Bind(wx.EVT_LIST_COL_END_DRAG, self._HandleColumnEndDrag) self.Bind(wx.EVT_MOUSEWHEEL, self._HandleMouseWheel) self.Bind(wx.EVT_SCROLLWIN, self._HandleScroll) self.Bind(wx.EVT_SIZE, self._HandleSize) # When is this event triggered? #self.Bind(wx.EVT_LIST_COL_DRAGGING, self._HandleColumnDragging) # For some reason under Linux, the default wx.StaticText always appears # behind the ListCtrl. The GenStaticText class appears as it should. if wx.Platform == "__WXGTK__": from wx.lib.stattext import GenStaticText as StaticText else: StaticText = wx.StaticText self.stEmptyListMsg = StaticText(self, -1, "This list is empty", wx.Point(0, 0), wx.Size(0, 0), wx.ALIGN_CENTER | wx.ST_NO_AUTORESIZE | wx.FULL_REPAINT_ON_RESIZE) self.stEmptyListMsg.Hide() self.stEmptyListMsg.SetForegroundColour(wx.LIGHT_GREY) self.stEmptyListMsg.SetBackgroundColour(self.GetBackgroundColour()) self.stEmptyListMsg.SetFont(wx.Font(24, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) #--------------------------------------------------------------#000000#FFFFFF # Setup def SetColumns(self, columns, repopulate=True): """ Set the list of columns that will be displayed. The elements of the list can be either ColumnDefn objects or a tuple holding the values to be given to the ColumnDefn constructor. The first column is the primary column -- this will be shown in the the non-report views. This clears any preexisting CheckStateColumn. The first column that is a check state column will be installed as the CheckStateColumn for this listview. """ sortCol = self.GetSortColumn() wx.ListCtrl.ClearAll(self) self.checkStateColumn = None self.columns = [] for x in columns: if isinstance(x, ColumnDefn): self.AddColumnDefn(x) else: self.AddColumnDefn(ColumnDefn(*x)) # Try to preserve the column column self.SetSortColumn(sortCol) if repopulate: self.RepopulateList() def AddColumnDefn(self, defn): """ Append the given ColumnDefn object to our list of active columns. If this method is called directly, you must also call RepopulateList() to populate the new column with data. """ self.columns.append(defn) info = wx.ListItem() info.m_mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_FORMAT if isinstance(defn.headerImage, basestring) and self.smallImageList is not None: info.m_image = self.smallImageList.GetImageIndex(defn.headerImage) else: info.m_image = defn.headerImage if info.m_image != -1: info.m_mask = info.m_mask | wx.LIST_MASK_IMAGE info.m_format = defn.GetAlignment() info.m_text = defn.title info.m_width = defn.width self.InsertColumnInfo(len(self.columns)-1, info) # Under Linux, the width doesn't take effect without this call self.SetColumnWidth(len(self.columns)-1, defn.width) # The first checkbox column becomes the check state column for the control if defn.HasCheckState() and self.checkStateColumn is None: self.InstallCheckStateColumn(defn) def _InitializeCheckBoxImages(self): """ Initialize some checkbox images for use by this control. """ def _makeBitmap(state, size): bitmap = wx.EmptyBitmap(size, size) dc = wx.MemoryDC(bitmap) dc.Clear() # On Linux, the Renderer draws the checkbox too low if wx.Platform == "__WXGTK__": yOrigin = -1 else: yOrigin = 0 wx.RendererNative.Get().DrawCheckBox(self, dc, (0, yOrigin, size, size), state) dc.SelectObject(wx.NullBitmap) return bitmap def _makeBitmaps(name, state): self.AddNamedImages(name, _makeBitmap(state, 16), _makeBitmap(state, 32)) # If there isn't a small image list, make one if self.smallImageList is None: self.SetImageLists() _makeBitmaps(ObjectListView.NAME_CHECKED_IMAGE, wx.CONTROL_CHECKED) _makeBitmaps(ObjectListView.NAME_UNCHECKED_IMAGE, wx.CONTROL_CURRENT) _makeBitmaps(ObjectListView.NAME_UNDETERMINED_IMAGE, wx.CONTROL_UNDETERMINED) def CreateCheckStateColumn(self, columnIndex=0): """ Create a fixed width column at the given index to show the checkedness of objects in this list. If this is installed at column 0 (which is the default), the listview should only be used in Report view. This should be called after SetColumns() has been called, since SetColumns() removed any previous check state column. RepopulateList() or SetObjects() must be called after this. """ col = ColumnDefn("", fixedWidth=24, isEditable=False) col.valueGetter = col.GetCheckState # Install a value getter so sorting works col.stringConverter = lambda x: "" # We don't want any string for the value col.isInternal = True # This is an autocreated column self.columns.insert(columnIndex, col) self.SetColumns(self.columns, False) self.InstallCheckStateColumn(col) def InstallCheckStateColumn(self, column): """ Configure the given column so that it shows the check state of each row in this control. This column's checkbox will be toggled when the user pressed space when a row is selected. `RepopulateList()` or `SetObjects()` must be called after a new check state column is installed for the check state column to be visible. Set to None to remove the check state column. """ self.checkStateColumn = column if column is None: return if self.smallImageList == None or \ not self.smallImageList.HasName(ObjectListView.NAME_CHECKED_IMAGE): self._InitializeCheckBoxImages() # Is the column already configured to handle check state? if column.HasCheckState(): return # The column isn't managing it's own check state, so install handlers # that will manage the state. This is useful when the checkedness is # related to the view and is not an attribute of the model. checkState = dict() def _handleGetCheckState(modelObject): return checkState.get(modelObject, False) # objects are not checked by default def _handleSetCheckState(modelObject, newValue): checkState[modelObject] = newValue return newValue column.checkStateGetter = _handleGetCheckState column.checkStateSetter = _handleSetCheckState def RegisterSortIndicators(self, sortUp=None, sortDown=None): """ Register the bitmaps that should be used to indicated which column is being sorted These bitmaps must be the same dimensions as the small image list (not sure why that should be so, but it is) If no parameters are given, 16x16 default images will be registered """ self.AddNamedImages(ObjectListView.NAME_DOWN_IMAGE, sortDown or _getSmallDownArrowBitmap()) self.AddNamedImages(ObjectListView.NAME_UP_IMAGE, sortUp or _getSmallUpArrowBitmap()) def SetImageLists(self, smallImageList=None, normalImageList=None): """ Remember the image lists to be used for this control. Call this without parameters to create reasonable default image lists. Use this to change the size of images shown by the list control. """ if isinstance(smallImageList, NamedImageList): self.smallImageList = smallImageList else: self.smallImageList = NamedImageList(smallImageList, 16) self.SetImageList(self.smallImageList.imageList, wx.IMAGE_LIST_SMALL) if isinstance(normalImageList, NamedImageList): self.normalImageList = normalImageList else: self.normalImageList = NamedImageList(normalImageList, 32) self.SetImageList(self.normalImageList.imageList, wx.IMAGE_LIST_NORMAL) #--------------------------------------------------------------#000000#FFFFFF # Commands def AddImages(self, smallImage=None, normalImage=None): """ Add the given images to the list of available images. Return the index of the image. """ return self.AddNamedImages(None, smallImage, normalImage) def AddObject(self, modelObject): """ Add the given object to our collection of objects. The object will appear at its sorted location, or at the end of the list if the list is unsorted """ self.AddObjects([modelObject]) def AddObjects(self, modelObjects): """ Add the given collections of objects to our collection of objects. The objects will appear at their sorted locations, or at the end of the list if the list is unsorted """ if len(self.innerList) == 0: return self.SetObjects(modelObjects) try: self.Freeze() originalSize = len(self.innerList) self.modelObjects.extend(modelObjects) self._BuildInnerList() item = wx.ListItem() item.SetColumn(0) for (i, x) in enumerate(self.innerList[originalSize:]): item.Clear() self._InsertUpdateItem(item, originalSize+i, x, True) self._SortItemsNow() finally: self.Thaw() def AddNamedImages(self, name, smallImage=None, normalImage=None): """ Add the given images to the list of available images. Return the index of the image. If a name is given, that name can later be used to refer to the images rather than having to use the returned index. """ if isinstance(smallImage, basestring): smallImage = wx.Bitmap(smallImage) if isinstance(normalImage, basestring): normalImage = wx.Bitmap(normalImage) # We must have image lists for images to be added to them if self.smallImageList is None or self.normalImageList is None: self.SetImageLists() # There must always be the same number of small and normal bitmaps, # so if we aren't given one, we have to make an empty one of the right size smallImage = smallImage or wx.EmptyBitmap(*self.smallImageList.GetSize(0)) normalImage = normalImage or wx.EmptyBitmap(*self.normalImageList.GetSize(0)) self.smallImageList.AddNamedImage(name, smallImage) return self.normalImageList.AddNamedImage(name, normalImage) def AutoSizeColumns(self): """ Resize our auto sizing columns to match the data """ for (iCol, col) in enumerate(self.columns): if col.width == wx.LIST_AUTOSIZE: self.SetColumnWidth(iCol, wx.LIST_AUTOSIZE) # The new width must be within our minimum and maximum colWidth = self.GetColumnWidth(iCol) boundedWidth = col.CalcBoundedWidth(colWidth) if colWidth != boundedWidth: self.SetColumnWidth(iCol, boundedWidth) # wxbanker patch to sourceforge bug 2674878 self._ResizeSpaceFillingColumns() def Check(self, modelObject): """ Mark the given model object as checked. """ self.SetCheckState(modelObject, True) def ClearAll(self): """ Remove all items and columns """ wx.ListCtrl.ClearAll(self) self.SetObjects(list()) def CopyObjectsToClipboard(self, objects): """ Put a textual representation of the given objects onto the clipboard. This will be one line per object and tab-separated values per line. Under windows there will be a HTML table version put on the clipboard as well. """ if objects is None or len(objects) == 0: return # Get all the values of the given rows into multi-list rows = self._GetValuesAsMultiList(objects) # Make a text version of the values lines = [ "\t".join(x) for x in rows ] txt = "\n".join(lines) + "\n" # Make a html version on Windows try: lines = [ "" + "".join(x) + "" for x in rows ] html = "" + "".join(lines) + "
" self._PutTextAndHtmlToClipboard(txt, html) except ImportError: cb = wx.Clipboard() if cb.Open(): cb.SetData(wx.TextDataObject(txt)) cb.Flush() cb.Close() def _GetValuesAsMultiList(self, objects): """ Return a list of lists of the string of the aspects of the given objects """ cols = self.columns[:] if self.checkStateColumn is not None: cols.remove(self.checkStateColumn) return [[column.GetStringValue(x) for column in cols] for x in objects] def _PutTextAndHtmlToClipboard(self, txt, fragment): """ Put the given text and html into the windows clipboard. The html will be written in accordance with strange "HTML Format" as specified in http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/dataexchange/clipboard/htmlclipboardformat.asp """ import win32clipboard MARKER_BLOCK_OUTPUT = \ "Version:1.0\r\n" \ "StartHTML:%09d\r\n" \ "EndHTML:%09d\r\n" \ "StartFragment:%09d\r\n" \ "EndFragment:%09d\r\n" \ "StartSelection:%09d\r\n" \ "EndSelection:%09d\r\n" \ "SourceURL:%s\r\n" DEFAULT_HTML_BODY = \ "" \ "%s" html = DEFAULT_HTML_BODY % fragment source = "http://objectlistview.sourceforge.net/python" fragmentStart = selectionStart = html.index(fragment) fragmentEnd = selectionEnd = fragmentStart + len(fragment) # How long is the prefix going to be? dummyPrefix = MARKER_BLOCK_OUTPUT % (0, 0, 0, 0, 0, 0, source) lenPrefix = len(dummyPrefix) prefix = MARKER_BLOCK_OUTPUT % (lenPrefix, len(html)+lenPrefix, fragmentStart+lenPrefix, fragmentEnd+lenPrefix, selectionStart+lenPrefix, selectionEnd+lenPrefix, source) htmlForClipboard = (prefix + html) try: win32clipboard.OpenClipboard(0) win32clipboard.EmptyClipboard() cfText = 1 win32clipboard.SetClipboardData(cfText, txt) cfHtml = win32clipboard.RegisterClipboardFormat("HTML Format") win32clipboard.SetClipboardData(cfHtml, htmlForClipboard) finally: win32clipboard.CloseClipboard() def CopySelectionToClipboard(self): """ Copy the selected objects to the clipboard """ self.CopyObjectsToClipboard(self.GetSelectedObjects()) def DeleteAllItems(self): """ Remove all items """ wx.ListCtrl.DeleteAllItems(self) self.SetObjects(list()) def EnsureCellVisible(self, rowIndex, subItemIndex): """ Make sure the user can see all of the given cell, scrolling if necessary. Return the bounds to the cell calculated after the cell has been made visible. Return None if the cell cannot be made visible (non-Windows platforms can't scroll the listview horizontally) If the cell is bigger than the ListView, the top left of the cell will be visible. """ self.EnsureVisible(rowIndex) bounds = self.GetSubItemRect(rowIndex, subItemIndex, wx.LIST_RECT_BOUNDS) boundsRight = bounds[0]+bounds[2] if bounds[0] < 0 or boundsRight > self.GetSize()[0]: if bounds[0] < 0: horizDelta = bounds[0] - (self.GetSize()[0] / 4) else: horizDelta = boundsRight - self.GetSize()[0] + (self.GetSize()[0] / 4) if wx.Platform == "__WXMSW__": self.ScrollList(horizDelta, 0) else: return None return self.GetSubItemRect(rowIndex, subItemIndex, wx.LIST_RECT_LABEL) def _FormatAllRows(self): """ Set up the required formatting on all rows """ for i in range(self.GetItemCount()): item = self.GetItem(i) self._FormatOneItem(item, i, self.GetObjectAt(i)) self.SetItem(item) def _FormatOneItem(self, item, index, model): """ Give the given row it's correct background color """ if self.useAlternateBackColors and self.InReportView(): if index & 1: item.SetBackgroundColour(self.oddRowsBackColor) else: item.SetBackgroundColour(self.evenRowsBackColor) if self.rowFormatter is not None: self.rowFormatter(item, model) def RepopulateList(self): """ Completely rebuild the contents of the list control """ self._SortObjects() self._BuildInnerList() self.Freeze() try: wx.ListCtrl.DeleteAllItems(self) if len(self.innerList) == 0 or len(self.columns) == 0: self.Refresh() self.stEmptyListMsg.Show() return self.stEmptyListMsg.Hide() # Insert all the rows item = wx.ListItem() item.SetColumn(0) for (i, x) in enumerate(self.innerList): item.Clear() self._InsertUpdateItem(item, i, x, True) # Auto-resize once all the data has been added self.AutoSizeColumns() finally: self.Thaw() def RefreshIndex(self, index, modelObject): """ Refresh the item at the given index with data associated with the given object """ self._InsertUpdateItem(self.GetItem(index), index, modelObject, False) def _InsertUpdateItem(self, listItem, index, modelObject, isInsert): if isInsert: listItem.SetId(index) listItem.SetData(index) listItem.SetText(self.GetStringValueAt(modelObject, 0)) listItem.SetImage(self.GetImageAt(modelObject, 0)) self._FormatOneItem(listItem, index, modelObject) if isInsert: self.InsertItem(listItem) else: self.SetItem(listItem) for iCol in range(1, len(self.columns)): self.SetStringItem(index, iCol, self.GetStringValueAt(modelObject, iCol), self.GetImageAt(modelObject, iCol)) def RefreshObject(self, modelObject): """ Refresh the display of the given model """ idx = self.GetIndexOf(modelObject) if idx != -1: self.RefreshIndex(self._MapModelIndexToListIndex(idx), modelObject) def RefreshObjects(self, aList): """ Refresh all the objects in the given list """ try: self.Freeze() for x in aList: self.RefreshObject(x) finally: self.Thaw() def RemoveObject(self, modelObject): """ Remove the given object from our collection of objects. """ self.RemoveObjects([modelObject]) def RemoveObjects(self, modelObjects): """ Remove the given collections of objects from our collection of objects. """ # Unlike AddObjects(), there is no clever way to do this -- we have to simply # remove the objects and rebuild the whole list. We can't just remove the rows # because every wxListItem holds the index of its matching model object. If we # remove the first model object, the index of every object will change. selection = self.GetSelectedObjects() # Use sets to quickly remove objects from self.modelObjects # For large collections, this is MUCH faster. try: s1 = set(self.modelObjects) s2 = set(modelObjects) self.modelObjects = list(s1 - s2) except TypeError: # Not every object can be hashed, so some model objects cannot be placed in sets. # For such objects, we have to resort to the slow method. for x in modelObjects: self.modelObjects.remove(x) self.RepopulateList() self.SelectObjects(selection) def _ResizeSpaceFillingColumns(self): """ Change the width of space filling columns so that they fill the unoccupied width of the listview """ # If the list isn't in report view or there are no space filling columns, just return if not self.InReportView(): return # Don't do anything if there are no space filling columns if True not in set(x.isSpaceFilling for x in self.columns): return # Calculate how much free space is available in the control totalFixedWidth = sum(self.GetColumnWidth(i) for (i, x) in enumerate(self.columns) if not x.isSpaceFilling) #freeSpace = max(0, self.GetClientSizeTuple()[0] - totalFixedWidth) import platform if platform.platform().startswith("Linux"): freeSpace = self.MainWindow.GetClientSizeTuple()[0] - totalFixedWidth else: freeSpace = self.GetClientSizeTuple()[0] - totalFixedWidth # Calculate the total number of slices the free space will be divided into totalProportion = sum(x.freeSpaceProportion for x in self.columns if x.isSpaceFilling) # Space filling columns that would escape their boundary conditions # are treated as fixed size columns columnsToResize = [] for (i, col) in enumerate(self.columns): if col.isSpaceFilling: newWidth = freeSpace * col.freeSpaceProportion / totalProportion boundedWidth = col.CalcBoundedWidth(newWidth) if newWidth == boundedWidth: columnsToResize.append((i, col)) else: freeSpace -= boundedWidth totalProportion -= col.freeSpaceProportion if self.GetColumnWidth(i) != boundedWidth: self.SetColumnWidth(i, boundedWidth) # Finally, give each remaining space filling column a proportion of the free space for (i, col) in columnsToResize: newWidth = freeSpace * col.freeSpaceProportion / totalProportion boundedWidth = col.CalcBoundedWidth(newWidth) if self.GetColumnWidth(i) != boundedWidth: self.SetColumnWidth(i, boundedWidth) def SetCheckState(self, modelObject, state): """ Set the check state of the given model object. 'state' can be True, False or None (which means undetermined) """ if self.checkStateColumn is None: return None else: return self.checkStateColumn.SetCheckState(modelObject, state) def SetColumnFixedWidth(self, colIndex, width): """ Make the given column to be fixed width """ if 0 <= colIndex < self.GetColumnCount(): self.SetColumnWidth(colIndex, width) self.columns[colIndex].SetFixedWidth(width) def SetEmptyListMsg(self, msg): """ When there are no objects in the list, show this message in the control """ self.stEmptyListMsg.SetLabel(msg) def SetEmptyListMsgFont(self, font): """ In what font should the empty list msg be rendered? """ self.stEmptyListMsg.SetFont(font) def SetObjects(self, modelObjects, preserveSelection=False): """ Set the list of modelObjects to be displayed by the control. """ if preserveSelection: selection = self.GetSelectedObjects() if modelObjects is None: self.modelObjects = list() else: self.modelObjects = modelObjects[:] self.RepopulateList() if preserveSelection: self.SelectObjects(selection) # Synonym as per many wxWindows widgets SetValue = SetObjects def _BuildInnerList(self): """ Build the list that will actually populate the control """ # This is normally just the list of model objects if self.filter: self.innerList = self.filter(self.modelObjects) else: self.innerList = self.modelObjects # Our map isn't valid after doing this self.objectToIndexMap = None def ToggleCheck(self, modelObject): """ Toggle the "checkedness" of the given model. Checked becomes unchecked; unchecked or undetermined becomes checked. """ self.SetCheckState(modelObject, not self.IsChecked(modelObject)) def Uncheck(self, modelObject): """ Mark the given model object as unchecked. """ self.SetCheckState(modelObject, False) #--------------------------------------------------------------#000000#FFFFFF # Accessing def GetCheckedObjects(self): """ Return a collection of the modelObjects that are checked in this control. """ if self.checkStateColumn is None: return list() else: return [x for x in self.innerList if self.IsChecked(x)] def GetCheckState(self, modelObject): """ Return the check state of the given model object. Returns a boolean or None (which means undetermined) """ if self.checkStateColumn is None: return None else: return self.checkStateColumn.GetCheckState(modelObject) def GetFilter(self): """ Return the filter that is currently operating on this control. """ return self.filter def GetFilteredObjects(self): """ Return the model objects that are actually displayed in the control. If no filter is in effect, this is the same as GetObjects(). """ return self.innerList def GetFocusedRow(self): """ Return the index of the row that has the focus. -1 means no focus """ return self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_FOCUSED) def GetIndexOf(self, modelObject): """ Return the index of the given modelObject in the list. This method works on the visible item in the control. If a filter is in place, not all model object given to SetObjects() are visible. """ # Rebuild our index map if it has been invalidated. The TypeError # exceptions are for objects that cannot be hashed (like lists) if self.objectToIndexMap is None: self.objectToIndexMap = dict() for (i, x) in enumerate(self.innerList): try: self.objectToIndexMap[x] = i except TypeError: pass # Use our map to find the object (but fall back to simple search # for non-hashable objects) try: return self.objectToIndexMap.get(modelObject, -1) except TypeError: try: return self.innerList.index(modelObject) except ValueError: return -1 def GetImageAt(self, modelObject, columnIndex): """ Return the index of the image that should be display at the given column of the given modelObject """ column = self.columns[columnIndex] # If the column is a checkbox column, return the image appropriate to the check # state if column.HasCheckState(): name = { True: ObjectListView.NAME_CHECKED_IMAGE, False: ObjectListView.NAME_UNCHECKED_IMAGE, None: ObjectListView.NAME_UNDETERMINED_IMAGE }.get(column.GetCheckState(modelObject)) return self.smallImageList.GetImageIndex(name) # Not a checkbox column, so just return the image imageIndex = column.GetImage(modelObject) if isinstance(imageIndex, basestring): return self.smallImageList.GetImageIndex(imageIndex) else: return imageIndex def GetObjectAt(self, index): """ Return the model object at the given row of the list. """ # Because of sorting, index can't be used directly, which is # why we set the item data to be the real index return self.innerList[self.GetItemData(index)] def __getitem__(self, index): """ Synactic sugar over GetObjectAt() """ return self.GetObjectAt(index) def GetObjects(self): """ Return the model objects that are available to the control. If no filter is in effect, this is the same as GetFilteredObjects(). """ return self.modelObjects def GetPrimaryColumn(self): """ Return the primary column or None there is no primary column. The primary column is the first column given by the user. This column is edited when F2 is pressed. """ i = self.GetPrimaryColumnIndex() if i == -1: return None else: return self.columns[i] def GetPrimaryColumnIndex(self): """ Return the index of the primary column. Returns -1 when there is no primary column. The primary column is the first column given by the user. This column is edited when F2 is pressed. """ for (i, x) in enumerate(self.columns): if not x.isInternal: return i return -1 def GetSelectedObject(self): """ Return the selected modelObject or None if nothing is selected or if more than one is selected. """ model = None for (i, x) in enumerate(self.YieldSelectedObjects()): if i == 0: model = x else: model = None break return model def GetSelectedObjects(self): """ Return a list of the selected modelObjects """ return list(self.YieldSelectedObjects()) def GetSortColumn(self): """ Return the column by which the rows of this control should be sorted """ if self.sortColumnIndex < 0 or self.sortColumnIndex >= len(self.columns): return None else: return self.columns[self.sortColumnIndex] def GetStringValueAt(self, modelObject, columnIndex): """ Return a string representation of the value that should be display at the given column of the given modelObject """ column = self.columns[columnIndex] return column.GetStringValue(modelObject) def GetValueAt(self, modelObject, columnIndex): """ Return the value that should be display at the given column of the given modelObject """ column = self.columns[columnIndex] return column.GetValue(modelObject) def IsCellEditing(self): """ Is some cell currently being edited? """ return self.cellEditor and self.cellEditor.IsShown() def IsChecked(self, modelObject): """ Return a boolean indicating if the given modelObject is checked. """ return self.GetCheckState(modelObject) == True def IsObjectSelected(self, modelObject): """ Is the given modelObject selected? """ return modelObject in self.GetSelectedObjects() def SetFilter(self, filter): """ Remember the filter that is currently operating on this control. Set this to None to clear the current filter. A filter is a callable that accepts one parameter: the original list of model objects. The filter chooses which of these model objects should be visible to the user, and returns a collection of only those objects. The Filter module has some useful standard filters. You must call RepopulateList() for changes to the filter to be visible. """ self.filter = filter def SetSortColumn(self, column, resortNow=False): """ Set the column by which the rows should be sorted. 'column' can be None (which makes the list be unsorted), a ColumnDefn, or the index of the column desired """ if column is None: self.sortColumnIndex = -1 elif isinstance(column, ColumnDefn): try: self.sortColumnIndex = self.columns.index(column) except ValueError: self.sortColumnIndex = -1 else: self.sortColumnIndex = column if resortNow: self.SortBy(self.sortColumnIndex) else: self._UpdateColumnSortIndicators() def YieldSelectedObjects(self): """ Progressively yield the selected modelObjects """ i = self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) while i != -1: yield self.GetObjectAt(i) i = self.GetNextItem(i, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) #---------------------------------------------------------------------------- # Calculating def GetSubItemRect(self, rowIndex, subItemIndex, flag): """ Poor mans replacement for missing wxWindows method. The rect returned takes scroll position into account, so negative x and y are possible. """ #print "GetSubItemRect(self, %d, %d, %d):" % (rowIndex, subItemIndex, flag) # Linux doesn't handle wx.LIST_RECT_LABEL flag. So we always get # the whole bounds then par it down to the cell we want rect = self.GetItemRect(rowIndex, wx.LIST_RECT_BOUNDS) if self.InReportView(): rect = [0-self.GetScrollPos(wx.HORIZONTAL), rect.Y, 0, rect.Height] for i in range(subItemIndex+1): rect[0] += rect[2] rect[2] = self.GetColumnWidth(i) # If we want only the label rect for sub items, we have to manually # adjust for any image the subitem might have if flag == wx.LIST_RECT_LABEL: lvi = self.GetItem(rowIndex, subItemIndex) if lvi.GetImage() != -1: if self.HasFlag(wx.LC_ICON): imageWidth = self.normalImageList.GetSize(0)[0] rect[1] += imageWidth rect[3] -= imageWidth else: imageWidth = self.smallImageList.GetSize(0)[0] + 1 rect[0] += imageWidth rect[2] -= imageWidth #print "rect=%s" % rect return rect def HitTestSubItem(self, pt): """ Return a tuple indicating which (item, subItem) the given pt (client coordinates) is over. This uses the buildin version on Windows, and poor mans replacement on other platforms. """ # The buildin version works on Windows if wx.Platform == "__WXMSW__": return wx.ListCtrl.HitTestSubItem(self, pt) (rowIndex, flags) = self.HitTest(pt) # Did the point hit any item? if (flags & wx.LIST_HITTEST_ONITEM) == 0: return (-1, 0, -1) # If it did hit an item and we are not in report mode, it must be the primary cell if not self.InReportView(): return (rowIndex, wx.LIST_HITTEST_ONITEM, 0) # Find which subitem is hit right = 0 scrolledX = self.GetScrollPos(wx.HORIZONTAL) + pt.x for i in range(self.GetColumnCount()): left = right right += self.GetColumnWidth(i) if scrolledX < right: if (scrolledX - left) < self.smallImageList.GetSize(0)[0]: flag = wx.LIST_HITTEST_ONITEMICON else: flag = wx.LIST_HITTEST_ONITEMLABEL return (rowIndex, flag, i) return (rowIndex, 0, -1) #---------------------------------------------------------------------------- # Event handling def _HandleChar(self, evt): if evt.GetKeyCode() == wx.WXK_F2 and not self.IsCellEditing(): return self._PossibleStartCellEdit(self.GetFocusedRow(), self.GetPrimaryColumnIndex()) # We have to catch Return/Enter/Escape here since some types of controls # (e.g. ComboBox, UserControl) don't trigger key events that we can listen for. # Treat Return or Enter as committing the current edit operation unless the control # is a multiline text control, in which case we treat it as data if evt.GetKeyCode() in (wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER) and self.IsCellEditing(): if self.cellEditor and self.cellEditor.HasFlag(wx.TE_MULTILINE): return evt.Skip() else: return self.FinishCellEdit() # Treat Escape as cancel the current edit operation if evt.GetKeyCode() in (wx.WXK_ESCAPE, wx.WXK_CANCEL) and self.IsCellEditing(): return self.CancelCellEdit() # Tab to the next editable column if evt.GetKeyCode() == wx.WXK_TAB and self.IsCellEditing(): return self._HandleTabKey(evt.ShiftDown()) # Space bar with a selection on a listview with checkboxes toggles the checkboxes if (evt.GetKeyCode() == wx.WXK_SPACE and not self.IsCellEditing() and self.checkStateColumn is not None and self.GetSelectedItemCount() > 0): return self._ToggleCheckBoxForSelection() if not self.IsCellEditing(): if self._HandleTypingEvent(evt): return if not self.IsCellEditing() and self.handleStandardKeys: # Copy selection on Ctrl-C # Why is Ctrl-C represented by 3?! Is this Windows only? if (evt.GetKeyCode() == 3): self.CopySelectionToClipboard() return # Select All on Ctrl-A if (evt.GetKeyCode() == 1): self.SelectAll() return evt.Skip() def _HandleTypingEvent(self, evt): """ """ if self.GetItemCount() == 0 or self.GetColumnCount() == 0: return False if evt.GetModifiers() != 0 and evt.GetModifiers() != wx.MOD_SHIFT: return False if evt.GetKeyCode() > wx.WXK_START: return False if evt.GetKeyCode() in (wx.WXK_BACK, wx.WXK_DELETE): self.searchPrefix = u"" return True # On which column are we going to compare values? If we should search on the # sorted column, and there is a sorted column and it is searchable, we use that # one, otherwise we fallback to the primary column if self.typingSearchesSortColumn and self.GetSortColumn() and self.GetSortColumn().isSearchable: searchColumn = self.GetSortColumn() else: searchColumn = self.GetPrimaryColumn() # On Linux, GetUnicodeKey() always returns 0 -- on my 2.8.7.1 (gtk2-unicode) if evt.GetUnicodeKey() == 0: uniChar = chr(evt.GetKeyCode()) else: uniChar = unichr(evt.GetUnicodeKey()) if uniChar not in string.printable: return False # On Linux, evt.GetTimestamp() isn't reliable so use time.time() instead timeNow = time.time() if (timeNow - self.whenLastTypingEvent) > self.SEARCH_KEYSTROKE_DELAY: self.searchPrefix = uniChar else: self.searchPrefix += uniChar self.whenLastTypingEvent = timeNow #self.__rows = 0 self._FindByTyping(searchColumn, self.searchPrefix) #print "Considered %d rows in %2f secs" % (self.__rows, time.time() - timeNow) return True def _FindByTyping(self, searchColumn, prefix): """ Select the first row passed the currently focused row that has a string representation that begins with 'prefix' in the given column """ start = max(self.GetFocusedRow(), 0) # If the user is starting a new search, we don't want to consider the current row if len(prefix) == 1: start = (start + 1) % self.GetItemCount() # If we are searching on a sorted column, use a binary search if self._CanUseBisect(searchColumn): if self._FindByBisect(searchColumn, prefix, start, self.GetItemCount()): return if self._FindByBisect(searchColumn, prefix, 0, start): return else: # A binary search on a sorted column can handle any number of rows. A linear # search cannot. So we impose an arbitrary limit on the number of rows to # consider. Above that, we don't even try if self.GetItemCount() > self.MAX_ROWS_FOR_UNSORTED_SEARCH: self._SelectAndFocus(0) return # Do a linear, wrapping search to find the next match. To wrap, we consider # the rows in two partitions: start to the end of the collection, and then # from the beginning to the start position. Expressing this in other languages # is a pain, but it's elegant in Python. I just love Python :) for i in itertools.chain(range(start, self.GetItemCount()), range(0, start)): #self.__rows += 1 model = self.GetObjectAt(i) if model is not None: strValue = searchColumn.GetStringValue(model) if strValue.lower().startswith(prefix): self._SelectAndFocus(i) return wx.Bell() def _CanUseBisect(self, searchColumn): """ Return True if we can use binary search on the given column """ # If the list isn't sorted or if it's sorted by some other column, we can't if self.GetSortColumn() != searchColumn: return False # If the column doesn't knows whether it should or not, make a guess based on the # type of data in the column (strings and booleans are probably safe). We already # know that the list isn't empty. if searchColumn.useBinarySearch is None: aspect = searchColumn.GetValue(self.GetObjectAt(0)) searchColumn.useBinarySearch = isinstance(aspect, (basestring, bool)) return searchColumn.useBinarySearch def _FindByBisect(self, searchColumn, prefix, start, end): """ Use a binary search to look for rows that match the given prefix between the rows given. If a match was found, select/focus/reveal that row and return True. """ # If the sorting is ascending, we use less than to find the first match # If the sort is descending, we have to use greater-equal, and suffix the # search string to make sure we find the first match (without the suffix # we always find the last match) if self.sortAscending: cmpFunc = operator.lt searchFor = prefix else: cmpFunc = operator.ge searchFor = prefix + "z" # Adapted from bisect std module lo = start hi = end while lo < hi: mid = (lo + hi) // 2 strValue = searchColumn.GetStringValue(self.GetObjectAt(mid)) if cmpFunc(searchFor, strValue.lower()): hi = mid else: lo = mid+1 if lo < start or lo >= end: return False strValue = searchColumn.GetStringValue(self.GetObjectAt(lo)) if strValue.lower().startswith(prefix): self._SelectAndFocus(lo) return True return False def _SelectAndFocus(self, rowIndex): """ Select and focus on the given row. """ self.DeselectAll() self.Select(rowIndex) self.Focus(rowIndex) def _ToggleCheckBoxForSelection(self): """ Toggles the checkedness of the selected modelObjects. """ selection = self.GetSelectedObjects() newValue = not self.IsChecked(selection[0]) for x in selection: self.SetCheckState(x, newValue) self.RefreshObjects(selection) def _HandleColumnBeginDrag(self, evt): """ Handle when the user begins to resize a column """ self._PossibleFinishCellEdit() colIndex = evt.GetColumn() if 0 > colIndex >= len(self.columns): evt.Skip() else: col = self.columns[colIndex] if col.IsFixedWidth() or col.isSpaceFilling: evt.Veto() else: evt.Skip() def _HandleColumnClick(self, evt): """ The user has clicked on a column title """ evt.Skip() self._PossibleFinishCellEdit() # Toggle the sort column on the second click if evt.GetColumn() == self.sortColumnIndex: self.sortAscending = not self.sortAscending else: self.sortAscending = True self.SortBy(evt.GetColumn(), self.sortAscending) self._FormatAllRows() def _HandleColumnDragging(self, evt): """ A column is being dragged """ # When is this triggered? # The processing should be the same processing as Dragged evt.Skip() def _HandleColumnEndDrag(self, evt): """ The user has finished resizing a column. Make sure that it is not bigger than it should be, then resize any space filling columns. """ colIndex = evt.GetColumn() if 0 > colIndex >= len(self.columns): evt.Skip() else: currentWidth = self.GetColumnWidth(colIndex) col = self.columns[colIndex] newWidth = col.CalcBoundedWidth(currentWidth) if currentWidth != newWidth: wx.CallAfter(self._SetColumnWidthAndResize, colIndex, newWidth) else: evt.Skip() wx.CallAfter(self._ResizeSpaceFillingColumns) def _SetColumnWidthAndResize(self, colIndex, newWidth): self.SetColumnWidth(colIndex, newWidth) self._ResizeSpaceFillingColumns() def _HandleLeftDown(self, evt): """ Handle a left down on the ListView """ evt.Skip() # Test for a mouse down on the image of the check box column if self.InReportView(): (row, flags, subitem) = self.HitTestSubItem(evt.GetPosition()) else: (row, flags) = self.HitTest(evt.GetPosition()) subitem = 0 if flags == wx.LIST_HITTEST_ONITEMICON: self._HandleLeftDownOnImage(row, subitem) def _HandleLeftDownOnImage(self, rowIndex, subItemIndex): """ Handle a left click on the image at the given cell """ column = self.columns[subItemIndex] if not column.HasCheckState(): return self._PossibleFinishCellEdit() modelObject = self.GetObjectAt(rowIndex) if modelObject is not None: column.SetCheckState(modelObject, not column.GetCheckState(modelObject)) self.RefreshIndex(rowIndex, modelObject) def _HandleLeftClickOrDoubleClick(self, evt): """ Handle a left click or left double click on the ListView """ evt.Skip() # IF any modifiers are down, OR # the listview isn't editable, OR # we should edit on double click and this is a single click, OR # we should edit on single click and this is a double click, # THEN we don't try to start a cell edit operation if evt.m_altDown or evt.m_controlDown or evt.m_shiftDown: return if self.cellEditMode == self.CELLEDIT_NONE: return if evt.LeftUp() and self.cellEditMode == self.CELLEDIT_DOUBLECLICK: return if evt.LeftDClick() and self.cellEditMode == self.CELLEDIT_SINGLECLICK: return # Which item did the user click? (rowIndex, flags, subItemIndex) = self.HitTestSubItem(evt.GetPosition()) if (flags & wx.LIST_HITTEST_ONITEM) == 0 or subItemIndex == -1: return # A single click on column 0 doesn't start an edit if subItemIndex == 0 and self.cellEditMode == self.CELLEDIT_SINGLECLICK: return self._PossibleStartCellEdit(rowIndex, subItemIndex) def _HandleMouseWheel(self, evt): """ The user spun the mouse wheel """ self._PossibleFinishCellEdit() evt.Skip() def _HandleScroll(self, evt): """ The ListView is being scrolled """ self._PossibleFinishCellEdit() evt.Skip() def _HandleSize(self, evt): """ The ListView is being resized """ self._PossibleFinishCellEdit() evt.Skip() self._ResizeSpaceFillingColumns() # Make sure our empty msg is reasonably positioned sz = self.GetClientSize() self.stEmptyListMsg.SetDimensions(0, sz.GetHeight()/3, sz.GetWidth(), sz.GetHeight()) #self.stEmptyListMsg.Wrap(sz.GetWidth()) def _HandleTabKey(self, isShiftDown): """ Handle a Tab key during a cell edit operation """ (rowBeingEdited, subItem) = self.cellBeingEdited # Prevent a nasty flicker when tabbing between fields where the selected rows # are restored at the end of one cell edit, and removed at the start of the next shadowSelection = self.selectionBeforeCellEdit self.selectionBeforeCellEdit = [] self.FinishCellEdit() # If we are in report view, move to the next (or previous) editable subitem, # wrapping at the edges if self.HasFlag(wx.LC_REPORT): columnCount = self.GetColumnCount() for ignored in range(columnCount-1): if isShiftDown: subItem = (columnCount + subItem - 1) % columnCount else: subItem = (subItem + 1) % columnCount if self.columns[subItem].isEditable and self.GetColumnWidth(subItem) > 0: self.StartCellEdit(rowBeingEdited, subItem) break self.selectionBeforeCellEdit = shadowSelection #--------------------------------------------------------------#000000#FFFFFF # Sorting def EnableSorting(self): """ Enable automatic sorting when the user clicks on a column title """ self.Bind(wx.EVT_LIST_COL_CLICK, self._HandleColumnClick) # Install sort indicators if they don't already exist if self.smallImageList is None: self.SetImageLists() if (not self.smallImageList.HasName(ObjectListView.NAME_DOWN_IMAGE) and self.smallImageList.GetSize(0) == (16,16)): self.RegisterSortIndicators() def SortBy(self, newColumnIndex, ascending=True): """ Sort the items by the given column """ oldSortColumnIndex = self.sortColumnIndex self.sortColumnIndex = newColumnIndex self.sortAscending = ascending # Let the world have a chance to sort the items evt = OLVEvent.SortEvent(self, self.sortColumnIndex, self.sortAscending, self.IsVirtual()) self.GetEventHandler().ProcessEvent(evt) if evt.IsVetoed(): return if not evt.wasHandled: self._SortItemsNow() self._UpdateColumnSortIndicators(self.sortColumnIndex, oldSortColumnIndex) def _SortItemsNow(self): """ Sort the actual items in the list now, according to the current column and order """ sortColumn = self.GetSortColumn() if not sortColumn: return secondarySortColumn = None # self.GetSecondarySortColumn() def _singleObjectComparer(col, object1, object2): value1 = col.GetValue(object1) value2 = col.GetValue(object2) try: return locale.strcoll(value1.lower(), value2.lower()) except: return cmp(value1, value2) def _objectComparer(object1, object2): result = _singleObjectComparer(sortColumn, object1, object2) if secondarySortColumn and result == 0: result = _singleObjectComparer(secondarySortColumn, object1, object2) return result self.SortListItemsBy(_objectComparer) def SortListItemsBy(self, cmpFunc, ascending=None): """ Sort the existing list items using the given comparison function. The comparison function must accept two model objects as parameters. The primary users of this method are handlers of the SORT event that want to sort the items by their own special function. """ if ascending is None: ascending = self.sortAscending def _sorter(key1, key2): cmpVal = cmpFunc(self.innerList[key1], self.innerList[key2]) if ascending: return cmpVal else: return -cmpVal self.SortItems(_sorter) def _SortObjects(self, modelObjects=None, sortColumn=None, secondarySortColumn=None): """ Sort the given modelObjects in place. This does not change the information shown in the control itself. """ if modelObjects is None: modelObjects = self.modelObjects if sortColumn is None: sortColumn = self.GetSortColumn() if secondarySortColumn == sortColumn: secondarySortColumn = None # If we don't have a sort column, we can't sort -- duhh if sortColumn is None: return # Let the world have a chance to sort the model objects evt = OLVEvent.SortEvent(self, self.sortColumnIndex, self.sortAscending, True) self.GetEventHandler().ProcessEvent(evt) if evt.IsVetoed() or evt.wasHandled: return # When sorting large groups, this is called a lot. Make it efficent. # It is more efficient (by about 30%) to try to call lower() and catch the # exception than it is to test for the class def _getSortValue(x): primary = sortColumn.GetValue(x) try: primary = primary.lower() except AttributeError: pass if secondarySortColumn: secondary = secondarySortColumn.GetValue(x) try: secondary = secondary.lower() except AttributeError: pass return (primary, secondary) else: return primary modelObjects.sort(key=_getSortValue, reverse=(not self.sortAscending)) # Sorting invalidates our object map self.objectToIndexMap = None def _UpdateColumnSortIndicators(self, sortColumnIndex=None, oldSortColumnIndex=-1): """ Change the column that is showing a sort indicator """ if sortColumnIndex is None: sortColumnIndex = self.sortColumnIndex # Remove the sort indicator from the old sort column if oldSortColumnIndex >= 0: headerImage = self.columns[oldSortColumnIndex].headerImage if isinstance(headerImage, basestring) and self.smallImageList is not None: headerImage = self.smallImageList.GetImageIndex(headerImage) self.SetColumnImage(oldSortColumnIndex, headerImage) if sortColumnIndex >= 0 and self.smallImageList is not None: if self.sortAscending: imageIndex = self.smallImageList.GetImageIndex(ObjectListView.NAME_UP_IMAGE) else: imageIndex = self.smallImageList.GetImageIndex(ObjectListView.NAME_DOWN_IMAGE) if imageIndex != -1: self.SetColumnImage(sortColumnIndex, imageIndex) #--------------------------------------------------------------#000000#FFFFFF # Selecting def SelectAll(self): """ Selected all rows in the control """ # -1 indicates 'all items' self.SetItemState(-1, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) def DeselectAll(self): """ De-selected all rows in the control """ # -1 indicates 'all items' self.SetItemState(-1, 0, wx.LIST_STATE_SELECTED) def SelectObject(self, modelObject, deselectOthers=True, ensureVisible=False): """ Select the given modelObject. If deselectOthers is True, all other rows will be deselected """ i = self.GetIndexOf(modelObject) if i == -1: return if deselectOthers: self.DeselectAll() realIndex = self._MapModelIndexToListIndex(i) self.SetItemState(realIndex, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) if ensureVisible: self.EnsureVisible(realIndex) def SelectObjects(self, modelObjects, deselectOthers=True): """ Select all of the given modelObjects. If deselectOthers is True, all other rows will be deselected """ if deselectOthers: self.DeselectAll() for x in modelObjects: self.SelectObject(x, False) def _MapModelIndexToListIndex(self, modelIndex): """ Return the index in the list where the given model index lives """ return self.FindItemData(-1, modelIndex) #---------------------------------------------------------------------------- # Cell editing def _PossibleStartCellEdit(self, rowIndex, subItemIndex): """ Start an edit operation on the given cell after performing some sanity checks """ if 0 > rowIndex >= self.GetItemCount(): return if 0 > subItemIndex >= self.GetColumnCount(): return if self.cellEditMode == self.CELLEDIT_NONE: return if not self.columns[subItemIndex].isEditable: return if self.GetObjectAt(rowIndex) is None: return self.StartCellEdit(rowIndex, subItemIndex) def _PossibleFinishCellEdit(self): """ If a cell is being edited, finish and commit an edit operation on the given cell. """ if self.IsCellEditing(): self.FinishCellEdit() def _PossibleCancelCellEdit(self): """ If a cell is being edited, cancel the edit operation. """ if self.IsCellEditing(): self.CancelCellEdit() def StartCellEdit(self, rowIndex, subItemIndex): """ Begin an edit operation on the given cell. """ # Collect the information we need for the StartingEditEvent modelObject = self.GetObjectAt(rowIndex) cellValue = self.GetValueAt(modelObject, subItemIndex) # Make sure the user can see where the editor is going to be. If the bounds are # null, this means we needed to scroll horizontally but were unable (this can only # happen on non-Windows platforms). In that case we can't let the edit happen # since the user won't be able to see the cell cellBounds = self.EnsureCellVisible(rowIndex, subItemIndex) if cellBounds is None: wx.Bell() return # Give the world the chance to veto the edit, or to change its characteristics defaultEditor = self._MakeDefaultCellEditor(rowIndex, subItemIndex, cellValue) evt = OLVEvent.CellEditStartingEvent(self, rowIndex, subItemIndex, modelObject, cellValue, cellBounds, defaultEditor) self.GetEventHandler().ProcessEvent(evt) if evt.IsVetoed(): defaultEditor.Destroy() return # Remember that we are editing something (and make sure we can see it) self.selectionBeforeCellEdit = self.GetSelectedObjects() self.DeselectAll() self.cellEditor = evt.newEditor or evt.editor self.cellBeingEdited = (rowIndex, subItemIndex) # If we aren't using the default editor, destroy it if self.cellEditor != defaultEditor: defaultEditor.Destroy() # If the event handler hasn't already configured the editor, do it now. if evt.shouldConfigureEditor: self.cellEditor.SetFocus() colDef = self.columns[subItemIndex] if colDef.editFormatter: evt.cellValue = colDef.editFormatter(modelObject) self.cellEditor.SetValue(evt.cellValue) self._ConfigureCellEditor(self.cellEditor, evt.cellBounds, rowIndex, subItemIndex) # Let the world know the cell editing has started evt = OLVEvent.CellEditStartedEvent(self, rowIndex, subItemIndex, modelObject, cellValue, cellBounds, defaultEditor) self.GetEventHandler().ProcessEvent(evt) self.cellEditor.Show() self.cellEditor.Raise() def _ConfigureCellEditor(self, editor, bounds, rowIndex, subItemIndex): """ Perform the normal configuration on the cell editor. """ editor.SetDimensions(*bounds) colour = self.GetItemBackgroundColour(rowIndex) if colour.IsOk(): editor.SetBackgroundColour(colour) else: editor.SetBackgroundColour(self.GetBackgroundColour()) colour = self.GetItemTextColour(rowIndex) if colour.IsOk(): editor.SetForegroundColour(colour) else: editor.SetForegroundColour(self.GetTextColour()) font = self.GetItemFont(rowIndex) if font.IsOk(): editor.SetFont(font) else: editor.SetFont(self.GetFont()) if hasattr(self.cellEditor, "SelectAll"): self.cellEditor.SelectAll() editor.Bind(wx.EVT_CHAR, self._Editor_OnChar) editor.Bind(wx.EVT_COMMAND_ENTER, self._Editor_OnChar) editor.Bind(wx.EVT_KILL_FOCUS, self._Editor_KillFocus) def _MakeDefaultCellEditor(self, rowIndex, subItemIndex, value): """ Return an editor that can edit the value of the given cell. """ # The column could have editor creation function registered. # Otherwise, we have to guess the editor from the type of the value. # If the given cell actually holds None, we can't decide what editor to use. # So we try to find any non-null value in the same column. # If all else fails, we use a string editor. creatorFunction = self.columns[subItemIndex].cellEditorCreator if creatorFunction is None: value = value or self._CalcNonNullValue(subItemIndex) creatorFunction = CellEditor.CellEditorRegistry().GetCreatorFunction(value) if creatorFunction is None: creatorFunction = CellEditor.CellEditorRegistry().GetCreatorFunction("") return creatorFunction(self, rowIndex, subItemIndex) def _CalcNonNullValue(self, colIndex, maxRows=1000): """ Return the first non-null value in the given column, processing at most maxRows rows """ column = self.columns[colIndex] for i in range(min(self.GetItemCount(), maxRows)): model = self.GetObjectAt(i) if model is not None: value = column.GetValue(model) if value is not None: return value return None def _Editor_OnChar(self, evt): """ A character has been pressed in a cell editor """ self._HandleChar(evt) def _Editor_KillFocus(self, evt): evt.Skip() # Some control trigger FocusLost events even when they still have focus focusWindow = wx.Window.FindFocus() #if focusWindow is not None and self.cellEditor != focusWindow: if self.cellEditor != focusWindow: self._PossibleFinishCellEdit() def FinishCellEdit(self): """ Finish and commit an edit operation on the given cell. """ (rowIndex, subItemIndex) = self.cellBeingEdited # Give the world the chance to veto the edit, or to change its characteristics rowModel = self.GetObjectAt(rowIndex) evt = OLVEvent.CellEditFinishingEvent(self, rowIndex, subItemIndex, rowModel, self.cellEditor.GetValue(), self.cellEditor, False) self.GetEventHandler().ProcessEvent(evt) if not evt.IsVetoed() and evt.cellValue is not None: self.columns[subItemIndex].SetValue(rowModel, evt.cellValue) self.RefreshIndex(rowIndex, rowModel) evt = OLVEvent.CellEditFinishedEvent(self, rowIndex, subItemIndex, rowModel, False) self.GetEventHandler().ProcessEvent(evt) self._CleanupCellEdit() def CancelCellEdit(self): """ Cancel an edit operation on the given cell. """ # Tell the world that the user cancelled the edit (rowIndex, subItemIndex) = self.cellBeingEdited rowModel = self.GetObjectAt(rowIndex) evt = OLVEvent.CellEditFinishingEvent(self, rowIndex, subItemIndex, rowModel, self.cellEditor.GetValue(), self.cellEditor, True) self.GetEventHandler().ProcessEvent(evt) evt = OLVEvent.CellEditFinishedEvent(self, rowIndex, subItemIndex, rowModel, True) self.GetEventHandler().ProcessEvent(evt) self._CleanupCellEdit() def _CleanupCellEdit(self): """ Cleanup after finishing a cell edit operation """ self.SelectObjects(self.selectionBeforeCellEdit) if self.cellEditor: self.cellEditor.Hide() self.cellEditor = None self.cellBeingEdited = None self.SetFocus() ######################################################################## class AbstractVirtualObjectListView(ObjectListView): """ This class holds the behaviour that is common to all virtual lists. A virtual list must be given an "object getter", which is a callable that accepts the index of the model object required and returns the model. This can be set via the SetObjectGetter() method, or passed into the constructor as the "getter" parameter. Due to the vagarities of virtual lists, rowFormatters must operate in a slightly different manner for virtual lists. Instead of being passed a ListItem, rowFormatters are passed a ListItemAttr instance. This supports the same formatting methods as a ListItem -- SetBackgroundColour(), SetTextColour(), SetFont() -- but no other ListItem methods. Obviously, being a virtual list, the rowFormatter cannot call any SetItem* method on the ListView itself. """ def __init__(self, *args, **kwargs): self.lastGetObjectIndex = -1 self.lastGetObject = None self.objectGetter = None self.listItemAttr = None #self.cacheHit = 0 #self.cacheMiss = 0 self.SetObjectGetter(kwargs.pop("getter", None)) # We have to set the item count after the list has been created if "count" in kwargs: wx.CallAfter(self.SetItemCount, kwargs.pop("count")) # Virtual lists have to be in report format kwargs["style"] = kwargs.get("style", 0) | wx.LC_REPORT | wx.LC_VIRTUAL ObjectListView.__init__(self, *args, **kwargs) #---------------------------------------------------------------------------- # Commands def ClearAll(self): """ Remove all items and columns """ ObjectListView.ClearAll(self) self.lastGetObjectIndex = -1 # Should this call SetItemCount()? def DeleteAllItems(self): """ Remove all items """ ObjectListView.DeleteAllItems(self) self.lastGetObjectIndex = -1 # Should this call SetItemCount()? def RefreshIndex(self, index, modelObject): """ Refresh the item at the given index with data associated with the given modelObject """ self.lastGetObjectIndex = -1 self.RefreshItem(index) def RefreshObject(self, modelObject): """ Refresh the display of the given modelObject """ # We only have a hammer so everything looks like a nail self.RefreshObjects() def RefreshObjects(self, aList=None): """ Refresh all the objects in the given list """ # We can only refresh everything self.lastGetObjectIndex = -1 self.RefreshItems(0, self.GetItemCount()-1) #self.Refresh() def RepopulateList(self): """ Completely rebuild the contents of the list control """ # Virtual lists never need to rebuild -- they simply redraw self.RefreshObjects() def SetItemCount(self, count): """ Change the number of items visible in the list """ wx.ListCtrl.SetItemCount(self, count) self.stEmptyListMsg.Show(count == 0) self.lastGetObjectIndex = -1 def SetObjectGetter(self, aCallable): """ Remember the callback that will be used to fetch the objects being displayed in this list """ self.objectGetter = aCallable def _FormatAllRows(self): """ Set up the required formatting on all rows """ # This is handled within OnGetItemAttr() pass #---------------------------------------------------------------------------- # Virtual list callbacks. # These are called a lot! Keep them efficient def OnGetItemText(self, itemIdx, colIdx): """ Return the text that should be shown at the given cell """ return self.GetStringValueAt(self.GetObjectAt(itemIdx), colIdx) def OnGetItemImage(self, itemIdx): """ Return the image index that should be shown on the primary column of the given item """ return self.GetImageAt(self.GetObjectAt(itemIdx), 0) def OnGetItemColumnImage(self, itemIdx, colIdx): """ Return the image index at should be shown at the given cell """ return self.GetImageAt(self.GetObjectAt(itemIdx), colIdx) def OnGetItemAttr(self, itemIdx): """ Return the display attributes that should be used for the given row """ if not self.useAlternateBackColors and self.rowFormatter is None: return None # We have to keep a reference to the ListItemAttr or the garbage collector # will clear it up immeditately, before the ListCtrl has time to process it. self.listItemAttr = wx.ListItemAttr() self._FormatOneItem(self.listItemAttr, itemIdx, self.GetObjectAt(itemIdx)) return self.listItemAttr #---------------------------------------------------------------------------- # Accessing def GetObjectAt(self, index): """ Return the model modelObject at the given row of the list. This method is called a lot! Keep it as efficient as possible. """ # For reasons of performance, it may even be worthwhile removing this test and # ensure/assume that objectGetter is never None if self.objectGetter is None: return None #if index == self.lastGetObjectIndex: # self.cacheHit += 1 #else: # self.cacheMiss += 1 #print "hit: %d / miss: %d" % (self.cacheHit, self.cacheMiss) # Cache the last result (the hit rate is normally good: 5-10 hits to 1 miss) if index != self.lastGetObjectIndex: self.lastGetObjectIndex = index self.lastGetObject = self.objectGetter(index) return self.lastGetObject ######################################################################## class VirtualObjectListView(AbstractVirtualObjectListView): """ A virtual object list displays various aspects of an unlimited numbers of objects in a multi-column list control. By default, a VirtualObjectListView cannot sort its rows when the user click on a header. If you have a back store that can sort the data represented in the virtual list, you can listen for the EVT_SORT events, and then order your model objects accordingly. Due to the vagarities of virtual lists, rowFormatters must operate in a slightly different manner for virtual lists. Instead of being passed a ListItem, rowFormatters are passed a ListItemAttr instance. This supports the same formatting methods as a ListItem -- SetBackgroundColour(), SetTextColour(), SetFont() -- but no other ListItem methods. Obviously, being a virtual list, the rowFormatter cannot call any SetItem* method on the ListView itself. """ def __init__(self, *args, **kwargs): # By default, virtual lists aren't sortable if "sortable" not in kwargs: kwargs["sortable"] = False AbstractVirtualObjectListView.__init__(self, *args, **kwargs) #---------------------------------------------------------------------------- # Commands def AddObjects(self, modelObjects): """ Add the given collections of objects to our collection of objects. This cannot work for virtual lists since the source of model objects is not under the control of the VirtualObjectListView. """ pass def RemoveObjects(self, modelObjects): """ Remove the given collections of objects from our collection of objects. This cannot work for virtual lists since the source of model objects is not under the control of the VirtualObjectListView. """ pass def SelectObject(self, modelObject, deselectOthers=True): """ Select the given modelObject. If deselectOthers is True, all other objects will be deselected This doesn't work for virtual lists, since the virtual list has no way of knowing where 'modelObject' is within the list. """ pass def SelectObjects(self, modelObjects, deselectOthers=True): """ Select all of the given modelObjects. If deselectOthers is True, all other modelObjects will be deselected This doesn't work for virtual lists, since the virtual list has no way of knowing where any of the modelObjects are within the list. """ pass #---------------------------------------------------------------------------- # Sorting def _SortItemsNow(self): """ Sort the items by our current settings. VirtualObjectListView can't sort anything by themselves, so this is a no-op. """ pass ######################################################################## class FastObjectListView(AbstractVirtualObjectListView): """ A fast object list view is a nice compromise between the functionality of an ObjectListView and the speed of a VirtualObjectListView. This class codes around the limitations of a virtual list. Specifically, it allows sorting and selection by object. """ def __init__(self, *args, **kwargs): AbstractVirtualObjectListView.__init__(self, *args, **kwargs) self.SetObjectGetter(lambda index: self.innerList[index]) #---------------------------------------------------------------------------- # Commands def AddObjects(self, modelObjects): """ Add the given collections of objects to our collection of objects. """ self.modelObjects.extend(modelObjects) # We don't want to call RepopulateList() here since that makes the whole # control redraw, which flickers slightly, which I *really* hate! So we # most of the work of RepopulateList() but only redraw from the first # added object down. self._SortObjects() self._BuildInnerList() self.SetItemCount(len(self.innerList)) # Find where the first added object appears and make that and everything # after it redraw first = self.GetItemCount() for x in modelObjects: # Because of filtering the added objects may not be in the list idx = self.GetIndexOf(x) if idx != -1: first = min(first, idx) if first == 0: break if first < self.GetItemCount(): self.RefreshItems(first, self.GetItemCount() - 1) def RepopulateList(self): """ Completely rebuild the contents of the list control """ self.lastGetObjectIndex = -1 self._SortObjects() self._BuildInnerList() # wxbanker patch to sourceforge bug 2679500 if wx.Platform == "__WXMSW__": wx.ListCtrl.DeleteAllItems(self) ### self.SetItemCount(len(self.innerList)) self.RefreshObjects() # Auto-resize once all the data has been added self.AutoSizeColumns() def RefreshObjects(self, aList=None): """ Refresh all the objects in the given list """ self.lastGetObjectIndex = -1 # If no list is given, refresh everything if aList: for x in aList: idx = self.GetIndexOf(x) if idx != -1: self.RefreshItem(idx) elif self.GetItemCount(): self.RefreshItems(0, self.GetItemCount() - 1) #---------------------------------------------------------------------------- # Accessing def _MapModelIndexToListIndex(self, modelIndex): """ Return the index in the list where the given model index lives """ # In a FastListView, the model index is the same as the list index return modelIndex #---------------------------------------------------------------------------- # Sorting def _SortItemsNow(self): """ Sort the items by our current settings. FastObjectListView don't sort the items, they sort the model objects themselves. """ selection = self.GetSelectedObjects() self._SortObjects() self.SelectObjects(selection) self.RefreshObjects() ####################################################################### class GroupListView(FastObjectListView): """ An ObjectListView that allows model objects to be organised into collapsable groups. GroupListView only work in report view. The appearance of the group headers are controlled by the 'groupFont', 'groupTextColour', and 'groupBackgroundColour' public variables. The images used for expanded and collapsed groups can be controlled by changing the images name 'ObjectListView.NAME_EXPANDED_IMAGE' and 'ObjectListView.NAME_COLLAPSED_IMAGE' respectfully. Like this:: self.AddNamedImages(ObjectListView.NAME_EXPANDED_IMAGE, myOtherImage1) self.AddNamedImages(ObjectListView.NAME_COLLAPSED_IMAGE, myOtherImage2) Public variables: * putBlankLineBetweenGroups When this is True (the default), the list will be built so there is a blank line between groups. """ #---------------------------------------------------------------------------- # Creation def __init__(self, *args, **kwargs): """ Create a GroupListView. Parameters: * showItemCounts If this is True (the default) Group title will include the count of the items that are within that group. * useExpansionColumn If this is True (the default), the expansion/contraction icon will have its own column at position 0. If this is false, the expand/contract icon will be in the first user specified column. This must be set before SetColumns() is called. If it is changed, SetColumns() must be called again. """ self.groups = list() self.showGroups = True self.putBlankLineBetweenGroups = True self.alwaysGroupByColumnIndex = -1 self.useExpansionColumn = kwargs.pop("useExpansionColumn", True) self.showItemCounts = kwargs.pop("showItemCounts", True) FastObjectListView.__init__(self, *args, **kwargs) # Setup default group characteristics font = self.GetFont() self.groupFont = wx.FFont(font.GetPointSize(), font.GetFamily(), wx.FONTFLAG_BOLD, font.GetFaceName()) self.groupTextColour = wx.Colour(33, 33, 33, 255) self.groupBackgroundColour = wx.Colour(159, 185, 250, 249) self._InitializeImages() def _InitializeImages(self): """ Initialize the images used to indicate expanded/collapsed state of groups. """ def _makeBitmap(state, size): bitmap = wx.EmptyBitmap(size, size) dc = wx.MemoryDC(bitmap) dc.SetBackground(wx.Brush(self.groupBackgroundColour)) dc.Clear() (x, y) = (0, 0) # The image under Linux is smaller and needs to be offset somewhat to look reasonable if wx.Platform == "__WXGTK__": (x, y) = (4, 4) wx.RendererNative.Get().DrawTreeItemButton(self, dc, (x, y, size, size), state) dc.SelectObject(wx.NullBitmap) return bitmap # If there isn't a small image list, make one if self.smallImageList is None: self.SetImageLists() size = self.smallImageList.GetSize()[0] self.AddNamedImages(ObjectListView.NAME_EXPANDED_IMAGE, _makeBitmap(wx.CONTROL_EXPANDED, size)) self.AddNamedImages(ObjectListView.NAME_COLLAPSED_IMAGE, _makeBitmap(0, size)) #---------------------------------------------------------------------------- # Accessing def GetShowGroups(self): """ Return whether or not this control is showing groups of objects or a straight list """ return self.showGroups def SetShowGroups(self, showGroups=True): """ Set whether or not this control is showing groups of objects or a straight list """ if showGroups == self.showGroups: return self.showGroups = showGroups if not len(self.columns): return if showGroups: self.SetColumns(self.columns, False) else: if self.useExpansionColumn: self.SetColumns(self.columns[1:], False) self.SetObjects(self.modelObjects) def GetShowItemCounts(self): """ Return whether or not the number of items in a groups should be included in the title """ return self.showItemCounts def SetShowItemCounts(self, showItemCounts=True): """ Set whether or not the number of items in a groups should be included in the title """ if showItemCounts != self.showItemCounts: self.showItemCounts = showItemCounts self._BuildGroupTitles(self.groups, self.GetGroupByColumn()) self._SetGroups(self.groups) def GetGroupByColumn(self): """ Return the column by which the rows should be grouped """ if self.alwaysGroupByColumnIndex >= 0: return self.GetAlwaysGroupByColumn() elif self.GetSortColumn() is None: return self.GetPrimaryColumn() else: return self.GetSortColumn() def GetAlwaysGroupByColumn(self): """ Get the column by which the rows should be always be grouped. """ try: return self.columns[self.alwaysGroupByColumnIndex] except IndexError: return None def SetAlwaysGroupByColumn(self, column): """ Set the column by which the rows should be always be grouped. 'column' can be None (which clears the setting), a ColumnDefn, or the index of the column desired """ if column is None: self.alwaysGroupByColumnIndex = -1 elif isinstance(column, ColumnDefn): try: self.alwaysGroupByColumnIndex = self.columns.index(column) except ValueError: self.alwaysGroupByColumnIndex = -1 else: self.alwaysGroupByColumnIndex = column #---------------------------------------------------------------------------- # Commands def AddObjects(self, modelObjects): """ Add the given collections of objects to our collection of objects. """ self.groups = None FastObjectListView.AddObjects(self, modelObjects) def CreateCheckStateColumn(self, columnIndex=0): """ Create a fixed width column at the given index to show the checkedness of objects in this list. """ # If the control is configured to have a separate expansion column, # the check state column has to come after that if self.useExpansionColumn and columnIndex == 0: columnIndex = 1 FastObjectListView.CreateCheckStateColumn(self, columnIndex) def RemoveObjects(self, modelObjects): """ Remove the given collections of objects from our collection of objects. """ self.groups = None FastObjectListView.RemoveObjects(self, modelObjects) def SetColumns(self, columns, repopulate=True): """ Set the columns for this control. """ newColumns = columns[:] # Insert the column used for expansion and contraction (if one isn't already there) if self.showGroups and self.useExpansionColumn and len(newColumns) > 0: if not isinstance(newColumns[0], ColumnDefn) or not newColumns[0].isInternal: newColumns.insert(0, ColumnDefn("", fixedWidth=24, isEditable=False)) newColumns[0].isInternal = True FastObjectListView.SetColumns(self, newColumns, repopulate) def SetGroups(self, groups): """ Present the collection of ListGroups in this control. Calling this automatically put the control into ShowGroup mode """ self.modelObjects = list() self.SetShowGroups(True) self._SetGroups(groups) def SetObjects(self, modelObjects, preserveSelection=False): """ Set the list of modelObjects to be displayed by the control. """ # Force our groups to be rebuilt, if we are supposd to be showing them if self.showGroups: self.groups = None else: self.groups = list() FastObjectListView.SetObjects(self, modelObjects, preserveSelection) #---------------------------------------------------------------------------- # Building def _SetGroups(self, groups): """ Present the collection of ListGroups in this control. """ self.groups = groups self.RepopulateList() def RebuildGroups(self): """ Completely rebuild our groups from our current list of model objects. Only use this if SetObjects() has been called. If you have specifically created your groups and called SetGroups(), do not use this method. """ groups = self._BuildGroups() self.SortGroups(groups) self._SetGroups(groups) def _BuildGroups(self, modelObjects=None): """ Partition the given list of objects into ListGroups depending on the given groupBy column. Returns the created collection of ListGroups """ if modelObjects is None: modelObjects = self.modelObjects if self.filter: modelObjects = self.filter(modelObjects) groupingColumn = self.GetGroupByColumn() groupMap = {} for model in modelObjects: key = groupingColumn.GetGroupKey(model) group = groupMap.get(key) if group is None: groupMap[key] = group = ListGroup(key, groupingColumn.GetGroupKeyAsString(key)) group.Add(model) groups = groupMap.values() if self.GetShowItemCounts(): self._BuildGroupTitles(groups, groupingColumn) # Let the world know that we are creating the given groups evt = OLVEvent.GroupCreationEvent(self, groups) self.GetEventHandler().ProcessEvent(evt) return evt.groups def _BuildGroupTitles(self, groups, groupingColumn): """ Rebuild the titles of the given groups """ for x in groups: x.title = groupingColumn.GetGroupTitle(x, self.GetShowItemCounts()) def _BuildInnerList(self): """ Build the list that will be used to populate the ListCtrl. This internal list is an amalgum of model objects, ListGroups and None (which are blank rows). """ self.objectToIndexMap = None if not self.showGroups: return ObjectListView._BuildInnerList(self) if not self.modelObjects: self.groups = list() self.innerList = list() return if self.groups is None: self.groups = self._BuildGroups() self.SortGroups() self.innerList = list() for grp in self.groups: if len(self.innerList) and self.putBlankLineBetweenGroups: self.innerList.append(None) self.innerList.append(grp) if grp.isExpanded: self.innerList.extend(grp.modelObjects) #---------------------------------------------------------------------------- # Virtual list callbacks. # These are called a lot! Keep them efficient def OnGetItemText(self, itemIdx, colIdx): """ Return the text that should be shown at the given cell """ modelObject = self.innerList[itemIdx] if modelObject is None: return "" if isinstance(modelObject, ListGroup): if self.GetPrimaryColumnIndex() == colIdx: return modelObject.title else: return "" return self.GetStringValueAt(modelObject, colIdx) def OnGetItemImage(self, itemIdx): """ Return the image index that should be shown on the primary column of the given item """ # I don't think this method is ever called. Maybe in non-details views. modelObject = self.innerList[itemIdx] if modelObject is None: return -1 if isinstance(modelObject, ListGroup): if modelObject.isExpanded: imageKey = ObjectListView.NAME_EXPANDED_IMAGE else: imageKey = ObjectListView.NAME_COLLAPSED_IMAGE return self.smallImageList.GetImageIndex(imageKey) return self.GetImageAt(modelObject, 0) def OnGetItemColumnImage(self, itemIdx, colIdx): """ Return the image index at should be shown at the given cell """ modelObject = self.innerList[itemIdx] if modelObject is None: return -1 if isinstance(modelObject, ListGroup): if colIdx == 0: if modelObject.isExpanded: imageKey = ObjectListView.NAME_EXPANDED_IMAGE else: imageKey = ObjectListView.NAME_COLLAPSED_IMAGE return self.smallImageList.GetImageIndex(imageKey) else: return -1 return self.GetImageAt(modelObject, colIdx) def OnGetItemAttr(self, itemIdx): """ Return the display attributes that should be used for the given row """ self.listItemAttr = wx.ListItemAttr() modelObject = self.innerList[itemIdx] if modelObject is None: return self.listItemAttr if isinstance(modelObject, ListGroup): # We have to keep a reference to the ListItemAttr or the garbage collector # will clear it up immeditately, before the ListCtrl has time to process it. if self.groupFont is not None: self.listItemAttr.SetFont(self.groupFont) if self.groupTextColour is not None: self.listItemAttr.SetTextColour(self.groupTextColour) if self.groupBackgroundColour is not None: self.listItemAttr.SetBackgroundColour(self.groupBackgroundColour) return self.listItemAttr return FastObjectListView.OnGetItemAttr(self, itemIdx) #---------------------------------------------------------------------------- # Commands def ToggleExpansion(self, group): """ Toggle the expanded/collapsed state of the given group and redisplay the list """ self._DoExpandCollapse([group], not group.isExpanded) def Expand(self, group): """ Expand the given group and redisplay the list """ self._DoExpandCollapse([group], True) def Collapse(self, group): """ Collapse the given group and redisplay the list """ self._DoExpandCollapse([group], False) def ExpandAll(self, groups=None): """ Expand the given groups (or all groups) and redisplay the list """ if groups is None: groups = self.groups self._DoExpandCollapse(groups, True) def CollapseAll(self, groups=None): """ Collapse the given groups (or all groups) and redisplay the list """ if groups is None: groups = self.groups self._DoExpandCollapse(groups, False) def _DoExpandCollapse(self, groups, isExpanding): """ Do the real work of expanding/collapsing the given groups """ # Cull groups that aren't going to change groups = [x for x in groups if x.isExpanded != isExpanding] if not groups: return # Let the world know that the given groups are about to be expanded/collapsed evt = OLVEvent.ExpandingCollapsingEvent(self, groups, isExpanding) self.GetEventHandler().ProcessEvent(evt) if evt.IsVetoed(): return # Expand/contract the groups, then put those changes into effect for x in evt.groups: x.isExpanded = isExpanding self._BuildInnerList() self.SetItemCount(len(self.innerList)) # Refresh eveything from the first group down i = min([self.GetIndexOf(x) for x in evt.groups]) self.RefreshItems(i, len(self.innerList)-1) # Let the world know that the given groups have been expanded/collapsed evt = OLVEvent.ExpandedCollapsedEvent(self, evt.groups, isExpanding) self.GetEventHandler().ProcessEvent(evt) def Reveal(self, modelObject): """ Ensure that the given modelObject is visible, expanding the group it belongs to, if necessary """ # If it is already there, just make sure it is visible i = self.GetIndexOf(modelObject) if i != -1: self.EnsureVisible(i) return True # Find which group (if any) the object belongs to, and # expand it and then try to reveal it again for group in self.groups: if not group.isExpanded and modelObject in group.modelObjects: self.Expand(group) return self.Reveal(modelObject) return False def SelectAll(self): """ Selected all model objects in the control. In a GroupListView, this does not select blank lines or groups """ self.SetItemState(-1, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) for (i, x) in enumerate(self.innerList): if x is None or isinstance(x, ListGroup): self.SetItemState(i, 0, wx.LIST_STATE_SELECTED) # With the current implemetation, these are synonyms SelectGroup = ObjectListView.SelectObject SelectGroups = ObjectListView.SelectObjects #---------------------------------------------------------------------------- # Accessing def FindGroupFor(self, modelObject): """ Return the group that contains the given object or None if the given object is not found """ for group in self.groups: if modelObject in group.modelObjects: return group return None def GetSelectedGroups(self): """ Return a list of the groups that are selected """ selectedGroups = list() i = self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) while i != -1: model = self.innerList[i] if isinstance(model, ListGroup): selectedGroups.append(model) i = self.GetNextItem(i, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) return selectedGroups def GetFilteredObjects(self): """ Return the model objects that are actually displayed in the control. """ objects = list() for x in self.groups: objects.extend(x.modelObjects) return objects def GetObjectAt(self, index): """ Return the model object at the given row of the list. With GroupListView, this method can return None, since the given index may be a blank row or a group header. These do not have corresponding model objects. """ try: model = self.innerList[index] if isinstance(model, ListGroup): model = None except IndexError: model = None return model def YieldSelectedObjects(self): """ Progressively yield the selected modelObjects. Only return model objects, not blank lines or ListGroups """ i = self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) while i != -1: model = self.GetObjectAt(i) if model is not None: yield model i = self.GetNextItem(i, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED) def _CanUseBisect(self, searchColumn): """ Return True if we can use binary search on the given column. A GroupListView can never use binary search since its rows aren't sorted. """ return not self.showGroups def _GetValuesAsMultiList(self, objects): """ Return a list of lists of the string of the aspects of the given objects """ cols = self.columns[self.GetPrimaryColumnIndex():] # We don't want to copy the expand icon columns objects = [x for x in objects if x is not None and not isinstance(x, ListGroup)] return [[column.GetStringValue(x) for column in cols] for x in objects] #---------------------------------------------------------------------------- # Event handlers def _HandleChar(self, evt): if not self.IsCellEditing() and self.handleStandardKeys: if (evt.GetKeyCode() == wx.WXK_LEFT): self.CollapseAll(self.GetSelectedGroups()) return if (evt.GetKeyCode() == wx.WXK_RIGHT): self.ExpandAll(self.GetSelectedGroups()) return FastObjectListView._HandleChar(self, evt) def _HandleColumnClick(self, evt): """ The user has clicked on a column title """ # If they click on a new column, we have to rebuild our groups if evt.GetColumn() != self.sortColumnIndex: self.groups = None FastObjectListView._HandleColumnClick(self, evt) def _HandleLeftDownOnImage(self, rowIndex, subItemIndex): """ Handle a left click on the image at the given cell """ self._PossibleFinishCellEdit() listObject = self.innerList[rowIndex] if subItemIndex == 0 and isinstance(listObject, ListGroup): self.ToggleExpansion(listObject) else: FastObjectListView._HandleLeftDownOnImage(self, rowIndex, subItemIndex) #---Sorting-------------------------------------------------------#000000#FFFFFF def SortGroups(self, groups=None, ascending=None): """ Sort the given collection of groups in the given direction (defaults to ascending). The model objects within each group will be sorted as well """ if groups is None: groups = self.groups if ascending is None: ascending = self.sortAscending # If the groups are locked, we sort by the sort column, otherwise by the grouping column. # The primary column is always used as a secondary sort key. if self.GetAlwaysGroupByColumn(): sortCol = self.GetSortColumn() else: sortCol = self.GetGroupByColumn() # Let the world have a change to sort the items evt = OLVEvent.SortGroupsEvent(self, groups, sortCol, ascending) self.GetEventHandler().ProcessEvent(evt) if evt.wasHandled: return # Sorting event wasn't handled, so we do the default sorting def _getLowerCaseKey(group): try: return group.key.lower() except: return group.key groups.sort(key=_getLowerCaseKey, reverse=(not ascending)) # Sort the model objects within each group. for x in groups: self._SortObjects(x.modelObjects, sortCol, self.GetPrimaryColumn()) def _SortItemsNow(self): """ Sort the items by our current settings. GroupListViews don't sort the items directly. We have to sort the groups and then rebuild the list. """ if not self.showGroups: return FastObjectListView._SortItemsNow(self) if self.groups is None: self.groups = self._BuildGroups() self.SortGroups(self.groups) self._SetGroups(self.groups) #def _FormatAllRows(self): # """ # GroupListViews don't need this method. # """ # pass ####################################################################### class ListGroup(object): """ A ListGroup is a partition of model objects that can be presented under a collapsible heading in a GroupListView. """ def __init__(self, key, title, isExpanded=True): self.key = key self.title = title self.isExpanded = isExpanded self.modelObjects = list() def Add(self, model): """ Add the given model to those that belong to this group. """ self.modelObjects.append(model) ####################################################################### class ColumnDefn(object): """ A ColumnDefn controls how one column of information is sourced and formatted. Much of the intelligence and ease of use of an ObjectListView comes from the column definitions. It is worthwhile gaining an understanding of the capabilities of this class. Public Attributes (alphabetically): * align How will the title and the cells of the this column be aligned. Possible values: 'left', 'centre', 'right' * cellEditorCreator This is a callable that will be invoked to create an editor for value in this column. The callable should accept three parameters: the objectListView starting the edit, the rowIndex and the subItemIndex. It should create and return a Control that is capable of editing the value. If this is None, a cell editor will be chosen based on the type of objects in this column (See CellEditor.EditorRegistry). * freeSpaceProportion If the column is space filling, this attribute controls what proportion of the space should be given to this column. By default, all spacing filling column share the free space equally. By changing this attribute, a column can be given a larger proportion of the space. * groupKeyConverter The groupKeyConverter converts a group key into the string that can be presented to the user. This string will be used as part of the title for the group. Its behaviour is the same as "stringConverter." * groupKeyGetter When this column is used to group the model objects, what groupKeyGetter extracts the value from each model that will be used to partition the model objects into groups. Its behaviour is the same as "valueGetter." If this is None, the value returned by valueGetter will be used. * groupTitleSingleItem When a group is created that contains a single item, and the GroupListView has "showItemCounts" turned on, this string will be used to create the title of the group. The string should contain two placeholder: %(title)s and %(count)d. Example: "%(title)s [only %(count)d song]" * groupTitlePluralItems When a group is created that contains 0 items or >1 items, and the GroupListView has "showItemCounts" turned on, this string will be used to create the title of the group. The string should contain two placeholder: %(title)s and %(count)d. Example: "%(title)s [%(count)d songs]" * headerImage The index or name of the image that will be shown against the column header. Remember, a column header can only show one image at a time, so if the column is the sort column, it will show the sort indicator -- not this headerImage. * imageGetter A string, callable or integer that is used to get a index of the image to be shown in a cell. Strings and callable are used as for the `valueGetter` attribute. Integers are treated as constants (that is, all rows will have the same image). * isEditable Can the user edit cell values in this column? Default is True * isSearchable If this column is the sort column, when the user types into the ObjectListView, will a match be looked for using values from this column? If this is False, values from column 0 will be used. Default is True. * isSpaceFilling Is this column a space filler? Space filling columns resize to occupy free space within the listview. As the listview is expanded, space filling columns expand as well. Conversely, as the control shrinks these columns shrink too. Space filling columns can disappear (i.e. have a width of 0) if the control becomes too small. You can set `minimumWidth` to prevent them from disappearing. * maximumWidth An integer indicate the number of pixels above which this column will not resize. Default is -1, which means there is no limit. * minimumWidth An integer indicate the number of pixels below which this column will not resize. Default is -1, which means there is no limit. * useBinarySearch If isSearchable and useBinarySearch are both True, the ObjectListView will use a binary search algorithm to locate a match. If useBinarySearch is False, a simple linear search will be done. The binary search can quickly search large numbers of rows (10,000,000 in about 25 comparisons), which makes them ideal for virtual lists. However, there are two constraints: - the ObjectListView must be sorted by this column - sorting by string representation must give the same ordering as sorting by the aspect itself. The second constraint is necessary because the user types characters expecting them to match the string representation of the data. The binary search will make its decisions using the string representation, but the rows ordered by aspect value. This will only work if sorting by string representation would give the same ordering as sorting by the aspect value. In general, binary searches work with strings, YYYY-MM-DD dates, and booleans. They do not work with numerics or other date formats. If either of these constrains are not true, you must set useBinarySearch to False and be content with linear searches. Otherwise, the searching will not work correctly. * stringConverter A string or a callable that will used to convert a cells value into a presentation string. If it is a callble, it will be called with the value for the cell and must return a string. If it is a string, it will be used as a format string with the % operator, e.g. "self.stringConverter % value." For dates and times, the stringConverter will be passed as the first parameter to the strftime() method on the date/time. * title A string that will be used as the title of the column in the listview * valueGetter A string, callable or integer that is used to get the value to be displayed in a cell. See _Munge() for details on how this attribute is used. A callable is simply called and the result is the value for the cell. The string can be the name of a method to be invoked, the name of an attribute to be fetched, or (for dictionary like objects) an index into the dictionary. An integer can only be used for list-like objects and is used as an index into the list. * valueSetter A string, callable or integer that is used to write an edited value back into the model object. A callable is called with the model object and the new value. Example:: myCol.valueSetter(modelObject, newValue) An integer can only be used if the model object is a mutable sequence. The integer is used as an index into the list. Example:: modelObject[myCol.valueSetter] = newValue The string can be: * the name of a method to be invoked, in which case the method should accept the new value as its parameter. Example:: method = getattr(modelObject, myCol.valueSetter) method(newValue) * the name of an attribute to be updated. This attribute will not be created: it must already exist. Example:: setattr(modelObject, myCol.valueSetter, newValue) * for dictionary like model objects, an index into the dictionary. Example:: modelObject[myCol.valueSetter] = newValue * useInitialLetterForGroupKey When this is true and the group key for a row is a string, only the first letter of the string will be considered as the group key. This is often useful for grouping row when the column contains a name. * width How many pixels wide will the column be? -1 means auto size to contents. For a list with thousands of items, autosize can be noticably slower than specifically setting the size. The `title`, `align` and `width` attributes are only references when the column definition is given to the ObjectListView via the `SetColumns()` or `AddColumnDefn()` methods. The other attributes are referenced intermittently -- changing them will change the behaviour of the `ObjectListView`. Without a string converter, None will be converted to an empty string. Install a string converter ('%s' will suffice) if you want to see the 'None' instead. BUG: Double-clicking on a divider (under Windows) can resize a column beyond its minimum and maximum widths. """ def __init__(self, title="title", align="left", width=-1, valueGetter=None, imageGetter=None, stringConverter=None, valueSetter=None, isEditable=True, fixedWidth=None, minimumWidth=-1, maximumWidth=-1, isSpaceFilling=False, cellEditorCreator=None, autoCompleteCellEditor=False, autoCompleteComboBoxCellEditor=False, checkStateGetter=None, checkStateSetter=None, isSearchable=True, useBinarySearch=None, headerImage=-1, groupKeyGetter=None, groupKeyConverter=None, useInitialLetterForGroupKey=False, groupTitleSingleItem=None, groupTitlePluralItems=None, editFormatter=None): """ Create a new ColumnDefn using the given attributes. The attributes behave as described in the class documentation, except for: * fixedWidth An integer which indicates that this column has the given width and is not resizable. Useful for column that always display fixed with data (e.g. a single icon). Setting this parameter overrides the width, minimumWidth and maximumWidth parameters. * autoCompleteCellEditor If this is True, the column will use an autocomplete TextCtrl when values of this column are edited. This overrules the cellEditorCreator parameter. * autoCompleteComboBoxCellEditor If this is True, the column will use an autocomplete ComboBox when values of this column are edited. This overrules the cellEditorCreator parameter. """ self.title = title self.align = align self.valueGetter = valueGetter self.imageGetter = imageGetter self.stringConverter = stringConverter self.editFormatter = editFormatter self.valueSetter = valueSetter self.isSpaceFilling = isSpaceFilling self.cellEditorCreator = cellEditorCreator self.freeSpaceProportion = 1 self.isEditable = isEditable self.isSearchable = isSearchable self.useBinarySearch = useBinarySearch self.headerImage = headerImage self.groupKeyGetter = groupKeyGetter self.groupKeyConverter = groupKeyConverter self.useInitialLetterForGroupKey = useInitialLetterForGroupKey self.groupTitleSingleItem = groupTitleSingleItem or "%(title)s (%(count)d item)" self.groupTitlePluralItems = groupTitlePluralItems or "%(title)s (%(count)d items)" self.isInternal = False # was this column created internally by ObjectListView? self.minimumWidth = minimumWidth self.maximumWidth = maximumWidth self.width = self.CalcBoundedWidth(width) if fixedWidth is not None: self.SetFixedWidth(fixedWidth) if autoCompleteCellEditor: self.cellEditorCreator = lambda olv, row, col: CellEditor.MakeAutoCompleteTextBox(olv, col) if autoCompleteComboBoxCellEditor: self.cellEditorCreator = lambda olv, row, col: CellEditor.MakeAutoCompleteComboBox(olv, col) self.checkStateGetter = checkStateGetter self.checkStateSetter = checkStateSetter #------------------------------------------------------------------------------- # Column properties def GetAlignment(self): """ Return the alignment that this column uses """ alignment = { "l": wx.LIST_FORMAT_LEFT, "c": wx.LIST_FORMAT_CENTRE, "r": wx.LIST_FORMAT_RIGHT }.get(self.align[:1], wx.LIST_FORMAT_LEFT) return alignment def GetAlignmentForText(self): """ Return the alignment of this column in a form that can be used as a style flag on a text control """ return { "l": wx.TE_LEFT, "c": wx.TE_CENTRE, "r": wx.TE_RIGHT, }.get(self.align[:1], wx.TE_LEFT) #------------------------------------------------------------------------------- # Value accessing def GetValue(self, modelObject): """ Return the value for this column from the given modelObject """ return self._Munge(modelObject, self.valueGetter) def GetStringValue(self, modelObject): """ Return a string representation of the value for this column from the given modelObject """ value = self.GetValue(modelObject) return self._StringToValue(value, self.stringConverter) def _StringToValue(self, value, converter): """ Convert the given value to a string, using the given converter """ try: return converter(value) except TypeError: pass if converter and isinstance(value, (datetime.datetime, datetime.date, datetime.time)): return value.strftime(self.stringConverter) # By default, None is changed to an empty string. if not converter and not value: return "" fmt = converter or "%s" try: return fmt % value except UnicodeError: return unicode(fmt) % value def GetGroupKey(self, modelObject): """ Return the group key for this column from the given modelObject """ if self.groupKeyGetter is None: key = self.GetValue(modelObject) else: key = self._Munge(modelObject, self.groupKeyGetter) if self.useInitialLetterForGroupKey: try: return key[:1].upper() except TypeError: return key else: return key def GetGroupKeyAsString(self, groupKey): """ Return the given group key as a human readable string """ # If there is no group key getter, we must have the normal aspect value. So if # there isn't a special key converter, use the normal aspect to string converter. if self.groupKeyGetter is None and self.groupKeyConverter is None: return self._StringToValue(groupKey, self.stringConverter) else: return self._StringToValue(groupKey, self.groupKeyConverter) def GetGroupTitle(self, group, useItemCount): """ Return a title of the group """ title = self.GetGroupKeyAsString(group.key) if useItemCount: objectCount = len(group.modelObjects) if objectCount == 1: fmt = self.groupTitleSingleItem else: fmt = self.groupTitlePluralItems title = fmt % {"title":title, "count":objectCount} return title def GetImage(self, modelObject): """ Return the image index for this column from the given modelObject. -1 means no image. """ if self.imageGetter is None: return -1 if isinstance(self.imageGetter, int): return self.imageGetter idx = self._Munge(modelObject, self.imageGetter) if idx is None: return -1 else: return idx def SetValue(self, modelObject, value): """ Set this columns aspect of the given modelObject to have the given value. """ if self.valueSetter is None: return self._SetValueUsingMunger(modelObject, value, self.valueGetter, False) else: return self._SetValueUsingMunger(modelObject, value, self.valueSetter, True) def _SetValueUsingMunger(self, modelObject, value, munger, shouldInvokeCallable): """ Look for ways to update modelObject with value using munger. If munger finds a callable, it will be called if shouldInvokeCallable == True. """ # If there isn't a munger, we can't do anything if munger is None: return # Is munger a function? if callable(munger): if shouldInvokeCallable: munger(modelObject, value) return # Try indexed access for dictionary or list like objects try: modelObject[munger] = value return except: pass # Is munger the name of some slot in the modelObject? try: attr = getattr(modelObject, munger) except TypeError: return except AttributeError: return # Is munger the name of a method? if callable(attr): if shouldInvokeCallable: attr(value) return # If we get to here, it seems that munger is the name of an attribute or # property on modelObject. Try to set, realising that many things could still go wrong. try: setattr(modelObject, munger, value) except: pass def _Munge(self, modelObject, munger): """ Wrest some value from the given modelObject using the munger. With a description like that, you know this method is going to be obscure :-) 'munger' can be: 1) a callable. This method will return the result of executing 'munger' with 'modelObject' as its parameter. 2) the name of an attribute of the modelObject. If that attribute is callable, this method will return the result of executing that attribute. Otherwise, this method will return the value of that attribute. 3) an index (string or integer) onto the modelObject. This allows dictionary-like objects and list-like objects to be used directly. """ if munger is None: return None # THINK: The following code treats an instance variable with the value of None # as if it doesn't exist. Is that best? # Try attribute access try: attr = getattr(modelObject, munger, None) if attr is not None: try: return attr() except TypeError: return attr except TypeError: # Happens when munger is not a string pass # Use the callable directly, if possible. # In accordance with Guido's rules for Python 3, we just call it and catch the # exception try: return munger(modelObject) except TypeError: pass # Try dictionary-like indexing try: return modelObject[munger] except: return None #------------------------------------------------------------------------------- # Width management def CalcBoundedWidth(self, width): """ Calculate the given width bounded by the (optional) minimum and maximum column widths """ # Values of < 0 have special meanings, so just return them if width < 0: return width if self.maximumWidth >= 0: width = min(self.maximumWidth, width) return max(self.minimumWidth, width) def IsFixedWidth(self): """ Is this column fixed width? """ return self.minimumWidth != -1 and \ self.maximumWidth != -1 and \ (self.minimumWidth >= self.maximumWidth) def SetFixedWidth(self, width): """ Make this column fixed width """ self.width = self.minimumWidth = self.maximumWidth = width #---------------------------------------------------------------------------- # Check state def HasCheckState(self): """ Return if this column is showing a check box? """ return self.checkStateGetter is not None def GetCheckState(self, modelObject): """ Return the check state of the given model object """ if self.checkStateGetter is None: return None else: return self._Munge(modelObject, self.checkStateGetter) def SetCheckState(self, modelObject, state): """ Set the check state of the given model object """ if self.checkStateSetter is None: return self._SetValueUsingMunger(modelObject, state, self.checkStateGetter, False) else: return self._SetValueUsingMunger(modelObject, state, self.checkStateSetter, True) #====================================================================== class NamedImageList(object): """ A named image list is an Adaptor that gives a normal image list the ability to reference images by name, rather than just index """ def __init__(self, imageList=None, imageSize=16): """ """ self.imageList = imageList or wx.ImageList(imageSize, imageSize) self.imageSize = imageSize self.nameToImageIndexMap = {} def GetSize(self, ignored=None): """ Return a pair that represents the size of the image in this list """ # Mac and Linux have trouble getting the size of empty image lists if self.imageList.GetImageCount() == 0: return (self.imageSize, self.imageSize) else: return self.imageList.GetSize(0) def AddNamedImage(self, name, image): """ Add the given image to our list, and remember its name. Returns the images index. """ imageIndex = self.imageList.Add(image) if name is not None: self.nameToImageIndexMap[name] = imageIndex return imageIndex def HasName(self, name): """ Does this list have an image with the given name?" """ return name in self.nameToImageIndexMap def GetImageIndex(self, name): """ Return the image with the given name, or -1 if it doesn't exist """ return self.nameToImageIndexMap.get(name, -1) #====================================================================== class BatchedUpdate(object): """ This class is an *Adapter* around an ``ObjectListView`` which ensure that the list is updated, at most, once every *N* seconds. Usage:: self.olv2 = BatchedUpdate(self.olv, 3) # Now use olv2 in place of olv, and the list will only be updated at most once # every 3 second, no many how many calls are made to it. This is useful for a certain class of problem where model objects are update frequently -- more frequently than you wish to update the control. A backup program may be able to backup several files a second, but does not wish to update the list ctrl that often. A packet sniffer will receive hundreds of packets per second, but should not try to update the list ctrl for each packet. A batched update adapter solves situations like these in a trivial manner. This class only intercepts the following messages: * ``AddObject()``, ``AddObjects()`` * ``RefreshObject()``, ``RefreshObjects()`` * ``RemoveObject()``, ``RemoveObjects()`` * ``RepopulateList()`` * ``SetObjects()`` All other message are passed directly to the ``ObjectListView`` and are thus unbatched. This means that sorting and changes to columns are unbatched and will take effect immediately. You need to be a little careful when using batched updates. There are at least two things you need to avoid, or at least be careful about: 1) Don't mix batched and unbatched updates. If you go behind the back of the batched update wrapper and make direct changes to the underlying control, you will probably get bitten by difficult-to-reproduce bugs. For example:: self.olvBatched.SetObjects(objects) # Batched update self.olvBatched.objectlistView.AddObject(aModel) # unbatched update This will almost certainly not do what you expect, or at best, will only sometimes do what you want. 2) You cannot assume that objects will immediately appear in the list and thus be available for further operations. For example:: self.olv.AddObject(aModel) self.olv.Check(aModel) If *self.olv* is a batched update adapter, this code *may* not work since the ``AddObject()`` might not have yet taken effect, so the ``Check()`` will not find *aModel* in the control. Worse, it may work most of the time and fail only occassionally. If you need to be able to do further processing on objects just added, it would be better not to use a batched adapter. """ # For SetObjects(), None and empty list are both possible valid values so we need a # non-valid value that indicates that SetObjects() has not been called NOT_SET = -1 def __init__(self, objectListView, updatePeriod=0): self.objectListView = objectListView # Must not be None self.updatePeriod = updatePeriod self.objectListView.Bind(wx.EVT_IDLE, self._HandleIdle) self.newModelObjects = BatchedUpdate.NOT_SET self.objectsToAdd = list() self.objectsToRefresh = list() self.objectsToRemove = list() self.freezeUntil = 0 def __getattr__(self, name): """ Forward any unknown references to the original objectListView. This is what allows us to pretend to be an ObjectListView. """ return getattr(self.objectListView, name) def RepopulateList(self): """ Remember the given model objects so that they can be displayed when the next update cycle occurs """ if self.freezeUntil < time.clock(): self.objectListView.RepopulateList() self.freezeUntil = time.clock() + self.updatePeriod return self.newModelObjects = self.objectListView.modelObjects self.objectsToRefresh = list() # Unlike SetObjects(), refreshing the list does NOT invalidate the objects to be added/removed def SetObjects(self, modelObjects): """ Remember the given model objects so that they can be displayed when the next update cycle occurs """ if self.freezeUntil < time.clock(): self.objectListView.SetObjects(modelObjects) self.freezeUntil = time.clock() + self.updatePeriod return self.newModelObjects = modelObjects # Explicitly setting the objects to be shown renders void any previous Add/Refresh/Remove commands self.objectsToAdd = list() self.objectsToRefresh = list() self.objectsToRemove = list() def AddObject(self, modelObject): """ Add the given object to our collection of objects. The object will appear at its sorted location, or at the end of the list if the list is unsorted """ self.AddObjects([modelObject]) def AddObjects(self, modelObjects): """ Remember the given model objects so that they can be added when the next update cycle occurs """ if self.freezeUntil < time.clock(): self.objectListView.AddObjects(modelObjects) self.freezeUntil = time.clock() + self.updatePeriod return # TODO: We should check that none of the model objects is already in the list self.objectsToAdd.extend(modelObjects) # Since we are adding these objects, we must no longer remove them if self.objectsToRemove: for x in modelObjects: self.objectsToRemove.remove(x) def RefreshObject(self, modelObject): """ Refresh the display of the given model """ self.RefreshObjects([modelObject]) def RefreshObjects(self, modelObjects): """ Refresh the information displayed about the given model objects """ if self.freezeUntil < time.clock(): self.objectListView.RefreshObjects(modelObjects) self.freezeUntil = time.clock() + self.updatePeriod return self.objectsToRefresh.extend(modelObjects) def RemoveObject(self, modelObjects): """ Remember the given model objects so that they can be removed when the next update cycle occurs """ self.RemoveObjects([modelObject]) def RemoveObjects(self, modelObjects): """ Remember the given model objects so that they can be removed when the next update cycle occurs """ if self.freezeUntil < time.clock(): self.objectListView.RemoveObjects(modelObjects) self.freezeUntil = time.clock() + self.updatePeriod return self.objectsToRemove.extend(modelObjects) # Since we are removing these objects, we must no longer add them if self.objectsToAdd: for x in modelObjects: self.objectsToAdd.remove(x) #---------------------------------------------------------------------------- # Event processing def _HandleIdle(self, evt): """ The app is idle. Process any outstanding requests """ if (self.newModelObjects != BatchedUpdate.NOT_SET or self.objectsToAdd or self.objectsToRefresh or self.objectsToRemove): if self.freezeUntil < time.clock(): self._ApplyChanges() else: evt.RequestMore() def _ApplyChanges(self): """ Apply any batched changes to the list """ if self.newModelObjects != BatchedUpdate.NOT_SET: self.objectListView.SetObjects(self.newModelObjects) if self.objectsToAdd: self.objectListView.AddObjects(self.objectsToAdd) if self.objectsToRemove: self.objectListView.RemoveObjects(self.objectsToRemove) if self.objectsToRefresh: self.objectListView.RefreshObjects(self.objectsToRefresh) self.newModelObjects = BatchedUpdate.NOT_SET self.objectsToAdd = list() self.objectsToRemove = list() self.objectsToRefresh = list() self.freezeUntil = time.clock() + self.updatePeriod #---------------------------------------------------------------------------- # Built in images so clients don't have to do the same import cStringIO, zlib def _getSmallUpArrowData(): return zlib.decompress( 'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ \x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4[z\xba8\x86X\xf4&\ \xa7\xa4$\xa5-`1\x08\\R\xcd"\x11\x10\x1f\xfe{~\x0es\xc2,N\xc9\xa6\xab\x0c%\ \xbe?x\x0e\x1a0LO\x8ay\xe4sD\xe3\x90\xfay\x8bYB\xec\x8d\x8c\x0c\xc1\x01b9\ \xe1\xbc\x8fw\x01\ra\xf0t\xf5sY\xe7\x94\xd0\x04\x00\xb7\x89#\xbb' ) def _getSmallUpArrowBitmap(): stream = cStringIO.StringIO(_getSmallUpArrowData()) return wx.BitmapFromImage(wx.ImageFromStream(stream)) def _getSmallDownArrowData(): return zlib.decompress( 'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ \x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\x07x\xba8\x86X\xf4\ &\xa7\xa4$\xa5-`1\x08\\R}\x85\x81\r\x04\xc4R\xfcjc\xdf\xd6;II\xcd\x9e%Y\xb8\ \x8b!v\xd2\x844\x1e\xe6\x0f\x92M\xde2\xd9\x12\x0b\xb4\x8f\xbd6rSK\x9b\xb3c\ \xe1\xc2\x87\xf6v\x95@&\xdb\xb1\x8bK|v22,W\x12\xd0\xdb-\xc4\xe4\x044\x9b\xc1\ \xd3\xd5\xcfe\x9dSB\x13\x00$1+:' ) def _getSmallDownArrowBitmap(): stream = cStringIO.StringIO(_getSmallDownArrowData()) return wx.BitmapFromImage(wx.ImageFromStream(stream)) # ####################################################################### # TESTING ONLY if __name__ == '__main__': pass wxbanker-0.9.1/wxbanker/ObjectListView/OLVEvent.py0000644000175000017500000002540112243601243022035 0ustar mrooneymrooney# -*- coding: utf-8 -*- #---------------------------------------------------------------------------- # Name: OLVEvent.py # Author: Phillip Piper # Created: 3 April 2008 # SVN-ID: $Id$ # Copyright: (c) 2008 by Phillip Piper, 2008 # License: wxWindows license #---------------------------------------------------------------------------- # Change log: # 2008/08/18 JPP Added CELL_EDIT_STARTED and CELL_EDIT_FINISHED events # 2008/07/16 JPP Added group-related events # 2008/06/19 JPP Added EVT_SORT # 2008/05/26 JPP Fixed pyLint annoyances # 2008/04/04 JPP Initial version complete #---------------------------------------------------------------------------- # To do: """ The OLVEvent module holds all the events used by the ObjectListView module. """ __author__ = "Phillip Piper" __date__ = "3 August 2008" __version__ = "1.1" import wx #====================================================================== # Event ids and types def _EventMaker(): evt = wx.NewEventType() return (evt, wx.PyEventBinder(evt)) (olv_EVT_CELL_EDIT_STARTING, EVT_CELL_EDIT_STARTING) = _EventMaker() (olv_EVT_CELL_EDIT_STARTED, EVT_CELL_EDIT_STARTED) = _EventMaker() (olv_EVT_CELL_EDIT_FINISHING, EVT_CELL_EDIT_FINISHING) = _EventMaker() (olv_EVT_CELL_EDIT_FINISHED, EVT_CELL_EDIT_FINISHED) = _EventMaker() (olv_EVT_SORT, EVT_SORT) = _EventMaker() (olv_EVT_GROUP_CREATING, EVT_GROUP_CREATING) = _EventMaker() (olv_EVT_GROUP_SORT, EVT_GROUP_SORT) = _EventMaker() (olv_EVT_EXPANDING, EVT_EXPANDING) = _EventMaker() (olv_EVT_EXPANDED, EVT_EXPANDED) = _EventMaker() (olv_EVT_COLLAPSING, EVT_COLLAPSING) = _EventMaker() (olv_EVT_COLLAPSED, EVT_COLLAPSED) = _EventMaker() #====================================================================== # Event parameter blocks class VetoableEvent(wx.PyCommandEvent): """ Base class for all cancellable actions """ def __init__(self, evtType): wx.PyCommandEvent.__init__(self, evtType, -1) self.veto = False def Veto(self, isVetoed=True): """ Veto (or un-veto) this event """ self.veto = isVetoed def IsVetoed(self): """ Has this event been vetod? """ return self.veto #---------------------------------------------------------------------------- class CellEditEvent(VetoableEvent): """ Base class for all cell editing events """ def SetParameters(self, objectListView, rowIndex, subItemIndex, rowModel, cellValue, editor): self.objectListView = objectListView self.rowIndex = rowIndex self.subItemIndex = subItemIndex self.rowModel = rowModel self.cellValue = cellValue self.editor = editor #---------------------------------------------------------------------------- class CellEditStartedEvent(CellEditEvent): """ A cell has started to be edited. All attributes are public and should be considered read-only. """ def __init__(self, objectListView, rowIndex, subItemIndex, rowModel, cellValue, cellBounds, editor): CellEditEvent.__init__(self, olv_EVT_CELL_EDIT_STARTED) self.SetParameters(objectListView, rowIndex, subItemIndex, rowModel, cellValue, editor) self.cellBounds = cellBounds #---------------------------------------------------------------------------- class CellEditStartingEvent(CellEditEvent): """ A cell is about to be edited. All attributes are public and should be considered read-only. Methods are provided for information that can be changed. """ def __init__(self, objectListView, rowIndex, subItemIndex, rowModel, cellValue, cellBounds, editor): CellEditEvent.__init__(self, olv_EVT_CELL_EDIT_STARTING) self.SetParameters(objectListView, rowIndex, subItemIndex, rowModel, cellValue, editor) self.cellBounds = cellBounds self.newEditor = None self.shouldConfigureEditor = True def SetCellBounds(self, rect): """ Change where the editor will be placed. rect is a list: [left, top, width, height] """ self.cellBounds = rect def SetNewEditor(self, control): """ Use the given control instead of the editor. """ self.newEditor = control def DontConfigureEditor(self): """ The editor will not be automatically configured. If this is called, the event handler must handle all configuration. In particular, it must configure its own event handlers to that ObjectListView.CancelCellEdit() is called when the user presses Escape, and ObjectListView.CommitCellEdit() is called when the user presses Enter/Return or when the editor loses focus. """ self.shouldConfigureEditor = False #---------------------------------------------------------------------------- class CellEditFinishedEvent(CellEditEvent): """ The user has finished editing a cell. """ def __init__(self, objectListView, rowIndex, subItemIndex, rowModel, userCancelled): CellEditEvent.__init__(self, olv_EVT_CELL_EDIT_FINISHED) self.SetParameters(objectListView, rowIndex, subItemIndex, rowModel, None, None) self.userCancelled = userCancelled #---------------------------------------------------------------------------- class CellEditFinishingEvent(CellEditEvent): """ The user is finishing editing a cell. If this event is vetoed, the edit will be cancelled silently. This is useful if the event handler completely handles the model updating. """ def __init__(self, objectListView, rowIndex, subItemIndex, rowModel, cellValue, editor, userCancelled): CellEditEvent.__init__(self, olv_EVT_CELL_EDIT_FINISHING) self.SetParameters(objectListView, rowIndex, subItemIndex, rowModel, cellValue, editor) self.userCancelled = userCancelled def SetCellValue(self, value): """ If the event handler sets the cell value here, this value will be used to update the model object, rather than the value that was actually in the cell editor """ self.cellValue = value #---------------------------------------------------------------------------- class SortEvent(VetoableEvent): """ The user wants to sort the ObjectListView. When sortModelObjects is True, the event handler should sort the model objects used by the given ObjectListView. If the "modelObjects" instance variable is not None, that collection of objects should be sorted, otherwise the "modelObjects" collection of the ObjectListView should be sorted. For a VirtualObjectListView, "modelObjects" will always be None and the programmer must sort the object in whatever backing store is being used. When sortModelObjects is False, the event handler must sort the actual ListItems in the OLV. It does this by calling SortListItemsBy(), passing a callable that accepts two model objects as parameters. sortModelObjects must be True for a VirtualObjectListView (or a FastObjectListView) since virtual lists cannot sort items. If the handler calls Veto(), no further default processing will be done. If the handler calls Handled(), default processing concerned with UI will be done. This includes updating sort indicators. If the handler calls neither of these, all default processing will be done. """ def __init__(self, objectListView, sortColumnIndex, sortAscending, sortModelObjects, modelObjects=None): VetoableEvent.__init__(self, olv_EVT_SORT) self.objectListView = objectListView self.sortColumnIndex = sortColumnIndex self.sortAscending = sortAscending self.sortModelObjects = sortModelObjects self.modelObjects = modelObjects self.wasHandled = False def Handled(self, wasHandled=True): """ Indicate that the event handler has sorted the ObjectListView. The OLV will handle other tasks like updating sort indicators """ self.wasHandled = wasHandled #---------------------------------------------------------------------------- class GroupCreationEvent(wx.PyCommandEvent): """ The user is about to create one or more groups. The handler can mess with the list of groups before they are created: change their names, give them icons, remove them from the list to stop them being created (that last behaviour could be very confusing for the users). """ def __init__(self, objectListView, groups): wx.PyCommandEvent.__init__(self, olv_EVT_GROUP_CREATING, -1) self.objectListView = objectListView self.groups = groups #---------------------------------------------------------------------------- class ExpandCollapseEvent(VetoableEvent): """ The user wants to expand or collapse one or more groups, or has just done so. If the handler calls Veto() for a Expanding or Collapsing event, the expand/collapse action will be cancelled. Calling Veto() has no effect on a Expanded or Collapsed event """ def __init__(self, eventType, objectListView, groups, isExpand): VetoableEvent.__init__(self, eventType) self.objectListView = objectListView self.groups = groups self.isExpand = isExpand def ExpandingCollapsingEvent(objectListView, groups, isExpand): if isExpand: return ExpandCollapseEvent(olv_EVT_EXPANDING, objectListView, groups, True) else: return ExpandCollapseEvent(olv_EVT_COLLAPSING, objectListView, groups, False) def ExpandedCollapsedEvent(objectListView, groups, isExpand): if isExpand: return ExpandCollapseEvent(olv_EVT_EXPANDED, objectListView, groups, True) else: return ExpandCollapseEvent(olv_EVT_COLLAPSED, objectListView, groups, False) #---------------------------------------------------------------------------- class SortGroupsEvent(wx.PyCommandEvent): """ The given list of groups needs to be sorted. Both the groups themselves and the model objects within the group should be sorted. The handler should rearrange the list of groups in the order desired. """ def __init__(self, objectListView, groups, sortColumn, sortAscending): wx.PyCommandEvent.__init__(self, olv_EVT_GROUP_SORT, -1) self.objectListView = objectListView self.groups = groups self.sortColumn = sortColumn self.sortAscending = sortAscending self.wasHandled = False def Handled(self, wasHandled=True): """ Indicate that the event handler has sorted the groups. """ self.wasHandled = wasHandled wxbanker-0.9.1/wxbanker/ObjectListView/OLVPrinter.py0000644000175000017500000016011112243601243022375 0ustar mrooneymrooney# -*- coding: utf-8 -*- #!/usr/bin/env python #---------------------------------------------------------------------------- # Name: OLVPrinter.py # Author: Phillip Piper # Created: 17 July 2008 # SVN-ID: $Id$ # Copyright: (c) 2008 by Phillip Piper, 2008 # License: wxWindows license #---------------------------------------------------------------------------- # Change log: # 2008/07/17 JPP Initial version #---------------------------------------------------------------------------- # To do: # - scaling # - gradients # - images # - attributes from ListCtrl # - persistence of ReportFormat # - use wx.wordwrap and DrawLabel # - investigate DrawImageLabel """ An OLVPrinter takes an ObjectListView and turns it into a pretty report. As always, the goal is for this to be as easy to use as possible. A typical usage should be as simple as:: printer = OLVPrinter(self.myOlv, "My Report Title") printer.PrintPreview() """ import wx from wxbanker.ObjectListView.WordWrapRenderer import WordWrapRenderer #====================================================================== class OLVPrinter(wx.Printout): """ An OLVPrinter creates a pretty report from an ObjectListView/ListCtrl. """ def __init__(self, listCtrl=None, title="ObjectListView Printing"): """ """ wx.Printout.__init__(self, title) self.engine = ReportEngine() self.printData = wx.PrintData() self.printData.SetPaperId(wx.PAPER_A4) self.printData.SetPrintMode(wx.PRINT_MODE_PRINTER) if listCtrl is not None: self.engine.AddListCtrl(listCtrl, title) #---------------------------------------------------------------------------- # Accessing def HasPage(self, page): print "HasPage(%d)" % page return page <= self.engine.GetTotalPages() def GetPageInfo(self): print "GetPageInfo" return (1, self.engine.GetTotalPages(), 1, 1) def GetReportFormat(self): """ Return the ReportFormat object that controls the appearance of this printout """ return self.engine.reportFormat def SetReportFormat(self, fmt): """ Set the ReportFormat object that controls the appearance of this printout """ self.engine.reportFormat = fmt ReportFormat = property(GetReportFormat, SetReportFormat) #---------------------------------------------------------------------------- # Commands def PageSetup(self): """ Show a Page Setup dialog that will change the configuration of this printout """ psdd = wx.PageSetupDialogData(self.printData) psdd.CalculatePaperSizeFromId() dlg = wx.PageSetupDialog(self, psdd) dlg.ShowModal() # this makes a copy of the wx.PrintData instead of just saving # a reference to the one inside the PrintDialogData that will # be destroyed when the dialog is destroyed self.printData = wx.PrintData(dlg.GetPageSetupData().GetPrintData()) dlg.Destroy() def PrintPreview(self, parent=None, title="ObjectListView Print Preview", bounds=(20, 50, 800, 800)): """ Show a Print Preview of this report """ data = wx.PrintDialogData(self.printData) #TODO: Implement some proper way to copy the printer forPrinter = None #forPrinter = OLVPrinter() #forPrinter.ReportFormat = self.ReportFormat #forPrinter.engine.listCtrls = list(self.engine.listCtrls) self.preview = wx.PrintPreview(self, forPrinter, data) if not self.preview.Ok(): return False pfrm = wx.PreviewFrame(self.preview, parent, title) pfrm.Initialize() pfrm.SetPosition(bounds[0:2]) pfrm.SetSize(bounds[2:4]) pfrm.Show(True) return True def DoPrint(self, parent=None): """ Send the report to the configured printer """ pdd = wx.PrintDialogData(self.printData) printer = wx.Printer(pdd) if printer.Print(parent, self, True): self.printData = wx.PrintData(printer.GetPrintDialogData().GetPrintData()) else: wx.MessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wx.OK) printout.Destroy() #---------------------------------------------------------------------------- # Event handlers def OnPreparePrinting(self): """ Prepare for printing. This event is sent before any of the others """ print "OnPreparePrinting" print "self.GetDC() = %s" % self.GetDC() self.MapScreenSizeToPage() self.engine.CalculateTotalPages(self.GetDC()) self.engine.StartPrinting() def OnBeginDocument(self, start, end): """ Begin printing one copy of the document. Return False to cancel the job """ print "OnBeginDocument(%d, %d)" % (start, end) if not super(OLVPrinter, self).OnBeginDocument(start, end): return False return True def OnEndDocument(self): print "OnEndDocument" super(OLVPrinter, self).OnEndDocument() def OnBeginPrinting(self): print "OnBeginPrinting" super(OLVPrinter, self).OnBeginPrinting() def OnEndPrinting(self): print "OnEndPrinting" super(OLVPrinter, self).OnEndPrinting() def OnPrintPage(self, page): print "OnPrintPage(%d)" % page return self.engine.PrintPage(self.GetDC(), page) #====================================================================== class ReportEngine(object): """ A ReportEngine handles all the work of actually producing a report. """ def __init__(self): """ """ self.currentPage = -1 self.totalPages = -1 self.blocks = list() self.blockInsertionIndex = 0 self.listCtrls = list() self.reportFormat = ReportFormat() self.isColumnHeadingsOnEachPage = True self.alwaysCenterColumnHeader = True self.reportHeaderText = "Report Header Text" self.reportFooterText = "Report Footer Text" self.pageHeaderText = "This is the header" self.pageFooterText = "This is the footer" self.isPrintSelectionOnly = False self.isShrinkToFit = False self.canCellsWrap = True self.watermarkText = "WATERMARK" self.watermarkFont = None self.watermarkColor = None #---------------------------------------------------------------------------- # Accessing def GetNamedFormat(self, name): """ Return the given format """ return self.reportFormat.GetNamedFormat(name) def GetTotalPages(self): """ Return the total number of pages that this report will produce. CalculateTotalPages() must be called before this is accurate. """ return self.totalPages #---------------------------------------------------------------------------- # Calculating def CalculateTotalPages(self, dc): """ Do the work of calculating how many pages this report will occupy? This is expensive because it basically prints the whole report. """ self.StartPrinting() self.totalPages = 1 while self.PrintOnePage(dc, self.totalPages): self.totalPages += 1 dc.Clear() def CalculateBounds(self, dc): """ Calculate our page and work bounds """ self.pageBounds = (0, 0) + dc.GetSizeTuple() self.workBounds = list(self.pageBounds) #---------------------------------------------------------------------------- # Commands def AddBlock(self, block): """ Add the given block at the current insertion point """ self.blocks.insert(self.blockInsertionIndex, block) self.blockInsertionIndex += 1 block.engine = self def AddListCtrl(self, listCtrl, title=None): """ Add the given list to those that will be printed by this report. """ if listCtrl.InReportView(): self.listCtrls.append([listCtrl, title]) def DropCurrentBlock(self): """ Remove the current block from our list of blocks """ self.blocks.pop(0) self.blockInsertionIndex = 1 #---------------------------------------------------------------------------- # Printing def StartPrinting(self): """ Initial a print job on this engine """ self.currentPage = 0 self.blockInsertionIndex = 0 self.blocks = list() self.AddBlock(ReportBlock()) self.runningBlocks = list() self.AddRunningBlock(PageHeaderBlock(self)) self.AddRunningBlock(PageFooterBlock(self)) def AddRunningBlock(self, block): """ A running block is printed on every page until it is removed """ self.runningBlocks.append(block) block.engine = self def RemoveRunningBlock(self, block): """ A running block is printed on every page until it is removed """ self.runningBlocks.remove(block) def PrintPage(self, dc, pageNumber): """ Print the given page on the given device context. """ #try: # pdc = wx.GCDC(dc) #except: # pdc = dc pdc = dc # If the request page isn't next in order, we have to restart # the printing process and advance until we reach the desired page if pageNumber != self.currentPage + 1: print "Skipping pages..." self.StartPrinting() for i in range(1, pageNumber): self.PrintOnePage(pdc, i) dc.Clear() print "...finished skipping." return self.PrintOnePage(pdc, pageNumber) def PrintOnePage(self, dc, pageNumber): """ Print the current page on the given device context. Return true if there is still more to print. """ self.currentPage = pageNumber self.CalculateBounds(dc) self.ApplyPageDecorations(dc) for x in self.runningBlocks: x.Print(dc) while len(self.blocks) and self.blocks[0].Print(dc): self.DropCurrentBlock() return len(self.blocks) > 0 def ApplyPageDecorations(self, dc): """ """ fmt = self.GetNamedFormat("Page") # Draw the page decorations bounds = list(self.pageBounds) fmt.DrawDecorations(dc, bounds, self) # Subtract the area used from the work area self.workBounds = fmt.SubtractDecorations(dc, self.workBounds) #====================================================================== class ReportFormat(object): """ A ReportFormat defines completely how a report is formatted. It holds a collection of BlockFormat objects which control the formatting of individual blocks of the report """ def __init__(self): """ """ self.formats = [ "Page", "ReportHeader", "PageHeader", "ListHeader", "GroupTitle", "List", "ColumnHeader", "ListRows", "Row", "ListFooter", "PageFooter", "ReportFooter" ] for x in self.formats: setattr(self, x, BlockFormat()) def GetNamedFormat(self, name): """ Return the format used in to format a block with the given name. """ return getattr(self, name) @staticmethod def Trying(fontName="Arial"): """ Return a reasonable default format for a report """ fmt = ReportFormat() fmt.PageHeader.Font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face=fontName) #fmt.PageHeader.Add(LineDecoration(pen=wx.Pen(wx.BLUE, 2), space=5)) fmt.PageHeader.Background(wx.Colour(255, 255, 0)) # yellow fmt.PageHeader.Line(wx.TOP, wx.BLUE, 2, space=5) fmt.PageHeader.Line(wx.BOTTOM, wx.RED, 2, space=5) fmt.ReportHeader.Font = wx.FFont(24, wx.FONTFAMILY_DEFAULT, face=fontName) fmt.ReportHeader.TextColor = wx.RED fmt.ReportHeader.Padding = (0, 12, 0, 12) fmt.ReportHeader.Line(wx.BOTTOM, wx.GREEN, 5, wx.WHITE, space=5) fmt.ListHeader.Add(LineDecoration(side=wx.BOTTOM, pen=wx.Pen(wx.GREEN, 1))) fmt.PageFooter.Font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face=fontName) fmt.PageFooter.TextAlignment = wx.ALIGN_RIGHT fmt.PageFooter.Add(LineDecoration(side=wx.TOP, pen=wx.Pen(wx.BLUE, 1), space=3)) fmt.Row.Font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face=fontName) #fmt.ColumnHeader.CellPadding=25 fmt.ColumnHeader.GridPen=wx.Pen(wx.RED, 1) fmt.Row.CellPadding=(10, 10, 0, 10) fmt.Row.GridPen=wx.Pen(wx.BLUE, 1) #fmt.ColumnHeader.Add(FrameDecoration(pen=wx.Pen(wx.RED, 1))) #fmt.Row.Add(FrameDecoration(pen=wx.Pen(wx.RED, 10))) #fmt.Row.Add(LineDecoration(side=wx.BOTTOM, pen=wx.Pen(wx.GREEN, 1))) return fmt @staticmethod def Normal(fontName="Arial"): """ Return a reasonable default format for a report """ fmt = ReportFormat() fmt.PageHeader.Font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face=fontName) fmt.PageHeader.Line(wx.BOTTOM, wx.BLUE, 2, space=5) fmt.ReportHeader.Font = wx.FFont(24, wx.FONTFAMILY_DEFAULT, face=fontName) fmt.ReportHeader.Padding = (0, 12, 0, 12) fmt.ReportHeader.TextAlignment = wx.ALIGN_CENTER fmt.ReportHeader.Frame(pen=wx.Pen(wx.BLUE, 2, wx.DOT), space=5) fmt.ListHeader.Font = wx.FFont(14, wx.FONTFAMILY_DEFAULT, face=fontName) fmt.ListHeader.Padding = (0, 12, 0, 12) fmt.ListHeader.Line(wx.BOTTOM, pen=wx.Pen(wx.BLUE, 2, wx.DOT), space=5) fmt.GroupTitle.Padding = (0, 12, 0, 12) fmt.GroupTitle.Line(wx.BOTTOM, wx.BLUE, 4, toColor=wx.WHITE, space=5) fmt.PageFooter.Font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face=fontName) fmt.PageFooter.TextAlignment = wx.ALIGN_RIGHT fmt.PageFooter.Line(wx.TOP, wx.BLUE, 1, space=3) fmt.ColumnHeader.Font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, wx.FONTFLAG_BOLD, face=fontName) fmt.ColumnHeader.CellPadding = 5 fmt.ColumnHeader.GridPen = wx.Pen(wx.Colour(192, 192, 192), 1) #fmt.ColumnHeader.Background(wx.Colour(128, 128, 128)) fmt.Row.Font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face=fontName) fmt.Row.CellPadding = 5 fmt.Row.GridPen = wx.Pen(wx.Colour(192, 192, 192), 1) return fmt #====================================================================== class BlockFormat(object): """ A block format defines how a Block is formatted. """ def __init__(self): """ """ self.padding = None self.decorations = list() self.font = wx.FFont(14, wx.FONTFAMILY_SWISS, face="Gill Sans") self.textColor = None self.textAlignment = wx.ALIGN_LEFT self.cellPadding = None self.gridPen = None #---------------------------------------------------------------------------- # Accessing def GetFont(self): """ Return the font used by this format """ return self.font def SetFont(self, font): """ Set the font used by this format """ self.font = font def GetTextAlignment(self): """ Return the alignment of text in this format """ return self.textAlignment def SetTextAlignment(self, alignment): """ Set the alignment of text in this format """ self.textAlignment = alignment def GetTextColor(self): """ Return the color of text in this format """ return self.textColor def SetTextColor(self, color): """ Set the color of text in this format """ self.textColor = color def GetPadding(self): """ Get the padding around this format """ return self.padding def SetPadding(self, padding): """ Set the padding around this format Padding is either a single numeric (indicating the values on all sides) or a collection of paddings [left, top, right, bottom] """ self.padding = self._MakePadding(padding) def GetCellPadding(self): """ Get the padding around cells in this format """ return self.cellPadding def SetCellPadding(self, padding): """ Set the padding around cells in this format Padding is either a single numeric (indicating the values on all sides) or a collection of paddings [left, top, right, bottom] """ self.cellPadding = self._MakePadding(padding) def GetGridPen(self): """ Return the pen used to draw a grid in this format """ return self.gridPen def SetGridPen(self, pen): """ Set the pen used to draw a grid in this format """ self.gridPen = pen if self.gridPen: # Other styles don't produce nice joins self.gridPen.SetCap(wx.CAP_BUTT) self.gridPen.SetJoin(wx.JOIN_MITER) def _MakePadding(self, padding): try: if len(padding) < 4: return (tuple(padding) + (0, 0, 0, 0))[:4] else: return padding except TypeError: return (padding,) * 4 Font = property(GetFont, SetFont) Padding = property(GetPadding, SetPadding) TextAlignment = property(GetTextAlignment, SetTextAlignment) TextColor = property(GetTextColor, SetTextColor) CellPadding = property(GetCellPadding, SetCellPadding) GridPen = property(GetGridPen, SetGridPen) # Misspellers of the world Untie! TextAlign = property(GetTextAlignment, SetTextAlignment) TextColour = property(GetTextColor, SetTextColor) #---------------------------------------------------------------------------- # Decorations def Add(self, decoration): """ Add the given decoration to those adorning blocks with this format """ self.decorations.append(decoration) def Line(self, side=wx.BOTTOM, color=wx.BLACK, width=1, toColor=None, space=0, pen=None): """ Add a line to our decorations. If a pen is given, we use a straight Line decoration, otherwise we use a coloured rectangle """ if pen: self.Add(LineDecoration(side, pen, space)) else: self.Add(RectangleDecoration(side, pen, color, toColor, width, space)) def Background(self, color=wx.BLUE, toColor=None): self.Add(RectangleDecoration(color=color, toColor=toColor)) def Frame(self, pen=None, space=0): self.Add(RectangleDecoration(pen=pen, space=space)) #---------------------------------------------------------------------------- # Commands def SubtractPadding(self, bounds): """ Subtract any padding used by this format from the given bounds """ if self.padding is None: return bounds else: return RectUtils.InsetRect(bounds, self.padding) def SubtractCellPadding(self, bounds): """ Subtract any cell padding used by this format from the given bounds """ if self.cellPadding is None: return bounds else: return RectUtils.InsetRect(bounds, self.cellPadding) def SubtractDecorations(self, dc, bounds): """ Subtract any space used by our decorations from the given bounds """ for x in self.decorations: bounds = x.SubtractFrom(dc, bounds) return bounds def DrawDecorations(self, dc, bounds, block): """ Draw our decorations on the given block """ for x in self.decorations: x.DrawDecoration(dc, bounds, block) #====================================================================== class Block(object): """ A Block is a portion of a report that will stack vertically with other Block. A report consists of several Blocks. """ def __init__(self, engine=None): self.engine = engine # This is also set when the block is added to a print engine #---------------------------------------------------------------------------- # Accessing def GetFont(self): """ Return Font that should be used to draw text in this block """ return self.GetFormat().GetFont() def GetTextColor(self): """ Return Colour that should be used to draw text in this block """ return self.GetFormat().GetTextColor() def GetFormat(self): """ Return the BlockFormat object that controls the formatting of this block """ return self.engine.GetNamedFormat(self.__class__.__name__[:-5]) def GetReducedBlockBounds(self, dc, bounds=None): """ Return the bounds of this block once padding and decoration have taken their toll. """ bounds = bounds or list(self.GetWorkBounds()) fmt = self.GetFormat() if fmt: bounds = fmt.SubtractPadding(bounds) bounds = fmt.SubtractDecorations(dc, bounds) return bounds def GetWorkBounds(self): """ Return the boundaries of the work area for this block """ return self.engine.workBounds def ChangeWorkBoundsTopBy(self, amt): """ Move the top of our work bounds down by the given amount """ RectUtils.MoveTopBy(self.engine.workBounds, amt) #---------------------------------------------------------------------------- # Calculating def CalculateExtrasHeight(self, dc): """ Return the height of the padding and decorations themselves """ return 0 - RectUtils.Height(self.GetReducedBlockBounds(dc, [0, 0, 0, 0])) def CalculateHeight(self, dc): """ Return the heights of this block in pixels """ return -1 def CalculateTextHeight(self, dc, txt, bounds=None, font=None): """ Return the height of the given txt in pixels """ bounds = bounds or self.GetReducedBlockBounds(dc) font = font or self.GetFont() dc.SetFont(font) return WordWrapRenderer.CalculateHeight(dc, txt, RectUtils.Width(bounds)) def CanFit(self, height): """ Can this block fit into the remaining work area on the page? """ return height <= RectUtils.Height(self.GetWorkBounds()) #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ # If this block does not have a format, it is simply skipped if not self.GetFormat(): return True height = self.CalculateHeight(dc) if not self.CanFit(height): return False bounds = self.GetWorkBounds() bounds = RectUtils.SetHeight(list(bounds), height) self.Draw(dc, bounds) self.ChangeWorkBoundsTopBy(height) return True def Draw(self, dc, bounds): """ Draw this block and its decorations allowing for any padding """ fmt = self.GetFormat() bounds = fmt.SubtractPadding(bounds) fmt.DrawDecorations(dc, bounds, self) bounds = fmt.SubtractDecorations(dc, bounds) self.DrawSelf(dc, bounds) def DrawSelf(self, dc, bounds): """ Do the actual work of rendering this block. """ pass def DrawText(self, dc, txt, bounds, font=None, alignment=wx.ALIGN_LEFT, image=None, color=None): """ """ dc.SetFont(font or self.GetFont()) dc.SetTextForeground(color or self.GetTextColor() or wx.BLACK) WordWrapRenderer.DrawString(dc, txt, bounds, alignment, allowClipping=False) #====================================================================== class TextBlock(Block): """ A TextBlock prints a string objects. """ def GetText(self): return "Missing GetText() in class %s" % self.__class__.__name__ def CalculateHeight(self, dc): """ Return the heights of this block in pixels """ textHeight = self.CalculateTextHeight(dc, self.GetText()) extras = self.CalculateExtrasHeight(dc) return textHeight + extras def DrawSelf(self, dc, bounds): """ Do the actual work of rendering this block. """ self.DrawText(dc, self.GetText(), bounds, alignment=self.GetFormat().TextAlignment) #====================================================================== class CellBlock(Block): """ A CellBlock is a Block whose data is presented in a cell format. """ #---------------------------------------------------------------------------- # Accessing - Subclasses should override def GetCellWidths(self): """ Return a list of the widths of the cells in this block """ return list() def GetTexts(self): """ Return a list of the texts that should be drawn with the cells """ return list() def GetAlignments(self): """ Return a list indicating how the text within each cell is aligned. """ return list() def GetImages(self): """ Return a list of the images that should be drawn in each cell """ return list() #---------------------------------------------------------------------------- # Accessing def CanCellsWrap(self): """ Return True if the text values can wrap within a cell, producing muliline cells """ return self.engine.canCellsWrap def GetCombinedLists(self): """ Return a collection of Buckets that hold all the values of the subclass-overridable collections above """ buckets = [Bucket(cellWidth=x, text="", align=None, image=None) for x in self.GetCellWidths()] for (i, x) in enumerate(self.GetTexts()): buckets[i].text = x for (i, x) in enumerate(self.GetImages()): buckets[i].image = x for (i, x) in enumerate(self.GetAlignments()): buckets[i].align = x return buckets #---------------------------------------------------------------------------- # Utiltities def GetColumnAlignments(self, olv, left, right): """ Return the alignments of the given slice of columns """ listAlignments = [olv.GetColumn(i).GetAlign() for i in range(left, right+1)] mapping = { wx.LIST_FORMAT_LEFT: wx.ALIGN_LEFT, wx.LIST_FORMAT_RIGHT: wx.ALIGN_RIGHT, wx.LIST_FORMAT_CENTRE: wx.ALIGN_CENTRE, } return [mapping[x] for x in listAlignments] def GetColumnWidths(self, olv, left, right): """ Return a list of the widths of the given slice of columns """ return [olv.GetColumnWidth(i) for i in range(left, right+1)] #---------------------------------------------------------------------------- # Calculating def CalculateHeight(self, dc): """ Return the heights of this block in pixels """ # If cells can wrap, figure out the tallest, otherwise we just figure out the height of one line if self.CanCellsWrap(): font = self.GetFont() height = 0 for x in self.GetCombinedLists(): bounds = [0, 0, x.cellWidth, 99999] height = max(height, self.CalculateTextHeight(dc, x.text, bounds, font)) else: height = self.CalculateTextHeight(dc, "Wy") cellPadding = self._CalculateCellPadding(self.GetFormat()) return height + cellPadding[1] + cellPadding[3] + self.CalculateExtrasHeight(dc) def _CalculateCellPadding(self, cellFmt): if cellFmt.CellPadding: cellPadding = list(cellFmt.CellPadding) else: cellPadding = 0, 0, 0, 0 if cellFmt.GridPen: penFactor = int((cellFmt.GridPen.GetWidth()+1)/2) cellPadding = [x + penFactor for x in cellPadding] return cellPadding #---------------------------------------------------------------------------- # Commands def DrawSelf(self, dc, bounds): """ Do the actual work of rendering this block. """ cellFmt = self.GetFormat() cellPadding = self._CalculateCellPadding(cellFmt) combined = self.GetCombinedLists() # Calculate cell boundaries cell = list(bounds) cell[2] = 0 for x in combined: RectUtils.SetLeft(cell, RectUtils.Right(cell)) RectUtils.SetWidth(cell, x.cellWidth + cellPadding[0] + cellPadding[2]) x.cell = list(cell) #dc.SetPen(wx.BLACK_PEN) #dc.DrawRectangle(*cell) # Draw each cell font = self.GetFont() for x in combined: cellBounds = RectUtils.InsetRect(x.cell, cellPadding) self.DrawText(dc, x.text, cellBounds, font, x.align, x.image) #dc.SetPen(wx.RED_PEN) #dc.DrawRectangle(*cellBounds) if cellFmt.GridPen and combined: dc.SetPen(cellFmt.GridPen) dc.SetBrush(wx.TRANSPARENT_BRUSH) top = RectUtils.Top(combined[0].cell) bottom = RectUtils.Bottom(combined[0].cell) # Draw the interior dividers for x in combined[:-1]: right = RectUtils.Right(x.cell) dc.DrawLine(right, top, right, bottom) # Draw the surrounding frame left = RectUtils.Left(combined[0].cell) right = RectUtils.Right(combined[-1].cell) dc.DrawRectangle(left, top, right-left, bottom-top) #====================================================================== class ReportBlock(Block): """ A ReportBlock is boot strap Block that represents an entire report. """ #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ self.engine.AddBlock(ReportHeaderBlock()) # Print each ListView. Each list but the first starts on a separate page first = True for (olv, title) in self.engine.listCtrls: if not first: self.engine.AddBlock(PageBreakBlock()) self.engine.AddBlock(ListBlock(olv, title)) first = False self.engine.AddBlock(ReportFooterBlock()) return True #====================================================================== class ReportHeaderBlock(TextBlock): """ A ReportHeader is a text message that appears at the very beginning of a report. """ def GetText(self): return self.engine.reportHeaderText #====================================================================== class ReportFooterBlock(TextBlock): """ A ReportFooter is a text message that appears at the very end of a report. """ def GetText(self): return self.engine.reportFooterText #====================================================================== class PageHeaderBlock(TextBlock): """ A PageHeaderBlock appears at the top of every page. """ def GetText(self): return self.engine.pageHeaderText #====================================================================== class PageFooterBlock(TextBlock): """ A PageFooterBlock appears at the bottom of every page. """ def GetText(self): return self.engine.pageFooterText #---------------------------------------------------------------------------- # Printing def Print(self, dc): """ Print this block. """ height = self.CalculateHeight(dc) # Draw the footer at the bottom of the page bounds = self.GetWorkBounds() bounds = [RectUtils.Left(bounds), RectUtils.Bottom(bounds) - height, RectUtils.Width(bounds), height] self.Draw(dc, bounds) # The footer changes the bottom of the work area RectUtils.MoveBottomBy(self.engine.workBounds, height) return True #====================================================================== class PageBreakBlock(Block): """ A PageBreakBlock acts a page break. """ #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ # Completely fill the remaining area on the page, forcing a page break bounds = self.GetWorkBounds() self.ChangeWorkBoundsTopBy(RectUtils.Height(bounds)) return True #====================================================================== class ListBlock(Block): """ A ListBlock handles the printing of an entire ObjectListView. """ def __init__(self, olv, title): self.olv = olv self.title = title #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ # Break the list into vertical slices. Each one but the first # will be placed on a new page. first = True for (left, right) in self.CalculateListSlices(): if not first: self.engine.AddBlock(PageBreakBlock()) self.engine.AddBlock(ListHeaderBlock(self.olv, self.title)) self.engine.AddBlock(ListSliceBlock(self.olv, left, right)) self.engine.AddBlock(ListFooterBlock(self.olv, "")) first = False return True def CalculateListSlices(self): """ Return a list of integer pairs, where each pair represents the left and right columns that can fit into the width of one page """ boundsWidth = RectUtils.Width(self.GetWorkBounds()) columnWidths = [self.olv.GetColumnWidth(i) for i in range(self.olv.GetColumnCount())] return self.CalculateSlices(boundsWidth, columnWidths) def CalculateSlices(self, maxWidth, columnWidths): """ Return a list of integer pairs, where each pair represents the left and right columns that can fit into the width of one page """ firstColumn = 0 # If a GroupListView has a column just for the expand/collapse, don't include it if hasattr(self.olv, "useExpansionColumn") and self.olv.useExpansionColumn: firstColumn = 1 # If we are shrinking to fit or all the columns fit, just return all columns if self.engine.isShrinkToFit or (sum(columnWidths)) <= maxWidth: return [ [firstColumn, len(columnWidths)-1] ] pairs = list() left = firstColumn right = firstColumn while right < len(columnWidths): if (sum(columnWidths[left:right+1])) > maxWidth: if left == right: pairs.append([left, right]) left += 1 right += 1 else: pairs.append([left, right-1]) left = right else: right += 1 if left < len(columnWidths): pairs.append([left, right-1]) return pairs #====================================================================== class ListHeaderBlock(TextBlock): """ A ListHeaderBlock is the title that comes before an ObjectListView. """ def __init__(self, olv, title): self.olv = olv self.title = title def GetText(self): return self.title #====================================================================== class ListFooterBlock(TextBlock): """ A ListFooterBlock is the text that comes before an ObjectListView. """ def __init__(self, olv, text): self.olv = olv self.text = text def GetText(self): return self.text #====================================================================== class GroupTitleBlock(TextBlock): """ A GroupTitleBlock is the title that comes before a list group. """ def __init__(self, olv, group): self.olv = olv self.group = group def GetText(self): return self.group.title #====================================================================== class ListSliceBlock(Block): """ A ListSliceBlock prints a vertical slice of an ObjectListView. """ def __init__(self, olv, left, right): self.olv = olv self.left = left self.right = right #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ self.engine.AddBlock(ColumnHeaderBlock(self.olv, self.left, self.right)) if hasattr(self.olv, "GetShowGroups") and self.olv.GetShowGroups(): self.engine.AddBlock(GroupListRowsBlock(self.olv, self.left, self.right)) else: self.engine.AddBlock(ListRowsBlock(self.olv, self.left, self.right)) return True #====================================================================== class ColumnHeaderBlock(CellBlock): """ A ColumnHeaderBlock prints a portion of the columns header in an ObjectListView. """ def __init__(self, olv, left, right): self.olv = olv self.left = left self.right = right #---------------------------------------------------------------------------- # Accessing - Subclasses should override def GetCellWidths(self): """ Return a list of the widths of the cells in this block """ return self.GetColumnWidths(self.olv, self.left, self.right) def GetTexts(self): """ Return a list of the texts that should be drawn with the cells """ return [self.olv.GetColumn(i).GetText() for i in range(self.left, self.right+1)] def GetAlignments(self): """ Return a list indicating how the text within each cell is aligned. """ if self.engine.alwaysCenterColumnHeader: return [wx.ALIGN_CENTRE for i in range(self.left, self.right+1)] else: return self.GetColumnAlignments(olv, self.left, self.right) def GetImages(self): """ Return a list of the images that should be drawn in each cell """ return [self.olv.GetColumn(i).GetImage() for i in range(self.left, self.right+1)] #====================================================================== class ListRowsBlock(Block): """ A ListRowsBlock prints rows of an ObjectListView. """ def __init__(self, olv, left, right): """ """ self.olv = olv self.left = left self.right = right self.currentIndex = 0 self.totalRows = self.olv.GetItemCount() #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ # This block works by printing a single row and then rescheduling itself # to print the remaining rows after the current row has finished. if self.currentIndex < self.totalRows: self.engine.AddBlock(RowBlock(self.olv, self.currentIndex, self.left, self.right)) self.currentIndex += 1 self.engine.AddBlock(self) return True #====================================================================== class GroupListRowsBlock(Block): """ A GroupListRowsBlock prints rows of an GroupListView. """ def __init__(self, olv, left, right): """ """ self.olv = olv # Must be a GroupListView self.left = left self.right = right self.currentIndex = 0 self.totalRows = self.olv.GetItemCount() #---------------------------------------------------------------------------- # Commands def Print(self, dc): """ Print this Block. Return True if the Block has finished printing """ # This block works by printing a single row and then rescheduling itself # to print the remaining rows after the current row has finished. if self.currentIndex >= self.totalRows: return True # If GetObjectAt() return an object, then it's a normal row. # Otherwise, if the innerList object isn't None, it must be a ListGroup # We can't use isinstance(x, GroupListView) because ObjectListView may not be installed if self.olv.GetObjectAt(self.currentIndex): self.engine.AddBlock(RowBlock(self.olv, self.currentIndex, self.left, self.right)) elif self.olv.innerList[self.currentIndex]: self.engine.AddBlock(GroupTitleBlock(self.olv, self.olv.innerList[self.currentIndex])) # Schedule the printing of the remaining rows self.currentIndex += 1 self.engine.AddBlock(self) return True #====================================================================== class RowBlock(CellBlock): """ A RowBlock prints a vertical slice of a single row of an ObjectListView. """ def __init__(self, olv, rowIndex, left, right): self.olv = olv self.rowIndex = rowIndex self.left = left self.right = right def GetCellWidths(self): """ Return a list of the widths of the cells in this block """ return self.GetColumnWidths(self.olv, self.left, self.right) def GetTexts(self): """ Return a list of the texts that should be drawn with the cells """ return [self.olv.GetItem(self.rowIndex, i).GetText() for i in range(self.left, self.right+1)] def GetAlignments(self): """ Return a list indicating how the text within each cell is aligned. """ return self.GetColumnAlignments(self.olv, self.left, self.right) def GetImages(self): """ Return a list of the images that should be drawn in each cell """ return [self.olv.GetItem(self.rowIndex, i).GetImage() for i in range(self.left, self.right+1)] #====================================================================== class Decoration(object): """ A Decoration add some visual effect to a Block (e.g. borders, background image, watermark). They can also reserve a chunk of their Blocks space for their own use. Decorations are added to a BlockFormat which is then applied to a ReportBlock """ #---------------------------------------------------------------------------- # Commands def SubtractFrom(self, dc, bounds): """ Subtract the space used by this decoration from the given bounds """ return bounds def DrawDecoration(self, dc, bounds, block): """ Draw this decoration """ pass #---------------------------------------------------------------------------- class RectangleDecoration(Decoration): """ A RectangleDecoration draw a rectangle around or on the side of a block. The rectangle can be hollow, solid filled or gradient-filled. It can have a frame drawn as well. """ def __init__(self, side=None, pen=None, color=None, toColor=None, width=0, space=0): """ If color is None, the rectangle will be hollow. If toColor is None, the rectangle will be filled with "color" otherwise it will be gradient-filled. If pen is not None, the rectangle will be framed with that pen. If no side is given, the rectangle will be drawn around the block. """ self.side = side self.pen = pen self.color = color self.toColor = toColor self.width = width self.space = space #---------------------------------------------------------------------------- # Commands def SubtractFrom(self, dc, bounds): """ Subtract the space used by this decoration from the given bounds """ inset = self.space + self.width if self.side is None: return RectUtils.InsetBy(bounds, inset) if self.side == wx.LEFT: return RectUtils.MoveLeftBy(bounds, inset) if self.side == wx.RIGHT: return RectUtils.MoveRightBy(bounds, -inset) if self.side == wx.TOP: return RectUtils.MoveTopBy(bounds, inset) if self.side == wx.BOTTOM: return RectUtils.MoveBottomBy(bounds, -inset) return bounds def DrawDecoration(self, dc, bounds, block): """ Draw this decoration """ rect = self._CalculateRect(bounds) if self.color: if self.toColor is None: dc.SetPen(wx.TRANSPARENT_PEN) dc.SetBrush(wx.Brush(self.color)) dc.DrawRectangle(*rect) else: dc.GradientFillLinear(wx.Rect(*rect), self.color, self.toColor) if self.pen: dc.SetPen(self.pen) dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.DrawRectangle(*rect) def _CalculateRect(self, bounds): """ Calculate the rectangle that this decoration is going to paint """ if self.side is None: return bounds if self.side == wx.LEFT: return (RectUtils.Left(bounds), RectUtils.Top(bounds), self.width, RectUtils.Height(bounds)) if self.side == wx.RIGHT: return (RectUtils.Right(bounds) - self.width, RectUtils.Top(bounds), self.width, RectUtils.Height(bounds)) if self.side == wx.TOP: return (RectUtils.Left(bounds), RectUtils.Top(bounds), RectUtils.Width(bounds), self.width) if self.side == wx.BOTTOM: return (RectUtils.Left(bounds), RectUtils.Bottom(bounds) - self.width, RectUtils.Width(bounds), self.width) return bounds #---------------------------------------------------------------------------- #class FrameDecoration(Decoration): # """ # A FrameDecoration a frame around a block # """ # # def __init__(self, pen=None, space=0, corner=None): # self.pen = pen # self.space = space # self.corner = corner # # def SubtractFrom(self, dc, bounds): # """ # Subtract the space used by this decoration from the given bounds # """ # inset = self.space # if self.pen is not None: # inset += self.pen.GetWidth() # # return RectUtils.InsetBy(bounds, inset) # # def DrawDecoration(self, dc, bounds, block): # """ # Draw this decoration # """ # if self.pen is None: # return # # We want to draw our decoration within the given bounds. Fat pens are drawn half # # either side of the coords, so we contract our coords so that fat pens don't # # cause drawing outside our bounds. # if self.pen.GetWidth() > 1: # rect = RectUtils.InsetBy(bounds, self.pen.GetWidth()/2) # else: # rect = bounds # dc.SetPen(self.pen) # dc.SetBrush(wx.TRANSPARENT_BRUSH) # if self.corner: # dc.DrawRoundedRectangle(rect[0], rect[1], rect[2], rect[3], self.corner) # else: # dc.DrawRectangle(*rect) #---------------------------------------------------------------------------- class LineDecoration(Decoration): """ A LineDecoration draws a line on the side of a decoration. """ def __init__(self, side=wx.BOTTOM, pen=None, space=0): self.side = side self.pen = pen self.space = space #---------------------------------------------------------------------------- # Commands def SubtractFrom(self, dc, bounds): """ Subtract the space used by this decoration from the given bounds """ inset = self.space if self.pen is not None: inset += self.pen.GetWidth() if self.side == wx.LEFT: return RectUtils.MoveLeftBy(bounds, inset) if self.side == wx.RIGHT: return RectUtils.MoveRightBy(bounds, -inset) if self.side == wx.TOP: return RectUtils.MoveTopBy(bounds, inset) if self.side == wx.BOTTOM: return RectUtils.MoveBottomBy(bounds, -inset) return bounds def DrawDecoration(self, dc, bounds, block): """ Draw this decoration """ if self.pen == None: return if self.side == wx.LEFT: pt1 = RectUtils.TopLeft(bounds) pt2 = RectUtils.BottomLeft(bounds) elif self.side == wx.RIGHT: pt1 = RectUtils.TopRight(bounds) pt2 = RectUtils.BottomRight(bounds) elif self.side == wx.TOP: pt1 = RectUtils.TopLeft(bounds) pt2 = RectUtils.TopRight(bounds) elif self.side == wx.BOTTOM: pt1 = RectUtils.BottomLeft(bounds) pt2 = RectUtils.BottomRight(bounds) dc.SetPen(self.pen) dc.DrawLine(pt1[0], pt1[1], pt2[0], pt2[1]) #====================================================================== class Bucket(object): """ General purpose, hold-all data object """ def __init__(self, **kwargs): self.__dict__.update(kwargs) def __repr__(self): strs = ["%s=%r" % kv for kv in self.__dict__.items()] return "Bucket(" + ", ".join(strs) + ")" #====================================================================== class RectUtils: """ Static rectangle utilities """ #---------------------------------------------------------------------------- # Accessing @staticmethod def Left(r): return r[0] @staticmethod def Top(r): return r[1] @staticmethod def Width(r): return r[2] @staticmethod def Height(r): return r[3] @staticmethod def Right(r): return r[0] + r[2] @staticmethod def Bottom(r): return r[1] + r[3] @staticmethod def TopLeft(r): return [r[0], r[1]] @staticmethod def TopRight(r): return [r[0] + r[2], r[1]] @staticmethod def BottomLeft(r): return [r[0], r[1] + r[3]] @staticmethod def BottomRight(r): return [r[0] + r[2], r[1] + r[3]] #---------------------------------------------------------------------------- # Modifying @staticmethod def SetLeft(r, l): r[0] = l return r @staticmethod def SetTop(r, t): r[1] = t return r @staticmethod def SetWidth(r, w): r[2] = w return r @staticmethod def SetHeight(r, h): r[3] = h return r @staticmethod def MoveLeftBy(r, delta): r[0] += delta r[2] -= delta return r @staticmethod def MoveTopBy(r, delta): r[1] += delta r[3] -= delta return r @staticmethod def MoveRightBy(r, delta): r[2] += delta return r @staticmethod def MoveBottomBy(r, delta): r[3] += delta return r #---------------------------------------------------------------------------- # Calculations @staticmethod def InsetBy(r, delta): if delta is None: return r try: delta[0] # is it indexable? return RectUtils.InsetRect(r, delta) except: return RectUtils.InsetRect(r, (delta, delta, delta, delta)) @staticmethod def InsetRect(r, r2): if r2 is None: return r else: return [r[0] + r2[0], r[1] + r2[1], r[2] - (r2[0] + r2[2]), r[3] - (r2[1] + r2[3])] #====================================================================== # TESTING ONLY #====================================================================== if __name__ == '__main__': import wx from ObjectListView import ObjectListView, GroupListView, ColumnDefn # Where can we find the Example module? import sys sys.path.append("../Examples") import ExampleModel import ExampleImages class MyFrame(wx.Frame): def __init__(self, *args, **kwds): kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.panel = wx.Panel(self, -1) self.olv = ObjectListView(self.panel, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) self.olv = GroupListView(self.panel, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) #self.olv = FastObjectListView(self.panel, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) #self.olv = VirtualObjectListView(self.panel, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) sizer_2 = wx.BoxSizer(wx.VERTICAL) sizer_2.Add(self.olv, 1, wx.ALL|wx.EXPAND, 4) self.panel.SetSizer(sizer_2) self.panel.Layout() sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_1.Add(self.panel, 1, wx.EXPAND) self.SetSizer(sizer_1) self.Layout() groupImage = self.olv.AddImages(ExampleImages.getGroup16Bitmap(), ExampleImages.getGroup32Bitmap()) userImage = self.olv.AddImages(ExampleImages.getUser16Bitmap(), ExampleImages.getUser32Bitmap()) musicImage = self.olv.AddImages(ExampleImages.getMusic16Bitmap(), ExampleImages.getMusic32Bitmap()) self.olv.SetColumns([ ColumnDefn("Title", "left", 120, "title", imageGetter=musicImage), ColumnDefn("Artist", "left", 120, "artist", imageGetter=groupImage), ColumnDefn("Last Played", "left", 100, "lastPlayed"), ColumnDefn("Size", "center", 100, "sizeInBytes"), ColumnDefn("Rating", "center", 100, "rating") ]) #self.olv.CreateCheckStateColumn() self.olv.SetSortColumn(self.olv.columns[2]) self.olv.SetObjects(ExampleModel.GetTracks()) wx.CallLater(50, self.run) def run(self): printer = OLVPrinter(self.olv, "First ObjectListView Report") printer.ReportFormat = ReportFormat.Normal("Chiller") #printer.ReportFormat = ReportFormat.Trying("Chiller") printer.PrintPreview(self) app = wx.PySimpleApp(0) wx.InitAllImageHandlers() frame_1 = MyFrame(None, -1, "") app.SetTopWindow(frame_1) frame_1.Show() app.MainLoop() wxbanker-0.9.1/wxbanker/ObjectListView/timingTests.txt0000644000175000017500000004022412243601243023074 0ustar mrooneymrooneyListCtrlPrinter CalculateTotalPages 1862.3 ms Tue Aug 05 10:50:53 2008 app.prof 267006 function calls in 1.742 CPU seconds Ordered by: internal time, call count List reduced from 209 to 30 due to restriction <30> ncalls tottime percall cumtime percall filename:lineno(function) 12584 0.211 0.000 0.291 0.000 _controls.py:4521(GetItem) 18920 0.084 0.000 0.120 0.000 _controls.py:4178() 6336 0.082 0.000 0.122 0.000 _controls.py:4491(GetColumn) 3167 0.079 0.000 0.495 0.000 ListCtrlPrinter.py:1140(DrawText) 305 0.078 0.000 1.064 0.003 ListCtrlPrinter.py:1411(DrawSelf) 3167 0.066 0.000 0.066 0.000 _gdi.py:3585(DrawLabel) 572 0.061 0.000 0.245 0.000 ListCtrlPrinter.py:2027(GetTexts) 572 0.061 0.000 0.237 0.000 ListCtrlPrinter.py:2039(GetImages) 572 0.060 0.000 0.212 0.000 ListCtrlPrinter.py:1310(GetColumnAlignments) 610 0.051 0.000 0.885 0.001 ListCtrlPrinter.py:1269(GetCombinedLists) 3163 0.049 0.000 0.260 0.000 WordWrapRenderer.py:95(DrawTruncatedString) 3209 0.045 0.000 0.048 0.000 _gdi.py:3791(GetPartialTextExtents) 18920 0.036 0.000 0.036 0.000 {method 'own' of 'PySwigObject' objects} 18920 0.036 0.000 0.036 0.000 _controls.py:4184() 6325 0.036 0.000 0.036 0.000 _controls.py:4501(GetColumnWidth) 6288 0.033 0.000 0.102 0.000 ListCtrlPrinter.py:962(GetFormat) 3163 0.030 0.000 0.098 0.000 WordWrapRenderer.py:113(_Truncate) 6324 0.030 0.000 0.069 0.000 ListCtrlPrinter.py:205(GetNamedFormat) 6422 0.027 0.000 0.042 0.000 ListCtrlPrinter.py:2304(__init__) 6324 0.025 0.000 0.039 0.000 ListCtrlPrinter.py:603(GetNamedFormat) 6314 0.025 0.000 0.025 0.000 _controls.py:4261(GetText) 3080 0.023 0.000 0.079 0.000 ListCtrlPrinter.py:1987(GetTextColor) 574 0.021 0.000 0.058 0.000 ListCtrlPrinter.py:1323(GetColumnWidths) 3168 0.018 0.000 0.025 0.000 _core.py:1133(__init__) 6314 0.018 0.000 0.018 0.000 _controls.py:4265(GetImage) 6292 0.018 0.000 0.018 0.000 _controls.py:4277(GetAlign) 3179 0.016 0.000 0.016 0.000 _gdi.py:4022(SetTextForeground) 6422 0.015 0.000 0.015 0.000 {method 'update' of 'dict' objects} 3167 0.014 0.000 0.022 0.000 _core.py:1440(__getitem__) 6324 0.014 0.000 0.014 0.000 {getattr} ListCtrlPrinter CalculateTotalPages 1770.4 ms Tue Aug 05 11:11:21 2008 app.prof 266950 function calls in 1.722 CPU seconds Ordered by: internal time, call count List reduced from 209 to 30 due to restriction <30> ncalls tottime percall cumtime percall filename:lineno(function) 12584 0.208 0.000 0.288 0.000 _controls.py:4521(GetItem) 3167 0.083 0.000 0.489 0.000 ListCtrlPrinter.py:1140(DrawText) 18920 0.083 0.000 0.119 0.000 _controls.py:4178() 6336 0.081 0.000 0.121 0.000 _controls.py:4491(GetColumn) 305 0.078 0.000 1.058 0.003 ListCtrlPrinter.py:1411(DrawSelf) 3167 0.065 0.000 0.065 0.000 _gdi.py:3585(DrawLabel) 572 0.061 0.000 0.236 0.000 ListCtrlPrinter.py:2041(GetImages) 572 0.061 0.000 0.238 0.000 ListCtrlPrinter.py:2027(GetTexts) 572 0.059 0.000 0.209 0.000 ListCtrlPrinter.py:1310(GetColumnAlignments) 610 0.050 0.000 0.874 0.001 ListCtrlPrinter.py:1269(GetCombinedLists) 3163 0.046 0.000 0.251 0.000 WordWrapRenderer.py:95(DrawTruncatedString) 3213 0.038 0.000 0.040 0.000 _gdi.py:3791(GetPartialTextExtents) 18920 0.036 0.000 0.036 0.000 {method 'own' of 'PySwigObject' objects} 18920 0.036 0.000 0.036 0.000 _controls.py:4184() 6325 0.035 0.000 0.035 0.000 _controls.py:4501(GetColumnWidth) 6288 0.034 0.000 0.100 0.000 ListCtrlPrinter.py:962(GetFormat) 3163 0.030 0.000 0.092 0.000 WordWrapRenderer.py:113(_Truncate) 6324 0.028 0.000 0.067 0.000 ListCtrlPrinter.py:205(GetNamedFormat) 6422 0.027 0.000 0.042 0.000 ListCtrlPrinter.py:2308(__init__) 6324 0.025 0.000 0.039 0.000 ListCtrlPrinter.py:603(GetNamedFormat) 3080 0.022 0.000 0.077 0.000 ListCtrlPrinter.py:1987(GetTextColor) 574 0.021 0.000 0.057 0.000 ListCtrlPrinter.py:1323(GetColumnWidths) 6314 0.019 0.000 0.019 0.000 _controls.py:4261(GetText) 6314 0.019 0.000 0.019 0.000 _controls.py:4265(GetImage) 3168 0.019 0.000 0.025 0.000 _core.py:1133(__init__) 6292 0.017 0.000 0.017 0.000 _controls.py:4277(GetAlign) 3179 0.016 0.000 0.016 0.000 _gdi.py:4022(SetTextForeground) 6422 0.014 0.000 0.014 0.000 {method 'update' of 'dict' objects} 3167 0.014 0.000 0.022 0.000 _core.py:1440(__getitem__) 6324 0.014 0.000 0.014 0.000 {getattr} ListCtrlPrinter CalculateTotalPages 1855.8 ms Tue Aug 05 10:56:46 2008 app.prof 294965 function calls in 1.805 CPU seconds Ordered by: internal time, call count List reduced from 232 to 30 due to restriction <30> ncalls tottime percall cumtime percall filename:lineno(function) 6336 0.084 0.000 0.126 0.000 _controls.py:4491(GetColumn) 3167 0.079 0.000 0.560 0.000 ListCtrlPrinter.py:1140(DrawText) 3167 0.078 0.000 0.097 0.000 _gdi.py:3585(DrawLabel) 305 0.073 0.000 1.132 0.004 ListCtrlPrinter.py:1411(DrawSelf) 6292 0.061 0.000 0.134 0.000 ObjectListView.py:929(GetImageAt) 3224 0.060 0.000 0.083 0.000 _gdi.py:3791(GetPartialTextExtents) 572 0.060 0.000 0.215 0.000 ListCtrlPrinter.py:1310(GetColumnAlignments) 7436 0.059 0.000 0.081 0.000 ObjectListView.py:3420(_Munge) 610 0.051 0.000 0.879 0.001 ListCtrlPrinter.py:1269(GetCombinedLists) 6292 0.050 0.000 0.246 0.000 ObjectListView.py:3274(GetStringValue) 3163 0.048 0.000 0.324 0.000 WordWrapRenderer.py:95(DrawTruncatedString) 6292 0.045 0.000 0.096 0.000 ObjectListView.py:3282(_StringToValue) 6325 0.036 0.000 0.036 0.000 _controls.py:4501(GetColumnWidth) 6292 0.035 0.000 0.100 0.000 ObjectListView.py:3267(GetValue) 6288 0.033 0.000 0.106 0.000 ListCtrlPrinter.py:962(GetFormat) 6324 0.032 0.000 0.046 0.000 ListCtrlPrinter.py:603(GetNamedFormat) 6292 0.030 0.000 0.276 0.000 ObjectListView.py:1028(GetStringValueAt) 3163 0.030 0.000 0.131 0.000 WordWrapRenderer.py:113(_Truncate) 13760 0.029 0.000 0.029 0.000 {getattr} 6924 0.029 0.000 0.051 0.000 cp1252.py:14(decode) 6336 0.029 0.000 0.042 0.000 _controls.py:4178() 6324 0.027 0.000 0.073 0.000 ListCtrlPrinter.py:205(GetNamedFormat) 6422 0.026 0.000 0.041 0.000 ListCtrlPrinter.py:2308(__init__) 572 0.024 0.000 0.309 0.001 ListCtrlPrinter.py:2027(GetTexts) 1188 0.023 0.000 0.023 0.000 {method 'strftime' of 'datetime.date' objects} 3080 0.023 0.000 0.078 0.000 ListCtrlPrinter.py:1987(GetTextColor) 572 0.022 0.000 0.165 0.000 ListCtrlPrinter.py:2041(GetImages) 6292 0.021 0.000 0.041 0.000 ObjectListView.py:3349(GetImage) 6924 0.021 0.000 0.021 0.000 {_codecs.charmap_decode} 574 0.021 0.000 0.058 0.000 ListCtrlPrinter.py:1323(GetColumnWidths) ListCtrlPrinter CalculateTotalPages 1700.5 ms Tue Aug 05 11:14:24 2008 app.prof 275373 function calls in 1.665 CPU seconds Ordered by: internal time, call count List reduced from 231 to 30 due to restriction <30> ncalls tottime percall cumtime percall filename:lineno(function) 3167 0.078 0.000 0.564 0.000 ListCtrlPrinter.py:1140(DrawText) 3167 0.076 0.000 0.095 0.000 _gdi.py:3585(DrawLabel) 305 0.075 0.000 1.064 0.003 ListCtrlPrinter.py:1411(DrawSelf) 7436 0.061 0.000 0.083 0.000 ObjectListView.py:3420(_Munge) 6292 0.060 0.000 0.135 0.000 ObjectListView.py:929(GetImageAt) 3209 0.055 0.000 0.084 0.000 _gdi.py:3791(GetPartialTextExtents) 610 0.052 0.000 0.743 0.001 ListCtrlPrinter.py:1269(GetCombinedLists) 6292 0.051 0.000 0.253 0.000 ObjectListView.py:3274(GetStringValue) 3163 0.049 0.000 0.324 0.000 WordWrapRenderer.py:95(DrawTruncatedString) 6292 0.045 0.000 0.099 0.000 ObjectListView.py:3282(_StringToValue) 6325 0.036 0.000 0.036 0.000 _controls.py:4501(GetColumnWidth) 6292 0.036 0.000 0.102 0.000 ObjectListView.py:3267(GetValue) 6905 0.035 0.000 0.056 0.000 cp1252.py:14(decode) 6292 0.034 0.000 0.045 0.000 ObjectListView.py:3241(GetAlignment) 6288 0.033 0.000 0.102 0.000 ListCtrlPrinter.py:962(GetFormat) 6292 0.030 0.000 0.283 0.000 ObjectListView.py:1028(GetStringValueAt) 3163 0.030 0.000 0.132 0.000 WordWrapRenderer.py:113(_Truncate) 13760 0.029 0.000 0.029 0.000 {getattr} 6324 0.029 0.000 0.069 0.000 ListCtrlPrinter.py:205(GetNamedFormat) 6422 0.026 0.000 0.041 0.000 ListCtrlPrinter.py:2309(__init__) 6324 0.026 0.000 0.040 0.000 ListCtrlPrinter.py:603(GetNamedFormat) 572 0.025 0.000 0.316 0.001 ListCtrlPrinter.py:2027(GetTexts) 3080 0.023 0.000 0.081 0.000 ListCtrlPrinter.py:1987(GetTextColor) 572 0.023 0.000 0.166 0.000 ListCtrlPrinter.py:2042(GetImages) 572 0.023 0.000 0.070 0.000 ListCtrlPrinter.py:2035(GetAlignments) 574 0.022 0.000 0.060 0.000 ListCtrlPrinter.py:1323(GetColumnWidths) 1188 0.022 0.000 0.022 0.000 {method 'strftime' of 'datetime.date' objects} 6292 0.021 0.000 0.042 0.000 ObjectListView.py:3349(GetImage) 6905 0.021 0.000 0.021 0.000 {_codecs.charmap_decode} 9724 0.020 0.000 0.020 0.000 {isinstance} #====================================================================== FASTLIST 10,000 rows ListCtrlPrinter CalculateTotalPages 142273.9 ms Tue Aug 05 11:23:54 2008 app.prof 22351842 function calls in 142.228 CPU seconds Ordered by: internal time, call count List reduced from 214 to 30 due to restriction <30> ncalls tottime percall cumtime percall filename:lineno(function) 507298 19.119 0.000 70.122 0.000 _controls.py:4521(GetItem) 507298 5.051 0.000 11.103 0.000 ObjectListView.py:929(GetImageAt) 599534 5.027 0.000 6.828 0.000 ObjectListView.py:3420(_Munge) 507298 4.048 0.000 20.396 0.000 ObjectListView.py:3274(GetStringValue) 507298 3.718 0.000 7.838 0.000 ObjectListView.py:3282(_StringToValue) 507298 3.444 0.000 28.113 0.000 ObjectListView.py:2116(OnGetItemText) 760991 3.437 0.000 4.925 0.000 _controls.py:4178() 253693 3.416 0.000 5.045 0.000 _controls.py:4491(GetColumn) 507298 3.400 0.000 16.120 0.000 ObjectListView.py:2130(OnGetItemColumnImage) 1014596 3.338 0.000 3.396 0.000 ObjectListView.py:2155(GetObjectAt) 25042 3.274 0.000 75.245 0.003 ListCtrlPrinter.py:1411(DrawSelf) 131137 3.253 0.000 21.029 0.000 ListCtrlPrinter.py:1140(DrawText) 507298 2.930 0.000 8.510 0.000 ObjectListView.py:3267(GetValue) 50082 2.834 0.000 97.934 0.002 ListCtrlPrinter.py:1269(GetCombinedLists) 46118 2.810 0.000 39.491 0.001 ListCtrlPrinter.py:2027(GetTexts) 46118 2.783 0.000 38.978 0.001 ListCtrlPrinter.py:2039(GetImages) 46118 2.677 0.000 9.037 0.000 ListCtrlPrinter.py:1310(GetColumnAlignments) 131137 2.601 0.000 2.601 0.000 _gdi.py:3585(DrawLabel) 507298 2.494 0.000 22.890 0.000 ObjectListView.py:1028(GetStringValueAt) 533378 2.348 0.000 4.062 0.000 cp1252.py:14(decode) 990365 2.132 0.000 2.132 0.000 {getattr} 386871 2.069 0.000 6.193 0.000 ListCtrlPrinter.py:962(GetFormat) 131131 1.995 0.000 10.308 0.000 WordWrapRenderer.py:95(DrawTruncatedString) 96209 1.921 0.000 1.921 0.000 {method 'strftime' of 'datetime.date' objects} 507298 1.777 0.000 3.327 0.000 ObjectListView.py:3349(GetImage) 144064 1.770 0.000 1.971 0.000 _gdi.py:3791(GetPartialTextExtents) 157504 1.752 0.000 1.752 0.000 _gdi.py:3659(SetFont) 390831 1.744 0.000 4.167 0.000 ListCtrlPrinter.py:205(GetNamedFormat) 784006 1.722 0.000 1.722 0.000 {isinstance} 533378 1.714 0.000 1.714 0.000 {_codecs.charmap_decode} ListCtrlPrinter CalculateTotalPages 79258.0 ms Tue Aug 05 11:26:44 2008 app.prof 13485917 function calls in 79.211 CPU seconds Ordered by: internal time, call count List reduced from 210 to 30 due to restriction <30> ncalls tottime percall cumtime percall filename:lineno(function) 25042 3.295 0.000 45.882 0.002 ListCtrlPrinter.py:1411(DrawSelf) 131137 3.253 0.000 23.338 0.000 ListCtrlPrinter.py:1140(DrawText) 131137 2.955 0.000 3.753 0.000 _gdi.py:3585(DrawLabel) 50082 2.806 0.000 32.646 0.001 ListCtrlPrinter.py:1269(GetCombinedLists) 253649 2.452 0.000 5.388 0.000 ObjectListView.py:929(GetImageAt) 299767 2.376 0.000 3.247 0.000 ObjectListView.py:3420(_Munge) 144264 2.206 0.000 3.250 0.000 _gdi.py:3791(GetPartialTextExtents) 386871 2.045 0.000 6.129 0.000 ListCtrlPrinter.py:962(GetFormat) 131131 2.019 0.000 12.593 0.000 WordWrapRenderer.py:95(DrawTruncatedString) 253649 1.997 0.000 9.879 0.000 ObjectListView.py:3274(GetStringValue) 253649 1.808 0.000 3.832 0.000 ObjectListView.py:3282(_StringToValue) 157504 1.788 0.000 1.788 0.000 _gdi.py:3659(SetFont) 390831 1.705 0.000 4.125 0.000 ListCtrlPrinter.py:205(GetNamedFormat) 390831 1.572 0.000 2.420 0.000 ListCtrlPrinter.py:603(GetNamedFormat) 253682 1.489 0.000 1.489 0.000 _controls.py:4501(GetColumnWidth) 690598 1.465 0.000 1.465 0.000 {getattr} 253649 1.421 0.000 4.050 0.000 ObjectListView.py:3267(GetValue) 253649 1.390 0.000 1.861 0.000 ObjectListView.py:3241(GetAlignment) 300016 1.305 0.000 2.212 0.000 cp1252.py:14(decode) 253649 1.242 0.000 11.121 0.000 ObjectListView.py:1028(GetStringValueAt) 131131 1.201 0.000 4.871 0.000 WordWrapRenderer.py:113(_Truncate) 46118 1.195 0.000 12.728 0.000 ListCtrlPrinter.py:2045(GetTexts) 265551 1.117 0.000 1.741 0.000 ListCtrlPrinter.py:2324(__init__) 46118 1.091 0.000 6.745 0.000 ListCtrlPrinter.py:2058(GetImages) 46118 1.082 0.000 3.062 0.000 ListCtrlPrinter.py:2052(GetAlignments) 101484 1.060 0.000 1.683 0.000 ListCtrlPrinter.py:1355(_CalculateCellPadding) 46122 0.998 0.000 2.608 0.000 ListCtrlPrinter.py:1323(GetColumnWidths) 123200 0.936 0.000 3.169 0.000 ListCtrlPrinter.py:1987(GetTextColor) 50091 0.930 0.000 0.930 0.000 {method 'strftime' of 'datetime.date' objects} 300016 0.907 0.000 0.907 0.000 {_codecs.charmap_decode} wxbanker-0.9.1/wxbanker/ObjectListView/WordWrapRenderer.py0000644000175000017500000002077412243601243023637 0ustar mrooneymrooney# -*- coding: utf-8 -*- #!/usr/bin/env python #---------------------------------------------------------------------------- # Name: WordWrapRenderer.py # Author: Phillip Piper # Created: 25 July 2008 # SVN-ID: $Id$ # Copyright: (c) 2008 by Phillip Piper, 2008 # License: wxWindows license #---------------------------------------------------------------------------- # Change log: # 2008/07/25 JPP Initial version #---------------------------------------------------------------------------- # To do: """ A WordWrapRenderer encapsulates the ability to draw and measure word wrapped strings directly to a device context. It is meant to be good enough for general use. It is not suitable for typographic layout -- it does not handle kerning or ligatures. The DC passed to these methods cannot be a GraphicContext DC. These methods use GetPartialTextExtents() which does not work with GCDC's (as of wx 2.8). """ import wx import bisect from wx.lib.wordwrap import wordwrap class WordWrapRenderer: """ This renderer encapsulates the logic need to draw and measure a word-wrapped string within a given rectangle. """ #---------------------------------------------------------------------------- # Calculating @staticmethod def CalculateHeight(dc, text, width): """ Calculate the height of the given text when fitted within the given width. Remember to set the font on the dc before calling this method. """ # There is a bug in the wordwrap routine where a string that needs truncated and # that ends with a single space causes the method to throw an error (wx 2.8). # Our simple, but not always accurate, is to remove trailing spaces. # This won't catch single trailing space imbedded in a multiline string. text = text.rstrip(' ') lines = wordwrap(text, width, dc, True) (width, height, descent, externalLeading) = dc.GetFullTextExtent("Wy") return (lines.count("\n")+1) * (height + externalLeading) #---------------------------------------------------------------------------- # Rendering @staticmethod def DrawString(dc, text, bounds, align=wx.ALIGN_LEFT, valign=wx.ALIGN_TOP, allowClipping=False): """ Draw the given text word-wrapped within the given bounds. bounds must be a wx.Rect or a 4-element collection: (left, top, width, height). If allowClipping is True, this method changes the clipping region so that no text is drawn outside of the given bounds. """ if not text: return if align == wx.ALIGN_CENTER: align = wx.ALIGN_CENTER_HORIZONTAL if valign == wx.ALIGN_CENTER: valign = wx.ALIGN_CENTER_VERTICAL # DrawLabel only accepts a wx.Rect try: bounds = wx.Rect(*bounds) except: pass if allowClipping: clipper = wx.DCClipper(dc, bounds) # There is a bug in the wordwrap routine where a string that needs truncated and # that ends with a single space causes the method to throw an error (wx 2.8). # Our simple, but not always accurate, is to remove trailing spaces. # This won't catch single trailing space imbedded in a multiline string. text = text.rstrip(' ') lines = wordwrap(text, bounds[2], dc, True) dc.DrawLabel(lines, bounds, align|valign) @staticmethod def DrawTruncatedString(dc, text, bounds, align=wx.ALIGN_LEFT, valign=wx.ALIGN_TOP, ellipse=wx.RIGHT, ellipseChars="..."): """ Draw the given text truncated to the given bounds. bounds must be a wx.Rect or a 4-element collection: (left, top, width, height). If allowClipping is True, this method changes the clipping region so that no text is drawn outside of the given bounds. """ if not text: return if align == wx.ALIGN_CENTER: align = wx.ALIGN_CENTER_HORIZONTAL if valign == wx.ALIGN_CENTER: valign = wx.ALIGN_CENTER_VERTICAL try: bounds = wx.Rect(*bounds) except: pass lines = WordWrapRenderer._Truncate(dc, text, bounds[2], ellipse, ellipseChars) dc.DrawLabel(lines, bounds, align|valign) @staticmethod def _Truncate(dc, text, maxWidth, ellipse, ellipseChars): """ Return a string that will fit within the given width. """ line = text.split("\n")[0] # only consider the first line if not line: return "" pte = dc.GetPartialTextExtents(line) # Does the whole thing fit within our given width? stringWidth = pte[-1] if stringWidth <= maxWidth: return line # We (probably) have to ellipse the text so allow for ellipse maxWidthMinusEllipse = maxWidth - dc.GetTextExtent(ellipseChars)[0] if ellipse == wx.LEFT: i = bisect.bisect(pte, stringWidth - maxWidthMinusEllipse) return ellipseChars + line[i+1:] if ellipse == wx.CENTER: i = bisect.bisect(pte, maxWidthMinusEllipse / 2) j = bisect.bisect(pte, stringWidth - maxWidthMinusEllipse / 2) return line[:i] + ellipseChars + line[j+1:] if ellipse == wx.RIGHT: i = bisect.bisect(pte, maxWidthMinusEllipse) return line[:i] + ellipseChars # No ellipsing, just truncating is the default i = bisect.bisect(pte, maxWidth) return line[:i] #====================================================================== # TESTING ONLY #====================================================================== if __name__ == '__main__': class TestPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, -1, style=wx.FULL_REPAINT_ON_RESIZE) self.Bind(wx.EVT_PAINT, self.OnPaint) self.text = """This is Thisisareallylongwordtoseewhathappens the text to be drawn. It needs to be long to see if wrapping works. to long words. This is on new line by itself. This should have a blank line in front of it but still wrap when we reach the edge. The bottom of the red rectangle should be immediately below this.""" self.font = wx.Font(12, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName="Gill Sans") def OnPaint(self, evt): dc = wx.PaintDC(self) inset = (20, 20, 20, 20) rect = [inset[0], inset[1], self.GetSize().width-(inset[0]+inset[2]), self.GetSize().height-(inset[1]+inset[3])] # Calculate exactly how high the wrapped is going to be and put a frame around it. dc.SetFont(self.font) dc.SetPen(wx.RED_PEN) rect[3] = WordWrapRenderer.CalculateHeight(dc, self.text, rect[2]) dc.DrawRectangle(*rect) WordWrapRenderer.DrawString(dc, self.text, rect, wx.ALIGN_LEFT) #WordWrapRenderer.DrawTruncatedString(dc, self.text, rect, wx.ALIGN_CENTER_HORIZONTAL,s ellipse=wx.CENTER) #bmp = wx.EmptyBitmap(rect[0]+rect[2], rect[1]+rect[3]) #mdc = wx.MemoryDC(bmp) #mdc.SetBackground(wx.Brush("white")) #mdc.Clear() #mdc.SetFont(self.font) #mdc.SetPen(wx.RED_PEN) #rect[3] = WordWrapRenderer.CalculateHeight(mdc, self.text, rect[2]) #mdc.DrawRectangle(*rect) #WordWrapRenderer.DrawString(mdc, self.text, rect, wx.ALIGN_LEFT) #del mdc #dc = wx.ScreenDC() #dc.DrawBitmap(bmp, 20, 20) class MyFrame(wx.Frame): def __init__(self, *args, **kwds): kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.panel = wx.Panel(self, -1) self.testPanel = TestPanel(self.panel) sizer_2 = wx.BoxSizer(wx.VERTICAL) sizer_2.Add(self.testPanel, 1, wx.ALL|wx.EXPAND, 4) self.panel.SetSizer(sizer_2) self.panel.Layout() sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_1.Add(self.panel, 1, wx.EXPAND) self.SetSizer(sizer_1) self.Layout() app = wx.PySimpleApp(0) wx.InitAllImageHandlers() frame_1 = MyFrame(None, -1, "") app.SetTopWindow(frame_1) frame_1.Show() app.MainLoop() wxbanker-0.9.1/wxbanker/persistentstore.py0000644000175000017500000005753412243601243020767 0ustar mrooneymrooney# https://launchpad.net/wxbanker # persistentstore.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . """ Table: accounts v2 v3 v10 +---------------------------------------------------------------+---------------+-----------------+ | id INTEGER PRIMARY KEY | name VARCHAR(255) | currency INTEGER | balance FLOAT | mintId INTEGER | |------------------------+-------------------+------------------+---------------+-----------------| | 1 | "My Account" | 0 | 0 | 123456 | +---------------------------------------------------------------+---------------+-----------------+ Table: transactions v4 +-------------------------------------------------------------------------------------------------------+----------------+ | id INTEGER PRIMARY KEY | accountId INTEGER | amount FLOAT | description VARCHAR(255) | date CHAR(10)) | linkId INTEGER | |------------------------+-------------------+--------------+--------------------------+----------------|----------------| | 1 | 1 | 100.00 | "Initial Balance" | "2007/01/06" | null | +-------------------------------------------------------------------------------------------------------+----------------+ """ import ast import datetime import os import sys from sqlite3 import dbapi2 as sqlite import sqlite3 from wx.lib.pubsub import Publisher from wxbanker import currencies, debug from wxbanker.bankobjects.account import Account from wxbanker.bankobjects.accountlist import AccountList from wxbanker.bankobjects.bankmodel import BankModel from wxbanker.bankobjects.transaction import Transaction from wxbanker.bankobjects.transactionlist import TransactionList from wxbanker.bankobjects.recurringtransaction import RecurringTransaction from wxbanker.bankobjects.ormobject import ORMKeyValueObject from wxbanker.bankexceptions import MissingLinkException class PersistentStore: """ Handles creating the Model (bankobjects) from the store and writing back the changes. """ def __init__(self, path, autoSave=True): self.Subscriptions = [] self.Version = 13 self.Path = path self.AutoSave = False self.Dirty = False self.BatchDepth = 0 self.cachedModel = None # Upgrades can't enable syncing if needed from older versions. self.needsSync = False existed = True # See if the path already exists to decide what to do. if not os.path.exists(self.Path): existed = False # Initialize the connection and optimize it. connection = sqlite.connect(self.Path) self.dbconn = connection # Disable synchronous I/O, which makes everything MUCH faster, at the potential cost of durability. self.dbconn.execute("PRAGMA synchronous=OFF;") # If the db doesn't exist, initialize it. if not existed: debug.debug('Initializing', self.Path) self.initialize() else: debug.debug('Loading', self.Path) self.Meta = self.getMeta() debug.debug(self.Meta) while self.Meta['VERSION'] < self.Version: # If we are creating a new db, we don't need to backup each iteration. self.upgradeDb(self.Meta['VERSION'], backup=existed) self.Meta = self.getMeta() debug.debug(self.Meta) # We have to subscribe before syncing otherwise it won't get synced if there aren't other changes. self.Subscriptions = ( (self.onORMObjectUpdated, "ormobject.updated"), (self.onAccountBalanceChanged, "account.balance changed"), (self.onAccountRemoved, "account.removed"), (self.onBatchEvent, "batch"), (self.onExit, "exiting"), ) for callback, topic in self.Subscriptions: Publisher.subscribe(callback, topic) # If the upgrade process requires a sync, do so now. if self.needsSync: self.syncBalances() self.needsSync = False self.AutoSave = autoSave self.commitIfAppropriate() def GetModel(self, useCached=True): if self.cachedModel is None or not useCached: debug.debug('Creating model...') self.cachedModel = BankModel(self) return self.cachedModel def CreateAccount(self, accountName, currency=0): if isinstance(currency, currencies.BaseCurrency): currency = currencies.GetCurrencyInt(currency) if type(currency) != int or currency < 0: raise Exception("Currency code must be int and >= 0") cursor = self.dbconn.cursor() cursor.execute('INSERT INTO accounts (name, currency) VALUES (?, ?)', (accountName, currency)) ID = cursor.lastrowid self.commitIfAppropriate() account = Account(self, ID, accountName, currency) return account def RemoveAccount(self, account): self.dbconn.cursor().execute('DELETE FROM accounts WHERE id=?',(account.ID,)) self.commitIfAppropriate() def MakeRecurringTransaction(self, recurring): cursor = self.dbconn.cursor() cursor.execute('INSERT INTO recurring_transactions VALUES (null, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', self.recurringtransaction2result(recurring)[1:]) self.commitIfAppropriate() recurring.ID = cursor.lastrowid return recurring def MakeTransaction(self, account, transaction): cursor = self.dbconn.cursor() cursor.execute('INSERT INTO transactions VALUES (null, ?, ?, ?, ?, ?, ?)', [account.ID] + transaction.toResult()[1:]) self.commitIfAppropriate() transaction.ID = cursor.lastrowid return transaction def RemoveTransaction(self, transaction): ID = transaction.ID result = self.dbconn.cursor().execute('DELETE FROM transactions WHERE id=?', (ID,)).fetchone() self.commitIfAppropriate() # The result doesn't appear to be useful here, it is None regardless of whether the DELETE matched anything. return True def RemoveRecurringTransaction(self, recurring): ID = recurring.ID result = self.dbconn.cursor().execute('DELETE FROM recurring_transactions WHERE id=?', (ID,)) self.commitIfAppropriate() def Save(self): import time; t = time.time() self.dbconn.commit() debug.debug("Committed in %s seconds" % (time.time()-t)) self.Dirty = False def Close(self): self.dbconn.close() for callback, topic in self.Subscriptions: Publisher.unsubscribe(callback) def PopulateKeyValues(self, ormkvobj): table = ormkvobj.ORM_TABLE for result in self.dbconn.cursor().execute("SELECT * from %s" % table).fetchall(): autoid, key, value = result # eval the value since we store it repr'd. However null comes out as None, so cast to a string. value = ast.literal_eval(str(value)) setattr(ormkvobj, key, value) def onBatchEvent(self, message): batchType = message.topic[1].lower() if batchType == "start": self.BatchDepth += 1 elif batchType == "end": if self.BatchDepth == 0: raise Exception("Cannot end a batch that has not started.") self.BatchDepth -= 1 # If the batching is over, perhaps we should save. if self.BatchDepth == 0 and self.Dirty: self.commitIfAppropriate() else: raise Exception("Expected batch type of 'start' or 'end', got '%s'" % batchType) def commitIfAppropriate(self): # Don't commit if there is a batch in progress. if self.AutoSave and not self.BatchDepth: self.Save() else: self.Dirty = True def initialize(self): cursor = self.dbconn.cursor() cursor.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, name VARCHAR(255), currency INTEGER)') cursor.execute('CREATE TABLE transactions (id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10))') cursor.execute('CREATE TABLE meta (id INTEGER PRIMARY KEY, name VARCHAR(255), value VARCHAR(255))') cursor.execute('INSERT INTO meta VALUES (null, ?, ?)', ('VERSION', '2')) def getMeta(self): try: results = self.dbconn.cursor().execute('SELECT * FROM meta').fetchall() except sqlite3.OperationalError: meta = {'VERSION': 1} else: meta = {} for uid, key, value in results: # All values come in as strings but some we want to cast. if key == "VERSION": value = int(value) meta[key] = value return meta def upgradeDb(self, fromVer, backup=True): if backup: # Make a backup source = self.Path dest = self.Path + ".backup-v%i-%s" % (fromVer, datetime.date.today().strftime("%Y-%m-%d")) debug.debug("Making backup to %s" % dest) import shutil try: shutil.copyfile(source, dest) except IOError: import traceback; traceback.print_exc() raise Exception("Unable to make backup before proceeding with database upgrade...bailing.") debug.debug('Upgrading db from %i' % fromVer) cursor = self.dbconn.cursor() if fromVer == 1: # Add `currency` column to the accounts table with default value 0. cursor.execute('ALTER TABLE accounts ADD currency INTEGER not null DEFAULT 0') # Add metadata table, with version: 2 cursor.execute('CREATE TABLE meta (id INTEGER PRIMARY KEY, name VARCHAR(255), value VARCHAR(255))') cursor.execute('INSERT INTO meta VALUES (null, ?, ?)', ('VERSION', '2')) elif fromVer == 2: # Add `total` column to the accounts table. cursor.execute('ALTER TABLE accounts ADD balance FLOAT not null DEFAULT 0.0') # The total column will need to be synced. self.needsSync = True # Update the meta version number. elif fromVer == 3: # Add `linkId` column to transactions for transfers. cursor.execute('ALTER TABLE transactions ADD linkId INTEGER') elif fromVer == 4: # Add recurring transactions table. transactionBase = "id INTEGER PRIMARY KEY, accountId INTEGER, amount FLOAT, description VARCHAR(255), date CHAR(10)" recurringExtra = "repeatType INTEGER, repeatEvery INTEGER, repeatsOn VARCHAR(255), endDate CHAR(10)" cursor.execute('CREATE TABLE recurring_transactions (%s, %s)' % (transactionBase, recurringExtra)) elif fromVer == 5: cursor.execute('ALTER TABLE recurring_transactions ADD sourceId INTEGER') cursor.execute('ALTER TABLE recurring_transactions ADD lastTransacted CHAR(10)') elif fromVer == 6: # Handle LP: #496341 by ignoring the error if this table already exists. try: cursor.execute('ALTER TABLE transactions ADD recurringParent INTEGER') except sqlite3.OperationalError: debug.debug("Detected a broken database from the 0.4 -> 0.6 upgrade, handling appropriately.") elif fromVer == 7: # Force a re-sync for the 0.6.1 release after fixing LP: #496341 self.needsSync = True elif fromVer == 8: # Add the LastAccountId meta key. cursor.execute('INSERT INTO meta VALUES (null, ?, ?)', ('LastAccountId', None)) elif fromVer == 9: # Mint integration cursor.execute('INSERT INTO meta VALUES (null, ?, ?)', ('MintEnabled', False)) cursor.execute('ALTER TABLE accounts ADD mintId INTEGER') elif fromVer == 10: # The obvious index to create, had I known about indexes previously. # It is nice to use IF NOT EXISTS here as some devs and branch users might have it outside of an upgrade. cursor.execute('CREATE INDEX IF NOT EXISTS transactions_accountId_idx ON transactions(accountId)') # Due to bug LP #605591 there can be orphaned transactions which can cause errors if linked. # This is tested by testOrphanedTransactionsAreDeleted (dbupgradetests.DBUpgradeTest) # Also takes care of LP #249954 without the explicit need to defensively remove on any account creation. self.cleanOrphanedTransactions() elif fromVer == 11: self.needsSync = True elif fromVer == 12: # globalCurrency entry cursor.execute('INSERT INTO meta VALUES (null, ?, ?)', ('GlobalCurrency', 0)) else: raise Exception("Cannot upgrade database from version %i"%fromVer) """ # Tagging infrastructure (currently unused due to speed of parsing on startup). cursor.execute('CREATE TABLE tags (id INTEGER PRIMARY KEY, name VARCHAR(255))') cursor.execute('CREATE TABLE transactions_tags_link (id INTEGER PRIMARY KEY, transactionId INTEGER, tagId INTEGER)') cursor.execute('CREATE INDEX transactions_tags_transactionId_idx ON transactions_tags_link(transactionId)') cursor.execute('CREATE INDEX transactions_tags_tagId_idx ON transactions_tags_link(tagId)') """ metaVer = fromVer + 1 cursor.execute('UPDATE meta SET value=? WHERE name=?', (metaVer, "VERSION")) self.commitIfAppropriate() def syncBalances(self): debug.debug("Syncing balances...") # Load the model, necessary to sync the balances. model = self.GetModel() for account in model.Accounts: account.Balance = sum([t.Amount for t in account.Transactions]) self.commitIfAppropriate() def recurringtransaction2result(self, recurringObj): """ This method converts the Bank's generic implementation of a recurring transaction into this model's specific one. """ dateStr = "%s/%s/%s"%(recurringObj.Date.year, str(recurringObj.Date.month).zfill(2), str(recurringObj.Date.day).zfill(2)) repeatOn = recurringObj.RepeatOn if repeatOn: repeatOn = ",".join((str(i) for i in repeatOn)) sourceId = recurringObj.Source and recurringObj.Source.ID result = [recurringObj.ID, recurringObj.Parent.ID, recurringObj.Amount, recurringObj.Description, dateStr] result += [recurringObj.RepeatType, recurringObj.RepeatEvery, repeatOn, recurringObj.EndDate, sourceId, recurringObj.LastTransacted] return result def result2account(self, result): ID, name, currency, balance, mintId = result return Account(self, ID, name, currency, balance, mintId) def result2recurringtransaction(self, result, parentAccount, allAccounts): rId, accountId, amount, description, date, repeatType, repeatEvery, repeatOn, endDate, sourceId, lastTransacted = result if repeatOn: repeatOn = [int(x) for x in repeatOn.split(",")] if sourceId: try: sourceAccount = [a for a in allAccounts if a.ID == sourceId][0] except IndexError: # The sourceAccount no longer exists; it was likely deleted. sourceAccount = None else: sourceAccount = None return RecurringTransaction(rId, parentAccount, amount, description, date, repeatType, repeatEvery, repeatOn, endDate, sourceAccount, lastTransacted) def getAccountRows(self): return self.dbconn.cursor().execute("SELECT * FROM accounts").fetchall() def GetAccounts(self): # Fetch all the accounts. accounts = [self.result2account(result) for result in self.getAccountRows()] # Add any recurring transactions that exist for each. recurrings = self.getRecurringTransactions() for recurring in recurrings: parentId = recurring[1] for account in accounts: if account.ID == parentId: rObj = self.result2recurringtransaction(recurring, account, accounts) account.RecurringTransactions.append(rObj) return accounts def getRecurringTransactions(self): return self.dbconn.cursor().execute('SELECT * FROM recurring_transactions').fetchall() def cleanOrphanedTransactions(self): # Grab all the accounts that currently exist, to check against. accountIDs = [row[0] for row in self.getAccountRows()] # We'll keep a list of deceased accounts to clean, so we aren't doing a DELETE per orphan. deceasedAccounts = set() # Iterate over the transactions, treating the cursor as an iterator instead of fetchall() in case there are a lot. for transactionRow in self.dbconn.cursor().execute('SELECT * FROM transactions'): accountID = transactionRow[1] # If the account ID isn't in the current accounts, it must not exist and this transaction is an orphan, so note the parent. if accountID not in accountIDs: deceasedAccounts.add(accountID) # Now iterate over the deceased accounts of which to remove orphans. for accountID in deceasedAccounts: self.dbconn.cursor().execute('DELETE FROM transactions WHERE accountId=?', (accountID,)) self.commitIfAppropriate() def result2transaction(self, result, parentObj, linkedTransaction=None, recurringCache=None): tid, pid, amount, description, date, linkId, recurringId = result t = Transaction(tid, parentObj, amount, description, date) # Handle a linked transaction being passed in, a special case called from a few lines down. if linkedTransaction: t.LinkedTransaction = linkedTransaction else: # Handle recurring parents. if recurringId: t.RecurringParent = recurringCache[recurringId] # Handle linked transactions. if linkId: try: link, linkAccount = self.getTransactionAndParentById(linkId, parentObj, t) except MissingLinkException: # The link is gone, it's Account was likely deleted before LP: #514183/605591 was fixed. Remove it. t.LinkedTransaction = None else: # If the link parent hasn't loaded its transactions yet, put this in its pre list so this # object is used if and when they are loaded. if linkAccount._Transactions is None: linkAccount._preTransactions.append(link) t.LinkedTransaction = link # Synchronize the RecurringParent attribute. t.LinkedTransaction.RecurringParent = t.RecurringParent return t def getTransactionsFrom(self, account): transactions = TransactionList() # Generate a map of recurring transaction IDs to the objects for fast look-up. recurringCache = {} for recurring in account.Parent.GetRecurringTransactions(): recurringCache[recurring.ID] = recurring Publisher.sendMessage("batch.start") for result in self.dbconn.cursor().execute('SELECT * FROM transactions WHERE accountId=?', (account.ID,)).fetchall(): t = self.result2transaction(result, account, recurringCache=recurringCache) transactions.append(t) Publisher.sendMessage("batch.end") return transactions def getTransactionAndParentById(self, tId, parentObj, linked): result = self.dbconn.cursor().execute('SELECT * FROM transactions WHERE id=? LIMIT 1', (tId,)).fetchone() if result is None: # This is probably LP #514183: the account of the sibling was deleted. raise MissingLinkException("Unable to find the linked transaction") # Before we can create the LinkedTransaction, we need to find its parent. linkedParent = None for account in parentObj.Parent: if account.ID == result[1]: linkedParent = account break if linkedParent is None: raise Exception("Unable to find parent of LinkedTransaction") transaction = self.result2transaction(result, linkedParent, linkedTransaction=linked) return transaction, linkedParent def renameAccount(self, oldName, account): self.dbconn.cursor().execute("UPDATE accounts SET name=? WHERE name=?", (account.Name, oldName)) self.commitIfAppropriate() def setCurrency(self, currencyIndex, account=None): if account: self.dbconn.cursor().execute('UPDATE accounts SET currency=? WHERE id=?', (currencyIndex, account.ID)) else: # Since no account received, we are updating the global currency self.dbconn.cursor().execute('UPDATE meta SET value=? WHERE name="GlobalCurrency"', (currencyIndex,)) self.commitIfAppropriate() def __print__(self): cursor = self.dbconn.cursor() for account in cursor.execute("SELECT * FROM accounts").fetchall(): print account[1] for trans in cursor.execute("SELECT * FROM transactions WHERE accountId=?", (account[0],)).fetchall(): print ' -',trans def onAccountRenamed(self, message): oldName, account = message.data self.renameAccount(oldName, account) def onAccountRemoved(self, message): account = message.data self.RemoveAccount(account) def onAccountBalanceChanged(self, message): account = message.data self.dbconn.cursor().execute("UPDATE accounts SET balance=? WHERE id=?", (account.Balance, account.ID)) self.commitIfAppropriate() def onExit(self, message): self.syncBalances() if self.Dirty: Publisher.sendMessage("warning.dirty exit", message.data) def onORMObjectUpdated(self, message): topic, data = message.topic, message.data classname, attrname = topic[-2:] ormobj = data table = ormobj.ORM_TABLE value = ormobj.getAttrValue(attrname) if isinstance(ormobj, ORMKeyValueObject): result = self.dbconn.cursor().execute("UPDATE %s SET value=? WHERE name=?" % table, (repr(value), attrname)) else: # Figure out the name of the column colname = attrname.strip("_") colname = colname[0].lower() + colname[1:] colname = {"repeatOn": "repeatsOn", "source": "sourceId", "linkedTransaction": "linkId"}.get(colname, colname) query = "UPDATE %s SET %s=? WHERE id=?" % (table, colname) objId = ormobj.ID self.dbconn.cursor().execute(query, (value, objId)) self.commitIfAppropriate() debug.debug("Persisting %s.%s update (%s)" % (classname, attrname, value)) def __del__(self): self.commitIfAppropriate() self.Close() if __name__ == "__main__": import doctest doctest.testmod() wxbanker-0.9.1/wxbanker/plots/0000755000175000017500000000000012243601243016263 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/plots/__init__.py0000644000175000017500000000000012243601243020362 0ustar mrooneymrooneywxbanker-0.9.1/wxbanker/plots/baseplot.py0000644000175000017500000001066312243601243020454 0ustar mrooneymrooney# https://launchpad.net/wxbanker # baseplot.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import datetime from wxbanker.plots.plotfactory import BasePlotImportException from wxbanker.analyzers import MonthlyAnalyzer # Needs Numeric or numarray or NumPy try: import numpy.oldnumeric as _Numeric except: try: import numarray as _Numeric #if numarray is used it is renamed Numeric except: try: import Numeric as _Numeric except: _Numeric = None if not hasattr(_Numeric, 'polyfit'): raise BasePlotImportException() class BaseFactory(object): def __init__(self): self.Plots = [] def createPanel(self, parent, bankController, graphIndex=0): plotPanel = self.Plots[graphIndex] return plotPanel(bankController, parent) class BasePlot(object): def getPoints(self, totals, numPoints): # Don't ever return 0 as the dpp, you can't graph without SOME x delta. smallDelta = 1.0/2**32 # If there aren't any transactions, return 0 for every point and start at today. if totals == []: return [0] * 10, datetime.date.today(), smallDelta startDate = totals[0][0] endDate = totals[-1][0] # Figure out the fraction of a day that exists between each point. distance = (endDate - startDate).days daysPerPoint = 1.0 * distance / numPoints dppDelta = datetime.timedelta(daysPerPoint) # Generate all the points. tindex = 0 points = [totals[0][1]] for i in range(numPoints): while tindex < len(totals) and totals[tindex][0] <= startDate + (dppDelta * (i+1)): points[i] = totals[tindex][1] tindex += 1 points.append(points[-1]) return points[:-1], startDate, daysPerPoint or smallDelta def plotMonthly(self, transactions, months): monthly = MonthlyAnalyzer(months) earnings = monthly.GetEarnings(transactions) return earnings def plotBalance(self, totals, plotSettings, xunits): totals, startDate, every = self.getPoints(totals, plotSettings['Granularity']) self.startDate = startDate timeDelta = datetime.timedelta( every * {'Days':1, 'Weeks':7, 'Months':30, 'Years':365}[xunits] ) dates = [] strdates = [] currentTime = 0 uniquePoints = set() for i, total in enumerate(totals): dates.append(currentTime) uniquePoints.add("%.2f"%total) currentTime += every # Don't just += the timeDelta to currentDate, since adding days is all or nothing, ie: # currentDate + timeDelta == currentDate, where timeDelta < 1 (bad!) # ...so the date will never advance for timeDeltas < 1, no matter how many adds you do. # As such we must start fresh each time and multiply the time delta appropriately. currentDate = startDate + (i+1)*timeDelta strdates.append(currentDate.strftime('%Y/%m/%d')) # Is this data trendable? In other words, at least two different points. trendable = bool(len(uniquePoints)) return totals, dates, strdates, trendable def getPolyData(self, points, N=1): xs = tuple((p[0] for p in points)) ys = tuple((p[1] for p in points)) coefficients = _Numeric.polyfit(xs, ys, N) bestFitPoints = [] for x in xs: newY = 0.0 power = len(coefficients)-1 for coefficient in coefficients: newY += coefficient*(x**power) power -= 1 bestFitPoints.append((int(x), float(newY))) return bestFitPointswxbanker-0.9.1/wxbanker/plots/cairopanel.py0000644000175000017500000001240112243601243020750 0ustar mrooneymrooneyimport wx import datetime from wxbanker.plots import plotfactory from wx.lib.pubsub import Publisher try: try: from wxbanker.plots import baseplot except plotfactory.BasePlotImportException: raise plotfactory.PlotLibraryImportException('cairo', 'python-numpy') from wxbanker.cairoplot import cairoplot, series import wx.lib.wxcairo except ImportError: raise plotfactory.PlotLibraryImportException('cairo', 'pycairo') class CairoPlotPanelFactory(baseplot.BaseFactory): def __init__(self): self.Plots = [CairoPlotPanel, CairoPlotPanelMonthly] class BaseCairoPlotPanel(wx.Panel, baseplot.BasePlot): def __init__(self, bankController, parent, plotSettings=None): wx.Panel.__init__(self, parent) baseplot.BasePlot.__init__(self) self.bankController = bankController self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.data = None self.x_labels = None self.plotSettings = plotSettings # watch if there's any currency change to repaint the plot. Publisher.subscribe(self.currencyChanged, "controller.show_currency_nick_toggled") Publisher.subscribe(self.currencyChanged, "currency_changed") def currencyChanged(self, message): self.Refresh() def OnSize(self, event): self.Refresh() class CairoPlotPanelMonthly(BaseCairoPlotPanel): NAME = _("monthly") def plotBalance(self, totals, plotSettings): self.plotSettings = plotSettings model = self.bankController.Model transactions = model.GetTransactions() earnings = baseplot.BasePlot.plotMonthly(self, transactions, plotSettings['Months']) self.data, self.x_labels = [], [] for month, amount in earnings: # Add the amount to the data. self.data.append([amount]) # Generate the x_label representing the month. year, month = [int(x) for x in month.split(".")] x_label = datetime.date(year, month, 1).strftime("%b %Y") self.x_labels.append(x_label) self.Refresh() def OnPaint(self, event): # I'm not sure when this might happen, but I recall doing it for a reason. Perhaps OnPaint can occur without a plotBalance? if self.data is None: return dc = wx.BufferedPaintDC(self) dc.Clear() cr = wx.lib.wxcairo.ContextFromDC(dc) size = self.GetClientSize() # try to format Y axes labels according to the account's currency. if self.plotSettings['Account']: value_formatter = lambda s: self.plotSettings['Account'].float2str(s) else: value_formatter = lambda s: self.bankController.Model.float2str(s) cairoplot.vertical_bar_plot( cr.get_target(), data = self.data, width = size.width, height = size.height, border = 20, grid = True, colors = ["green"], #series_legend = True, display_values = True, value_formatter = value_formatter, #x_title=_("Earnings"), #y_title=_("Month"), rounded_corners = True, x_labels = self.x_labels ) class CairoPlotPanel(BaseCairoPlotPanel): NAME = _("balance") def plotBalance(self, totals, plotSettings, xunits="Days"): self.plotSettings = plotSettings amounts, dates, strdates, trendable = baseplot.BasePlot.plotBalance(self, totals, plotSettings, xunits) data = [(i, total) for i, total in enumerate(amounts)] self.data = { _("Balance") : data, } if trendable: fitdata = self.getPolyData(data, N=plotSettings["FitDegree"]) self.data[_("Trend")] = fitdata # The maximum number of X labels (dates) we want to show. num_dates = 10 if len(amounts) <= num_dates+1: labels = strdates else: labels = [] delta = 1.0 * (len(amounts)-1) / (num_dates) for i in range(num_dates+1): labels.append(strdates[int(i*delta)]) self.x_labels = labels self.Refresh() def OnPaint(self, event): if self.data is None: return dc = wx.BufferedPaintDC(self) dc.Clear() cr = wx.lib.wxcairo.ContextFromDC(dc) size = self.GetClientSize() # try to format Y axes labels according to the account's currency. if self.plotSettings['Account']: y_formatter = lambda s: self.plotSettings['Account'].float2str(s) else: y_formatter = lambda s: self.bankController.Model.float2str(s) cairoplot.scatter_plot( cr.get_target(), data = self.data, width = size.width, height = size.height, border = 20, axis = True, dots = 0, grid = True, series_colors = ["green", "blue"], series_legend = True, x_labels=self.x_labels, y_formatter=y_formatter, x_title=_("Time"), y_title=_("Balance"), ) wxbanker-0.9.1/wxbanker/plots/plotfactory.py0000644000175000017500000000335512243601243021211 0ustar mrooneymrooneyclass PlotFactory(object): # The available factories, in their preferred order. factories = ( ('cairo', lambda : PlotFactory.__getCairoFactory()), ('wx', lambda : PlotFactory.__getWxFactory()), ) @classmethod def getFactory(cls, factoryName=None): """ Get plot factory. Either the one specified in arguments or the first one createable. """ if factoryName is not None: return cls.__createFactory(cls.factories[factoryName]) else: # return first available factory for factoryName, factory in cls.factories: factory = cls.__createFactory(factory) if factory is not None: return factory @classmethod def getAvailableFactories(cls): return cls.factories.keys() @classmethod def __createFactory(cls, method): """Execute factory creation method. Handle thrown exception exception.""" try: return method() except PlotLibraryImportException, exc: print exc.getImportHint() @staticmethod def __getCairoFactory(): from wxbanker.plots import cairopanel return cairopanel.CairoPlotPanelFactory() @staticmethod def __getWxFactory(): from wxbanker.plots import wxplotpanel return wxplotpanel.WxPlotFactory() class PlotLibraryImportException(Exception): def __init__(self, library, module): self.library = library self.module = module def getImportHint(self): return _("To use '%s' plotting library, install following python modules: %s."%(self.library, self.module)) class BasePlotImportException(Exception): pass wxbanker-0.9.1/wxbanker/plots/wxplotpanel.py0000644000175000017500000001102512243601243021211 0ustar mrooneymrooneyimport wx import datetime from wxbanker.plots import plotfactory try: from wxbanker.plots import baseplot except plotfactory.BasePlotImportException: raise plotfactory.PlotLibraryImportException('wx', 'python-numpy') import wx.lib.plot as pyplot class WxPlotFactory(baseplot.BaseFactory): def __init__(self): self.Plots = [AccountPlotCanvas] class AccountPlotCanvas(pyplot.PlotCanvas, baseplot.BasePlot): NAME = _("balance") def __init__(self, bankController, *args, **kwargs): pyplot.PlotCanvas.__init__(self, *args, **kwargs) baseplot.BasePlot.__init__(self) self.bankController = bankController self.pointDates = [] self.startDate = None #WXTODO: get rid of this and use self.pointDates[0] self.SetEnablePointLabel(True) self.SetEnableLegend(True) self.SetPointLabelFunc(self.drawPointLabel) self.canvas.Bind(wx.EVT_MOTION, self.onMotion) def plotBalance(self, totals, plotSettings, xunits="Days"): totals, dates, strdates, trendable = baseplot.BasePlot.plotBalance(self, totals, plotSettings, xunits) data = zip(dates, totals) #drawPointLabel will need these later self.pointDates = strdates line = pyplot.PolyLine(data, width=2, colour="green", legend=_("Balance")) lines = [line] # Without more than one unique value, a best fit line doesn't make sense (and also causes freezes!) if trendable: bestFitData = self.getPolyData(data, N=plotSettings["FitDegree"]) bestfitline = pyplot.PolyLine(bestFitData, width=2, colour="blue", legend=_("Trend")) lines.append(bestfitline) self.Draw(pyplot.PlotGraphics(lines, _("Total Balance Over Time"), _("Time"), _("Balance"))) def onMotion(self, event): #show closest point (when enbled) if self.GetEnablePointLabel() == True: #make up dict with info for the pointLabel #I've decided to mark the closest point on the closest curve dlst = self.GetClosestPoint( self._getXY(event), pointScaled= True) if dlst != []: #returns [] if none curveNum, legend, pIndex, pointXY, scaledXY, distance = dlst #make up dictionary to pass to my user function (see DrawPointLabel) mDataDict= {"pointXY":pointXY, "scaledXY":scaledXY, "pIndex": pIndex} #pass dict to update the pointLabel self.UpdatePointLabel(mDataDict) event.Skip() #go to next handler def drawPointLabel(self, dc, mDataDict): """ This is the fuction that defines how the pointLabels are plotted dc - DC that will be passed mDataDict - Dictionary of data that you want to use for the pointLabel This just displays the total in a nicely-formatted money string. """ #print mDataDict #if mDataDict['legend'] != 'Balance': # return False dc.SetPen(wx.Pen(wx.BLACK)) dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID )) sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point dc.DrawRectangle(sx-5, sy-5, 10, 10) #10by10 square centered on point px, py = mDataDict["pointXY"] #make a string to display line1, line2 = self.bankController.Model.float2str(py), str(self.pointDates[mDataDict["pIndex"]]) x1, y1 = dc.GetTextExtent(line1) x2, y2 = dc.GetTextExtent(line2) dc.DrawText(line1, sx, sy+1) dc.DrawText(line2, sx-(x2-x1)/2, sy+y1+3) def _xticks(self, *args): ticks = pyplot.PlotCanvas._xticks(self, *args) myTicks = [] lastTick = None for tick in ticks: floatVal = tick[0] stringVal = str(self.startDate + datetime.timedelta(floatVal)) # Don't display this xtick if it isn't different from the last one. if stringVal == lastTick: stringVal = "" else: lastTick = stringVal myTicks.append( (floatVal, stringVal) ) return myTicks def _yticks(self, *args): ticks = pyplot.PlotCanvas._yticks(self, *args) myTicks = [] for tick in ticks: floatVal = tick[0] stringVal = self.bankController.Model.float2str(floatVal) if stringVal.endswith('.00'): stringVal = stringVal[:-3] myTicks.append( (floatVal, stringVal) ) return myTicks wxbanker-0.9.1/wxbanker/po/0000755000175000017500000000000012243601243015540 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/po/ar.po0000644000175000017500000004122512243601243016506 0ustar mrooneymrooney# Arabic translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-03 00:18-0800\n" "PO-Revision-Date: 2009-04-07 12:42+0000\n" "Last-Translator: Kaïs Bejaoui \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= " "3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n" "X-Launchpad-Export-Date: 2010-02-04 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/bankobjects/transaction.py:92 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:94 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:171 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "الحسابات" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "أضف حسابا جديدا" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "إحذف الحساب المختار" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "أعد تسمية الحساب المختار" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:62 msgid "All accounts" msgstr "كل الحسابات" #: wxbanker/accountlistctrl.py:385 wxbanker/accountlistctrl.py:487 msgid "Sorry, an account by that name already exists." msgstr "عفوًا يوجد حساب يحمل نفس الإسم" #: wxbanker/accountlistctrl.py:387 wxbanker/accountlistctrl.py:489 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:421 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:460 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:461 msgid "Warning" msgstr "إنذار" #: wxbanker/accountconfigdialog.py:32 msgid "" "wxBanker can synchronize account balances online if you have an account with " "mint.com" msgstr "" #: wxbanker/accountconfigdialog.py:40 msgid "Username" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Password" msgstr "" #: wxbanker/accountconfigdialog.py:62 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:103 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:105 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:115 wxbanker/csvimportframe.py:184 msgid "Save" msgstr "إحفظ" #: wxbanker/accountconfigdialog.py:116 msgid "Cancel" msgstr "" #: wxbanker/accountconfigdialog.py:136 msgid "Recurring Transactions" msgstr "" #: wxbanker/plots/cairopanel.py:72 wxbanker/plots/cairopanel.py:113 #: wxbanker/plots/wxplotpanel.py:35 wxbanker/plots/wxplotpanel.py:42 msgid "Balance" msgstr "" #: wxbanker/plots/cairopanel.py:76 wxbanker/plots/wxplotpanel.py:40 msgid "Trend" msgstr "" #: wxbanker/plots/cairopanel.py:112 wxbanker/plots/wxplotpanel.py:42 msgid "Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:45 msgid "Dismiss" msgstr "" #: wxbanker/summarytab.py:42 msgid "From" msgstr "" #: wxbanker/summarytab.py:46 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "" #: wxbanker/summarytab.py:50 msgid "Trend Degree" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "أظهر الحاسبة" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "أخف الحاسبة" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "" #: wxbanker/managetab.py:109 msgid "Summary" msgstr "موجز" #: wxbanker/transactionolv.py:48 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:60 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:96 msgid "Date" msgstr "التاريخ" #: wxbanker/transactionolv.py:61 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:110 msgid "Description" msgstr "الوصف" #: wxbanker/transactionolv.py:62 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:104 msgid "Amount" msgstr "المبلغ" #: wxbanker/transactionolv.py:63 msgid "Total" msgstr "الناتج" #: wxbanker/transactionolv.py:204 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:205 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:206 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:218 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:219 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:221 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:222 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "حوّل" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:375 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:377 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:380 msgid "Please enter a number such as 12.34 or -20." msgstr "الرّجاء إدخال عدد مثل 12.34 أو -20" #: wxbanker/newtransactionctrl.py:381 msgid "Invalid Transaction Amount" msgstr "" #: wxbanker/newtransactionctrl.py:392 msgid "Please select an account and then try again." msgstr "الرّجاء إختيار حساب و إعادة المحاولة" #: wxbanker/newtransactionctrl.py:393 wxbanker/newtransactionctrl.py:421 msgid "No account selected" msgstr "" #: wxbanker/newtransactionctrl.py:406 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:406 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:407 msgid "Clear search?" msgstr "" #: wxbanker/newtransactionctrl.py:420 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:453 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:454 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/menubar.py:52 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:52 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:54 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:54 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:61 msgid "Next account" msgstr "" #: wxbanker/menubar.py:64 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:64 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:73 msgid "&Currency" msgstr "" #: wxbanker/menubar.py:73 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:82 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:93 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:93 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:98 msgid "Ask a &Question" msgstr "" #: wxbanker/menubar.py:98 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:103 msgid "&Report a Bug" msgstr "" #: wxbanker/menubar.py:103 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:108 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:108 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:113 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:113 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:120 msgid "&About" msgstr "" #: wxbanker/menubar.py:120 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:123 msgid "&File" msgstr "" #: wxbanker/menubar.py:124 msgid "&View" msgstr "" #: wxbanker/menubar.py:125 msgid "&Settings" msgstr "" #: wxbanker/menubar.py:126 msgid "&Help" msgstr "" #: wxbanker/menubar.py:220 msgid "Copyright" msgstr "" #: wxbanker/menubar.py:221 msgid "A lightweight personal finance management application." msgstr "" #: wxbanker/main.py:79 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:84 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:95 wxbanker/csvimportframe.py:149 #: wxbanker/csvimportframe.py:151 msgid "Preview" msgstr "" #: wxbanker/main.py:104 msgid "Perform" msgstr "" #: wxbanker/main.py:120 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:122 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:186 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:187 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:188 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" #: wxbanker/main.py:189 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:190 msgid "Have fun!" msgstr "" #: wxbanker/main.py:192 msgid "Welcome!" msgstr "" #: wxbanker/main.py:200 msgid "Save changes?" msgstr "حفظ التّغييرات؟" #: wxbanker/main.py:201 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:202 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/searchctrl.py:36 msgid "Search transactions" msgstr "" #: wxbanker/searchctrl.py:39 msgid "More options" msgstr "" #: wxbanker/searchctrl.py:39 msgid "Less options" msgstr "" #: wxbanker/searchctrl.py:50 msgid "Match: " msgstr "" #: wxbanker/searchctrl.py:94 msgid "Show advanced search options" msgstr "" #: wxbanker/searchctrl.py:96 msgid "Hide advanced search options" msgstr "" #: wxbanker/csvimportframe.py:28 msgid "CSV import" msgstr "إستيراد CSV" #: wxbanker/csvimportframe.py:60 msgid "Target account" msgstr "" #: wxbanker/csvimportframe.py:75 wxbanker/csvimportframe.py:77 msgid "Import" msgstr "إستيراد" #: wxbanker/csvimportframe.py:87 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:99 msgid "Date format" msgstr "" #: wxbanker/csvimportframe.py:106 msgid "Decimal separator" msgstr "فاصلة الكسر العشري" #: wxbanker/csvimportframe.py:117 msgid "CSV file settings" msgstr "" #: wxbanker/csvimportframe.py:126 msgid "Skip first line" msgstr "" #: wxbanker/csvimportframe.py:129 msgid "Encoding" msgstr "" #: wxbanker/csvimportframe.py:133 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:144 msgid "File to import" msgstr "" #: wxbanker/csvimportframe.py:164 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:169 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:179 msgid "Load" msgstr "" #: wxbanker/csvimportframe.py:189 msgid "Delete" msgstr "احذف" #: wxbanker/csvimportframe.py:243 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:250 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:251 msgid "CSV import error" msgstr "خطأ في إستيراد CSV" #: wxbanker/csvimportframe.py:301 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:302 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:316 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/currencies.py:277 msgid "detected" msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #~ msgid "Which account will the money come from?" #~ msgstr "من أيّ حساب سيأتي المال؟" #~ msgid "Other accounts" #~ msgstr "حسابات أخرى" #~ msgid "transfer" #~ msgstr "حوِّل" #~ msgid "Account" #~ msgstr "الحساب" #~ msgid "All Accounts" #~ msgstr "كل الحسابات" #~ msgid "Current Account" #~ msgstr "الحساب الحالي" #~ msgid "Show" #~ msgstr "أظهر" #~ msgid "CSV Import" #~ msgstr "إستيراد CSV" wxbanker-0.9.1/wxbanker/po/bg.po0000644000175000017500000006637112243601243016505 0ustar mrooneymrooney# Bulgarian translation for wxbanker # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2011-08-28 14:52+0000\n" "Last-Translator: Dimitar Dimitrov \n" "Language-Team: Bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2011-08-29 04:31+0000\n" "X-Generator: Launchpad (build 13794)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Тенденция" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Месеци" #: wxbanker/summarytab.py:48 msgid "From" msgstr "От" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "на" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Диаграма" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Внасяне на CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Целева сметка" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Отказ" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Внасяне" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Дата" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Формат на датата" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Сума" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Десетичен разделител" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Описание" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Настройки на CSV файла" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Редове за пропускане" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Кодиране" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Разделител на колоните" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Файл за внасяне" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV профили" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Библиотеката на Python simplejson е необходима за зареждане/запазване на csv " "профил." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Запазване" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Премахване" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Изглежда, че кодирането на файла не е '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "По време внасянето на csv файла възникна грешка." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Грешка при внасяне на CSV" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Вече съществува профил с името '%s' exists already. Презаписване?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Презаписване на профила?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Изберете файл и натиснете \"Преглед\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "от" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Трансфер" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Ежедневно" msgstr[1] "На всеки %(num)d дни" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Ежеседмично" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Ежемесечно" msgstr[1] "На всеки %(num)d месеца" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Ежегодишно" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Никога" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "на всеки" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Край:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Повторения:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "ден" msgstr[1] "дни" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "седмица" msgstr[1] "седмици" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "месец" msgstr[1] "месеца" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "година" msgstr[1] "години" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Пон" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Вто" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Сря" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Чет" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Пет" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Съб" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Нед" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Повтаря се в дните:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Начало:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Въведете тази транзакция" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Повтаряема" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Начален баланс" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "В полето 'Сума' няма въведено нищо." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' не е валидна сума." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Моля въведете число като 12.34 или -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Невалидна сума на транзакция" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Моля изберете сметка и опитайте отново." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Не е избрана сметка" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "В момента има активно търсене." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Желаете ли да изтриете текущото търсене и да направите тази транзакция в " "\"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Изчистване на търсенето?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Тази транзакция е маркирана като трансфер. Моля изберете сметката на " "трансфера." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Ако е поставена отметка при добавяне на транзакция, ще бъдете запитани за " "сметка, която да се използва като източник на трансфера." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Например слагайки отметка и въвеждайки транзакция от 50 лв. в тази сметка, " "ще се извадят 50 лв. от сметката, която сте избрали като източник." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Търсене на транзакции" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Още опции" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "По-малко опции" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Съвпадение: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Показване на разширени опции за търсене" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Скриване на разширени опции за търсене" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "Повтаряемата транзакция \"%(description)s\" има %(num)i готови транзакции за " "%(amount)s на %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i повтаряеми транзакции имат готови общо %(totalnum)i транзакции." #: wxbanker/main.py:101 msgid "Preview" msgstr "Преглед" #: wxbanker/main.py:110 msgid "Perform" msgstr "Изпълнение" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Повтаряемата транзакции е добавена успешно." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "Първата транзакция ще се осъществи на %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Изглежда, че за първи път използвате wxBanker!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "За да започнете, добавете сметка, като използвате контрола за сметки в " "горният ляв ъгъл." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Бутоните в контрола за сметки ви позволяват да добавяте, преименувате, " "настройвате и премахвате сметки." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Веднъж създали сметка, можете да добавите транзакции към нея (напр. вашият " "начален баланс), използвайки контролите под мрежата, долу в дясно." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Забавлявайте се!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Добре дошли!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Запазване на промените?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Направили сте промени от последното запазване. Желаете ли да ги запазите " "преди да излезете?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Обърнете внимание, че включването на автоматично запазване от менюто Файл, " "ще премахне нуждата от ръчно запазване." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "За валутата \"%s\" няма обменен курс" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Сметки" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Добавяне на нова сметка" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Премахване на избраната сметка" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Преименуване на избраната сметка" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Настройване на избраната сметка" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Всички сметки" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Без синхронизация с Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Съжаляваме, вече съществува сметка с такова име." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Имената на сметките не могат да бъдат празни" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Име на сметката" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Това ще премахне безвъзвратно сметката '%s' и всичките нейни транзакции. " "Продължаване?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Внимание" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Автоматично запазване" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Автоматично запазване на промените" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Внасяне от CSV файл" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Внасяне на транзакции от CSV файл" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Изнасяне в CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Изнасяне на транзакции в SCV файл" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Предишна сметка" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Следваща сметка" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Показване на сметки с нулев баланс" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Когато е изключено, сметки с баланс 0.00 ще бъдат скривани от списъка" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Валута" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Изберете валута за показване" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Изискване на валута" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Интегриране с Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" "Синхронизиране на балансите по сметките със съществуваща регистрация в " "Mint.com" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Преглед на &ЧЗВ" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Вижте често задаваните въпроси онлайн" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Задавен на a &въпрос" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Задаване на въпрос онлайн" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Съобщаване за грешка" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Онлайн съобщаване за грешка на разработчика" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Искане за нова &функционалност" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Искане за включване на нова функционалност" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "&Превеждане на wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Превеждане на wxBanker на друг език" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Относно" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Допълнителна информация за wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Файл" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Изглед" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Настройки" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Помощ" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Авторски права" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Прости лични финанси." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Ежеседмично през делничните дни" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Ежеседмично през почивните дни" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Понеделниците" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Вторниците" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Средите" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Четвъртъците" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Петъците" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Съботите" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Неделите" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Ежеседмично в %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "На всеки %(num)d седмици в %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " и %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Ежегодишно" msgstr[1] "На всеки %(num)d години" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "до %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Няма описание" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Трансфер от %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Трансфер към %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Резюме:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Показване на калкулатор" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Скриване на калкулатор" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Транзакции" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Резюме" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Не са въведени транзакции." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Няма съответстващи транзакции." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Баланс" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Общо" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Изпращане на %s към калкулатора" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Добавяне на %s към калкулатора" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Изваждане на %s от калкулатора" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Премахване на тази транзакция" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Преместване на тази транзакция в сметка" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Все още няма етикети" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Премахване на тези %i транзакции" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Преместване на тези %i транзакции в сметка" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Все още няма общи етикети" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Добавяне на етикети" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Етикети" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Търсене за този етикет" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Премахване на този етикет" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "баланс" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Тенденция" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Общ баланс във времето" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Време" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "ежемесечно" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "За да използвате библиотеката за изчертаване '%s', инсталирайте следните " "модули на python: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Отхвърляне" #: wxbanker/currencies.py:334 msgid "detected" msgstr "засечено" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Удостоверяване за самоличност в Mint.com:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Запазване на името и паролата в ключодържателя" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Съответстваща регистрация в Mint за %(name)s:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Обновяване" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Потребителско име:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Парола:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Подробности за транзакцията" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" "Това ще премахне безвъзвратно тази повтаряема транзакция. Продължаване?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "В момента тази сметка няма повтаряеми транзакции." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Затваряне" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Изтриване" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Повтаряеми транзакции" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Интеграция с Mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "Можете също така да сложите етикет на транзакция, като поставите " "#именаетикет навсякъде в описанието й." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Етикет:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "За да премахнете този етикет по-късно, просто го премахнете от описанието " "или цъкнете с десен бутон върху транзакцията." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Добавяне на етикет" wxbanker-0.9.1/wxbanker/po/bs.po0000644000175000017500000003755612243601243016524 0ustar mrooneymrooney# Bosnian translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-03 00:18-0800\n" "PO-Revision-Date: 2010-02-03 09:27+0000\n" "Last-Translator: Michael Rooney \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2010-02-04 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/bankobjects/transaction.py:92 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:94 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:171 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Računi" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:62 msgid "All accounts" msgstr "" #: wxbanker/accountlistctrl.py:385 wxbanker/accountlistctrl.py:487 msgid "Sorry, an account by that name already exists." msgstr "" #: wxbanker/accountlistctrl.py:387 wxbanker/accountlistctrl.py:489 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:421 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:460 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:461 msgid "Warning" msgstr "Upozorenje" #: wxbanker/accountconfigdialog.py:32 msgid "" "wxBanker can synchronize account balances online if you have an account with " "mint.com" msgstr "" #: wxbanker/accountconfigdialog.py:40 msgid "Username" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Password" msgstr "" #: wxbanker/accountconfigdialog.py:62 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:103 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:105 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:115 wxbanker/csvimportframe.py:184 msgid "Save" msgstr "" #: wxbanker/accountconfigdialog.py:116 msgid "Cancel" msgstr "" #: wxbanker/accountconfigdialog.py:136 msgid "Recurring Transactions" msgstr "" #: wxbanker/plots/cairopanel.py:72 wxbanker/plots/cairopanel.py:113 #: wxbanker/plots/wxplotpanel.py:35 wxbanker/plots/wxplotpanel.py:42 msgid "Balance" msgstr "Balans" #: wxbanker/plots/cairopanel.py:76 wxbanker/plots/wxplotpanel.py:40 msgid "Trend" msgstr "" #: wxbanker/plots/cairopanel.py:112 wxbanker/plots/wxplotpanel.py:42 msgid "Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:45 msgid "Dismiss" msgstr "" #: wxbanker/summarytab.py:42 msgid "From" msgstr "" #: wxbanker/summarytab.py:46 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "" #: wxbanker/summarytab.py:50 msgid "Trend Degree" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Prikaži digitron" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transakcije" #: wxbanker/managetab.py:109 msgid "Summary" msgstr "Rezime" #: wxbanker/transactionolv.py:48 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:60 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:96 msgid "Date" msgstr "Datum" #: wxbanker/transactionolv.py:61 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:110 msgid "Description" msgstr "Opis" #: wxbanker/transactionolv.py:62 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:104 msgid "Amount" msgstr "Iznos" #: wxbanker/transactionolv.py:63 msgid "Total" msgstr "Ukupno" #: wxbanker/transactionolv.py:204 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:205 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:206 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:218 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:219 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:221 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:222 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Transfer" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:375 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:377 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:380 msgid "Please enter a number such as 12.34 or -20." msgstr "" #: wxbanker/newtransactionctrl.py:381 msgid "Invalid Transaction Amount" msgstr "" #: wxbanker/newtransactionctrl.py:392 msgid "Please select an account and then try again." msgstr "" #: wxbanker/newtransactionctrl.py:393 wxbanker/newtransactionctrl.py:421 msgid "No account selected" msgstr "" #: wxbanker/newtransactionctrl.py:406 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:406 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:407 msgid "Clear search?" msgstr "" #: wxbanker/newtransactionctrl.py:420 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:453 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:454 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/menubar.py:52 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:52 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:54 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:54 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:61 msgid "Next account" msgstr "" #: wxbanker/menubar.py:64 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:64 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:73 msgid "&Currency" msgstr "" #: wxbanker/menubar.py:73 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:82 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:93 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:93 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:98 msgid "Ask a &Question" msgstr "" #: wxbanker/menubar.py:98 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:103 msgid "&Report a Bug" msgstr "" #: wxbanker/menubar.py:103 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:108 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:108 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:113 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:113 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:120 msgid "&About" msgstr "O progr&amu" #: wxbanker/menubar.py:120 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:123 msgid "&File" msgstr "" #: wxbanker/menubar.py:124 msgid "&View" msgstr "" #: wxbanker/menubar.py:125 msgid "&Settings" msgstr "&Postavke" #: wxbanker/menubar.py:126 msgid "&Help" msgstr "&Pomoć" #: wxbanker/menubar.py:220 msgid "Copyright" msgstr "Autorska prava" #: wxbanker/menubar.py:221 msgid "A lightweight personal finance management application." msgstr "" #: wxbanker/main.py:79 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:84 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:95 wxbanker/csvimportframe.py:149 #: wxbanker/csvimportframe.py:151 msgid "Preview" msgstr "" #: wxbanker/main.py:104 msgid "Perform" msgstr "" #: wxbanker/main.py:120 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:122 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:186 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:187 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:188 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" #: wxbanker/main.py:189 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:190 msgid "Have fun!" msgstr "" #: wxbanker/main.py:192 msgid "Welcome!" msgstr "" #: wxbanker/main.py:200 msgid "Save changes?" msgstr "" #: wxbanker/main.py:201 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:202 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/searchctrl.py:36 msgid "Search transactions" msgstr "" #: wxbanker/searchctrl.py:39 msgid "More options" msgstr "" #: wxbanker/searchctrl.py:39 msgid "Less options" msgstr "" #: wxbanker/searchctrl.py:50 msgid "Match: " msgstr "" #: wxbanker/searchctrl.py:94 msgid "Show advanced search options" msgstr "" #: wxbanker/searchctrl.py:96 msgid "Hide advanced search options" msgstr "" #: wxbanker/csvimportframe.py:28 msgid "CSV import" msgstr "CSV Uvoz" #: wxbanker/csvimportframe.py:60 msgid "Target account" msgstr "" #: wxbanker/csvimportframe.py:75 wxbanker/csvimportframe.py:77 msgid "Import" msgstr "Uvoz" #: wxbanker/csvimportframe.py:87 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:99 msgid "Date format" msgstr "Format datuma" #: wxbanker/csvimportframe.py:106 msgid "Decimal separator" msgstr "" #: wxbanker/csvimportframe.py:117 msgid "CSV file settings" msgstr "Postavke CSV datoteke" #: wxbanker/csvimportframe.py:126 msgid "Skip first line" msgstr "" #: wxbanker/csvimportframe.py:129 msgid "Encoding" msgstr "" #: wxbanker/csvimportframe.py:133 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:144 msgid "File to import" msgstr "" #: wxbanker/csvimportframe.py:164 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:169 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:179 msgid "Load" msgstr "" #: wxbanker/csvimportframe.py:189 msgid "Delete" msgstr "" #: wxbanker/csvimportframe.py:243 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:250 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:251 msgid "CSV import error" msgstr "" #: wxbanker/csvimportframe.py:301 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:302 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:316 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/currencies.py:277 msgid "detected" msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #~ msgid "Show" #~ msgstr "Prikaži" #~ msgid "Case Sensitive" #~ msgstr "Razlikuj velika i mala slova" wxbanker-0.9.1/wxbanker/po/ca.po0000644000175000017500000004604312243601243016472 0ustar mrooneymrooney# Catalan translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-08-20 00:01-0700\n" "PO-Revision-Date: 2010-08-20 21:10+0000\n" "Last-Translator: Dept.Técnico (Extreme Micro S.L.) \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-08-21 03:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "" #: wxbanker/summarytab.py:48 msgid "From" msgstr "" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Importació CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importar" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:63 msgid "Date" msgstr "Data" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Format de data" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:65 msgid "Amount" msgstr "Quantitat" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:64 msgid "Description" msgstr "Descripció" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Codificació" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Fitxer a importar" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Desar" #: wxbanker/csvimportframe.py:198 wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Suprimeix" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "La codificació de l'arxiu no sembla ser '%s'" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Ha esdevingut un error durant l'importació de l'arxiu csv." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Transferir" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:341 msgid "Initial balance" msgstr "" #: wxbanker/newtransactionctrl.py:377 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:379 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:382 msgid "Please enter a number such as 12.34 or -20." msgstr "" #: wxbanker/newtransactionctrl.py:383 msgid "Invalid Transaction Amount" msgstr "" #: wxbanker/newtransactionctrl.py:394 msgid "Please select an account and then try again." msgstr "" #: wxbanker/newtransactionctrl.py:395 wxbanker/newtransactionctrl.py:423 msgid "No account selected" msgstr "No s'ha seleccionat cap compte" #: wxbanker/newtransactionctrl.py:408 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:408 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:409 msgid "Clear search?" msgstr "Voleu netejar la cerca?" #: wxbanker/newtransactionctrl.py:422 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:455 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:456 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Més opcions" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Menys opcions" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Coincideix amb: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Mostra opcions de cerca avançades" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:101 msgid "Preview" msgstr "Vista prèvia" #: wxbanker/main.py:110 msgid "Perform" msgstr "" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Passeu-vos-ho bé!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Us donem la benvinguda" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Comptes" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Afegeix un nou compte" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Elimina el compte seleccionat" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Renombra el compte seleccionat" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Configura el compte seleccionat" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Tots els comptes" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Ho sento, un compte amb aquest nom ja existeix." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Avís" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Auto-desa" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Automaticament desa canvis" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Moneda" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Seleccioneu la moneda a mostrar" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Sol·licita una Moneca" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Feu una &pregunta" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&informeu dßun error" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Sol·licita una funcionali&tats" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Sol·licita implementar una nova funcionalitat" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Quant a" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:136 msgid "&File" msgstr "" #: wxbanker/menubar.py:137 msgid "&View" msgstr "" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Paràmetres" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "A&juda" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Copyright" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Mostra la calculadora" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Oculta la calculadora" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transaccions" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Resum" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "" #: wxbanker/transactionolv.py:66 msgid "Total" msgstr "Total" #: wxbanker/transactionolv.py:212 #, python-format msgid "Send %s to calculator" msgstr "Envia %s a la calculadora" #: wxbanker/transactionolv.py:213 #, python-format msgid "Add %s to calculator" msgstr "Afegeix %s a la calculadora" #: wxbanker/transactionolv.py:214 #, python-format msgid "Subtract %s from calculator" msgstr "Treu %s a la calculadora" #: wxbanker/transactionolv.py:226 msgid "Remove this transaction" msgstr "Esborra aquesta transacció" #: wxbanker/transactionolv.py:227 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:228 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:230 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:231 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/transactionolv.py:232 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:234 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:257 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:270 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:271 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:75 msgid "balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:37 wxbanker/plots/wxplotpanel.py:44 #: wxbanker/plots/cairopanel.py:81 wxbanker/plots/cairopanel.py:122 msgid "Balance" msgstr "Saldo" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:85 msgid "Trend" msgstr "Tendència" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:121 msgid "Time" msgstr "" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "" #: wxbanker/currencies.py:334 msgid "detected" msgstr "" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" #~ msgid "Sample Points" #~ msgstr "Punts de mostratge" #~ msgid "All Accounts" #~ msgstr "Tots els comptes" #~ msgid "Current Account" #~ msgstr "Compte actual" #~ msgid "Show" #~ msgstr "Mostra" #~ msgid "Case Sensitive" #~ msgstr "distingeix entre majúscules i minúscules" #~ msgid "Other accounts" #~ msgstr "Altres comptes" wxbanker-0.9.1/wxbanker/po/cs.po0000644000175000017500000005544512243601243016522 0ustar mrooneymrooney# Czech translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2012-08-06 04:09+0000\n" "Last-Translator: Michael Rooney \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2012-08-07 04:45+0000\n" "X-Generator: Launchpad (build 15745)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Z" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "do" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Graf" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "CSV import" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Cílový účet" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Zrušit" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importovat" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Formát sloupců CSV souboru" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Datum" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Formát data" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Částka" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Oddělovač desetinných míst" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Popis" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Nastavení souboru CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Kódování znaků" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Oddělovač sloupců" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Soubor pro importování" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV profily" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Pro načítání/ukládání csv profilů je zapotřebí simlejson knihovna pro Python" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Uložit" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Odstranit" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Kódování znakův souboru není '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Chyba při importu csv souboru" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Chyba CSV importu" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Profil '%s' již existuje. Přepsat?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Přepsat profil ?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Vyberte soubor a klikněte na \"Náhled\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "z" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Převod" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Denně" msgstr[1] "Každé %(num)d dny" msgstr[2] "Každé %(num)d dny" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Týdně" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Ročně" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Nikdy" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "každý" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Končí:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Opakování:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "den" msgstr[1] "dny" msgstr[2] "dnů" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "týden" msgstr[1] "týdny" msgstr[2] "týdnů" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "měsíc" msgstr[1] "měsíce" msgstr[2] "měsíců" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "rok" msgstr[1] "roky" msgstr[2] "let" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Po" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Út" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "St" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Čt" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Pá" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "So" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Ne" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Zadat tuto transakci" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Opakující se" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Počáteční bilance" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Pole 'Částka' neobsahuje žádnou hodnotu." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' není platná částka." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Zadejte číselnou hodnotu, např. 12,34 nebo -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Neplatná částka transakce." #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Vyberte účet a proveďe akci znova." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Není vybrán žádný účet" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Právě probíhá vyhledávání." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Vymazat hledání ?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Tato transakce je označena jako převod mezi používanými účty. Vyberte prosím " "účet." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Vyhledat v transakcích" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Další volby" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Skrýt" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Hledat v: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Zobrazit pokročilé možnosti vyhledávání" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Skrýt pokročilé možnosti vyhledávání" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:101 msgid "Preview" msgstr "Náhled" #: wxbanker/main.py:110 msgid "Perform" msgstr "" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Opakovaná transakce úspěšně přidána." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Zdá se, že spouštíte aplikaci wxBanker poprvé !" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Začněte tím, že přidáte nový účet pomocí tlačítka v levém horním rohu." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Bavte se !!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Vítejte !" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Uložit změny?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "Provedli jste změny. Chcete změny uložit před ukončením aplikace?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Není stanoven kurs měny \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Účty" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Přidat nový účet" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Odstranit vybraný účet" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Přejmenovat vybraný účet" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Konfigurovat vybraný účet" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Všechny účty" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Účet s tímto názvem již existuje." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Názvy účtů nemohou být prázdné." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Název účtu" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "Účet '%s' bude natrvalo smazán. Pokračovat ?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Varování" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Auto-uložení" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Automaticky uložit změny" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Importovat z CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Importovat transakce ze souboru CSV" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Exportovat do CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Exportovat transakce do CSV souboru" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Předchozí účet" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Další účet" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Měna" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Zvolit měnu pro zobrazení" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Zobrazit ča&sto kladené otázky" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Zobrazit ča_sto kladené otázky online" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Položit &otázku" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Položit otázku online" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "O&známit chybu" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Oznámit vývojářům chybu online" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&O aplikaci" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Další informace o aplikaci wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Soubor" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Zobrazit" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Nastavení" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "Ná&pověda" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Autorská práva" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Týdně o běžných dnech" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Týdně o víkendu" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Pondělky" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Úterky" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Středy" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Čtvrtky" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Pátky" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Soboty" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Neděle" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Týdně ve %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "až do %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Bez popisu" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Převod z %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Převod na %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Shrnutí:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Zobrazit kalkulačku" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Skrýt kalkulačku" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transakce" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Souhrn" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Nejsou vloženy žádné transakce." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Žádné odpovídající transakce" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Zůstatek" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Celkem" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Poslat %s do kalkulačky" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Přidat %s do kalkulačky" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Odstranit transakci" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Přesun této transakce na účet" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Odstranit transakce, počet %i" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Přesunout transakce na účet, počet %i" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Trend" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Čas" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "měsíčně" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "K použití grafické knihovny '%s', nainstalujte následující python moduly: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "" #: wxbanker/currencies.py:334 msgid "detected" msgstr "" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Aktualizovat" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Uživatelské jméno:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Heslo:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Transakční informace" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "Tato opakovaná transakce bude trvale zrušena. Pokračovat?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Tento účet nemá v současné době žádné opakující se transakce." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Zavřít" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Odstranit" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Opakující se transakce" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "Pomocí tlačítek v panelu účtů můžete vytvářet, odstraňovat a přejmenovávat " #~ "účty." #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Upozornění: Modul Numpy není k dispozici, z tohoto důvodu nebude zobrazena " #~ "záložka Souhrn. Pro její zobrazení nainstaluje modul Numpy." #~ msgid "All Accounts" #~ msgstr "Všechny účty" #~ msgid "Total" #~ msgstr "Celkem" #~ msgid "Current Account" #~ msgstr "Aktuální účet" #~ msgid "In: " #~ msgstr "V: " #~ msgid "Show" #~ msgstr "Zobrazit" #~ msgid "Case Sensitive" #~ msgstr "Rozlišovat velikost písmen" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "Zda vyhledávat s rozlišováním velikosti písmen" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "Zda skrýt účty, které mají nulový finančním zůstatkem" #~ msgid "Hide zero-balance accounts" #~ msgstr "Skrýt účty s nulovým zůstatkem" #~ msgid "Which account will the money come from?" #~ msgstr "Ze kterého účtu půjdou peníze ?" #~ msgid "transaction" #~ msgstr "transakce" #~ msgid "transfer" #~ msgstr "převod" #~ msgid "Other accounts" #~ msgstr "Další účty" #~ msgid "Sample Points" #~ msgstr "Vzorkovací body" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Upozornění: Nelze odchytit ENTER klávesu komponenty DateCtrl. Pro funkčnost " #~ "upgradujte wxPython na verzi >= 2.8.8.1." #~ msgid "A lightweight personal finance management application." #~ msgstr "Nenáročná osobní finanční aplikace." #~ msgid "Load" #~ msgstr "Nahrát" wxbanker-0.9.1/wxbanker/po/da.po0000644000175000017500000005556012243601243016477 0ustar mrooneymrooney# Danish translation for wxbanker # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2011-05-24 13:02+0000\n" "Last-Translator: mjjzf \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2011-05-25 04:33+0000\n" "X-Generator: Launchpad (build 12959)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Tendensgrad" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Måneder" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Fra" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "til" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Graf" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Import af CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Destinationskonto" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Annuller" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Import" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Opstilling af CSV-kolonner" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Dato" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Datoformat" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Beløb" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Decimaladskiller" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Beskrivelse" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Indstillinger for CSV-fil" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Linier, der springes over" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Tegnkodning" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Kolonneadskiller" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Fil til import" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV-profiler" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Biblioteket Python simplejson er påkrævet import og eksport af CSV-profil." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Gem" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Fjern" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Tegnsættet synes ikke at være '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Der opstod en fejl under import af CSV-filen." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Fejl i CSV-import" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" "Der findes allerede en profil med navnet '%s'. Ønsker du at overskrive den?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Overskriv fil?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Vælg fil og tryk \"Forhåndsvisning\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "fra" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Overførsel" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Dagligt" msgstr[1] "For hver %(num)d dage" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Ugentligt" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Månedligt" msgstr[1] "For hver %(num)d måneder" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Årligt" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Aldrig" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "hver" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Slutter:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Gentages:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "dag" msgstr[1] "dage" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "uge" msgstr[1] "uger" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "måned" msgstr[1] "måneder" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "år" msgstr[1] "år" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Man" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Tir" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Ons" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Tor" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Fre" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Lør" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Søn" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Gentages på dage:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Begynder:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Indsæt denne transaktion" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Gentages" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Startbalance" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Der er ikke indført et beløb i feltet 'Beløb'." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' er ikke et gyldigt beløb." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Vælg venligst et tal som 12,35 eller -20" #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Ugyldigt transaktionsbeløb" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Vælg venligst en konto og forsøg igen." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Ingen konto valgt" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Der er en søgning i gang." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Ønsker du at rydde den nuværende søgning og foretage denne transaktion i " "\"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Ryd søgning?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Denne transaktion er opgivet som overførsel. Indgiv venligst et beløb til " "overførsel." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Hvis denne boks er markeret når en transaktion oprettes, så vil du blive " "spurgt om, hvilken konto du ønsker som kilde til overførsel." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "For eksempel: Hvis du markerer denne boks og indtaster en transaktion på 50 " "kroner til denne konto, så vil det trække 50 kroner fra den konto, som du " "vælger som kilde." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Søg i transaktioner" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Flere valgmuligheder" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Færre valgmuligheder" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Træffer: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Vis avancerede søgeindstillinger" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Skjul avancerede søgeindstillinger" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "Den gentagne transaktion \"%(description)s\" har %(num)i transaktioner klar, " "svarende til %(amount)s på %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i gentagne transaktioner har totalt %(totalnum)i transaktioner klar." #: wxbanker/main.py:101 msgid "Preview" msgstr "Forhåndsvisning" #: wxbanker/main.py:110 msgid "Perform" msgstr "Udfør" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Fast transaktion oprettet korrekt." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "Den første transaktion vil finde sted den %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Det ser ud til at være første gang, du bruger wxBanker!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "For at komme i gang skal du tilføge en konto under kontokontrollen i øverste " "venstre hjørne." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Knapperne på kontokontrollen tillader tilføjelse, omdøbning, opsætning og " "fjernelse af en kontob." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Når du har oprettet en konto, kan du tilføje transaktioner til den (såsom " "startbalance) ved hjælp af felterne under oversigten nederst til højre." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Ha' det skægt!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Velkommen!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Gem ændringer?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Du har lavet ændringer siden der sidst blev gemt. Ønsker du at gemme inden " "programmet lukkes?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Bemærk, at der ikke vil være behov for at gemme manuelt, hvis det i " "Filmenuen vælges at gemme automatisk." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Der er ingen vekselkurs defineret for valutaen \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Konti" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Tilføj ny konto" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Fjern den valgte konto" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Omdøb den valgte konto" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Opsæt den valgte konto" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Alle konti" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Ikke synkroniseret med Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Beklager, der findes allerede en konto med det navn." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Konti kan ikke være uden navn." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Kontonavn" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Dette vil fjerne kontoen '%s' og alle dens transaktioner permanent. Ønsker " "du at fortsætte?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Advarsel" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Gem automatisk" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Gem ændringer automatisk" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Import fra CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Import transaktioner fra CSV-fil" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Eksporter til CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Eksporter transaktioner til CSV-fil" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Tidligere konto" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Næste konto" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Vis konti med nulbalance" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Hvis deaktiveret, så vil konto med en balance på 0,00 blive skjult fra listen" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Valuta" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Vælg valuta til visning" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Anmod om valuta" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integrer med Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Synkroniser kontobalance med en eksisterende konto hos Mint.com" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Vis &OSS" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Vis Ofte Stillede Spørgsmål online" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Stil &spørgsmål" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Stil et spørgsmål online" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Rapporter fejl" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Rapporter en fejl til udvikleren online" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Anmod om &funktion" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Anmod om implementering af ny funktion" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Over&sæt wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Oversæt wxBanker til andet sprog" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Om" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Yderligere oplysninger om wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Fil" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Vis" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Indstillinger" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Hjælp" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Ophavsret" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Enkle personlige finanser" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Ugentligt på hverdage" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Ugentligt på weekender" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Mandage" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Tirsdage" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Onsdage" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Torsdage" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Fredage" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Lørdage" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Søndage" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Ugentligt på %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Hver %(num)d uger på %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " og %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Årligt" msgstr[1] "For hver %(num)d år" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "Indtil %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Ingen beskrivelse" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Overfør fra %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Overfør til %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Resume:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Vis regnemaskine" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Skjul regnemaskine" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transaktioner" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Opsummering" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Ingen transaktioner indlagt." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Ingen matchende transaktioner." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Balance" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Total" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Send %s til regnemaskine" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Læg %s til i regnemaskine" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Træk %s fra regnemaskine" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Fjern denne transaktion" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Flyt denne transaktion til konto" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Endnu ingen mærker" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Fjern disse %i transaktioner" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Flyt disse %i transaktioner til konto" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Ingen fælles mærker endnu" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Tilføj mærke" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Mærker" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Søg efter dette mærke" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Fjern dette mærke" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "balance" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Trend" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Total balance over tid" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Tid" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "månedligt" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "For at bruge plot-biblioteket '%s', så installer følgende Python-moduler: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Afvis" #: wxbanker/currencies.py:334 msgid "detected" msgstr "registreret" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Ingen" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Oplysninger til Mint.com:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Gem oplysninger i nøglering" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Tilhørende Mint-konto for %(name)s:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Opdatering" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Brugernavn:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Adgangskode:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Transaktionsoplysninger" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" "Dette vil fjerne denne gentagne transaktion permanent. Ønsker du at " "fortsætte?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Denne konto har ingen gentagne transaktioner." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Luk" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Slet" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Gentagne transaktioner" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Integration af Mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "Du kan også mærke en transaktion ved at sætte #navn_på_mærke hvor som helst " "i beskrivelsen." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Mærke:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "For at fjerne dette mærke senere kan det ganske enkelt fjernes fra " "beskrivelsen eller ved højreklik på transaktionen." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Tilføj mærke" wxbanker-0.9.1/wxbanker/po/de.po0000644000175000017500000006377212243601243016507 0ustar mrooneymrooney# German translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2012-04-12 14:16+0000\n" "Last-Translator: Sebastian Rahlf \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2012-04-13 05:24+0000\n" "X-Generator: Launchpad (build 15070)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Trend Grad" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Monate" #: wxbanker/summarytab.py:48 msgid "From" msgstr "von" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "zu" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Diagramm" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "CSV Import" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Ziel-Konto" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Abbrechen" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importieren" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "CSV Wirtschaftsteilkarten" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Datum" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Datums-Format" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Betrag" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Dezimal-Trennzeichen" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Beschreibung" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "CSV Datei Einstellungen" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Zu überspringende Zeilen" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Zeichenkodierung" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Spaltentrennzeichen" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Zu importierende Datei" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV-Profile" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Das Python-Modul simplejson wird benötigt, um CSV-Profile laden und " "speichern zu können." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Speichern" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Entfernen" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Die Datei scheint nicht mit '%s' encodiert zu sein!" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Während des CSV-Imports ist ein Fehler aufgetreten." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "CSV-Import-Fehler" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" "Es gibt schon ein Profil mit dem Namen '%s'. Soll es überschrieben werden?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Profil überschreiben?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Datei auswählen und auf \"Vorschau\" klicken" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "von" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Überweisen" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Täglich" msgstr[1] "Alle %(num)d Tage" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Wöchentlich" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Monatlich" msgstr[1] "Alle %(num)d Monate" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Jährlich" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Nie" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "jeder" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Endet:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Wiederholungen:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "Tag" msgstr[1] "Tage" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "Woche" msgstr[1] "Wochen" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "Monat" msgstr[1] "Monate" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "Jahr" msgstr[1] "Jahre" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Montag" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Dienstag" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Mittwoch" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Donnerstag" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Freitag" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Samstag" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Sonntag" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Wiederholen an Tagen:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Beginnt:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Diese Transaktion eingeben" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Wiederkehrend" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Eröffnungskontostand" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Sie haben keinen Betrag im \"Betrag\"-Feld angegeben." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' ist kein gültiger Betrag." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Bitte tragen Sie eine Zahl wie 12.34 oder -20 ein." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Ungültiger Überweisungsbetrag" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Bitte wählen Sie ein Konto aus und versuchen Sie es noch einmal." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Kein Benutzerkonto ausgewählt" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Eine Suche ist derzeit aktiv." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Wollen Sie die aktuelle Suche löschen und diese Überweisung machen in \"%s\" " "?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Suche löschen?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Diese Überweisung ist markiert als Umbuchung. Bitte wählen Sie den " "Umbuchungsaccount." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Wenn diese Box ausgewählt ist wenn Sie eine Überweisung hinzufügen, werden " "Sie gefragt welchen Account genutzt werden sollte als Quelle für die " "Überweisung." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Zum Beispiel, wählen Sie diese Box und geben Sie eine Überweisung von 50$ " "ein. In dieses Konto wird auch 50$ weggenommen dass Sie als Quelle gewählt " "haben." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Transaktionen durchsuchen" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Mehr Optionen" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Weniger Optionen" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Treffer: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Erweiterte Suchoptionen anzeigen" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Erweiterte Suchoptionen ausblenden" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "Die wiederkehrende Überweisung \"%(description)s\" hat %(num)i " "Überweisungen bereit für %(amount)s an %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i wiederkehrende Überweisungen haben ein Total von %(totalnum)i " "Überweisungen bereit." #: wxbanker/main.py:101 msgid "Preview" msgstr "Vorschau" #: wxbanker/main.py:110 msgid "Perform" msgstr "Arbeiten" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Wiederkehrende Überweisung erfolgreich hinzugefügt." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "Die erste Überweisung wird erfolgen am %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Anscheinend benutzen Sie wxBanker zum ersten Mal!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Um zu beginnen, legen Sie oben links im Bedienfeld ein neues Konto an." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Diese Buttons in der Kontokontrolle erlauben es ihnen, Konten um zubenennen, " "hinzuzufügen, Einstellungen festzulegen und Solche zu entfernen." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Sobald Sie ein Konto angelegt haben, können Sie Transaktionen zuweise (wie " "z.B. Ihren anfänglichen Kontostand), indem Sie die Kontrollfelder unten " "rechts benutzen." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Viel Spaß!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Willkommen!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Änderungen speichern?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Sie haben Änderungen vorgenommen seit dem letztem Speichern. Wollen Sie " "speichern bevor Sie gehen?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Anmerkung : Wenn Sie die Auto-Speicherung vom Datei Menu aktivieren, müssen " "Sie manuell speichern." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Kein Umrechnungkurs für Währung \"%s\" vorhanden!" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Konten" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Ein neues Konto hinzufügen" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Entferne ausgewähltes Konto" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Das ausgewählte Konto umbenennen" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Das ausgewählte Konto konfigurieren" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Alle Konten" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Nicht mit Mint.com synchronisiert" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Leider exsistiert schon ein Konto mit diesem Namen." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Kontoname darf nicht leer sein." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Kontoname" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Alle Überweisungen des Kontos '%s' werden unwiederbringlich gelöscht. " "Fortfahren?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Achtung" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Autospeicherung" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Automatisch Änderungen speichern" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Aus CSV importieren" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Transaktionen aus einer CSV-Datei importieren" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Exportiere in eine CSV Datei" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Exportiere Transaktionen in eine CSV Datei" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Vorheriges Konto" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Nächstes Konto" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Zeige leere Konten" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Wenn diese Box deaktiviert ist, werden Konten mit einem leeren Kontostand " "von der Liste verborgen." #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Währung" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Angezeigte Währung auswählen" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Eine Währung anfordern" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integrieren mit Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Synchronisiere Kontostände mit einem existierendem Mint.com Account." #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "&FAQ anzeigen" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Lesen Sie die FAQs online" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Eine Frage stellen" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Stellen Sie online ihre Frage" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "Fehler melden" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Melden Sie einen Fehler online an die Entwickler" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Ein Fea&ture anfordern" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Ein neues Feature vorschlagen, welches implementiert werden soll." #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "wxBanker übersetzen" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "wxBanker in eine andere Sprache übersetzen" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Über" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Mehr Informationen über wxBanker." #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Datei" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Ansicht" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Einstellungen" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Hilfe" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Urheberrecht" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Einfache Finanzverwaltung" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Wöchentlich an Wochentagen" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Wöchentlich an Wochenenden" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Montags" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Dienstags" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Mittwochs" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Donnerstags" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Freitags" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Samstags" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Sonntags" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Wöchentlich an %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Jede %(num)d Wochen am %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " und %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "jährlich" msgstr[1] "Alle %(num)d Jahre" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "bis %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Keine Beschreibung" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Überweisen von %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Überweisen an %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Zusammenfassung:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Taschenrechner anzeigen" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Taschenrechner ausblenden" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Kontobewegungen" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Zusammenfassung" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Keine Transaktionen eingegeben." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Keine übereinsprechenden Transaktionen" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Kontostand" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Total" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Sende %s an Taschenrechner" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Füge %s zum Taschenrechner hinzu" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Subtrahiere %s vom Taschenrechner." #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Diese Transaktion entfernen" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Verschieben dieser Transaktion zu Konto" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Keine Schlagwörter" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Diese %i Transaktionen löschen" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Diese %i Transaktionen verschieben zu Konto" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Keine allgemeinen Schlagwörter gesetzt" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Ein Schlagwort hinzufügen" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Schlagwörter" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Suche nach diesem Schlagword" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Lösche dieses Schlagword" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "Kontostand" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Trend / Verlauf" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Gesamtbetrag über die Zeit" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Zeit" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "monatlich" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "Um '%s' grafische Darstellungsbibliothek nutzen zu können, installieren Sie " "bitte folgende Python Module: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Ablehnen" #: wxbanker/currencies.py:334 msgid "detected" msgstr "entdeckt" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Nichts" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Mint.com Daten:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Daten im Schlüsselbund speichern" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Das zugehörige Mint Konto für %(name)s:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Aktualisierung" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Benutzername:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Kennwort:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Details der Transaktion" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" "Diese Aktion wird die wiederkehrende Überweisung entfernen. Fortfahren?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Dieses Konto hat momentan keinen Dauerauftrag" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Schließen" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Löschen" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Daueraufträge" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Mint.com Einbindung" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "Sie können ein Schlagwort einer Überweisung hinzufügen indem Sie #tagname " "irgendwo in die Beschreibung setzen." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Schlagword" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "Um dieses Schlagwort später zu entfernen, entfernen Sie es von der " "Beschreibung oder klicken Sie rechts auf die Überweisung." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Schlagwort hinzufügen" #~ msgid "Total" #~ msgstr "Gesamt" #~ msgid "All Accounts" #~ msgstr "Alle Konten" #~ msgid "Case Sensitive" #~ msgstr "Groß-/Kleinschreibung beachten" #~ msgid "Show" #~ msgstr "Anzeigen" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Achtung: Das Modul numpy wurde nicht gefunden, deshalb kann die " #~ "Zusammenfassung nicht angezeigt werden. Installieren Sie numpy um dieses " #~ "Problem zu beheben." #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "Kontoumsätze mit $0.00 werden in der Liste ausgeblendet" #~ msgid "Other accounts" #~ msgstr "Andere Konten" #~ msgid "Transact" #~ msgstr "Überweisen" #~ msgid "Which account will the money come from?" #~ msgstr "Von welchem Konto wollen Sie überweisen?" #~ msgid "Current Account" #~ msgstr "ausgewähltes Konto" #~ msgid "transaction" #~ msgstr "Transaktion" #~ msgid "transfer" #~ msgstr "überweisen" #~ msgid "Sample Points" #~ msgstr "Messpunkte" #~ msgid "Hide zero-balance accounts" #~ msgstr "\"Leere\" Konten ausblenden" #~ msgid "In: " #~ msgstr "In: " #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "Mit den Buttons im Kasten \"Konten\" können Sie Konten anlegen, entfernen " #~ "und umbennen." #~ msgid "Load" #~ msgstr "Laden" #~ msgid "CSV Import" #~ msgstr "CSV Import" #~ msgid "&Tools" #~ msgstr "E&xtras" #~ msgid "Account" #~ msgstr "Konto" #~ msgid "Skip first line" #~ msgstr "Erste Zeile ignorieren" #~ msgid "A lightweight personal finance management application." #~ msgstr "Ein leichtgewichtiges Programm für das private Finanzmanagement" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Achtung: Eingabe konnte nicht mit DateCtrl verbunden werden! Updaten Sie zu " #~ "wxPython auf Version >= 2.8.8.1 um dies zu beheben." #~ msgid "Fit Curve Degree" #~ msgstr "Ausgleichskurvengrad" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "" #~ "Keine oder keine passende Errechnung bezogen auf die Errechnung des " #~ "Kapitalertrags aus den Zinsen vorhanden." #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "Es läuft bereits eine Suche. Möchten Sie die aktuelle Suche abbrechen und " #~ "durch %s in \"%s\" ersetzen?" wxbanker-0.9.1/wxbanker/po/el.po0000644000175000017500000004522312243601243016506 0ustar mrooneymrooney# Greek translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2011-08-17 12:38+0000\n" "Last-Translator: vassilis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2011-08-18 04:32+0000\n" "X-Generator: Launchpad (build 13697)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Μήνες" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Από" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "σε" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Γράφημα" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "εισαγωγή CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Άκυρο" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Εισαγωγή" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Ημερομηνία" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Μορφή ημερομηνίας" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Ποσότητα" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Διαχωριστής δεκαδικών" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Περιγραφή" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Ρυθμίσεις αρχείου CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Κωδικοποίηση" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Αρχείο για εισαγωγή" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Ημερησίως" msgstr[1] "Κάθε %(num)d μέρες" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Μηνιαία" msgstr[1] "Κάθε %(num)d μήνες" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "" #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "" #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "" #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:101 msgid "Preview" msgstr "" #: wxbanker/main.py:110 msgid "Perform" msgstr "" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Λογαριασμοί" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Προσθήκη νέου λογαριασμού" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "" #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:133 msgid "&About" msgstr "" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:136 msgid "&File" msgstr "" #: wxbanker/menubar.py:137 msgid "&View" msgstr "" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Εβδομαδιαίως τις καθημερινές" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Εβδομαδιαίως τα σαββατοκύριακα" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Δευτέρες" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Τρίτες" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Τετάρτες" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Πέμπτες" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Παρασκευές" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Σάββατα" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Κυριακές" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Εβδομαδιαίως την %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Κάθε %(num)d βδομάδα την %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " και %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Ετησίως" msgstr[1] "Κάθε %(num)d χρόνια" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "μέχρι %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Καμία περιγραφή" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Μεταφορά απο %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Μεταφορά πρός %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "" #: wxbanker/currencies.py:334 msgid "detected" msgstr "" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" wxbanker-0.9.1/wxbanker/po/en_GB.po0000644000175000017500000006146712243601243017070 0ustar mrooneymrooney# English (United Kingdom) translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2012-08-06 04:09+0000\n" "Last-Translator: Michael Rooney \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" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2012-08-07 04:45+0000\n" "X-Generator: Launchpad (build 15745)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Trend Degree" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Months" #: wxbanker/summarytab.py:48 msgid "From" msgstr "From" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "to" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Graph" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "CSV import" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Target account" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Cancel" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Import" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "CSV columns mapping" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Date" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Date format" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Amount" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Decimal separator" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Description" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "CSV file settings" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Lines to skip" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Encoding" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Column delimiter" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "File to import" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV profiles" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "Python simplejson library is needed for csv profile loading/saving." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Save" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Remove" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "The file encoding does not seem to be '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "An error ocurred during the csv file import." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "CSV import error" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Profile with the name '%s' exists already. Overwrite it ?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Overwrite profile ?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Select file and click \"Preview\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "from" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Transfer" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Daily" msgstr[1] "Every %(num)d days" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Weekly" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Monthly" msgstr[1] "Every %(num)d months" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Yearly" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Never" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "every" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Ends:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Repeats:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "day" msgstr[1] "days" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "week" msgstr[1] "weeks" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "month" msgstr[1] "months" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "year" msgstr[1] "years" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Mon" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Tue" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Wed" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Thu" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Fri" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Sat" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Sun" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Repeats on days:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Starts:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Enter this transaction" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Recurring" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Initial balance" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "No amount entered in the 'Amount' field." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' is not a valid amount." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Please enter a number such as 12.34 or -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Invalid Transaction Amount" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Please select an account and then try again." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "No account selected" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "A search is currently active." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Clear search?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "This transaction is marked as a transfer. Please select the transfer account." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "If this box is ticked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "For example, ticking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Search transactions" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "More options" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Less options" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Match: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Show advanced search options" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Hide advanced search options" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." #: wxbanker/main.py:101 msgid "Preview" msgstr "Preview" #: wxbanker/main.py:110 msgid "Perform" msgstr "Perform" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Recurring transaction successfully added." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "The first transaction will occur on %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "It looks like this is your first time using wxBanker!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "To get started, add an account using the account control in the top left " "corner." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Have fun!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Welcome!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Save changes?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "You have made changes since the last save. Would you like to save before " "exiting?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Copy text \t No exchange rate for currency \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Accounts" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Add a new account" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Remove the selected account" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Rename the selected account" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Configure the selected account" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "All accounts" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Not synchronised with Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Sorry, an account by that name already exists." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Account names cannot be blank." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Account name" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Warning" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Auto-save" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Automatically save changes" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Import from CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Import transactions from a CSV file" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Export to CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Export transactions to a CSV file" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Previous account" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Next account" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Show zero-balance accounts" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Currency" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Select currency to display" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Request a Currency" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integrate with Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Sync account balances with an existing Mint.com account" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "View &FAQs" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "View Frequently Asked Questions online" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Ask a &Question" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Ask a question online" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Report a Bug" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Report a bug to the developer online" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Request a Fea&ture" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Request a new feature to be implemented" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Tran&slate wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Translate wxBanker to another language" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&About" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "More information about wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&File" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&View" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Settings" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Help" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Copyright" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Simple personal finance." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Weekly on weekdays" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Weekly on weekends" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Mondays" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Tuesdays" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Wednesdays" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Thursdays" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Fridays" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Saturdays" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Sundays" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Weekly on %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Every %(num)d weeks on %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " and %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Annually" msgstr[1] "Every %(num)d years" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "until %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "No description" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Transfer from %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Transfer to %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Summary:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Show Calculator" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Hide Calculator" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transactions" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Summary" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "No transactions entered." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "No matching transactions" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Balance" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Total" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Send %s to calculator" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Add %s to calculator" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Subtract %s from calculator" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Remove this transaction" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Move this transaction to account" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "No tags yet" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Remove these %i transactions" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Move these %i transactions to account" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "No common tags yet" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Add a tag" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Tags" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Search for this tag" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Remove this tag" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "balance" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Trend" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Total Balance Over Time" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Time" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "monthly" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "To use '%s' plotting library, install following python modules: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Dismiss" #: wxbanker/currencies.py:334 msgid "detected" msgstr "detected" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "None" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Mint.com credentials:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Save credentials in keyring" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Corresponding Mint account for %(name)s:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Update" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Username:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Password:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Transaction details" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "This will permanently remove this recurring transaction. Continue?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "This account currently has no recurring transactions." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Close" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Delete" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Recurring Transactions" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Mint.com Integration" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "You can also tag a transaction by putting #tagname anywhere in the " "description." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Tag:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Add Tag" #~ msgid "Sample Points" #~ msgstr "Sample Points" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgid "Fit Curve Degree" #~ msgstr "Fit Curve Degree" #~ msgid "A lightweight personal finance management application." #~ msgstr "A lightweight personal finance management application." #~ msgid "All Accounts" #~ msgstr "All Accounts" #~ msgid "Total" #~ msgstr "Total" #~ msgid "Current Account" #~ msgstr "Current Account" #~ msgid "In: " #~ msgstr "In: " #~ msgid "Show" #~ msgstr "Show" #~ msgid "Case Sensitive" #~ msgstr "Case Sensitive" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "Whether or not to match based on capitalisation" #~ msgid "Transact" #~ msgstr "Transact" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgid "Which account will the money come from?" #~ msgstr "Which account will the money come from?" #~ msgid "transfer" #~ msgstr "transfer" #~ msgid "transaction" #~ msgstr "transaction" #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgid "Other accounts" #~ msgstr "Other accounts" #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "The buttons in the account control allow you to add, remove and rename an " #~ "account, respectively." #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgid "Hide zero-balance accounts" #~ msgstr "Hide zero balance accounts" #~ msgid "Skip first line" #~ msgstr "Skip first line" #~ msgid "Load" #~ msgstr "Load" #~ msgid "CSV Import" #~ msgstr "CSV Import" #~ msgid "&Tools" #~ msgstr "&Tools" #~ msgid "Account" #~ msgstr "Account" wxbanker-0.9.1/wxbanker/po/es.po0000644000175000017500000006332312243601243016516 0ustar mrooneymrooney# Spanish translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2012-08-06 04:09+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" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2012-08-07 04:45+0000\n" "X-Generator: Launchpad (build 15745)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Grado de tendencia" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Meses" #: wxbanker/summarytab.py:48 msgid "From" msgstr "De" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "a" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Gráfica" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Importar CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Cuenta objetivo" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Cancelar" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importar" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Asociación de columnas CSV" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Fecha" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Formato de fecha" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Cantidad" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Separador decimal" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Descripción" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Preferencias de archivo CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Líneas a omitir" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Codificación" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Delimitador de columnas" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Archivo a importar" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "Perfiles CSV" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Se necesita la librería de Python simplejson para cargar/guardar perfiles " "CSV." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Guardar" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Eliminar" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "La codificación del archivo parece no ser '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Ha ocurrido un error durante la importación del archivo CSV." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Error de importación del CSV" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Ya existe un perfil con el nombre '%s'. ¿Desea sobrescribirlo?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "¿Sobrescribir perfil?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Seleccione un archivo y pulse \"Previsualizar\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "de" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Transferir" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Diariamente" msgstr[1] "Cada %(num)d days" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Semanalmente" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Mensualmente" msgstr[1] "Cada %(num)d meses" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Anualmente" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Nunca" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "cada" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Termina:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Repeticiones:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "día" msgstr[1] "días" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "semana" msgstr[1] "semanas" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "mes" msgstr[1] "meses" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "año" msgstr[1] "años" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Lun" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Mar" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Mié" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Jue" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Vie" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Sáb" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Dom" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Se repite en días:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Comienza:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Introducir transacción" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Recurrente" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Balance inicial" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "No se ha introducido ningún valor en el campo 'Cantidad'" #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' no es una cantidad válida." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Por favor, introduzca un número como 12.34 o -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Cantidad inválidad para realizar transacción" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Por favor, seleccione una cuenta e inténtelo de nuevo." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "No hay ninguna cuenta seleccionada" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Hay una búsqueda activa." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "Desea limpiar la búsqueda actual y hacer esta transacción en \"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "¿Limpiar búsqueda?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Esta transacción está marcada como una transferencia. Por favor, seleccione " "la cuenta a transferir." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Si esta opción está seleccionada cuando se realice una transacción, se le " "preguntará cuál es la cuenta de la que viene el dinero." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Por ejemplo, al marcar la casilla al introducir una transacción de 50$ en " "esta cuenta le quitará 50$ de la cuenta que haya escogido como origen." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Buscar transacciones" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Más opciones" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Menos opciones" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Coincide: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Mostrar opciones avanzadas de búsqueda" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Ocultar opciones avanzadas de búsqueda" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "La transacción recurrente \"%(description)s\" tiene %(num)i transacciones " "listas por %(amount)s en %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i transacciones recurrentes tienen un total de %(totalnum)i " "transacciones listas." #: wxbanker/main.py:101 msgid "Preview" msgstr "Vista previa" #: wxbanker/main.py:110 msgid "Perform" msgstr "Ejecutar" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Transacción recurrente añadida exitosamente." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "La primera transacción ocurrirá el %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "¡Parece que es la primera vez que usa wxBanker!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Para empezar, añada una cuenta usando el control de cuentas en la esquina " "superior izquierda." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Los botones en el control de cuenta le permiten añadir, renombrar, " "configurar y eliminar una cuenta, respectivamente." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Una vez que haya creado una cuenta, le puede añadir transacciones como por " "ejemplo, su balance inicial, usando los controles por debajo de la rejilla, " "abajo a la derecha." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "¡Páselo bien!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "¡Bienvenido!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "¿Guardar los cambios?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Ha hecho cambios desde la última vez que guardó. ¿Dese guardar antes de " "salir?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Tenga en cuenta que activar el autoguardado desde el menú de archivos " "eliminará la necesidad de guardar manualmente." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "No hay tipo de cambio para la moneda \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Cuentas" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Añadir una cuenta nueva" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Eliminar la cuenta seleccionada" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Renombrar la cuenta seleccionada" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Configurar la cuenta seleccionada" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Todas las cuentas" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "No está sicronizado con Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Lo siento, pero ya existe una cuenta con ese nombre." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Los nombres de cuenta no pueden quedar en blanco." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Nombre de cuenta" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Se eliminará permanentemente la cuenta '%s' y todas sus transacciones. " "¿Desea continuar?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Aviso" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Autoguardar" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Guardar automáticamente los cambios" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Importar desde CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Importar transacciones desde un archivo CSV" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Exportar a CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Exportar transacciones a un archivo CSV" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Cuenta anterior" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Siguiente cuenta" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Mostrar cuentas con balance a cero" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Si está desactivado, las cuentas con un balance de $0.00 no se mostrarán en " "la lista" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Moneda" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Selecionar moneda a mostrar" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Solicitar una moneda" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integrar con Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Sincronizar balances de cuenta con una cuenta existente de Mint.com." #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Ver PU&Fs" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Ver Preguntas Usualmente Frecuentes en internet" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Hacer una &pregunta" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Haga una pregunta en línea" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Informar de un error" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Informar de un error a un desarrollador vía internet" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Solicitar una cara&cterística" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Solicitar que se implemente una nueva característica" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Tradu&cir wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Traducir wxBanker a otro idioma" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Acerca de" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Más información sobre wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Archivo" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Ver" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "Opcione&s" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "A&yuda" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Copyright" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Finanzas personales sencillas." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Semanalmente en días laborables:" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Semanalmente en fines de semana" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Lunes" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Martes" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Miércoles" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Jueves" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Viernes" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Sábados" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Domingos" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Semanalmente en %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Cada %(num)d semanas de %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " y %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Anualmente" msgstr[1] "Cada %(num)d años" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "hasta %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Sin descripción" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Transferir desde %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Transferir a %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Resumen:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Mostrar calculadora" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Ocultar calculadora" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transacciones" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Resumen" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "No se ha introducido una transacción." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "No hay traducciones que coincidan." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Balance" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Total" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Enviar %s a la calculadora." #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Sumar %s a la calculadora" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Restar %s de la calculadora" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Eliminar transacción" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Mover esta transacción a cuenta" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Sin etiquetas" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Eliminar estas %i transacciones" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Mover estas %i transacciones a cuenta" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Sin etiquetas comunes" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Añadir una etiqueta" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Etiquetas" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Buscar esta etiqueta" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Eliminar esta etiqueta" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "balance" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Tendencia" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Balance total del periodo" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Tiempo" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "mensualmente" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "Para usar la biblioteca para dibujar '%s', instale los siguientes módulos de " "Python: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Descartar" #: wxbanker/currencies.py:334 msgid "detected" msgstr "detectado" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Ninguno" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Credenciales de Mint.com:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Guardar credenciales en anillo de claves" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Cuenta de Mint correspondiente a %(name)s:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Actualizar" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Nombre de usuario:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Contraseña:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Detalles de la transacción" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "Esto eliminará esta operación recurrente. ¿Desea continuar?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Esta cuenta no tiene transacciones recurrentes por el momento." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Cerrar" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Eliminar" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Transacciones recurrentes" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Integración con mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "También puede etiquetar una transacción añadiendo #nombreetiqueta en la " "descripción." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Etiqueta:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "Para eliminar esta etiqueta, elimínela de la descripción o pulse con el " "botón derecho en la transacción." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Añadir etiqueta" #~ msgid "Sample Points" #~ msgstr "Puntos de ejemplo" #~ msgid "Total" #~ msgstr "Total" #~ msgid "All Accounts" #~ msgstr "Todas las cuentas" #~ msgid "Current Account" #~ msgstr "Cuenta actual" #~ msgid "Case Sensitive" #~ msgstr "Distinguir mayúsculas/minúsculas" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "Corresponder o no la capitalización" #~ msgid "Hide zero-balance accounts" #~ msgstr "Ocultar cuentas con saldo cero" #~ msgid "In: " #~ msgstr "En: " #~ msgid "Show" #~ msgstr "Mostrar" #~ msgid "Transact" #~ msgstr "Tramitar" #~ msgid "transfer" #~ msgstr "transferir" #~ msgid "transaction" #~ msgstr "transacción" #~ msgid "Which account will the money come from?" #~ msgstr "¿De qué cuenta viene el dinero?" #~ msgid "Other accounts" #~ msgstr "Otras cuentas" #~ msgid "Fit Curve Degree" #~ msgstr "Grado de la curva de ajuste" #~ msgid "Skip first line" #~ msgstr "Ignorar la primera línea" #~ msgid "Load" #~ msgstr "Cargar" #~ msgid "Account" #~ msgstr "Cuenta" #~ msgid "CSV Import" #~ msgstr "Importar de CSV" #~ msgid "&Tools" #~ msgstr "&Herramientas" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "" #~ "Cuando esté activado, las cuentas con saldo de $0.00 se ocultarán de la lista" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Aviso: no se puede asociar el ENTER de DateCtrl. Actualice a wxPython >= " #~ "2.8.8.1 para arreglar esto." #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "Hay una búsqueda activa. ¿Desea limpiar la búsqueda actual y hacer %s en " #~ "\"%s\"?" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Aviso: el módulo numpy no está disponible, la pestaña de Resumen se ha " #~ "deshabilitado. Instale numpy para arreglar esto." #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "Los botones de control de cuentas le permiten añadir, eliminar y cambiar el " #~ "nombre a una cuenta (resp.)." #~ msgid "A lightweight personal finance management application." #~ msgstr "Una aplicación ligera para gestionar sus finanzas personales." wxbanker-0.9.1/wxbanker/po/et.po0000644000175000017500000004340112243601243016512 0ustar mrooneymrooney# Estonian translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-08-20 00:01-0700\n" "PO-Revision-Date: 2010-08-20 08:16+0000\n" "Last-Translator: Michael Rooney \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-08-21 03:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "" #: wxbanker/summarytab.py:48 msgid "From" msgstr "" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "kuni" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:63 msgid "Date" msgstr "" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:65 msgid "Amount" msgstr "" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:64 msgid "Description" msgstr "Kirjeldus" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "" #: wxbanker/csvimportframe.py:198 wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Lõppeb" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "nädal" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "P" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:341 msgid "Initial balance" msgstr "" #: wxbanker/newtransactionctrl.py:377 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:379 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:382 msgid "Please enter a number such as 12.34 or -20." msgstr "" #: wxbanker/newtransactionctrl.py:383 msgid "Invalid Transaction Amount" msgstr "" #: wxbanker/newtransactionctrl.py:394 msgid "Please select an account and then try again." msgstr "" #: wxbanker/newtransactionctrl.py:395 wxbanker/newtransactionctrl.py:423 msgid "No account selected" msgstr "" #: wxbanker/newtransactionctrl.py:408 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:408 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:409 msgid "Clear search?" msgstr "" #: wxbanker/newtransactionctrl.py:422 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:455 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:456 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "" #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:101 msgid "Preview" msgstr "" #: wxbanker/main.py:110 msgid "Perform" msgstr "" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "" #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Uue lisavõimaluse tellimine" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:133 msgid "&About" msgstr "" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:136 msgid "&File" msgstr "" #: wxbanker/menubar.py:137 msgid "&View" msgstr "" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "" #: wxbanker/transactionolv.py:66 msgid "Total" msgstr "" #: wxbanker/transactionolv.py:212 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:213 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:214 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:226 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:227 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:228 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:230 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:231 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/transactionolv.py:232 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:234 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:257 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:270 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:271 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:75 msgid "balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:37 wxbanker/plots/wxplotpanel.py:44 #: wxbanker/plots/cairopanel.py:81 wxbanker/plots/cairopanel.py:122 msgid "Balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:85 msgid "Trend" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:121 msgid "Time" msgstr "" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "" #: wxbanker/currencies.py:334 msgid "detected" msgstr "" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" wxbanker-0.9.1/wxbanker/po/fa.po0000644000175000017500000004201712243601243016472 0ustar mrooneymrooney# Persian translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-03 00:18-0800\n" "PO-Revision-Date: 2009-02-16 19:43+0000\n" "Last-Translator: Opatan \n" "Language-Team: Persian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2010-02-04 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/bankobjects/transaction.py:92 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:94 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:171 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "حساب‌ها" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "افزودن یک حساب جدید" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "حذف حساب انتخاب شده" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "تغییرنام حساب انتخاب شده" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "پیکربندی حساب انتخاب شده" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:62 msgid "All accounts" msgstr "" #: wxbanker/accountlistctrl.py:385 wxbanker/accountlistctrl.py:487 msgid "Sorry, an account by that name already exists." msgstr "" #: wxbanker/accountlistctrl.py:387 wxbanker/accountlistctrl.py:489 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:421 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:460 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:461 msgid "Warning" msgstr "اخطار" #: wxbanker/accountconfigdialog.py:32 msgid "" "wxBanker can synchronize account balances online if you have an account with " "mint.com" msgstr "" #: wxbanker/accountconfigdialog.py:40 msgid "Username" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Password" msgstr "" #: wxbanker/accountconfigdialog.py:62 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:103 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:105 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:115 wxbanker/csvimportframe.py:184 msgid "Save" msgstr "" #: wxbanker/accountconfigdialog.py:116 msgid "Cancel" msgstr "" #: wxbanker/accountconfigdialog.py:136 msgid "Recurring Transactions" msgstr "" #: wxbanker/plots/cairopanel.py:72 wxbanker/plots/cairopanel.py:113 #: wxbanker/plots/wxplotpanel.py:35 wxbanker/plots/wxplotpanel.py:42 msgid "Balance" msgstr "تراز" #: wxbanker/plots/cairopanel.py:76 wxbanker/plots/wxplotpanel.py:40 msgid "Trend" msgstr "روند" #: wxbanker/plots/cairopanel.py:112 wxbanker/plots/wxplotpanel.py:42 msgid "Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:45 msgid "Dismiss" msgstr "" #: wxbanker/summarytab.py:42 msgid "From" msgstr "" #: wxbanker/summarytab.py:46 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "" #: wxbanker/summarytab.py:50 msgid "Trend Degree" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "ماشین‌حساب را نشان بده" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "ماشین‌حساب را نشان نده" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "تراکنش" #: wxbanker/managetab.py:109 msgid "Summary" msgstr "خلاصه" #: wxbanker/transactionolv.py:48 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:60 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:96 msgid "Date" msgstr "تاریخ" #: wxbanker/transactionolv.py:61 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:110 msgid "Description" msgstr "توصیف" #: wxbanker/transactionolv.py:62 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:104 msgid "Amount" msgstr "" #: wxbanker/transactionolv.py:63 msgid "Total" msgstr "جمع" #: wxbanker/transactionolv.py:204 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:205 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:206 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:218 msgid "Remove this transaction" msgstr "این تراکنش را حذف کن" #: wxbanker/transactionolv.py:219 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:221 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:222 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:375 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:377 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:380 msgid "Please enter a number such as 12.34 or -20." msgstr "" #: wxbanker/newtransactionctrl.py:381 msgid "Invalid Transaction Amount" msgstr "" #: wxbanker/newtransactionctrl.py:392 msgid "Please select an account and then try again." msgstr "" #: wxbanker/newtransactionctrl.py:393 wxbanker/newtransactionctrl.py:421 msgid "No account selected" msgstr "هیچ حسابی انتخاب نشده" #: wxbanker/newtransactionctrl.py:406 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:406 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:407 msgid "Clear search?" msgstr "" #: wxbanker/newtransactionctrl.py:420 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:453 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:454 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/menubar.py:52 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:52 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:54 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:54 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:61 msgid "Next account" msgstr "" #: wxbanker/menubar.py:64 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:64 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:73 msgid "&Currency" msgstr "واحد پول&" #: wxbanker/menubar.py:73 msgid "Select currency to display" msgstr "واحد پول را برای نمایش بگزینید." #: wxbanker/menubar.py:82 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:93 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:93 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:98 msgid "Ask a &Question" msgstr "پرسشی بپرسید" #: wxbanker/menubar.py:98 msgid "Ask a question online" msgstr "پرسسی را برخط بپرسید" #: wxbanker/menubar.py:103 msgid "&Report a Bug" msgstr "خطایی را گزارش دهید&" #: wxbanker/menubar.py:103 msgid "Report a bug to the developer online" msgstr "خطایی را برخط به برنامه‌سازگزارش دهید" #: wxbanker/menubar.py:108 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:108 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:113 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:113 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:120 msgid "&About" msgstr "درباره&" #: wxbanker/menubar.py:120 msgid "More information about wxBanker" msgstr "اطلاعات بیشتر درباره wxBanker" #: wxbanker/menubar.py:123 msgid "&File" msgstr "" #: wxbanker/menubar.py:124 msgid "&View" msgstr "" #: wxbanker/menubar.py:125 msgid "&Settings" msgstr "تنظیمات&" #: wxbanker/menubar.py:126 msgid "&Help" msgstr "کمک&" #: wxbanker/menubar.py:220 msgid "Copyright" msgstr "کپی‌رایت" #: wxbanker/menubar.py:221 msgid "A lightweight personal finance management application." msgstr "برنامه مدیریت مالی شخصی سبک" #: wxbanker/main.py:79 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:84 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:95 wxbanker/csvimportframe.py:149 #: wxbanker/csvimportframe.py:151 msgid "Preview" msgstr "" #: wxbanker/main.py:104 msgid "Perform" msgstr "" #: wxbanker/main.py:120 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:122 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:186 msgid "It looks like this is your first time using wxBanker!" msgstr "به نظر می‌آید که نخستین باری است که این نرم‌افزار را بکار می‌گیرید." #: wxbanker/main.py:187 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "برای شروع،با استفاده از کنترل حساب در گوشه سمت چپ بالا یک حساب اضافه کنید." #: wxbanker/main.py:188 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" "دکمه‌های روی کنترل حساب به شما اجازه می‌دهد که به‌ترتیب یک حساب را اضافه " "کنید،حذف کنید یا تغییر نام دهید." #: wxbanker/main.py:189 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:190 msgid "Have fun!" msgstr "خوش بگذره" #: wxbanker/main.py:192 msgid "Welcome!" msgstr "خوش آمدید" #: wxbanker/main.py:200 msgid "Save changes?" msgstr "" #: wxbanker/main.py:201 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:202 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/searchctrl.py:36 msgid "Search transactions" msgstr "جستجوی تراکنش" #: wxbanker/searchctrl.py:39 msgid "More options" msgstr "" #: wxbanker/searchctrl.py:39 msgid "Less options" msgstr "" #: wxbanker/searchctrl.py:50 msgid "Match: " msgstr "" #: wxbanker/searchctrl.py:94 msgid "Show advanced search options" msgstr "" #: wxbanker/searchctrl.py:96 msgid "Hide advanced search options" msgstr "" #: wxbanker/csvimportframe.py:28 msgid "CSV import" msgstr "" #: wxbanker/csvimportframe.py:60 msgid "Target account" msgstr "" #: wxbanker/csvimportframe.py:75 wxbanker/csvimportframe.py:77 msgid "Import" msgstr "" #: wxbanker/csvimportframe.py:87 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:99 msgid "Date format" msgstr "" #: wxbanker/csvimportframe.py:106 msgid "Decimal separator" msgstr "" #: wxbanker/csvimportframe.py:117 msgid "CSV file settings" msgstr "" #: wxbanker/csvimportframe.py:126 msgid "Skip first line" msgstr "" #: wxbanker/csvimportframe.py:129 msgid "Encoding" msgstr "" #: wxbanker/csvimportframe.py:133 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:144 msgid "File to import" msgstr "" #: wxbanker/csvimportframe.py:164 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:169 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:179 msgid "Load" msgstr "" #: wxbanker/csvimportframe.py:189 msgid "Delete" msgstr "" #: wxbanker/csvimportframe.py:243 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:250 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:251 msgid "CSV import error" msgstr "" #: wxbanker/csvimportframe.py:301 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:302 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:316 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/currencies.py:277 msgid "detected" msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #~ msgid "All Accounts" #~ msgstr "همه حساب‌ها" #~ msgid "Case Sensitive" #~ msgstr "حساس به بزرگ‌وکوچک" #~ msgid "transaction" #~ msgstr "تراکنش" #~ msgid "Other accounts" #~ msgstr "دیگر حساب‌ها" wxbanker-0.9.1/wxbanker/po/fi.po0000644000175000017500000005630212243601243016504 0ustar mrooneymrooney# Finnish translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2011-10-28 12:48+0000\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2011-10-29 05:13+0000\n" "X-Generator: Launchpad (build 14197)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Kuukausia" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Alkaen" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Kuvaaja" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "CSV-tuonti" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Kohdetili" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Peruuta" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Tuo" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Päivämäärä" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Päivämäärän muoto" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Määrä" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Desimaalierotin" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Kuvaus" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "CSV-tiedoston asetukset" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Ohitettavat rivit" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Merkistökoodaus" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Sarakkeiden erotin" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Tuotava tiedosto" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV-profiilit" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "CSV-profiilin lataus ja tallennus vaativat Python-kirjasto simplejsonin." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Tallenna" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Poista" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Tiedoston merkistökoodaus ei vaikuta olevan '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "CSV-tuonnin aikana tapahtui virhe." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "CSV-tuontivirhe" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Profiili nimeltä '%s' on jo olemassa. Korvataanko se?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Korvataanko profiili?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Valitse tiedosto ja napsauta \"Esikatsele\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "tililtä" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Siirto" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Päivittäin" msgstr[1] "%(num)d päivän välein" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Viikoittain" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Kuukausittain" msgstr[1] "%(num)d kuukauden välein" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Vuosittain" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Ei koskaan" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "joka" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Päättyy:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Toistuu:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "päivä" msgstr[1] "päivää" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "viikko" msgstr[1] "viikkoa" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "kuukausi" msgstr[1] "kuukautta" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "vuosi" msgstr[1] "vuotta" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Ma" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Ti" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Ke" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "To" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Pe" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "La" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Su" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Toista seuraavina päivinä:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Alkaa:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Syötä tämä tapahtuma" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Toistuva" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Alkusaldo" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Summaa ei ole kirjoitettu \"Määrä\"-kenttään." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' ei ole kelvollinen määrä." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Anna kelvollinen lukuarvo, kuten 12,34 tai -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Tapahtuman summa on virheellinen" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Valitse tili ja yritä sitten uudelleen" #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Yhtään tiliä ei ole valittu" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Haku on parhaillaan aktiivisena." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Tyhjennetäänkö haku?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Tämän ollessa valittuna, tilitapahtumaa lisättäessä kysytään miltä tililtä " "siirto tapahtui." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Etsi tapahtumia" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Lisää valintoja" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Vähemmän valintoja" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Hae sarakkeesta: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Näytä haun lisävalinnat" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Piilota laajennetut hakuominaisuudet" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:101 msgid "Preview" msgstr "Esikatsele" #: wxbanker/main.py:110 msgid "Perform" msgstr "Suorita" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Toistuva tapahtuma lisätty onnistuneesti" #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "Ensimmäinen tapahtuma suoritetaan %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Vaikuttaa siltä, että wxBanker käynnistyy nyt ensimmäistä kertaa!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "Lisää aluksi vasemmasta yläkulmasta itsellesi tili." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Painikkeet tilihallinnassa mahdollistavat tilin lisäyksen, " "uudelleennimeämisen, muokkauksen ja poiston." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Kun olet luonnut itsellesi tilin, voit lisätä maksutapahtumia (kuten " "alkusaldon) käyttäen oikean alakulman toimintoja." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Viihtyisiä hetkiä!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Tervetuloa!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Tallennetaanko muutokset?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Olet tehnyt muutoksia viimeisimmän tallennuskerran jälkeen. Halutko " "tallentaa muutokset, ennen kuin ohjelma suljetaan?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Ota huomioon, että automaattisen tallennuksen käyttöönotto Tiedosto-" "valikosta poistaa manuaalisen tallennuksen tarpeen." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Ei vaihtokurssia valuutalle \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Tilit" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Lisää uusi tili" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Poista valittu tili" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Nimeä valittu tili uudelleen" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Muokkaa valittua tiliä" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Kaikki tilit" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Ei synkronoitu Mint.com-palvelun kanssa" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Valittu nimi on jo käytössä toisella tilillä." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Tilin nimi ei voi olla tyhjä." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Tilin nimi" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Tämä poistaa pysyvästi valitun tilin '%s' ja kaikki sen tapahtumat. " "Jatketaanko?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Varoitus" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Automaattinen tallennus" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Tallenna muutokset automaattisesti" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Tuo CSV-tiedostosta" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Tuo tapahtumat CSV-tiedostosta" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Vie CSV-tiedostoon" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Vie tapahtumat CSV-tiedostoon" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Edellinen tili" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Seuraava tili" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Näytä nollasaldon tilit" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "Jos pois käytöstä, piilotetaan tilit joiden saldo on nolla" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Valuutta" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Valitse näytettävä valuutta" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Esitä valuuttaa lisättäväksi ohjelmaan" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integroi Mint.com-palvelun kanssa" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Synkronoi tilitiedot käytössä olevan Mint.com-tilin kanssa" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "&Lue usein kysytyt kysymykset" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Lue usein kysyttyjä kysymyksiä Internetissä" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Esitä &kysymys" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Esitä kysymys Internetissä" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Ilmoita ohjelmistovirheestä" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Ilmoita virheestä kehittäjälle" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Pyydä &uutta ominaisuutta" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Pyydä uutta ominaisuutta ohjelmaan" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Kää&nnä wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Käännä wxBanker haluamallesi kielelle" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Tietoja" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Lisätietoja wxBankerista" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Tiedosto" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Näkymä" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Asetukset" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Ohje" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Tekijänoikeus" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Yksinkertaista henkilökohtaista varainhoitoa." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Viikottain arkisin" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Viikottain viikonloppuisin" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "maanantaisin" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "tiistaisin" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "keskiviikkoisin" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "torstaisin" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "perjantaisin" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "lauantaisin" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "sunnuntaisin" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Viikottain %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "%(num)d viikon välein %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " ja %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Vuosittain" msgstr[1] "%(num)d vuoden välein" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "päättyen %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Ei kuvausta" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Siirrä tililtä %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Siirrä tilille %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Yhteenveto:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Näytä laskin" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Piilota laskin" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Tapahtumat" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Yhteenveto" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Tapahtumia ei ole kirjattu." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Ei vastaavia tapahtumia." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Saldo" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Yhteensä" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Lähetä %s laskimeen" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Lisää %s laskimeen" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Vähennä %s laskimesta" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Poista tämä tapahtuma" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Siirrä tämä tapahtuma tilille" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Ei tunnisteita vielä" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Poista nämä %i tapahtumaa" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Siirrä nämä %i tapahtumaa tilille" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Ei yleisiä tunnisteita vielä" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Lisää tunniste" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Tunnisteet" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Etsi tunnistetta" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Poista tämä tunniste" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "saldo" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Kehityssuunta" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Kokonaissaldo" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Aika" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "kuukausittain" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Hylkää" #: wxbanker/currencies.py:334 msgid "detected" msgstr "havaittu" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Ei määritelty" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Mint.com-tunnukset:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Tallenna tunnukset avainnippuun" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Tiliä %(name)s vastaava Mint-tunnus:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Päivitä" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Käyttäjätunnus:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Salasana:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Tapahtuman tiedot" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "Tämä poistaa pysyvästi toistuvan tapahtuman. Jatketaanko?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Tällä tilillä ei ole toistuvia tapahtumia." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Sulje" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Poista" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Toistuvat tapahtumat" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Mint.com-integraatio" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Tunniste:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Lisää tunniste" #~ msgid "A lightweight personal finance management application." #~ msgstr "Kevyt ohjelma oman talouden hallintaan." #~ msgid "Current Account" #~ msgstr "Valittu tili" #~ msgid "All Accounts" #~ msgstr "Kaikki tilit" #~ msgid "Show" #~ msgstr "Näytä" #~ msgid "Other accounts" #~ msgstr "Muut tilit" #~ msgid "Total" #~ msgstr "Yhteensä" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "Tämä valinta poistaa näkyvistä ne tilit, joiden saldo on 0,00" #~ msgid "Hide zero-balance accounts" #~ msgstr "Piilota tyhjät tilit" #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "Tilihallinnan painikkeet mahdollistavat tilien lisäyksen, poiston ja " #~ "uudelleen nimeämisen." #~ msgid "Load" #~ msgstr "Lataa" #~ msgid "Skip first line" #~ msgstr "Ohita ensimmäinen rivi" #~ msgid "Which account will the money come from?" #~ msgstr "Miltä tililtä rahat tulevat?" #~ msgid "Case Sensitive" #~ msgstr "Huomioi kirjainkoko" #~ msgid "Account" #~ msgstr "Tili" wxbanker-0.9.1/wxbanker/po/fr.po0000644000175000017500000006255212243601243016521 0ustar mrooneymrooney# French translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2010-10-12 06:33+0000\n" "Last-Translator: Thomas C. \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2010-10-13 04:55+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "L'encodage du fichier ne semble pas être '%s'." #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Degré de lissage de la tendance" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Mois" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Depuis" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "vers" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Graphique" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Importation CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Compte cible" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Annuler" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importer" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Format des colonnes CSV" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Date" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Format de la date" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Montant" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Séparateur décimal" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Description" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Paramètres du fichier CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Lignes à ignorer" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Encodage" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Délimiteur de colonnes" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Fichier à importer" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "Profils CSV" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "La bibliothèque Python simplejson est nécessaire pour charger ou sauvegarder " "des profils CSV." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Enregistrer" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Supprimer" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Une erreur s'est produite lors de l'importation du fichier CSV." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Erreur d'importation CSV" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Un profil avec le nom '%s' existe déjà. L'écraser ?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Écraser le profil ?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Sélectionnez un fichier et cliquez sur \"Aperçu\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "depuis" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Virement" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Quotidien" msgstr[1] "Tous les %(num)d jours" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Hebdomadaire" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Mensuel" msgstr[1] "Tous les %(num)d mois" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Annuel" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Jamais" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "chaque" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Termine :" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Fréquence de répétition :" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "jour" msgstr[1] "jours" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "semaine" msgstr[1] "semaines" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "mois" msgstr[1] "mois" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "an" msgstr[1] "ans" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Lun" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Mar" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Mer" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Jeu" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Ven" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Sam" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Dim" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Jours de répétition :" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Démarre :" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Ajouter cette transaction" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Récurrent" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Solde initial" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "La case 'Montant' ne contient pas de valeur." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' n'est pas un montant valide." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Merci d'entrer un nombre, par exemple 12,34, ou -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Montant de transaction invalide" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Merci de sélectionner un compte et de réessayer." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Aucun compte sélectionné" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Une recherche est actuellement active." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Désirez-vous annuler la recherche en cours et effectuer cette transaction " "dans \"%s\" ?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Annuler la recherche ?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "Cette transaction est un virement. Merci de choisir le compte cible." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Si cette case est cochée quand vous ajoutez une transaction, il vous sera " "demandé quel compte utiliser comme source du virement." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Par exemple, cocher cette case et entrer une transaction de 50 $ dans ce " "compte soustraira aussi 50 $ sur le compte que vous aurez choisi comme " "source." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Chercher dans les transactions" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Plus d'options" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Moins d'options" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Chercher dans : " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Afficher les options de recherche avancée" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Cacher les options de recherche avancée" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "La transaction récurrente \"%(description)s\" a %(num)i transactions prêtes " "pour %(amount)s à %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i transactions récurrentes ont un total de %(totalnum)i transactions " "prêtes." #: wxbanker/main.py:101 msgid "Preview" msgstr "Aperçu" #: wxbanker/main.py:110 msgid "Perform" msgstr "Effectuer" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Transaction récurrente ajoutée avec succès." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "La première transaction aura lieu à %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "C'est la première fois que vous utilsez wxBanker !" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Pour commencer, ajoutez un compte en utilisant le panneau de contrôle des " "comptes dans le coin en haut à gauche." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Les boutons dans le contrôle du compte vous permettent d'ajouter, de " "renommer, de configurer, et de supprimer un compte." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Après avoir créé un compte, vous pouvez y ajouter des transactions (comme " "votre solde initial), en utilisant les boutons situés en bas à droite." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Amusez-vous !" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Bienvenue !" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Enregistrer les modifications ?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Vous avez effectué des modifications depuis votre dernier enregistrement. " "Voulez-vous enregistrer ces modifications avant de fermer l'application ?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Notez qu'activer la sauvegarder automatique depuis le menu Fichier éliminera " "le besoin de sauvegarde manuelle." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Pas de taux d'échange pour la devise \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Comptes" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Ajouter un nouveau compte" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Supprimer le compte sélectionné" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Renommer le compte sélectionné" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Configurer le compte sélectionné" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Tous les comptes" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Pas synchronisé avec Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Désolé, un compte utilisant ce nom existe déjà." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Le nom d'un compte ne peut pas être vide." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Nom du compte" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Ceci va définitivement supprimer le compte '%s' et toutes ses transactions. " "Désirez-vous continuer ?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Attention" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Sauvegarde automatique" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Enrgistrer automatiquement les modifications" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Importer depuis CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Importer des transactions depuis un fichier au format CSV" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Exporter en CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Exporter les transactions vers un fichier CSV" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Compte précédent" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Compte suivant" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Montrer les comptes ayant un solde nul" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Si désactivé, les comptes dont le solde est de 0.00 € ne seront pas affichés " "dans la liste de comptes." #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Devise" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Sélectionnez la devise à afficher" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Proposer une devise" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Intégrer à Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Synchroniser les soldes de comptes avec un compte Mint.com existant" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "&Voir la FAQ" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Regarder la Foire Aux Questions en ligne" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "&Poser une Question" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Poser une question en ligne" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Signaler un Bogue" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Signaler en ligne un bogue au développeur" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Proposer une &Fonctionnalité" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Proposer l'implémentation d'une nouvelle fonctionnalité" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "&Traduire wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Traduire wxBanker dans une autre langue" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&À propos" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Plus d'informations sur wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Fichier" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Affichage" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Paramètres" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Aide" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Copyright" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Gestion simple de comptes personnels" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Hebdomadaire sur les jours de la semaine" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Hebdomadaire sur les weekends" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Lundis" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Mardis" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Mercredis" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Jeudis" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Vendredis" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Samedis" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Dimanches" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Hebdomadaire sur %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Toutes les %(num)d semaines sur %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " et %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Annuel" msgstr[1] "Tous les %(num)d ans" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "jusqu'à %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Pas de description" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Virement depuis %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Virement vers %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Résumé :" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Afficher la Calculatrice" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Masquer la Calculatrice" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transactions" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Résumé" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Aucune transaction sélectionnée." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Aucune transaction correspondante." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Solde" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Total" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Mettre la valeur de la calculatrice à %s" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Ajouter %s à la valeur de la calculatrice" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Soustraire %s de la valeur de la calculatrice" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Supprimer cette transaction" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Déplacer cette transaction vers le compte" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Aucun tag pour l'instant" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Supprimer ces %i transactions" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Déplacer ces %i transactions vers le compte" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Pas encore de tag commun" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Ajouter un tag" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Tags" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Rechercher ce tag" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Supprimer ce tag" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "solde" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Tendance" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Solde Total sur Temps" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Temps" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "mensuel" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "Pour utiliser la bibliothèque de tracé '%s', installez les modules python " "suivants : %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Annuler" #: wxbanker/currencies.py:334 msgid "detected" msgstr "détecté" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Aucun" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Identifiants Mint.com :" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Sauvegarder les identifiants dans le porte-clés." #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Compte Mint correspondant pour %(name)s :" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Mettre à jour" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Nom d'utilisateur :" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Mot de passe :" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Détails de la transaction" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" "Ceci supprimera définitivement cette transaction récurrente. Désirez-vous " "continuer ?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Ce compte n'a actuellement aucune transaction récurrente." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Fermer" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Effacer" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Transactions Récurrentes" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Intégration à Mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "Vous pouvez taguer une transaction en mettant un #tag n'importe ou dans la " "description." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Tag :" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "Pour supprimer ce tag plus tard, supprimer le simplement de la description " "ou faites un clic droit sur la transaction." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Ajouter un tag" #~ msgid "Total" #~ msgstr "Total" #~ msgid "All Accounts" #~ msgstr "Tous les comptes" #~ msgid "Current Account" #~ msgstr "Compte actuel" #~ msgid "Case Sensitive" #~ msgstr "Sensible à la casse" #~ msgid "Hide zero-balance accounts" #~ msgstr "Cacher les comptes de balance nulle" #~ msgid "Show" #~ msgstr "Afficher" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Attention: Numpy module n'est pas disponible, désactivant l'onglet résumé. " #~ "Installez numpy pour corriger." #~ msgid "transfer" #~ msgstr "Virement" #~ msgid "transaction" #~ msgstr "transaction" #~ msgid "Other accounts" #~ msgstr "Autres comptes" #~ msgid "In: " #~ msgstr "Dans: " #~ msgid "A lightweight personal finance management application." #~ msgstr "Une légère application pour manager ses finances personnels." #~ msgid "Whether or not to match based on capitalization" #~ msgstr "Rechercher ou non en se basant sur les majuscules" #~ msgid "Load" #~ msgstr "Charger" #~ msgid "Account" #~ msgstr "Compte" #~ msgid "&Tools" #~ msgstr "&Outils" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "Si coché, les comptes de balance nulle seront cachés de la liste" #~ msgid "CSV Import" #~ msgstr "Importer un fichier au format CVS" #~ msgid "Transact" #~ msgstr "Ajouter une transaction" #~ msgid "Fit Curve Degree" #~ msgstr "Ajuster le degré de la courbe" #~ msgid "Skip first line" #~ msgstr "Ignorer la première ligne" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "Attention : impossible de lier" #~ msgid "Which account will the money come from?" #~ msgstr "De quel compte l'argent proviendra-t-il ?" wxbanker-0.9.1/wxbanker/po/he.po0000644000175000017500000006476112243601243016512 0ustar mrooneymrooney# Hebrew translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2012-08-06 04:09+0000\n" "Last-Translator: Michael Rooney \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2012-08-07 04:45+0000\n" "X-Generator: Launchpad (build 15745)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "אחוזי מגמה" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "חודשים" #: wxbanker/summarytab.py:48 msgid "From" msgstr "מאת" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "אל" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "תרשים" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "ייבוא CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "חשבון היעד" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "ביטול" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "ייבוא" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "מיפוי עמודות CSV" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "תאריך" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "תבנית תאריך" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "סכום" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "מפריד עשרוני" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "תיאור" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "הגדרות קובץ CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "שורות לדילוג" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "קידוד" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "מפריד עמודות" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "קובץ לייבוא" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "פרופילי CSV" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "ספריית ה־Python ‏בשם simplejson נדרשת לצורך טעינה/שמירה של פרופיל csv." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "שמירה" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "נראה כי קידוד הקובץ אינו '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "ארעה שגיאה במהלך ייבוא קובץ ה־csv." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "שגיאת ייבוא csv" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "פרופיל עם השם '%s' כבר קיים. לשכתב אותו ?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "לשכתב פרופיל ?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "בחירת הקובץ ולחיצה על \"תצוגה מקדימה\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "מאת" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "העברה" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "יומי" msgstr[1] "בכל %(num)d ימים" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "שבועי" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "חודשי" msgstr[1] "בכל %(num)d חודשים" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "שנתי" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "לעולם לא" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "כל" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "מסתיים ב־:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "חזרה:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "יום" msgstr[1] "ימים" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "שבוע" msgstr[1] "שבועות" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "חודש" msgstr[1] "חודשים" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "שנה" msgstr[1] "שנים" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "שני" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "שלישי" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "רביעי" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "חמישי" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "שישי" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "שבת" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "ראשון" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "חוזרת בימים:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "מתחיל ב־:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "כניסה לעסקה זו" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "חוזר" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "מאזן ראשוני" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "לא הוזן סכום בשדה 'סכום'." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' אינו סכום תקני." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "אנא הזן מספר כגון 12.34 או -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "סכום ההעברה אינו תקני" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "אנא בחר חשבון ואז נסה שוב." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "לא נבחרו חשבונות" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "החיפוש פעיל כרגע" #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "האם למחוק את החיפוש הנוכחי ולהפוך עסקה זו תוך \"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "לרוקן את החיפוש?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "עסקה זו מסומנת כהעברת כספים. יש לבחור את חשבון ההעברה." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "אם תיבה זו מסומנת בעת הוספת עסקה, אתה תשאל באיזה חשבון להשתמש כמקור ההעברה." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "לדוגמה, סימון תיבה זו והזנת עסקה בסך 50$ לחשבון זה תחסיר 50$ מהחשבון שנבחר " "כמקור." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "חפש עסקאות" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "אפשרויות נוספות" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "פחות אפשרויות" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "תואם: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "הצג אפשרויות חיפוש מתקדמות" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "הסתר אפשרויות חיפוש מתקדמות" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "לעסקה החוזרת \"%(description)s\" ישנן %(num)i העברות מוכנות על סך %(amount)s " "בתאריך %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "ל־%(num)i העברות חוזרות ישנן סך הכל %(totalnum)i העברות מוכנות." #: wxbanker/main.py:101 msgid "Preview" msgstr "תצוגה מקדימה" #: wxbanker/main.py:110 msgid "Perform" msgstr "ביצוע" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "העסקה החוזרת נוספה בהצלחה." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "ההעברה הראשונה תתבצע בתאריך %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "נראה כי זאת הפעם הראשונה בה אתה משתמש ב־wxBanker!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "בתור התחלה, הוסף חשבון באמצעות בקרת החשבונות בפינה הימנית העליונה." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "לאחר שיצרת חשבון תוכל להוסיף לו עסקאות (כגון מאזן התחלתי) באמצעות הפקדים " "שמתחת לטבלה שמצד שמאל למטה." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "תהנה!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "ברוכים הבאים!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "לשמור את השינויים ?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "נערכו שינויים מאז השמירה האחרונה. האם לשמור בטרם היציאה?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "נא לשים לב ששמירה אוטומטית מהתפריט קובץ תחסוך ממך שמירה באופן ידני." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "אין שער המרה עבור סוג המטבע \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "חשבונות" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "הוסף חשבון חדש" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "הסר את החשבון הנבחר" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "שנה את שם החשבון הנבחר" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "הגדר את החשבון הנבחר" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "כל החשבונות" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "לא בסנכרון מול Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "אנו מתנצלים, חשבון בשם זה כבר קיים." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "שמות חשבונות לא יכולים להיות ריקים." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "שם החשבון" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "פעולה זו תסיר לצמיתות את החשבון '%s' על כל עסקאותיות. להמשיך?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "אזהרה" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "שמירה אוטומטית" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "שמירת השינויים אוטומטית" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "ייבוא מקובץ CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "ייבוא העברות מקובץ CSV" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "יצוא ל־CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "יצוא תזרים הכספים לקובץ CSV" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "החשבון הקודם" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "החשבון הבא" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "הצגת חשבונות בעלי מאזן 0" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "כשמבוטל, חשבונות בעלי 0.00₪ יוסתרו מהרשימה." #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&מטבע" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "בחירת סוג המטבע להצגה" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "בקשת מטבע" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "שילוב ב־Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "סנכרון מאזני חשבונות מול חשבון קיים ב־Mint.com" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "עיון ב&שאלות נפוצות" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "עיון בשאלות נפוצות באתר האינטרנט" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "לשאול ש&אלה" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "לשאול שאלה באתר האינטרנט" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "דיווח על &תקלה" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "דיווח על תקלה למפתחים באתר האינטרנט" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "בקשת &תכונה" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "בקשה להטמיע תכונה חדשה בתוכנה" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "&תרגום wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "תרגום wxBanker לשפה אחרת" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&אודות" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "מידע נוסף אודות wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&קובץ" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&תצוגה" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "ה&גדרות" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "ע&זרה" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "זכויות יוצרים" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "כלכלה אישית בפשטות." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "מדי יום בימות השבוע" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "מדי יום בסופי השבוע" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "ימי שני" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "ימי שלישי" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "ימי רביעי" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "ימי חמישי" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "ימי שישי" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "ימי שבת" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "ימי ראשון" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "מדי שבוע ב%s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "בכל %(num)d שבועות ב%%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " ו־%s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "בכל שנה" msgstr[1] "בכל %(num)d שנים" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "עד %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "ללא תיאור" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "העברה מ־%s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "העברה אל %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "תקציר:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "הצג את המחשבון" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "הסתר את המחשבון" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "עסקאות" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "תקציר" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "לא הוזנו עסקאות" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "אין העברות תואמות." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "מאזן" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "שלח את %s למחשבון" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "הוסף את %s למחשבון" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "חיסור %s מהמחשבון" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "הסר עסקה זו" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "העברת העסקה לחשבון" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "עדיין אין תגיות" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "הסרת %i עסקאות אלו" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "העברת %i עסקאות אלו לחשבון" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "עדיין אין תגיות נפוצות" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "הוספת תגית" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "תגיות" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "חפש תגית זו" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "הסר תגית זו" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "מאזן" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "מגמה" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "המאזן הכללי במשך הזמן" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "שעה" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "מדי חודש" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "כדי להשתמש בספריית השרטוט '%s', יש להתקין את המודולים הבאים של פייתון: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "סגור" #: wxbanker/currencies.py:334 msgid "detected" msgstr "זוהה" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "פרטי האימות מול Mint.com:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "שמירת פרטי הזיהוי במפתח הסיסמאות" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "חשבון ה־Mint התואם עבור %(name)s:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "עדכון" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "שם המשתמש:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "סיסמה:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "פרטי העסקה" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "פעולה זו תסיר לצמיתות את העסקה החוזרת. להמשיך?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "לחשבון זה אין עסקאות חוזרות לעת עתה." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "סגור" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "מחיקה" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "עסקאות חוזרות" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "שילוב ב־Mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "תגיות:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "הוספת תגית" #~ msgid "Sample Points" #~ msgstr "נקודות לדוגמה" #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "הלחצנים שבבקרת חשבונות מאפשרים לך להוסיף, להסיר ולשנות את שמות החשבונות, " #~ "עבור כל חשבון בנפרד." #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "אזהרה: לא נמצא מודול Numpy, לשונית התקציר תבוטל. התקן את Numpy כדי לתקן זאת." #~ msgid "Fit Curve Degree" #~ msgstr "התאם מעלת עקומה" #~ msgid "A lightweight personal finance management application." #~ msgstr "יישום קל משקל לניהול הכלכלה האישית." #~ msgid "All Accounts" #~ msgstr "כל החשבונות" #~ msgid "Total" #~ msgstr "סך־הכל" #~ msgid "Current Account" #~ msgstr "חשבון נוכחי" #~ msgid "In: " #~ msgstr "תחת: " #~ msgid "Case Sensitive" #~ msgstr "תלוי רישיות" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "האם לבצע התאמה בהתבסס על רישיות" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "במידה שהופעל, חשבונות שהמאזן שלהם הינו $0.00 יוסתרו מהרשימה" #~ msgid "Hide zero-balance accounts" #~ msgstr "הסתר חשבונות במאזן אפס" #~ msgid "Transact" #~ msgstr "ניהול" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "אזהרה: לא ניתן לאגד את ה־ENTER של DateCtrl. שדרג ל־wxPython => 2.8.8.1 כדי " #~ "לתקן זאת." #~ msgid "Which account will the money come from?" #~ msgstr "מאיזה חשבון יגיע הכסף?" #~ msgid "transfer" #~ msgstr "העברה" #~ msgid "transaction" #~ msgstr "עסקה" #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "החיפוש פעיל כעת. האם ברצונך לרוקן את החיפוש הנוכחי ולהפוך אותו ל־%s תחת " #~ "\"%s\"?" #~ msgid "Other accounts" #~ msgstr "חשבונות אחרים" #~ msgid "Load" #~ msgstr "טעינה" #~ msgid "Account" #~ msgstr "חשבון" #~ msgid "&Tools" #~ msgstr "&כלים" #~ msgid "Show" #~ msgstr "הצגה" #~ msgid "Skip first line" #~ msgstr "דלג על השורה הראשונה" #~ msgid "CSV Import" #~ msgstr "ייבוא CSV" wxbanker-0.9.1/wxbanker/po/hi.po0000644000175000017500000005575512243601243016521 0ustar mrooneymrooney# Hindi translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-03 00:18-0800\n" "PO-Revision-Date: 2009-11-30 02:28+0000\n" "Last-Translator: ankur_the_king \n" "Language-Team: Hindi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-02-04 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/bankobjects/transaction.py:92 #, python-format msgid "Transfer from %s" msgstr "%s से हस्ता॔तरित करे॔" #: wxbanker/bankobjects/transaction.py:94 #, python-format msgid "Transfer to %s" msgstr "%s को हस्ता॔तरित करे॔" #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "सोमवार" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "मंगलवार" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "बुधवार" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "गुरुवार" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "शुक्रवार" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "शनिवार" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "रविवार" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " और %s" #: wxbanker/bankobjects/recurringtransaction.py:171 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "कोई विवरण नहीं" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "खातॆ" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "नया खाता खॊले॔" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "चुनावित खाता मिटाँए" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "चयनित खाते का नाम बदलें" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "चयनित खाते मे फेर-बदल करें" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:62 msgid "All accounts" msgstr "" #: wxbanker/accountlistctrl.py:385 wxbanker/accountlistctrl.py:487 msgid "Sorry, an account by that name already exists." msgstr "माफ कीजिये, इस नाम से एक खाता पहले से मौज़ूद है" #: wxbanker/accountlistctrl.py:387 wxbanker/accountlistctrl.py:489 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:421 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:460 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "यह स्थायी रूप से खाता '%s' और उसके सभी लेनदेन को मिटा देगा. जारी रखें?" #: wxbanker/accountlistctrl.py:461 msgid "Warning" msgstr "चेतावनी" #: wxbanker/accountconfigdialog.py:32 msgid "" "wxBanker can synchronize account balances online if you have an account with " "mint.com" msgstr "" #: wxbanker/accountconfigdialog.py:40 msgid "Username" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Password" msgstr "पासवर्ड" #: wxbanker/accountconfigdialog.py:62 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:103 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:105 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:115 wxbanker/csvimportframe.py:184 msgid "Save" msgstr "सहेजें" #: wxbanker/accountconfigdialog.py:116 msgid "Cancel" msgstr "" #: wxbanker/accountconfigdialog.py:136 msgid "Recurring Transactions" msgstr "" #: wxbanker/plots/cairopanel.py:72 wxbanker/plots/cairopanel.py:113 #: wxbanker/plots/wxplotpanel.py:35 wxbanker/plots/wxplotpanel.py:42 msgid "Balance" msgstr "बकाया राशी" #: wxbanker/plots/cairopanel.py:76 wxbanker/plots/wxplotpanel.py:40 msgid "Trend" msgstr "प्रवृत्ति" #: wxbanker/plots/cairopanel.py:112 wxbanker/plots/wxplotpanel.py:42 msgid "Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 msgid "Total Balance Over Time" msgstr "समयानुसार कुल बकाया राशी" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:45 msgid "Dismiss" msgstr "खारिज करें" #: wxbanker/summarytab.py:42 msgid "From" msgstr "के द्वारा" #: wxbanker/summarytab.py:46 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "को" #: wxbanker/summarytab.py:50 msgid "Trend Degree" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "कैलक्यूलेटर दिखाएँ" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "कैलक्यूलेटर छुपाएँ" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "लेनदेन" #: wxbanker/managetab.py:109 msgid "Summary" msgstr "सारांश" #: wxbanker/transactionolv.py:48 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:60 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:96 msgid "Date" msgstr "तारीख़" #: wxbanker/transactionolv.py:61 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:110 msgid "Description" msgstr "विवरण" #: wxbanker/transactionolv.py:62 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:104 msgid "Amount" msgstr "राशि" #: wxbanker/transactionolv.py:63 msgid "Total" msgstr "कुल" #: wxbanker/transactionolv.py:204 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:205 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:206 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:218 msgid "Remove this transaction" msgstr "इस लेनदेन को मिटाँए" #: wxbanker/transactionolv.py:219 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:221 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:222 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "से" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "हस्तांतरित करें" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "साप्ताहिक" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "वार्षिक" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "कभी नहीं" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "दिन" msgstr[1] "दिनों" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "सप्ताह" msgstr[1] "सप्ताह" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "वर्ष" msgstr[1] "वर्ष" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "सोम" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "मंगल" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "बुध" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "गुरु" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "शुक्र" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "शनि" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "रवि" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "इस लेनदेन कॊ सम्मिलित कीजिए" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:375 msgid "No amount entered in the 'Amount' field." msgstr "कोई राशि 'राशि' फ़ील्ड में प्रवेश नही की गई है" #: wxbanker/newtransactionctrl.py:377 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' वैध राशि मूल्य नही है" #: wxbanker/newtransactionctrl.py:380 msgid "Please enter a number such as 12.34 or -20." msgstr "कृपया गणा॔क जैसे 12.34 या -20 डाले॔" #: wxbanker/newtransactionctrl.py:381 msgid "Invalid Transaction Amount" msgstr "अवैध राशि मूल्य" #: wxbanker/newtransactionctrl.py:392 msgid "Please select an account and then try again." msgstr "कृपया एक खाता चुने॔ और फिरसे कोशिश करे॔" #: wxbanker/newtransactionctrl.py:393 wxbanker/newtransactionctrl.py:421 msgid "No account selected" msgstr "कोई खाता चयनित नही॔ है" #: wxbanker/newtransactionctrl.py:406 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:406 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:407 msgid "Clear search?" msgstr "खोज परिणाम साफ़ करें?" #: wxbanker/newtransactionctrl.py:420 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:453 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "अगर इस बॉक्स को चयनित किया जाता है, तो आपको इस हस्तांतरण के स्रोत के रूप में " "उपयोग करने के लिए एक खाते के लिए पूछा जायेगा" #: wxbanker/newtransactionctrl.py:454 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "उदाहरण के लिए, इस बक्से पर सही का निशान है और 50 डॉलर के एक सौदे का प्रवेश " "इस खाते में करते है तो स्रोत के रूप में चुने गये खाते से $ 50 घट जायेंगे" #: wxbanker/menubar.py:52 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:52 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:54 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:54 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:61 msgid "Next account" msgstr "" #: wxbanker/menubar.py:64 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:64 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:73 msgid "&Currency" msgstr "&मुद्रा" #: wxbanker/menubar.py:73 msgid "Select currency to display" msgstr "प्रदर्शित किए जाने के लिए मुद्रा चुनें" #: wxbanker/menubar.py:82 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:93 msgid "View &FAQs" msgstr "&FAQs देखिये" #: wxbanker/menubar.py:93 msgid "View Frequently Asked Questions online" msgstr "ऑनलाइन FAQs देखिये" #: wxbanker/menubar.py:98 msgid "Ask a &Question" msgstr "अपने सवाल पूछिये" #: wxbanker/menubar.py:98 msgid "Ask a question online" msgstr "ऑनलाइन सवाल पूछिए" #: wxbanker/menubar.py:103 msgid "&Report a Bug" msgstr "बग के बारे मे सूचित करें" #: wxbanker/menubar.py:103 msgid "Report a bug to the developer online" msgstr "बग के बारे मे निर्माता को ऑनलाइन सूचित करें" #: wxbanker/menubar.py:108 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:108 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:113 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:113 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:120 msgid "&About" msgstr "के बारे में (&A)" #: wxbanker/menubar.py:120 msgid "More information about wxBanker" msgstr "wxBanker कि और जानकारी" #: wxbanker/menubar.py:123 msgid "&File" msgstr "" #: wxbanker/menubar.py:124 msgid "&View" msgstr "" #: wxbanker/menubar.py:125 msgid "&Settings" msgstr "विन्यास (&S)" #: wxbanker/menubar.py:126 msgid "&Help" msgstr "सहायता (&H)" #: wxbanker/menubar.py:220 msgid "Copyright" msgstr "सर्वाधिकार सुरक्षित" #: wxbanker/menubar.py:221 msgid "A lightweight personal finance management application." msgstr "एक हल्का व्यक्तिगत वित्त प्रबंधन अनुप्रयोग" #: wxbanker/main.py:79 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:84 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:95 wxbanker/csvimportframe.py:149 #: wxbanker/csvimportframe.py:151 msgid "Preview" msgstr "पूर्वदृश्य" #: wxbanker/main.py:104 msgid "Perform" msgstr "" #: wxbanker/main.py:120 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:122 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:186 msgid "It looks like this is your first time using wxBanker!" msgstr "wxBanker के पहले इस्तेमाल में आपका स्वागत है!" #: wxbanker/main.py:187 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "शुरु करने के लिए, उपर बाँए हाथ मे॑ खाता नियंत्रण से नया खाता खोलिये" #: wxbanker/main.py:188 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" "खाता नियंत्रण के बटन आपको अनुमति देते हैं ,क्रमशः, नया खाता जोड़ने, मिटाने " "एवम् खाते का नाम बदलने की" #: wxbanker/main.py:189 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "एक बार आपने एक खाता बना लिया फिर आप उसमे लेनदेन जोड़ सकते हैं (जैसे " "प्रारंभिक शेष राशि) ,आप इसे करने के लिए निचली-दाईं तरफ के ग्रिड के नीचे के " "नियंत्रणों का उपयोग कर सकते है." #: wxbanker/main.py:190 msgid "Have fun!" msgstr "आनंद लीजिये!" #: wxbanker/main.py:192 msgid "Welcome!" msgstr "सुस्वागतम्!" #: wxbanker/main.py:200 msgid "Save changes?" msgstr "" #: wxbanker/main.py:201 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:202 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/searchctrl.py:36 msgid "Search transactions" msgstr "लेनदेन खोजिये" #: wxbanker/searchctrl.py:39 msgid "More options" msgstr "" #: wxbanker/searchctrl.py:39 msgid "Less options" msgstr "" #: wxbanker/searchctrl.py:50 msgid "Match: " msgstr "मेल: " #: wxbanker/searchctrl.py:94 msgid "Show advanced search options" msgstr "" #: wxbanker/searchctrl.py:96 msgid "Hide advanced search options" msgstr "" #: wxbanker/csvimportframe.py:28 msgid "CSV import" msgstr "" #: wxbanker/csvimportframe.py:60 msgid "Target account" msgstr "" #: wxbanker/csvimportframe.py:75 wxbanker/csvimportframe.py:77 msgid "Import" msgstr "" #: wxbanker/csvimportframe.py:87 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:99 msgid "Date format" msgstr "दिनांक रचना" #: wxbanker/csvimportframe.py:106 msgid "Decimal separator" msgstr "दशमलव अलगानेवाला" #: wxbanker/csvimportframe.py:117 msgid "CSV file settings" msgstr "" #: wxbanker/csvimportframe.py:126 msgid "Skip first line" msgstr "" #: wxbanker/csvimportframe.py:129 msgid "Encoding" msgstr "एनकोडिंग" #: wxbanker/csvimportframe.py:133 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:144 msgid "File to import" msgstr "" #: wxbanker/csvimportframe.py:164 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:169 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:179 msgid "Load" msgstr "लोड करें" #: wxbanker/csvimportframe.py:189 msgid "Delete" msgstr "मिटाओ" #: wxbanker/csvimportframe.py:243 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:250 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:251 msgid "CSV import error" msgstr "" #: wxbanker/csvimportframe.py:301 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:302 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:316 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/currencies.py:277 msgid "detected" msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #~ msgid "All Accounts" #~ msgstr "सभी खाते" #~ msgid "Current Account" #~ msgstr "मौजूदा खाता" #~ msgid "Case Sensitive" #~ msgstr "केस सेंसिटिव" #~ msgid "Show" #~ msgstr "दिखाएं" #~ msgid "transaction" #~ msgstr "लेनदेन" #~ msgid "Other accounts" #~ msgstr "अन्य खाते" #~ msgid "Hide zero-balance accounts" #~ msgstr "शूण्य-बकाया राशी वाले खाते छिपाँए" #~ msgid "transfer" #~ msgstr "हस्तांतरण" #~ msgid "Which account will the money come from?" #~ msgstr "पैसा कौनसे खाते से लिया जायेगा?" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "चेतावनी: नम्पी मौड्यूल उपलब्ध नही है, इसलिए सारांश टैब निशक्रीय किया जाता " #~ "है| सुधार के लिए नम्पी इंस्टॉल करें" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "सक्षम होने पर, $ 0,00 के बकाया राशी वाले खाते सूची से छिप जायेंगे" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "चाहें या नहीं चाहे बड़े अक्षरों के प्रयोग के आधार पर मेल करने के लिए" #~ msgid "Transact" #~ msgstr "लेन देन करें" #~ msgid "Fit Curve Degree" #~ msgstr "योग्य वक्र डिग्री" #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "एक खोज वर्तमान में सक्रिय है.क्या आप मौजूदा खोज स्पष्ट करना चाहेंगे और इस %s " #~ "को \"%s\" मे बदलेंगे?" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "चेतावनी: DateCtrl का ENTER बाध्य करने में अक्षम. इसे ठीक करने के लिए " #~ "WxPython >= 2.8.8.1 तक नवीनीकरण करें." #~ msgid "Sample Points" #~ msgstr "उदाहरण बिंदु" #~ msgid "In: " #~ msgstr "इनमे॔: " #~ msgid "Every" #~ msgstr "प्रत्येक" #~ msgid "Account" #~ msgstr "खाता" wxbanker-0.9.1/wxbanker/po/hr.po0000644000175000017500000005051612243601243016520 0ustar mrooneymrooney# Croatian translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-03 00:18-0800\n" "PO-Revision-Date: 2009-11-30 02:28+0000\n" "Last-Translator: Miro Glavić \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2010-02-04 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/bankobjects/transaction.py:92 #, python-format msgid "Transfer from %s" msgstr "Prenesi sa %s" #: wxbanker/bankobjects/transaction.py:94 #, python-format msgid "Transfer to %s" msgstr "Prenesi na %s" #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Ponedjeljkom" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Utorkom" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Srijedom" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Četvrtkom" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Petkom" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Subotom" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Nedjeljom" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Tjedno na %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " i %s" #: wxbanker/bankobjects/recurringtransaction.py:171 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "dok %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Bez opisa" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Računi" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Dodaj novi račun" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Ukloni označeni račun" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Preimenuj označeni račun" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Podesite označeni račun" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:62 msgid "All accounts" msgstr "Svi računi" #: wxbanker/accountlistctrl.py:385 wxbanker/accountlistctrl.py:487 msgid "Sorry, an account by that name already exists." msgstr "Nažalost, račun pod tim imenom već postoji." #: wxbanker/accountlistctrl.py:387 wxbanker/accountlistctrl.py:489 msgid "Account names cannot be blank." msgstr "Nazivi računa ne mogu biti prazni." #: wxbanker/accountlistctrl.py:421 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:460 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Ovime se trajno uklanja račun '%s' i sve njegove transakcije. Nastaviti?" #: wxbanker/accountlistctrl.py:461 msgid "Warning" msgstr "Upozorenje" #: wxbanker/accountconfigdialog.py:32 msgid "" "wxBanker can synchronize account balances online if you have an account with " "mint.com" msgstr "" #: wxbanker/accountconfigdialog.py:40 msgid "Username" msgstr "Korisničko ime" #: wxbanker/accountconfigdialog.py:42 msgid "Password" msgstr "Lozinka" #: wxbanker/accountconfigdialog.py:62 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:103 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:105 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:115 wxbanker/csvimportframe.py:184 msgid "Save" msgstr "Spremi" #: wxbanker/accountconfigdialog.py:116 msgid "Cancel" msgstr "" #: wxbanker/accountconfigdialog.py:136 msgid "Recurring Transactions" msgstr "" #: wxbanker/plots/cairopanel.py:72 wxbanker/plots/cairopanel.py:113 #: wxbanker/plots/wxplotpanel.py:35 wxbanker/plots/wxplotpanel.py:42 msgid "Balance" msgstr "Stanje" #: wxbanker/plots/cairopanel.py:76 wxbanker/plots/wxplotpanel.py:40 msgid "Trend" msgstr "Trend" #: wxbanker/plots/cairopanel.py:112 wxbanker/plots/wxplotpanel.py:42 msgid "Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 msgid "Total Balance Over Time" msgstr "Ukupno stanje kroz vrijeme" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:45 msgid "Dismiss" msgstr "Odbaci" #: wxbanker/summarytab.py:42 msgid "From" msgstr "Od" #: wxbanker/summarytab.py:46 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "do" #: wxbanker/summarytab.py:50 msgid "Trend Degree" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Prikaži kalkulator" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Sakrij kalkulator" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transakcije" #: wxbanker/managetab.py:109 msgid "Summary" msgstr "Sažetak" #: wxbanker/transactionolv.py:48 msgid "No transactions entered." msgstr "Transakcija nije unešena." #: wxbanker/transactionolv.py:60 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:96 msgid "Date" msgstr "Datum" #: wxbanker/transactionolv.py:61 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:110 msgid "Description" msgstr "Opis" #: wxbanker/transactionolv.py:62 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:104 msgid "Amount" msgstr "Iznos" #: wxbanker/transactionolv.py:63 msgid "Total" msgstr "Ukupno" #: wxbanker/transactionolv.py:204 #, python-format msgid "Send %s to calculator" msgstr "Pošalji %s na kalkulator" #: wxbanker/transactionolv.py:205 #, python-format msgid "Add %s to calculator" msgstr "Dodaj %s u kalkulator" #: wxbanker/transactionolv.py:206 #, python-format msgid "Subtract %s from calculator" msgstr "Oduzmi %s iz kalkulatora" #: wxbanker/transactionolv.py:218 msgid "Remove this transaction" msgstr "Ukloni ovu transakciju" #: wxbanker/transactionolv.py:219 msgid "Move this transaction to account" msgstr "Premjesti ovu transakciju na račun" #: wxbanker/transactionolv.py:221 #, python-format msgid "Remove these %i transactions" msgstr "Ukloni ove %i transakcije" #: wxbanker/transactionolv.py:222 #, python-format msgid "Move these %i transactions to account" msgstr "Premjesti ove %i transakcije na račun" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "od" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Prijenos" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Tjedno" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Godišnje" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Nikad" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "dan" msgstr[1] "dana" msgstr[2] "dana" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "tjedan" msgstr[1] "tjedna" msgstr[2] "tjedana" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "mjesec" msgstr[1] "mjeseca" msgstr[2] "mjeseci" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "godina" msgstr[1] "godine" msgstr[2] "godina" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Pon" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Uto" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Sri" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Čet" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Pet" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Sub" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Ned" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Počinje:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Unesi ovu transakciju" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:375 msgid "No amount entered in the 'Amount' field." msgstr "Nije unešen iznos u polje 'Iznos'" #: wxbanker/newtransactionctrl.py:377 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' nije ispravan iznos." #: wxbanker/newtransactionctrl.py:380 msgid "Please enter a number such as 12.34 or -20." msgstr "Molim unesite broj kao 12.34 ili -20." #: wxbanker/newtransactionctrl.py:381 msgid "Invalid Transaction Amount" msgstr "Neispravan iznos transakcije" #: wxbanker/newtransactionctrl.py:392 msgid "Please select an account and then try again." msgstr "Molim odaberite račun, pa pokušajte ponovo." #: wxbanker/newtransactionctrl.py:393 wxbanker/newtransactionctrl.py:421 msgid "No account selected" msgstr "Nije odabran niti jedan račun." #: wxbanker/newtransactionctrl.py:406 msgid "A search is currently active." msgstr "Pretraga je trenutno aktivna." #: wxbanker/newtransactionctrl.py:406 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:407 msgid "Clear search?" msgstr "Poništiti pretragu?" #: wxbanker/newtransactionctrl.py:420 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:453 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Ako je ova kućica označena pri dodavanju transakcije, biti ćete upitani za " "račun koji se koristi kao izvor transfera." #: wxbanker/newtransactionctrl.py:454 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Na primjer, označivanje ove kućice i unos transakcije od 50 kn će također " "oduzeti 50 kn sa računa koji odaberete kao izvor." #: wxbanker/menubar.py:52 msgid "Auto-save" msgstr "Auto-spremanje" #: wxbanker/menubar.py:52 msgid "Automatically save changes" msgstr "Automatski spremi promjene" #: wxbanker/menubar.py:54 msgid "Import from CSV" msgstr "Uvezi iz CSV" #: wxbanker/menubar.py:54 msgid "Import transactions from a CSV file" msgstr "Uvezi transakcije iz CSV datoteke" #: wxbanker/menubar.py:60 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:61 msgid "Next account" msgstr "" #: wxbanker/menubar.py:64 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:64 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:73 msgid "&Currency" msgstr "&Valuta" #: wxbanker/menubar.py:73 msgid "Select currency to display" msgstr "Odaberite valutu za prikaz" #: wxbanker/menubar.py:82 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:93 msgid "View &FAQs" msgstr "Pogledajte &ČPP" #: wxbanker/menubar.py:93 msgid "View Frequently Asked Questions online" msgstr "Pogledajte često postavljana pitanja online" #: wxbanker/menubar.py:98 msgid "Ask a &Question" msgstr "Postavite &pitanje" #: wxbanker/menubar.py:98 msgid "Ask a question online" msgstr "Postavite pitanje online" #: wxbanker/menubar.py:103 msgid "&Report a Bug" msgstr "Prijavite po&grešku" #: wxbanker/menubar.py:103 msgid "Report a bug to the developer online" msgstr "Prijavite pogrešku online razvijatelju programa" #: wxbanker/menubar.py:108 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:108 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:113 msgid "Tran&slate wxBanker" msgstr "Pre&vedi wxBanker" #: wxbanker/menubar.py:113 msgid "Translate wxBanker to another language" msgstr "Prevedi wxBanker na drugi jezik" #: wxbanker/menubar.py:120 msgid "&About" msgstr "O &programu" #: wxbanker/menubar.py:120 msgid "More information about wxBanker" msgstr "Više informacija o wxBanker programu" #: wxbanker/menubar.py:123 msgid "&File" msgstr "&Datoteka" #: wxbanker/menubar.py:124 msgid "&View" msgstr "" #: wxbanker/menubar.py:125 msgid "&Settings" msgstr "&Postavke" #: wxbanker/menubar.py:126 msgid "&Help" msgstr "&Pomoć" #: wxbanker/menubar.py:220 msgid "Copyright" msgstr "Autorska prava" #: wxbanker/menubar.py:221 msgid "A lightweight personal finance management application." msgstr "Program lake kategorije za upravljanje osobnim financijama." #: wxbanker/main.py:79 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:84 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:95 wxbanker/csvimportframe.py:149 #: wxbanker/csvimportframe.py:151 msgid "Preview" msgstr "Pregled" #: wxbanker/main.py:104 msgid "Perform" msgstr "Izvrši" #: wxbanker/main.py:120 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:122 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:186 msgid "It looks like this is your first time using wxBanker!" msgstr "Izgleda da prvi puta koristite wxBanker!" #: wxbanker/main.py:187 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Kako biste započeli, dodajte račun koristeći kontrolu račun u gornjem " "lijevom kutu." #: wxbanker/main.py:188 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" "Gumbi u kontroli račun omogućavaju vam dodavanje, uklanjanje i preimenovanje " "računa." #: wxbanker/main.py:189 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Kada ste stvorili račun, možete mu dodati transakcije (na primjer početno " "stanje) koristeći kontrole ispod mreže desno dolje." #: wxbanker/main.py:190 msgid "Have fun!" msgstr "Dobru zabavu!" #: wxbanker/main.py:192 msgid "Welcome!" msgstr "Dobrodošli!" #: wxbanker/main.py:200 msgid "Save changes?" msgstr "Spremi promjene?" #: wxbanker/main.py:201 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Napravili ste promjene nakon zadnjeg spremanja. Da li hoćete da ih spremite " "prije izlaska?" #: wxbanker/main.py:202 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/searchctrl.py:36 msgid "Search transactions" msgstr "Pretraži transakcije" #: wxbanker/searchctrl.py:39 msgid "More options" msgstr "Više opcija" #: wxbanker/searchctrl.py:39 msgid "Less options" msgstr "Manje opcija" #: wxbanker/searchctrl.py:50 msgid "Match: " msgstr "Poklapanje: " #: wxbanker/searchctrl.py:94 msgid "Show advanced search options" msgstr "Prikaži napredne opcije pretrage" #: wxbanker/searchctrl.py:96 msgid "Hide advanced search options" msgstr "Sakrij napredne opcije pretrage" #: wxbanker/csvimportframe.py:28 msgid "CSV import" msgstr "CSV uvoz" #: wxbanker/csvimportframe.py:60 msgid "Target account" msgstr "Odredišni račun" #: wxbanker/csvimportframe.py:75 wxbanker/csvimportframe.py:77 msgid "Import" msgstr "Uvoz" #: wxbanker/csvimportframe.py:87 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:99 msgid "Date format" msgstr "Format datuma" #: wxbanker/csvimportframe.py:106 msgid "Decimal separator" msgstr "Decimalni separator" #: wxbanker/csvimportframe.py:117 msgid "CSV file settings" msgstr "Postavke CSV datoteke" #: wxbanker/csvimportframe.py:126 msgid "Skip first line" msgstr "Preskoči prvi red" #: wxbanker/csvimportframe.py:129 msgid "Encoding" msgstr "Šifriranje" #: wxbanker/csvimportframe.py:133 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:144 msgid "File to import" msgstr "Datoteka za uvoz" #: wxbanker/csvimportframe.py:164 msgid "CSV profiles" msgstr "CSV profili" #: wxbanker/csvimportframe.py:169 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:179 msgid "Load" msgstr "Učitaj" #: wxbanker/csvimportframe.py:189 msgid "Delete" msgstr "Obriši" #: wxbanker/csvimportframe.py:243 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Šifriranje datoteke ne izgleda da je '%s'." #: wxbanker/csvimportframe.py:250 msgid "An error ocurred during the csv file import." msgstr "Greška se dogodila prilikom CSV uvoza." #: wxbanker/csvimportframe.py:251 msgid "CSV import error" msgstr "Greška kod CSV uvoza" #: wxbanker/csvimportframe.py:301 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Profil sa imenom '%s' ve ćpostoji. Prepisati ga?" #: wxbanker/csvimportframe.py:302 msgid "Overwrite profile ?" msgstr "Prepisati profil?" #: wxbanker/csvimportframe.py:316 msgid "Select file and click \"Preview\"" msgstr "Odaberi datoteku i klikni na \"Pregled\"" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/currencies.py:277 msgid "detected" msgstr "otkriveno" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #~ msgid "Fit Curve Degree" #~ msgstr "Stupanj interpolacijske krivulje" #~ msgid "All Accounts" #~ msgstr "Svi računi" #~ msgid "Current Account" #~ msgstr "Trenutni račun" #~ msgid "In: " #~ msgstr "U: " #~ msgid "Show" #~ msgstr "Prikaži" #~ msgid "Case Sensitive" #~ msgstr "Razlikuj velika i mala slova" #~ msgid "Hide zero-balance accounts" #~ msgstr "Sakrij račune sa stanjem nula" #~ msgid "Transact" #~ msgstr "Prenesi" #~ msgid "Which account will the money come from?" #~ msgstr "Sa kojeg računa dolaze novci?" #~ msgid "transfer" #~ msgstr "prijenos" #~ msgid "transaction" #~ msgstr "transakcije" #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "Pretraga je trenutno aktivna. Želite li poništiti trenutnu pretragu, te " #~ "promijeniti %s u \"%s\"?" #~ msgid "Other accounts" #~ msgstr "Drugi računi" #~ msgid "Sample Points" #~ msgstr "Točaka uzorkovanja" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "Vrši li se poklapanje prema veličini slova" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Upozorenje: modul Numpy nije dostupan, što onemogućava karticu sažetak. " #~ "Instalirate numpy kako biste to ispravili." #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "Omogućeno sakriva račune sa stanjem 0.00 kn sa popisa" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Upozorenje: Nemoguće vezati uz DateCtrl ENTER. Nadogradite na wxPython >= " #~ "2.8.8.1 kako biste to ispravili." #~ msgid "Account" #~ msgstr "Račun" #~ msgid "account:" #~ msgstr "račun" #~ msgid "Every" #~ msgstr "Svaki" wxbanker-0.9.1/wxbanker/po/hu.po0000644000175000017500000005355712243601243016533 0ustar mrooneymrooney# Hungarian translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2011-03-29 05:08+0000\n" "Last-Translator: gergely87 \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2011-03-30 04:35+0000\n" "X-Generator: Launchpad (build 12559)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "hónapok" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Ettől" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "eddig" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Grafikon" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "CSV import" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Célszámla" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importálás" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "CSV oszlop-egyeztetés" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Dátum" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Dátum formátum" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Összeg" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Tizedesjel" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Leírás" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "CSV fájl beállításai" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Sorok kihagyjása" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Karakterkódolás" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Oszlop elválasztó" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Importálandó fájl" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV profilok" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "A Python simplejson könyvtár szükséges a csv profilok " "betöltéséhez/mentéséhez." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Mentés" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Eltávolítás" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "A fájl karakterkódolása valószínűleg '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Hiba történt a csv importálás során." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "CVS import hiba" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "A '%s' profil már létezik. Felülírjuk?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Felülírjuk a profilt?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Válassz fájlt és kattints az \"Előnézet\"-re" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "tól" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Átvitel" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Napi" msgstr[1] "Minden %(num)d nap" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Heti" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Havi" msgstr[1] "Minden %(num)d hónap" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Éves" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Soha" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "H" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "K" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Sze" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Cs" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "P" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Szo" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "V" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Nem adtál meg összeget az 'Összeg' mezőben." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "A '%s' összeg nem valós." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Kérlek, számot írj. Például: 12.34 vagy -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Érvénytelen tranzakciós összeg" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Kérlek, válassz egy számlát és próbáld újra." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Nem választottál számlát." #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Töröljük a keresést?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Több lehetőség" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Kevesebb lehetőség" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Egyezik: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Részletes keresési beállítások megjelenítése" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Részletes keresési beállítások elrejtése" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:101 msgid "Preview" msgstr "Előnézet" #: wxbanker/main.py:110 msgid "Perform" msgstr "" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Úgy tűnik, ez az első alkalom, hogy használja a wxBankert!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "A kezdéshez, adjon hozzá egy számlát a számlabeállításoknál, a bal felső " "sarokban." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "A gombokkal a számlabeállításoknál hozzáadhat, átnevezheti, beállíthatja, és " "eltávolíthatja a számláit." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Miután létrehozott egy számlát, felveheti a tranzakciókat (például induló " "egyenleg), használva a gombokat a jobb alsó sarokban" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Jó szórakozást!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Üdvözöljük!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Mentsük a változtatásokat?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Változások történtek az utolsó mentés óta. Szeretné, hogy menteni kilépés " "elõtt?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Nincs váltószám megadva a \"%s\" valutához." #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Számlák" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Új számla" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "A kijelölt számla törlése" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "A kijelölt számla átnevezése" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "A kijelölt számla beállítása" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Minden számla" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Bocsi, az adott névvel már létezik számla." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Fiók neve" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Ezzel véglegesen letöröljük a '%s' számlát és az összes tranzakcióját. " "Folytassuk?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Figyelmeztetés" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Automatikus mentés" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Változtatások automatikus mentése" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Importálás CSV-ből" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Exportálás CSV-be" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Pénznem" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Pénznem kérése" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "A Gyakran Ismételt Kérdések megtekintése interneten" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Kér&dezek" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Interneten kérdezek" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Hiba bejelentése" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Hiba bejelentése interneten" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Új szolgáltatás kérése" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Új szolgáltatás megvalósításának kérése" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "A vxBanker le&fordítása" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "A vxBanker lefordítása más nyelvre" #: wxbanker/menubar.py:133 msgid "&About" msgstr "Név&jegy" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "További információk a vxBanker-ről" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Fájl" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Nézet" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Beállítások" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Súgó" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Copyright" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Egyszerű személyes pénzügyek." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Heti hétköznapokon" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Heti hétvégén" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Hétfőnként" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Keddenként" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Szerdánként" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Csütörtökönként" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Péntekenként" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Szombatonként" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Vasárnaponként" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " és %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Nincs leírás" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Számológép Megjelenítése" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Számológép Elrejtése" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Tranzakciók" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Összesen" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Egyenleg" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Adjunk a számításhoz a %s-t." #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Vonjunk ki a számításból %s-t." #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Trend" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Teljes egyenleg az adott időben" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "Havi" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "" #: wxbanker/currencies.py:334 msgid "detected" msgstr "" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Tranzakció részletek" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Törlés" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" #~ msgid "Load" #~ msgstr "Betöltés" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "" #~ "Ha ez be van állítva, akkor a 0 egyenlegű számlák nem jelennek meg a " #~ "listában." #~ msgid "Hide zero-balance accounts" #~ msgstr "A zéró-összegű számlák elrejtése" #~ msgid "Total" #~ msgstr "Teljes összeg" #~ msgid "Which account will the money come from?" #~ msgstr "Melyik számláról érkezzen az összeg?" #~ msgid "transaction" #~ msgstr "tranzakció" #~ msgid "Other accounts" #~ msgstr "További számlák" #~ msgid "Account" #~ msgstr "Számla" #~ msgid "All Accounts" #~ msgstr "Minden számla" #~ msgid "Case Sensitive" #~ msgstr "Kisbetű-nagybetű számít" #~ msgid "CSV Import" #~ msgstr "CSV Import" #~ msgid "&Tools" #~ msgstr "&Eszközök" #~ msgid "A lightweight personal finance management application." #~ msgstr "Pehelykönnyű személyi pénzügyi menedzser alkalmazás." #~ msgid "Skip first line" #~ msgstr "Első sor kihagyása" #~ msgid "transfer" #~ msgstr "átutalás" #~ msgid "Fit Curve Degree" #~ msgstr "A görbeillesztés foka" #~ msgid "Sample Points" #~ msgstr "Mintavételi pontok" #~ msgid "Current Account" #~ msgstr "Aktuális számla" #~ msgid "Show" #~ msgstr "Megjelenít" wxbanker-0.9.1/wxbanker/po/it.po0000644000175000017500000006315712243601243016530 0ustar mrooneymrooney# Italian translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2012-10-09 16:27+0000\n" "Last-Translator: Da Lio Maurizio \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2012-10-10 04:43+0000\n" "X-Generator: Launchpad (build 16112)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Grado di Andamento" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Mesi" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Da" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "a" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Grafico" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Importare CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Conto in esame" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Annulla" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importa" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Mappatura Colonne CSV" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Data:" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Formato data" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Importo" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Separatore decimale" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Descrizione" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Impostazione file CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Linee da saltare" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Codifica" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Delimita colonne" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "File da importare" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV profili" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "la libreria simplejson di python è necessaria per leggere/salvare il CSV del " "profilo" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Salva" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Rimuovi" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "La codifica del file non sembra essere '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "C'è stato un'errore nell' importazione del file csv" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Errore nell'importazione CSV" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Esiste già un profilo con il nome '%s'. Sovrascrivere?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Sovrascrivere il profilo?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Seleziona un file e clicca \"Anteprima\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "da" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Bonifico" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Giornaliero" msgstr[1] "Ogni %(num)d giorni" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Settimanale" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Mensilmente" msgstr[1] "Ogni %(num)d mesi" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Annuale" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Mai" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "ogni" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Finisce:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Ripete:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "giorno" msgstr[1] "giorni" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "settimana" msgstr[1] "settimane" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "mese" msgstr[1] "mesi" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "anno" msgstr[1] "anni" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Lun" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Mar" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Mer" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Gio" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Ven" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Sab" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Dom" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Ripeti nei giorni:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Inizia:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Inserisci questa transazione" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Ricorrente" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Bilancio iniziale" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Nessun importo inserito nel campo 'Importo'" #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "«%s» è un importo non valido." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Inserisci un numero come 12.34 oppure -20" #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Ammontare della transazione invalido" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Per favore, scegli un account e prova di nuovo." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Nessun account selezionato" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Una ricerca è attiva al momento." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "Vuoi pulire la ricerca corrente e eseguire la transazione in \"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Pulire ricerca?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Questa transazione è marcata come trasferimento. Per favore, seleziona " "l'account di trasferimento." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Se questa opzione è selezionata aggiungendo una transazione, verrà richiesto " "l'inserimento del conto da utilizzare come sorgente del trasferimento." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Per esempio, selezionando questa casella e inserendo una transazione di $50 " "in questo account, verranno sottratti $50 dall'account che selezionerai come " "sorgente" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Ricerca movimenti" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Altre opzioni" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Meno opzioni" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Corrispondenza: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Mostra le opzioni di ricerca avanzate" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Nascondi opzioni avanzate di ricerca" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "La transazione ricorrente \"%(description)s\" ha %(num)i transazioni pronte " "per %(amount)s nei giorni %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i transazioni ricorrenti hanno un totale di %(totalnum)i transazioni " "pronte." #: wxbanker/main.py:101 msgid "Preview" msgstr "Anteprima" #: wxbanker/main.py:110 msgid "Perform" msgstr "Esegui" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Transazione periodica aggiunta con successo." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "La prima transazione avverrà il %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "A quanto pare è la prima volta che usi wxBanker!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Per cominciare, aggiungi un account usando i pulsanti per gli account " "nell'angolo in alto a sinistra." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "I pulsanti nel controllo del conto ti permettono di aggiungere, rinominare, " "configurare e rimuovere un conto, rispettivamente." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Una volta che hai creato un account puoi aggiungerci transazioni (come il " "tuo bilancio iniziale) usando i controlli sotto la griglia in basso a destra." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Divertiti!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Benvenuto!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Salvare le modifiche?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Hai effettuato delle modifiche dall'ultimo salvataggio. Vuoi salvare le " "modifiche prima di uscire?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Ricorda che abilitare il salvataggio automatico dal menu File eliminerà la " "necessità di salvare manualmente." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Nessun tasso di scambio per la valuta \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Accounts" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Aggiungi un nuovo account" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Rimuovi l'account selezionato" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Rinomina l'account selezionato" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Configura l'account selezionato" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Tutti i conti" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Non sincronizzato con Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Spiacente ma esiste già un conto con questo nome" #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "I nomi degli account non possono essere vuoti." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Nome conto" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Ciò cancellerà permanentemente l'account '%s' e tutte le sue transazioni. " "Continuare?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Attenzione" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Salvataggio automatico" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Salva automaticamente i cambiamenti" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Importa da CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Importa transazioni da un file CSV" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Esporta in CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Esporta le transazioni in un file CSV" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Account precedente" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Account successivo" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Mostra account con bilancio nullo" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Quando disattivati, i conti con un bilancio di $0.00 saranno nascosti dalla " "lista" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Valuta" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Seleziona la valuta da mostrare" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Richiedi valuta" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integra con Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" "Sincronizza i bilanci degli account con un account Mint.com esistente" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Mostra &FAQs" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Mostra le Frequently Asked Questions online" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Poni una &Domanda" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Poni una domanda online" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Segnala un bug" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Segnala un bug allo sviluppatore online" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Richiedi una funzionali&tà" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Richiedi di implementare una nuova funzionalità" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Traduci wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Traduci wxBanker in un'altra lingua" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Informazioni" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Maggiori informazioni su wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&File" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Visualizza" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Impostazioni" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Aiuto" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Copyright" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Semplice finanza personale." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Ogni settiamana nei giorni infrasettimanali" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Ogni settimana nel fine settimana" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Lunedi" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Martedi" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Mercoledi" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Giovedi" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Venerdi" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Sabato" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Domenica" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Ogni settimana di %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Ogni %(num)d settimane, di %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " e %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Annualmente" msgstr[1] "Ogni %(num)d anni" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "fino a %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Nessuna descrizione" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Trasferisci da %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Trasferisci a %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Riepilogo:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Mostra la calcolatrice" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Nascondi la calcolatrice" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transazioni" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Sommario" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Nessuna transazione inserita" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Nessuna transazione trovata." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Bilancio" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Totale" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Invia %s alla calcolatrice" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Aggiungi %s alla calcolatrice" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Sottrai %s alla calcolatrice" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Rimuovi questa transazione" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Sposta questa transazione al conto" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Nessuna etichetta" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Rimuovi queste %i transazioni" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Sposta queste %i transazioni al conto" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Nessuna etichetta comune" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Aggiungi un'etichetta" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Etichette" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Cerca questa etichetta" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Rimuovi questa etichetta" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "bilamcio" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Andamento" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Bilancio Totale nel Lungo Periodo" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Tempo" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "mensilmente" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "Per usare la libreria di stampa '%s', installare i seguenti moduli python: " "%s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Rimuovi" #: wxbanker/currencies.py:334 msgid "detected" msgstr "rilevato" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Nessuno/a" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Credenziali Mint.com:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Salva le credenziali nel portachiavi" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Conto Mint corrispondente per %(name)s:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Aggiorna" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Nome utente:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Password:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Dettagli della transazione" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" "Questo cancellerà in modo permanente la transazione ricorrente. Continuare?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Qesto conto non ha transazioni ricorrenti" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Chiudi" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Elimina" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Transazioni ricorrenti" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Integrazione Mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "Si può anche etichettare una transazione mettendo #nometag ovunque nella " "descrizione." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Etichetta:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "Per rimuovere questa etichetta, rimuoverla dalla descrizione o clicca col " "tasto destro sulla transazione." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Aggiungi Etichetta" #~ msgid "Total" #~ msgstr "Totale" #~ msgid "Skip first line" #~ msgstr "Ignora la prima linea" #~ msgid "Load" #~ msgstr "Carica" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "" #~ "Quando è abilitato, gli accounto con un bilancio pari a €0,00 saranno " #~ "nascosti dalla lista" #~ msgid "Hide zero-balance accounts" #~ msgstr "Nascondi gli account con bilancio pari a zero" #~ msgid "transfer" #~ msgstr "trasferisci" #~ msgid "transaction" #~ msgstr "transazione" #~ msgid "Transact" #~ msgstr "Transazione" #~ msgid "Which account will the money come from?" #~ msgstr "Da che account vengono i soldi?" #~ msgid "Other accounts" #~ msgstr "Altri account" #~ msgid "All Accounts" #~ msgstr "Tutti gli account" #~ msgid "Current Account" #~ msgstr "Account corrente" #~ msgid "Case Sensitive" #~ msgstr "Maiuscole/Minuscole" #~ msgid "Account" #~ msgstr "Account" #~ msgid "Show" #~ msgstr "Mostra" #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "I pulsanti per gli account ti permettono di aggiungere, rimuovere e " #~ "rinominare un account, rispettivamente." #~ msgid "CSV Import" #~ msgstr "Importa CSV" #~ msgid "&Tools" #~ msgstr "S&trumenti" #~ msgid "A lightweight personal finance management application." #~ msgstr "Una leggera applicazione per la gestione delle finanze personali." #~ msgid "Sample Points" #~ msgstr "Punti di Campionamento" #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "E' già attiva una ricerca. Vuoi scartare la ricerca attuale e fare questo %s " #~ "in \"%s\"?" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Attenzione: Impossibile legare all'INVIO di DateCtrl. Aggiorna a wxPython >= " #~ "2.8.8.1 per correggere il problema." #~ msgid "Whether or not to match based on capitalization" #~ msgstr "Se uguagliare o meno basandosi sulla capitalizzazione" #~ msgid "Fit Curve Degree" #~ msgstr "Grado di Curva Adattiva" #~ msgid "In: " #~ msgstr "In: " #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Attenzione: il modulo Numpy non è disponibile, viene disabilitato il tab " #~ "Riepilogo. Installa numpy per correggere il problema." wxbanker-0.9.1/wxbanker/po/ko.po0000644000175000017500000004337612243601243016526 0ustar mrooneymrooney# Korean translation for wxbanker # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-08-10 00:01-0700\n" "PO-Revision-Date: 2010-08-14 12:38+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2010-08-15 06:13+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "" #: wxbanker/summarytab.py:48 msgid "From" msgstr "" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "" #: wxbanker/csvimportframe.py:28 msgid "CSV import" msgstr "" #: wxbanker/csvimportframe.py:62 msgid "Target account" msgstr "" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:79 msgid "Import" msgstr "" #: wxbanker/csvimportframe.py:89 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:98 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:63 msgid "Date" msgstr "" #: wxbanker/csvimportframe.py:101 msgid "Date format" msgstr "" #: wxbanker/csvimportframe.py:106 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:65 msgid "Amount" msgstr "" #: wxbanker/csvimportframe.py:108 msgid "Decimal separator" msgstr "" #: wxbanker/csvimportframe.py:112 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:64 msgid "Description" msgstr "" #: wxbanker/csvimportframe.py:119 msgid "CSV file settings" msgstr "" #: wxbanker/csvimportframe.py:128 msgid "Lines to skip" msgstr "" #: wxbanker/csvimportframe.py:131 msgid "Encoding" msgstr "" #: wxbanker/csvimportframe.py:135 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:146 msgid "File to import" msgstr "" #: wxbanker/csvimportframe.py:151 wxbanker/csvimportframe.py:153 #: wxbanker/main.py:100 msgid "Preview" msgstr "" #: wxbanker/csvimportframe.py:166 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:171 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:181 msgid "Load" msgstr "" #: wxbanker/csvimportframe.py:186 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "" #: wxbanker/csvimportframe.py:191 wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "" #: wxbanker/csvimportframe.py:245 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:252 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:253 msgid "CSV import error" msgstr "" #: wxbanker/csvimportframe.py:303 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:304 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:318 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:341 msgid "Initial balance" msgstr "" #: wxbanker/newtransactionctrl.py:377 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:379 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:382 msgid "Please enter a number such as 12.34 or -20." msgstr "" #: wxbanker/newtransactionctrl.py:383 msgid "Invalid Transaction Amount" msgstr "" #: wxbanker/newtransactionctrl.py:394 msgid "Please select an account and then try again." msgstr "" #: wxbanker/newtransactionctrl.py:395 wxbanker/newtransactionctrl.py:423 msgid "No account selected" msgstr "" #: wxbanker/newtransactionctrl.py:408 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:408 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:409 msgid "Clear search?" msgstr "" #: wxbanker/newtransactionctrl.py:422 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:455 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:456 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "" #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "" #: wxbanker/main.py:84 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:89 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:109 msgid "Perform" msgstr "" #: wxbanker/main.py:125 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:127 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "" #: wxbanker/accountlistctrl.py:154 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:438 wxbanker/accountlistctrl.py:539 msgid "Sorry, an account by that name already exists." msgstr "" #: wxbanker/accountlistctrl.py:440 wxbanker/accountlistctrl.py:541 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:474 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:513 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:514 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:133 msgid "&About" msgstr "" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:136 msgid "&File" msgstr "" #: wxbanker/menubar.py:137 msgid "&View" msgstr "" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "" #: wxbanker/menubar.py:246 msgid "Copyright" msgstr "" #: wxbanker/menubar.py:247 msgid "Simple personal finance." msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "" #: wxbanker/transactionolv.py:66 msgid "Total" msgstr "" #: wxbanker/transactionolv.py:212 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:213 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:214 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:226 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:227 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:228 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:230 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:231 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/transactionolv.py:232 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:234 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:257 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:270 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:271 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:75 msgid "balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:37 wxbanker/plots/wxplotpanel.py:44 #: wxbanker/plots/cairopanel.py:81 wxbanker/plots/cairopanel.py:122 msgid "Balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:85 msgid "Trend" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:121 msgid "Time" msgstr "" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "" #: wxbanker/currencies.py:334 msgid "detected" msgstr "" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "" #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" wxbanker-0.9.1/wxbanker/po/nb.po0000644000175000017500000004346312243601243016511 0ustar mrooneymrooney# Norwegian Bokmal translation for wxbanker # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2011-05-20 10:28+0000\n" "Last-Translator: mabynke \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2011-05-21 04:42+0000\n" "X-Generator: Launchpad (build 12959)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "" #: wxbanker/summarytab.py:48 msgid "From" msgstr "" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Importer CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Målkonto" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "" #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "" #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "" #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:101 msgid "Preview" msgstr "" #: wxbanker/main.py:110 msgid "Perform" msgstr "" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "" #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:133 msgid "&About" msgstr "" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:136 msgid "&File" msgstr "" #: wxbanker/menubar.py:137 msgid "&View" msgstr "" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "" #: wxbanker/currencies.py:334 msgid "detected" msgstr "" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" wxbanker-0.9.1/wxbanker/po/nds.po0000644000175000017500000003714412243601243016675 0ustar mrooneymrooney# Low German translation for wxbanker # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-03 00:18-0800\n" "PO-Revision-Date: 2010-02-03 09:22+0000\n" "Last-Translator: Patrick Eigensatz \n" "Language-Team: Low German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-02-04 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/bankobjects/transaction.py:92 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:94 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:171 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:62 msgid "All accounts" msgstr "Alle Konten" #: wxbanker/accountlistctrl.py:385 wxbanker/accountlistctrl.py:487 msgid "Sorry, an account by that name already exists." msgstr "" #: wxbanker/accountlistctrl.py:387 wxbanker/accountlistctrl.py:489 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:421 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:460 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:461 msgid "Warning" msgstr "" #: wxbanker/accountconfigdialog.py:32 msgid "" "wxBanker can synchronize account balances online if you have an account with " "mint.com" msgstr "" #: wxbanker/accountconfigdialog.py:40 msgid "Username" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Password" msgstr "" #: wxbanker/accountconfigdialog.py:62 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:103 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:105 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:115 wxbanker/csvimportframe.py:184 msgid "Save" msgstr "" #: wxbanker/accountconfigdialog.py:116 msgid "Cancel" msgstr "" #: wxbanker/accountconfigdialog.py:136 msgid "Recurring Transactions" msgstr "" #: wxbanker/plots/cairopanel.py:72 wxbanker/plots/cairopanel.py:113 #: wxbanker/plots/wxplotpanel.py:35 wxbanker/plots/wxplotpanel.py:42 msgid "Balance" msgstr "Ausgleich" #: wxbanker/plots/cairopanel.py:76 wxbanker/plots/wxplotpanel.py:40 msgid "Trend" msgstr "Trend" #: wxbanker/plots/cairopanel.py:112 wxbanker/plots/wxplotpanel.py:42 msgid "Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 msgid "Total Balance Over Time" msgstr "Gesamter Kontostand über die Zeit:" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:45 msgid "Dismiss" msgstr "" #: wxbanker/summarytab.py:42 msgid "From" msgstr "Von" #: wxbanker/summarytab.py:46 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "Zu" #: wxbanker/summarytab.py:50 msgid "Trend Degree" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "" #: wxbanker/managetab.py:109 msgid "Summary" msgstr "" #: wxbanker/transactionolv.py:48 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:60 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:96 msgid "Date" msgstr "Datum" #: wxbanker/transactionolv.py:61 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:110 msgid "Description" msgstr "" #: wxbanker/transactionolv.py:62 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:104 msgid "Amount" msgstr "" #: wxbanker/transactionolv.py:63 msgid "Total" msgstr "" #: wxbanker/transactionolv.py:204 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:205 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:206 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:218 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:219 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:221 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:222 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:375 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:377 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:380 msgid "Please enter a number such as 12.34 or -20." msgstr "" #: wxbanker/newtransactionctrl.py:381 msgid "Invalid Transaction Amount" msgstr "" #: wxbanker/newtransactionctrl.py:392 msgid "Please select an account and then try again." msgstr "" #: wxbanker/newtransactionctrl.py:393 wxbanker/newtransactionctrl.py:421 msgid "No account selected" msgstr "" #: wxbanker/newtransactionctrl.py:406 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:406 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:407 msgid "Clear search?" msgstr "" #: wxbanker/newtransactionctrl.py:420 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:453 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:454 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/menubar.py:52 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:52 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:54 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:54 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:61 msgid "Next account" msgstr "" #: wxbanker/menubar.py:64 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:64 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:73 msgid "&Currency" msgstr "" #: wxbanker/menubar.py:73 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:82 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:93 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:93 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:98 msgid "Ask a &Question" msgstr "" #: wxbanker/menubar.py:98 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:103 msgid "&Report a Bug" msgstr "" #: wxbanker/menubar.py:103 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:108 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:108 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:113 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:113 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:120 msgid "&About" msgstr "" #: wxbanker/menubar.py:120 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:123 msgid "&File" msgstr "" #: wxbanker/menubar.py:124 msgid "&View" msgstr "" #: wxbanker/menubar.py:125 msgid "&Settings" msgstr "" #: wxbanker/menubar.py:126 msgid "&Help" msgstr "" #: wxbanker/menubar.py:220 msgid "Copyright" msgstr "" #: wxbanker/menubar.py:221 msgid "A lightweight personal finance management application." msgstr "" #: wxbanker/main.py:79 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:84 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:95 wxbanker/csvimportframe.py:149 #: wxbanker/csvimportframe.py:151 msgid "Preview" msgstr "" #: wxbanker/main.py:104 msgid "Perform" msgstr "" #: wxbanker/main.py:120 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:122 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:186 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:187 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:188 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" #: wxbanker/main.py:189 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:190 msgid "Have fun!" msgstr "" #: wxbanker/main.py:192 msgid "Welcome!" msgstr "" #: wxbanker/main.py:200 msgid "Save changes?" msgstr "" #: wxbanker/main.py:201 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:202 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/searchctrl.py:36 msgid "Search transactions" msgstr "" #: wxbanker/searchctrl.py:39 msgid "More options" msgstr "" #: wxbanker/searchctrl.py:39 msgid "Less options" msgstr "" #: wxbanker/searchctrl.py:50 msgid "Match: " msgstr "" #: wxbanker/searchctrl.py:94 msgid "Show advanced search options" msgstr "" #: wxbanker/searchctrl.py:96 msgid "Hide advanced search options" msgstr "" #: wxbanker/csvimportframe.py:28 msgid "CSV import" msgstr "" #: wxbanker/csvimportframe.py:60 msgid "Target account" msgstr "" #: wxbanker/csvimportframe.py:75 wxbanker/csvimportframe.py:77 msgid "Import" msgstr "" #: wxbanker/csvimportframe.py:87 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:99 msgid "Date format" msgstr "" #: wxbanker/csvimportframe.py:106 msgid "Decimal separator" msgstr "" #: wxbanker/csvimportframe.py:117 msgid "CSV file settings" msgstr "" #: wxbanker/csvimportframe.py:126 msgid "Skip first line" msgstr "" #: wxbanker/csvimportframe.py:129 msgid "Encoding" msgstr "" #: wxbanker/csvimportframe.py:133 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:144 msgid "File to import" msgstr "" #: wxbanker/csvimportframe.py:164 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:169 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:179 msgid "Load" msgstr "" #: wxbanker/csvimportframe.py:189 msgid "Delete" msgstr "" #: wxbanker/csvimportframe.py:243 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:250 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:251 msgid "CSV import error" msgstr "" #: wxbanker/csvimportframe.py:301 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:302 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:316 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/currencies.py:277 msgid "detected" msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" wxbanker-0.9.1/wxbanker/po/nl.po0000644000175000017500000006316312243601243016522 0ustar mrooneymrooney# Dutch translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2012-08-06 04:09+0000\n" "Last-Translator: Michael Rooney \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2012-08-07 04:45+0000\n" "X-Generator: Launchpad (build 15745)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Trendgraad" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Maanden" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Van" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "naar" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Grafiek" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Importeer CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Doelrekening" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Annuleren" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importeer" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "CSV kolommenindeling" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Datum" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Datumnotatie" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Bedrag" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Decimaalteken" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Omschrijving" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "CSV bestandsinstellingen" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Regels om over te slaan" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Codering" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Kolomn scheidingsteken" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Te importeren bestand" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV profielen" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Python simplejson bibliotheek is nodig voor het laden/opslaan van een CSV " "profiel." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Opslaan" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Verwijder" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "De bestandscodering lijkt geen '%s' te zijn" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Er is een fout ontstaan tijdens het importeren van het CSV-bestand" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "CSV importeerfout" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Profiel met de naam '%s' bestaat al. Overschrijven?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Profiel overschrijven?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Selecteer bestand en klik op 'Voorbeeld'" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "van" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Overmaken" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Dagelijks" msgstr[1] "Elke %(num)d dagen" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Wekelijks" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Maandelijks" msgstr[1] "Elke %(num)d maanden" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Jaarlijks" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Nooit" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "elke" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Eindigt:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Herhalingen:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "dag" msgstr[1] "dagen" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "week" msgstr[1] "weken" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "maand" msgstr[1] "maanden" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "jaar" msgstr[1] "jaren" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Ma" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Di" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Wo" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Do" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Vr" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Za" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Zo" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Herhaalt op dagen:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Begint:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Voeg deze transactie toe" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Herhalend" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Startbedrag" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Geen bedrag ingevuld bij 'Bedrag'" #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' is geen geldige hoeveelheid." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Voeg alstublieft een bedrag in zoals 12.34 of -20" #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Ongeldige transactie hoeveelheid" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "" "Alstublieft eerst een rekening selecteren, probeer het daarna nogmaals." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Geen rekening geselecteerd" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Momenteel is een zoekopdracht bezig." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Zou u de huidige zoekopdracht willen wissen en deze transactie maken in " "\"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Zoekveld wissen?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Deze transactie is gemarkeerd als overboeking. Selecteer alstublieft de " "overboekingsrekening." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Als dit vakje is aangevinkt tijdens het toevoegen van een transactie, wordt " "u gevraagd aan te geven van welke rekening het geld komt." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Bijvoorbeeld, als dit vakje is aangevinkt voor een transactie van $50 naar " "deze rekening, zal er $50 worden afgeschreven van de rekening die u heeft " "aangegeven." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Zoek transacties" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Meer opties" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Minder opties" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Komt overeen met: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Geavanceerde zoekopties tonen" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Geavanceerde zoekopties verbergen" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "De herhalende transactie \"%(description)s\" heeft %(num)i transacties klaar " "voor %(amount)s op %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i herhalende transacties hebben een totaal van %(totalnum)i " "transacties gereed." #: wxbanker/main.py:101 msgid "Preview" msgstr "Voorbeeld" #: wxbanker/main.py:110 msgid "Perform" msgstr "Uitvoeren" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Herhalende transactie succesvol toegevoegd." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "De eerste transactie zal plaatsvinden op %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Het lijkt erop dat dit de eerste keer is dat je wxBanker gebruikt!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Om te beginnen, maak een rekening aan in via rekeningenbeheer in de linker " "bovenhoek." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "De knoppen in het rekeningenbeheer geven u de mogelijkheid om een rekening " "respectievelijk toe te voegen, te hernoemen, te configureren en te " "verwijderen." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Zodra je een rekening hebt toegevoegd kun je transacties (zoals beginsaldo) " "toevoegen met behulp van de knoppen in het grid rechtsonder." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Veel Plezier!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Welkom!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Wijzigingen opslaan?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "U heeft wijzigingen gemaakt sinds de de laatste keer dat u opgeslagen heeft. " "Wilt u nu opslaan voor afsluiten?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Merk op dat het aanzetten van auto-opslaan in het bestandsmenu er voor zorgt " "dat u niet meer zelf hoeft op te slaan." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Geen wisselkoers voor valuta \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Rekeningen" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Een nieuwe rekening toevoegen" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Verwijder de geselecteerde rekening" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "De geselecteerde rekening hernoemen" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Configureer de geselecteerde rekening" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Alle rekeningen" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Niet gesynchroniseerd met Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Sorry, rekeningnaam bestaat al" #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Rekeningnamen kunnen niet leeg zijn." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Rekeningnaam" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Dit zal de rekening '%s' met bijbehorende transacties definitief " "verwijderen. Doorgaan?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Waarschuwing" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Auto-opslaan" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Automatisch veranderingen opslaan" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Importeer uit CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Importeer transacties uit een CSV-bestand" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Exporteer naar CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Exporteer transacties naar een CSV-bestand" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Vorige rekening" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Volgende rekening" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Laat rekeningen met nul-balans zien" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Indien uitgeschakeld worden rekeningen met een balans van €0,00 verborgen " "van de lijst" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Valuta" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Selecteer valuta" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Vraag een valuta aan" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integreer met Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Synchroniseer rekeningbalansen met een bestaand Mint.com-account" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Bekijk veel gestelde vragen (&FAQ)" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Bekijk veel gestelde vragen online" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Stel een vraag" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Stel een vraag online" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "Een fout &rapporteren" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Een fout online rapporteren aan een ontwikkelaar" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Vraag nieuwe func&tionalitiet aan" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Vraag niet bestaande nieuwe functionaliteit aan" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Vertaal wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Vertaal wxBanker naar een andere taal" #: wxbanker/menubar.py:133 msgid "&About" msgstr "Info &over" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Meer informatie over wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Bestand" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Toon" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Instellingen" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Help" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Auteursrecht" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Simpele, persoonlijke financiën." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Wekelijks op werkdagen" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Wekelijks in weekenden" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Maandagen" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Dinsdagen" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Woensdagen" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Donderdagen" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Vrijdagen" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Zaterdagen" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Zondagen" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Wekelijks op %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Elke %(num)d weken op %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " en %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Jaarlijks" msgstr[1] "Elke %(num)d jaar" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "tot %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Geen beschrijving" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Verplaats van %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Verplaats naar %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Samenvatting:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Rekenmachine tonen" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Rekenmachine verbergen" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transacties" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Samenvatting" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Geen transacties toegevoegd" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Geen overeenkomende transacties." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Saldo" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Totaal" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Stuur %s naar rekenmachine" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Tel %s op in rekenmachine" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Trek %s af in rekenmachine" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Verwijder deze transactie" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Verplaats deze transactie naar rekening" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Nog geen label" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Verwijder deze %i transacties" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Verplaatse deze %i transacties naar rekening" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Nog geen gemeenschappelijke labels" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Voeg een label toe" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Labels" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Zoek naar dit label" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Verwijder dit label" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "balans" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Trend" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Totaal saldo over tijd" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Tijd" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "maandelijks" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "Om de '%s' plotting-bibliotheek te gebruiken, moeten de volgende python " "modules worden geïnstalleerd: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Verwerpen" #: wxbanker/currencies.py:334 msgid "detected" msgstr "gedetecteerd" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Geen" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Mint.com gegevens:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Sla gegevens op in sleutelring" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Overeenkomend Mint account voor %(name)s:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Vernieuwen" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Gebruikersnaam:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Wachtwoord:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Transactiedetails" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" "Dit zal deze terugkerende transactie definitief verwijderen. Doorgaan?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Dit account heeft momenteel geen herhalende transacties." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Sluiten" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Verwijderen" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Herhalende transacties" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Mint.com Integratie" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "U kan ook een label toevoegen aan een transactie door #labelnaam ergens in " "de omschrijving neer te zetten." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Label:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "Om dit label later te verwijderen, verwijder het uit de omschrijving of " "rechtsklik op de transactie." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Label toevoegen" #~ msgid "Total" #~ msgstr "Totaal" #~ msgid "A lightweight personal finance management application." #~ msgstr "Een lichtgewicht persoonlijk financieel management programma." #~ msgid "All Accounts" #~ msgstr "Alle Rekeningen" #~ msgid "Current Account" #~ msgstr "Lopende rekening" #~ msgid "Case Sensitive" #~ msgstr "Hoofdlettergevoelig" #~ msgid "In: " #~ msgstr "In: " #~ msgid "Show" #~ msgstr "Tonen" #~ msgid "transfer" #~ msgstr "Overboeken" #~ msgid "transaction" #~ msgstr "transactie" #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "Er is een zoekactie actief. Wil je de huidige zoekactie stoppen en de actie " #~ "%s wijzigen in actie \"%s\"?" #~ msgid "Skip first line" #~ msgstr "Sla eerste regel over" #~ msgid "Load" #~ msgstr "Laden" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "" #~ "Wanneer geactiveerd zullen alle rekeningen met een balans van $0.00 worden " #~ "verbogen in de lijst" #~ msgid "Hide zero-balance accounts" #~ msgstr "Verberg de nul-balans rekeningen" #~ msgid "Transact" #~ msgstr "Overmaken" #~ msgid "Which account will the money come from?" #~ msgstr "Van welk account komt het geld?" #~ msgid "Other accounts" #~ msgstr "Andere rekeningen" #~ msgid "Sample Points" #~ msgstr "Voorbeeldpunten" #~ msgid "Account" #~ msgstr "Rekening" #~ msgid "Fit Curve Degree" #~ msgstr "Graden kromme lijn" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "Laat hoofdletters meewegen" #~ msgid "CSV Import" #~ msgstr "CSV importeren" #~ msgid "&Tools" #~ msgstr "&Hulpmiddelen" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Waarschuwing: Niet in staat DateCtrl's ENTER te binden. Update naar wxPython " #~ ">= 2.8.8.1 om dit op te lossen." #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "Via de knoppen in het rekeningenbeheer kun je rekeningen toevoegen, " #~ "verwijderen en hernoemen." #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Waarschuwing: Numpy modules zijn niet beschikbaar, de samenvattingstab is " #~ "uitgeschakeld. Installeer numpy om het probleem op te lossen." wxbanker-0.9.1/wxbanker/po/oc.po0000644000175000017500000004676312243601243016521 0ustar mrooneymrooney# Occitan (post 1500) translation for wxbanker # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2011-11-23 16:55+0000\n" "Last-Translator: Cédric VALMARY (Tot en òc) \n" "Language-Team: Occitan (post 1500) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2011-11-24 04:38+0000\n" "X-Generator: Launchpad (build 14336)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Gra de lissatge de la tendéncia" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Meses" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Periòde del" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "fins a" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Graf" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Importacion CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Compte cibla" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Anullar" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importar" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Format de las colomnas CSV" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Data de publicacion" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Format de la data" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Total" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Separador decimal" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Descripcion" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Paramètres del fichièr CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Linhas d'ignorar" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Encodatge" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Delimitador de colomnas" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Fichièr d'importar" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "Perfils CSV" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Enregistrar" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Suprimir" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Error d'importacion CSV" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Espotir lo perfil ?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "dempuèi" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Transferir" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Cada jorn" msgstr[1] "Cada %(num)d jorns" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Cada setmana" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Cada mes" msgstr[1] "Cada %(num)d meses" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Cada an" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Pas jamai" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "cada" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Fin :" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Repetir :" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "jorn" msgstr[1] "jorns" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "setmana" msgstr[1] "setmanas" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "mes" msgstr[1] "meses" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "an" msgstr[1] "ans" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Dil" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Dim" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Mèc" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Dij" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Div" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Dis" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Dim" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Jorns de repeticion :" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "S'avia :" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Apondre aquesta transaccion" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Repeticion" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Sòlde inicial" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "" #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Montant de transaccion invalid" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Mercés de seleccionar un compte e de tornar ensajar." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Cap de compte pas seleccionat" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Una recèrca es actualament activa." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Anullar la recèrca ?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Cercar dins las transaccions" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Mai d'opcions" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Mens d'opcions" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Cercar dins : " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Afichar las opcions de recèrca avançada" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Amagar las opcions de recèrca avançada" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:101 msgid "Preview" msgstr "Previsualizacion" #: wxbanker/main.py:110 msgid "Perform" msgstr "Jogar" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Amusatz-vos !" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Benvenguda !" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Salvar los cambiaments ?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Comptes" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Apondre un compte novèl" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Suprimir lo compte seleccionat" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Totes los comptes" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "" #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Nom del compte" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Avertiment" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Salvament automatic" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Importar dempuèi CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Exportar en CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Compte precedent" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Compte seguent" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Devisa" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Prepausar una devisa" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integrar a Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "&Veire la FAQ" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "&Pausar una Question" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "&Traduire wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Traduire wxBanker dins una autra lenga" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&A prepaus" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Fichièr" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Afichatge" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Paramètres" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Ajuda" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Dreches d'autor" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Gestion simpla de comptes personals" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Dissabtes" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Dimenges" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " e %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Pas cap de descripcion" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Resumit :" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Afichar la Calculadoira" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transaccions" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Resumit" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Balança" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Total" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Atributs" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "sòlde" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Tendéncia" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Moment" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "cada mes" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Tampar" #: wxbanker/currencies.py:334 msgid "detected" msgstr "detectat" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Pas cap" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Identificants Mint.com :" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Mesa a jorn" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Nom d'utilizaire :" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Senhal :" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Detalhs de la transaccion" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Tampar" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Suprimir" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Etiqueta :" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" wxbanker-0.9.1/wxbanker/po/pl.po0000644000175000017500000006217112243601243016522 0ustar mrooneymrooney# Polish translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2012-03-31 13:54+0000\n" "Last-Translator: Antoni Kudelski \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2012-04-01 04:36+0000\n" "X-Generator: Launchpad (build 15032)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Stopień trendu" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Miesięcy" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Od" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "do" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Wykres" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Import CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Konto docelowe" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Anuluj" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importuj" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Mapowanie kolumn CSV" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Data" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Format daty" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Kwota" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Separator dziesiętny" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Opis" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Ustawienia pliku CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Linie do pominięcia" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Kodowanie" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Separator kolumn" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Plik do zaimportowania" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "Profile CSV" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Zapisywanie i wczytywanie profili CSV wymaga biblioteki Python simplejson" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Zapisz" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Usuń" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Kodowanie pliku nie wydaje się być w formacie '%s'" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Podczas importu wystąpił błąd" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Błąd importu CSV" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Profil o nazwie '%s' już istnieje. Nadpisać?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Nadpisać profil?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Wybierz plik i naciśnij \"Podgląd\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "od" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Przelew" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Codziennie" msgstr[1] "Co %(num)d dni" msgstr[2] "Co %(num)d dni" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Co tydzień" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Co miesiąc" msgstr[1] "Co %(num)d miesiące" msgstr[2] "Co %(num)d miesięcy" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Co rok" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Nigdy" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "co" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Koniec:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Powtarza się:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "dzień" msgstr[1] "dni" msgstr[2] "dni" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "tydzień" msgstr[1] "tygodnie" msgstr[2] "tygodni" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "miesiąc" msgstr[1] "miesiące" msgstr[2] "miesięcy" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "rok" msgstr[1] "lata" msgstr[2] "lat" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Pn" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Wt" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Śr" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Cz" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Pt" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "So" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Nd" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Powtarza się w dniach:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Rozpoczyna się:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Wprowadź tę transakcję" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Powtarzanie" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Saldo początkowe" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Nie wpisano kwoty w polu 'Kwota'." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' nie jest ważną kwotą." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Proszę wpisać liczbę np. 12.34 or -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Nieważna Kwota Transakcji" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Proszę wybrać konto i spróbować ponownie." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Nie wybrano konta" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Włączone jest wyszukiwanie." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Czy chcesz usunąć aktualne szukanie i uczynić tę transakcję w \"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Wyczyścić wyszukiwanie?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Ta transakcja jest oznaczona jako przelew. Wynierz konto do przelewu." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Będziesz pytany którego konta użyć jako źródła przelewu, jeśli ta opcja jest " "aktywna podczas dodawania transakcji." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Dla przykładu zaznaczenie tego pola wyboru i wprowadzenie do tego konta " "transakcji na 50PLN odejmie jednocześnie 50PLN z konta, które zostało " "wybrane jako źródło." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Przeszukaj transakcje" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Więcej opcji" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Mniej opcji" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Dopasuj: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Pokaż zaawansowane opcje wyszukiwania" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Ukryj zawansowane opcje wyszukiwania" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:101 msgid "Preview" msgstr "Podgląd" #: wxbanker/main.py:110 msgid "Perform" msgstr "Wykonaj" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Dodano transakcje okresowa." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "Pierwsza transakcja nastąpi %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Wygląda na to, że używasz wxBanker po raz pierwszy!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Aby rozpocząć, dodaj konto używając kontroli konta w lewym górnym rogu." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Przyciski kontroli konta pozwalają odpowiednio na dodawanie, zmianę nazwy, " "konfigurowanie i usuwanie konta." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Po utworzeniu konta możesz do niego dodawać transakcje (np. początkowy stan " "konta) używając przycisków pod paskiem w prawym dolnym rogu." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Miłej zabawy!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Witaj!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Zapisać zmiany?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Wykonałeś zmiany od ostatniego zapisu. Czy chcesz zapisać dane przed " "zakończeniem aplikacji?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Należy pamiętać, że włączenia automatycznego zapisywania z menu Plik " "eliminuje konieczność ręcznego zapisywania." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Brak kursu wymiany dla waluty \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Konta" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Dodaj nowe konto" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Usuń zaznaczone konto" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Zmień nazwę zaznaczonego konta" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Konfiguruj zaznaczone konto" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Wszystkie konta" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Brak synchronizacji z Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Konto o tej nazwie już istnieje." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Nazwy kont nie mogą być puste." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Nazwa konta" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Konto '%s' zostanie trwale usunięte wraz ze wszystkimi transakcjami. Chcesz " "kontynuować?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Ostrzeżenie" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Automatyczne zapisywanie" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Automatycznie zapisuj zmiany" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Importuj z pliku CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Importuj transakcje z pliku CSV" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Eksport do CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Eksportuj transaakcje do pliku CSV" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Poprzednie konto" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Następne konto" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Pokazuj konta o zerowych saldach" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Gdy ta opcja jest wyłączona, konto o saldach wynoszących 0,00 będą " "niewidoczne na liście" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Waluta" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Wybierz walutę do wyświetlenia" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Wymagana Waluta" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integruj z Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Synchronizacja sald kont z istniejącym kontem Mint.com" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Przeglądaj &FAQs" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Przeglądaj najczęściej zadawane pytania online" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Zadaj &Pytanie" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Zadaj pytanie online" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Zgłoś Błąd" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Zgłoś błąd do dewelopera online" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Wymagana Funkcja" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Wymagana nowa funkcja do załączenia" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Przetłu&macz wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Przetłumacz wxBanker na inny język" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&O programie" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Więcej informacji o wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Plik" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Widok" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Ustawienia" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Pomoc" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Prawa autorskie" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Proste finanse osobiste." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Co tydzień w dni powszednie" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Co tydzień w weekendy" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "W poniedziałki" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "We wtorki" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "W środy" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "W czwartki" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "W piątki" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "W soboty" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "W niedziele" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Co tydzień w %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Co %(num)d tygodni w %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " i %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Rocznie" msgstr[1] "Co %(num)d lata" msgstr[2] "Co %(num)d lat" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "do %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Brak opisu" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Przelej z %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Przelej do %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Podsumowanie:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Pokaż kalkulator" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Ukryj kalkulator" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transakcje" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Podsumowanie" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Brak wprowadzonych transakcji" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Brak pasujących transakcji." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Saldo" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Łącznie" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Wyślij %s do kalkulatora" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Dodaj %s do kalkulatora" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Odejmij %s z kalkulatora" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Usuń transakcję" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Przesuń transakcję na konto" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Brak tagów" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Usuń %i transakcji" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Przesuń %i transakcji na konto" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Brak wspólnych tagów" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Dodaj tag" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Tagi" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Szukaj tego tagu" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Usuń ten tag" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "saldo" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Trend" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Przebieg całkowitego salda w czasie" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Czas" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "miesięcznie" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "Aby używać biblioteki kreślenia wykresów '%s', zainstaluj następujące moduły " "python: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Odrzuć" #: wxbanker/currencies.py:334 msgid "detected" msgstr "wykrytych" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Brak" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Dane logowania do Mint.com:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Zapisz dane w bazie kluczy" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Konto Mint powiązane z %(name)s:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Aktualizuj" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Nazwa użytkownika:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Hasło:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Szczegóły transakcji" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Brak obecnie transakcji okresowych dla tego konta." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Zamknij" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Usuń" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Transakcje okresowe" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Integracja z Mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "Możesz także oznaczyć transakcję poprzez umieszczenie #nazwatagu w dowolnym " "miejscu w opisie." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Tag:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "Aby usunąć ten tag później, po prostu usuń go z opisu lub kliknij prawym " "przyciskiem myszy na transakcji." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Dodaj tag" #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "Przyciski w kontroli konta pozwolą Ci odpowiednio dodać, usunąć i zmienić " #~ "nazwę konta." #~ msgid "Fit Curve Degree" #~ msgstr "Dopasuj Stopień Krzywej" #~ msgid "A lightweight personal finance management application." #~ msgstr "Lekki program do zarządzania osobistymi finansami." #~ msgid "All Accounts" #~ msgstr "Wszystkie konta" #~ msgid "Current Account" #~ msgstr "Bieżące konto" #~ msgid "Total" #~ msgstr "Suma" #~ msgid "In: " #~ msgstr "W: " #~ msgid "Show" #~ msgstr "Pokaż" #~ msgid "Hide zero-balance accounts" #~ msgstr "Ukryj konta o saldzie zerowym" #~ msgid "Transact" #~ msgstr "Przeprowadź transakcję" #~ msgid "transaction" #~ msgstr "transakcja" #~ msgid "transfer" #~ msgstr "przelej" #~ msgid "Other accounts" #~ msgstr "Inne konta" #~ msgid "Which account will the money come from?" #~ msgstr "Z którego konta będą pochodzić środki?" #~ msgid "Skip first line" #~ msgstr "Pomiń pierwszą linię" #~ msgid "Load" #~ msgstr "Wczytaj" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "" #~ "Konta o saldzie 0.00 będą ukryte na liście, jeśli ta opcja jest aktywna." #~ msgid "Account" #~ msgstr "Konto" #~ msgid "Case Sensitive" #~ msgstr "Uwzględniaj wielkość liter" #~ msgid "&Tools" #~ msgstr "&Narzędzia" #~ msgid "CSV Import" #~ msgstr "Import CSV" #~ msgid "Sample Points" #~ msgstr "Punkty wzorcowe" #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "Wyszukiwanie jest obecnie aktywne. Czy wyczyścić aktualne wyszukiwanie i " #~ "zmienić %s w \"%s\"?" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Ostrzeżenie: nie można dowiązać do DateCtrl ENTER. Należy zaktualizować " #~ "wxPython do wersji 2.8.8.1 lu” wyższej." #~ msgid "Whether or not to match based on capitalization" #~ msgstr "Czy dopasowywac w zależności od wielkości liter" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Ostrzeżenie: brak modułu Numpy, karta podsumowania zostanie wyłączona. Aby " #~ "ją włączyć ponownie należy zainstalować ten moduł." wxbanker-0.9.1/wxbanker/po/pt.po0000644000175000017500000006134612243601243016535 0ustar mrooneymrooney# Portuguese translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2012-02-09 16:11+0000\n" "Last-Translator: Fugiwara \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2012-02-10 04:42+0000\n" "X-Generator: Launchpad (build 14771)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Grau de tendência" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Meses" #: wxbanker/summarytab.py:48 msgid "From" msgstr "De" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "para" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Gráfico" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Importar CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Conta destino" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Cancelar" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importar" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Mapeamento das colunas CSV" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Data" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Formato da data" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Quantia" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Separador decimal" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Descrição" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Definiçoes do ficheiro CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Linhas a ignorar" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Codificando" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Delimitador de colunas" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Ficheiro a importar" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "Perfis CSV" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "A biblioteca Python simplejson é necessária para gravar/carregar o perfil " "csv." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Guardar" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Remover" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "A codificação do ficheiro não parece ser '%s'" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Ocorreu um erro durante a importação do ficheiro csv" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Erro ao importar o CSV" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Já existe o perfil '%s'. Deseja substituí-lo?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Substituir perfil?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Seleccione o ficheiro e clique em \"Pré-visualizar\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "de" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Transferência" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Diariamente" msgstr[1] "A cada %(num)d dias" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Semanalmente" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Mensalmente" msgstr[1] "A cada %(num)d meses" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Anualmente" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Nunca" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "a cada" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Acaba em:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Repete em:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "dia" msgstr[1] "dias" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "semana" msgstr[1] "semanas" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "mês" msgstr[1] "meses" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "ano" msgstr[1] "anos" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Seg" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Ter" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Qua" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Qui" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Sex" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Sáb" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Dom" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Repete nos dias:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Inicia:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Introduza esta transacção" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Recorrente" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Saldo inicial" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Nenhum montante indicado no campo \"Quantia\"." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' não é uma quantia válida" #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Adicione um número do tipo 12.34 ou -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Quantia da Transacção Inválida" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Por favor, escolha a conta e tente novamente." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Nenhuma conta seleccionada" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Já está a decorrer uma pesquisa." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Pretende apagar a pesquisa actual e efectuar esta transacção em \"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Limpar pesquisa?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Esta transacção está identificada como uma transferência. Por favor, escolha " "a conta." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Se seleccionar esta caixa, no momento da transacção, ser-lhe-á solicitada a " "conta a servir como origem da transacção." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Por exemplo, se marcar esta caixa e indicar uma transacção de $50 para esta " "conta, simultaneamente serão retirados $50 da conta escolhida como origem." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Procurar transacções" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Mais opções" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Menos opções" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Correspondências: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Mostrar as opções de procura avançada" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Ocultar as opções de procura avançada" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "A transacção recorrente \"%(description)s\" tem %(num)i transacções de " "%(amount)s agendadas para %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "As %(num)i transacções recorrentes têm um total de %(totalnum)i transacções " "agendadas." #: wxbanker/main.py:101 msgid "Preview" msgstr "Pré-visualizar" #: wxbanker/main.py:110 msgid "Perform" msgstr "Executar" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Adicionada com sucesso a transacção recorrente." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "A primeira transacção irá ocorrer em %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Parece que é a primeira vez que está a usar wxBanker!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Para começar, adicione uma conta usando o controlo de contas no canto " "superior esquerdo" #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Os botões no controlo de conta permitem-lhe adicionar, nomear, configurar e " "remover uma conta, respectivamente." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Assim que criar uma conta, pode adicionar transacções (por ex: saldo " "inicial) utilizando os controlos por baixo da grelha no canto inferior " "direito." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Divirta-se!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Bem-vindo!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Gravar alterações?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Ocorreram algumas alterações desde a última gravação. Pretende gravar as " "alterações antes de sair?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Tenha em atenção que se activar a gravação automática no menu Ficheiro, já " "não precisa de gravar manualmente." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Não há taxa de câmbio para a moeda \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Contas" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Adicionar uma nova conta" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Remover a conta seleccionada" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Renomear a conta seleccionada" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Configurar a conta seleccionada" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Todas as Contas" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Não está sincronizado com Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Desculpe, já existe uma conta com esse nome." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Os nomes das contas não podem estar vazios." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Nome da conta" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Isto apagará permanentemente a conta'%s' e todas as suas transacções. " "Continuar?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Aviso" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Gravação automática" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Salvar automáticamente" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Importar de CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Importar transacções de ficheiro CSV" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Exportar para CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Exportar transacções para um ficheiro CSV" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Conta anterior" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Conta seguinte" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Mostrar a(s) conta (s) com saldo nulo" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "Se inactivo, as contas com um saldo nulo serão ocultadas da lista" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Moeda" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Seleccionar moeda a mostrar" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Requisitar uma Moeda" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integração com Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Sincronizar os saldos bancários com a conta Mint.com" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Ver &FAQs" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Ver respostas a perguntas frequentes (online)" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Fazer uma &Pergunta" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Fazer uma pergunta na Internet" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Reportar um erro" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Reportar um erro para o programador na internet" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Pedir uma &funcionalidade" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Pedir uma nova funcionalidade a ser implementada" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "&Traduzir wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Traduzir wxBanker para outra língua" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Sobre" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Mais informação acerca do wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Ficheiro" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Ver" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Definições" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Ajuda" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Direitos de Autor" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Gestor de finanças pessoais." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Semanalmente nos dias de semana" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Semanalmente nos fins de semana" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Segundas" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Terças" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Quartas" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Quintas" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Sextas" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Sábados" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Domingos" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Semanalmente na(o) %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "A cada %(num)d semanas às/aos %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " e %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Anualmente" msgstr[1] "A cada %(num)d anos" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "até %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Sem descrição" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Transferir de %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Transferir para %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Resumo:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Mostrar Calculadora" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Ocultar Calculadora" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transacções" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Resumo" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Nenhuma transação introduzida." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Nenhuma transacção coincidente." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Saldo" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Total" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Enviar %s para a calculadora" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Adicionar %s para a calculadora" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Subtrair %s para a calculadora" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Remover esta transacção" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Mover esta transacção para a conta" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Sem etiquetas" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Remover estas %i transacções" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Mover estas %i transacções para a conta" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Sem etiquetas comuns" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Adicionar etiqueta" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Etiquetas" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Pesquisar por esta etiqueta" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Remover esta etiqueta" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "saldo" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Tendência" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Saldo Total Ao Longo do Tempo" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Hora" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "mensalmente" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "Para utilizar a biblioteca '%s' , instale os seguintes módulos: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Rejeitar" #: wxbanker/currencies.py:334 msgid "detected" msgstr "detectada" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Nenhuma" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Credencias Mint.com" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Gravar credenciais no \"keyring\"" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "A conta correspondente de %(name)s no Mint.com" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Actualização" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Nome de Utilizador:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Senha:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Detalhes da transacção" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" "Isto irá remover permanentemente esta transacção recorrente. Continuar?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Esta conta já não possui transacções recorrentes." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Fechar" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Apagar" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Transacções Recorrentes" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Integração Mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "Também pode adicionar uma etiqueta colocando #nomedaetiqueta em qualquer " "lugar da descrição." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Etiqueta:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "Para apagar esta etiqueta, remova-a da descrição ou faça clique com o botão " "direito do rato na transacção." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Adicionar Etiqueta" #~ msgid "transaction" #~ msgstr "transacção" #~ msgid "Other accounts" #~ msgstr "Outras contas" #~ msgid "Current Account" #~ msgstr "Conta Corrente" #~ msgid "All Accounts" #~ msgstr "Todas as Contas" #~ msgid "Case Sensitive" #~ msgstr "Distinguir Capitalização" #~ msgid "Total" #~ msgstr "Total" #~ msgid "In: " #~ msgstr "Em: " #~ msgid "Load" #~ msgstr "Carregar" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "" #~ "Quando activo, as contas com balanço de $0.00 serão escondidas da lista" #~ msgid "Hide zero-balance accounts" #~ msgstr "Esconder contas com balanço nulo" #~ msgid "Transact" #~ msgstr "Transaccionar" #~ msgid "Which account will the money come from?" #~ msgstr "De que conta virá o dinheiro?" #~ msgid "Sample Points" #~ msgstr "Pontos de Amostra" #~ msgid "transfer" #~ msgstr "Transferir" #~ msgid "Account" #~ msgstr "Conta" #~ msgid "Show" #~ msgstr "Mostrar" #~ msgid "&Tools" #~ msgstr "&Ferramentas" #~ msgid "CSV Import" #~ msgstr "Importar CSV" #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "Existe uma pesquisa activa. Quer apagar a pesquisa actual e fazer este %s em " #~ "%s?" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Aviso: Incapaz de criar atalho para DateCtrl's ENTER. Actualize para " #~ "wxPython >= 2.8.8.1 para resolver o problema." #~ msgid "Skip first line" #~ msgstr "Saltar primeira linha" wxbanker-0.9.1/wxbanker/po/pt_BR.po0000644000175000017500000006252312243601243017116 0ustar mrooneymrooney# Brazilian Portuguese translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2011-11-24 12:39+0000\n" "Last-Translator: Rafael Neri \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2011-11-25 05:20+0000\n" "X-Generator: Launchpad (build 14376)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Grau de Tendência" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Meses" #: wxbanker/summarytab.py:48 msgid "From" msgstr "De" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "para" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Gráfico" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Importar CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Conta alvo" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Cancelar" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importar" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Mapeamento de colunas CSV" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Data" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Formato de Data" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Quantia" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Separador decimal" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Descrição" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Preferências de arquivo CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Linhas para ignorar" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Codificação" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Delimitador de coluna" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Arquivo a importar" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "Perfis CSV" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Biblioteca python simplejson é necessária para carregar/salvar perfis csv" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Salvar" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Remover" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "A codificação do arquivo não parece ser '%s'" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Ocorreu um erro durante a importação do arquivo csv" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Erro de importação do CSV" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Já existe um perfil chamado '%s'. Deseja sobrescrever?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Sobrescrever perfil?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Selecione o arquivo e clique em \"Amostra\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "De" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Transferência" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Diariamente" msgstr[1] "A cada %(num)d dias" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Semanalmente" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Mensalmente" msgstr[1] "A cada %(num)d meses" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Anualmente" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Nunca" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "cada" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Finaliza:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Repetições:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "dia" msgstr[1] "dias" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "semana" msgstr[1] "semanas" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "mês" msgstr[1] "meses" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "ano" msgstr[1] "anos" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Seg" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Ter" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Qua" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Qui" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Sex" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Sáb" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Dom" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "repetir nos dias:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Começa:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Adicionar esta transação" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Recorrente" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Balanço inicial" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Nenhum valor no campo 'Quantia'." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' não é uma quantia válida" #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Por favor forneça um valor como: 12.34 ou -20" #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Quantia inválida para transação" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Por favor, selecione uma conta e tente novamente." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Nenhuma conta selecionada" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Uma busca está atualmente ativa." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Gostaria de limpar a pesquisa atual e fazer esta transação em \"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Limpar busca?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Esta transação está marcada como uma transferência. Por favor selecione a " "conta de transferência." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Se este campo estiver habilitado quando adicionar a tranferencia, será " "perguntado qual conta é a origem da transação." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Por exemplo, habilitando este campo e adicionando a transação que adiciona " "$50 na conta, será subtraido $50 da conta que voce escolher como origem." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Buscar transações" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Mais opções" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Menos opções" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Combinar: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Mostrar opções avançadas de busca" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Ocultar opções avançadas de busca" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "A transação recorrente \"%(description)s\" tem %(num)i transações prontas " "para %(amount)s em %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i transações recorrentes tem um total de %(totalnum)i transações " "prontas." #: wxbanker/main.py:101 msgid "Preview" msgstr "Amostra" #: wxbanker/main.py:110 msgid "Perform" msgstr "Fazer" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Transação recorrente adicionada com sucesso." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "A primeira transação ocorrerá em %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Está é a primeira vez que você executa o wxBanker!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Para iniciar, adicione uma conta usando os controles no conto esquerdo " "superior." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Os botões de controle da conta permite a você adicionar, renomear, " "configurar e remover uma conta, respectivamente." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Uma vez que a conta foi criada, você pode adicionar transações utilizando os " "controles no rodapé do programa." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Divirta-se!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Bem-Vindo!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Salvar mudanças?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Você efetuou mudanças desde o ultimo salvamento. Gostaria de salvar antes de " "sair?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Observe que habilitar o auto-salvar pelo menu irá eliminar a necessidade de " "salvar manualmente." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Sem taxa de câmbio para moeda \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Contas" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Adicionar nova conta" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Remover a conta selecionada" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Renomear a conta selecionada" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Configure a conta selecionada" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Todas as contas" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Não sincronizado com Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Desculpe, já existe uma conta com este nome." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Nomes de conta não estar em branco." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Nome da conta" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Isto removerá a conta '%s' e suas transações permanentemente. Continuar?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Atenção" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Auto-salvar" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Salvar mudanças automaticamente" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Importar de CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Importar transações de um arquivo CSV" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Exportar para CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Exportar transação para um arquivo CSV" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Conta anterior" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Próxima conta" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Mostrar contas com saldo zero" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Quando desativada, as contas com um saldo de $0,00 serão escondidas da lista" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Moeda" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Selecione a moeda que será exibida" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Solicitar uma moeda" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integrar com Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Sincronizar saldo da conta com uma conta existente em Mint.com" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Ver &FAQs" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Exibir as perguntas frequentes online" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Faça uma &Pergunta" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Pergunte online" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Notifique um erro" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Notifique um erro ao desenvolvedor online" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Solicitar uma fu&nção" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Solicitar uma nova função a ser implementada" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Tra&duzir wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Traduzir wxBanker para outro idioma" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Sobre" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Mais Informação sobre o wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Arquivo" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Visualisar" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Preferências" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Ajuda" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Copyright" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Simples gerenciador de finanças pessoais." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Semanalmente nos dias úteis" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Semanalmente em finais de semana" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Segundas-feiras" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Terças-feiras" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Quartas-feiras" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Quintas-feiras" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Sextas-feiras" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Sábados" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Domingos" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Semanal em %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Cada %(num)d semanas em %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " e %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Anual" msgstr[1] "Cada %(num)d anos" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "até %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Sem descrição" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Transferir de %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Transferir para %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Resumo:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Exibir calculadora" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Ocultar Calculadora" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transações" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Sumário" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Nenhuma transação entrada" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Sem transações correspondentes." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Balanço" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Total" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Enviar %s a calculadora" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Adicionar %s a calculadora" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Subtrair %s a calculadora" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Remover transação" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Mover essa transação para conta" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Sem tags ainda" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Remover essas %i transações" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Mover essas %i transações para conta" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Nenhuma tag comum ainda" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Adicionar uma tag" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Tags" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Procurar esta tag" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Remover esta tag" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "Saldo" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "tendência" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Balaço total ao longo do tempo" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Hora" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "mensalmente" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "Para usar a biblioteca de plotagem '%s', instale os seguintes módulos " "python: % s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Descartar" #: wxbanker/currencies.py:334 msgid "detected" msgstr "detectado" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Nenhum" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Credenciais Mint.com:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Salvar credenciais no banco de chaves" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Conta Mint correspondente para %(name)s:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Atualizar" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Nome de usuário:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Senha:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Detalhes da transação" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" "Isto irá remover permanentemente esta transação recorrente. Deseja continuar?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Esta conta atualmente não tem transações recorrentes." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Fechar" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Deletar" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Transações frequentes" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Integração Mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "Você também pode marcar uma transação, colocando #tag em qualquer lugar na " "descrição." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Tag:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "Para remover esta tag posteriormente, basta remover a partir da descrição ou " "com o botão direito do mouse sobre a transação." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Adicionar Tag" #~ msgid "Sample Points" #~ msgstr "Pontos de amostragem" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Atenção: O modulo Numpy não está instalado, a aba Sumário será desabilitada, " #~ "instale o numpy para habilita-la." #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "Os botões de contre permitem adicionar, remover e renomear contas, " #~ "respectivamente." #~ msgid "All Accounts" #~ msgstr "Todas as Contas" #~ msgid "Total" #~ msgstr "Total" #~ msgid "Current Account" #~ msgstr "Conta Atual" #~ msgid "In: " #~ msgstr "Em: " #~ msgid "Show" #~ msgstr "Mostrar" #~ msgid "Case Sensitive" #~ msgstr "Diferenciar Maiúsculas e Minúsculas" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "Combina ou não baseado na capitalização" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "Quando habilitada, contas com balanço $0.00 serão ocultadas da lista" #~ msgid "Hide zero-balance accounts" #~ msgstr "Ocultar contas com balanço zero" #~ msgid "Which account will the money come from?" #~ msgstr "De qual conta vem o dinheiro?" #~ msgid "transfer" #~ msgstr "transferência" #~ msgid "transaction" #~ msgstr "transação" #~ msgid "Load" #~ msgstr "Carregar" #~ msgid "Skip first line" #~ msgstr "Pular primeira linha" #~ msgid "Transact" #~ msgstr "Transação" #~ msgid "Account" #~ msgstr "Conta" #~ msgid "&Tools" #~ msgstr "&Ferramentas" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Atenção: impossível vincular ao DateCtrl's ENTER. Faça o upgrade do wxPython " #~ "para 2.8.8.1 ou superior." #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "Uma busca está ativa. Deseja limpar a busca atual e fazer com que %s em " #~ "\"%s\"?" #~ msgid "Other accounts" #~ msgstr "Outras contas" #~ msgid "Fit Curve Degree" #~ msgstr "Grau de ajuste da curva" #~ msgid "CSV Import" #~ msgstr "Importar CSV" #~ msgid "A lightweight personal finance management application." #~ msgstr "Uma aplicação leve para gerenciamento financeiro pessoal." wxbanker-0.9.1/wxbanker/po/ro.po0000644000175000017500000005130312243601243016522 0ustar mrooneymrooney# Romanian translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-27 01:56-0800\n" "PO-Revision-Date: 2010-03-21 05:19+0000\n" "Last-Translator: ValentinV \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 " "== 0) && (n != 0))) ? 2: 1));\n" "X-Launchpad-Export-Date: 2010-03-22 04:45+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/bankobjects/transaction.py:92 #, python-format msgid "Transfer from %s" msgstr "Transfer de la %s" #: wxbanker/bankobjects/transaction.py:94 #, python-format msgid "Transfer to %s" msgstr "Transfer la %s" #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Daily" msgstr[1] "La fiecare %(num)d zile" msgstr[2] "La fiecare %(num)d zile" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Saptamanal in zilele lucratoare" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Saptamanal in weekend" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Lunea" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Martea" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Miercurea" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Joia" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Vinerea" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Sambata" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Duminica" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Saptamanal pe %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "La fiecare %(num)d de saptamani pe %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " si %s" #: wxbanker/bankobjects/recurringtransaction.py:171 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Lunar" msgstr[1] "La fiercare %(num)d de luni" msgstr[2] "La fiercare %(num)d de luni" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Annually" msgstr[1] "La fiecare %(num)d de ani" msgstr[2] "La fiecare %(num)d de ani" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "pana la %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Fără descriere" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Conturi" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Adaugă un cont nou" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Șterge contul selectat" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Redenumește contul selectat" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Configurează contul selectat" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:63 msgid "All accounts" msgstr "Toate conturile" #: wxbanker/accountlistctrl.py:423 wxbanker/accountlistctrl.py:525 msgid "Sorry, an account by that name already exists." msgstr "Din păcate un cont cu acest nume există deja" #: wxbanker/accountlistctrl.py:425 wxbanker/accountlistctrl.py:527 msgid "Account names cannot be blank." msgstr "Numele conturilor nu pot fi goale" #: wxbanker/accountlistctrl.py:459 msgid "Account name" msgstr "Denumirea contului" #: wxbanker/accountlistctrl.py:498 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Aceasta va șterge definitiv contul „%s” și toate tranzacțiile sale. " "Continuați?" #: wxbanker/accountlistctrl.py:499 msgid "Warning" msgstr "Atenție" #: wxbanker/accountconfigdialog.py:32 msgid "" "wxBanker can synchronize account balances online if you have an account with " "mint.com" msgstr "" "wxBanker poate sincroniza online balanța conturilor dacă dețineți un cont la " "mint.com" #: wxbanker/accountconfigdialog.py:40 msgid "Username" msgstr "Nume utilizator:" #: wxbanker/accountconfigdialog.py:42 msgid "Password" msgstr "Parola" #: wxbanker/accountconfigdialog.py:62 msgid "Transaction details" msgstr "Detalii tranzacție" #: wxbanker/accountconfigdialog.py:103 msgid "This account currently has no recurring transactions." msgstr "Acest cont nu are nicio tranzacție recurentă" #: wxbanker/accountconfigdialog.py:105 msgid "Close" msgstr "Inchidere" #: wxbanker/accountconfigdialog.py:115 wxbanker/csvimportframe.py:186 msgid "Save" msgstr "Salvează" #: wxbanker/accountconfigdialog.py:116 msgid "Cancel" msgstr "Revocare" #: wxbanker/accountconfigdialog.py:136 msgid "Recurring Transactions" msgstr "Tranzacții recurente" #: wxbanker/plots/cairopanel.py:72 wxbanker/plots/cairopanel.py:113 #: wxbanker/plots/wxplotpanel.py:35 wxbanker/plots/wxplotpanel.py:42 msgid "Balance" msgstr "Balanță" #: wxbanker/plots/cairopanel.py:76 wxbanker/plots/wxplotpanel.py:40 msgid "Trend" msgstr "Tendință" #: wxbanker/plots/cairopanel.py:112 wxbanker/plots/wxplotpanel.py:42 msgid "Time" msgstr "Timp" #: wxbanker/plots/wxplotpanel.py:42 msgid "Total Balance Over Time" msgstr "Balanța totală în timp" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "Pentru a folosi '%s' plotting library , instalati umatoarele module phython " "%s" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Închide" #: wxbanker/summarytab.py:42 msgid "From" msgstr "De la" #: wxbanker/summarytab.py:46 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "la" #: wxbanker/summarytab.py:50 msgid "Trend Degree" msgstr "Grad Trend" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Arată calculator" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Ascunde calculator" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Tranzacții" #: wxbanker/managetab.py:109 msgid "Summary" msgstr "Sumar" #: wxbanker/transactionolv.py:48 msgid "No transactions entered." msgstr "Nicio tranzacție introdusă." #: wxbanker/transactionolv.py:60 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:98 msgid "Date" msgstr "Dată" #: wxbanker/transactionolv.py:61 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:112 msgid "Description" msgstr "Descriere" #: wxbanker/transactionolv.py:62 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:106 msgid "Amount" msgstr "Sumă" #: wxbanker/transactionolv.py:63 msgid "Total" msgstr "Total" #: wxbanker/transactionolv.py:204 #, python-format msgid "Send %s to calculator" msgstr "Trimite %s la calculator" #: wxbanker/transactionolv.py:205 #, python-format msgid "Add %s to calculator" msgstr "Adaugă %s la calculator" #: wxbanker/transactionolv.py:206 #, python-format msgid "Subtract %s from calculator" msgstr "Scade %s din calculator" #: wxbanker/transactionolv.py:218 msgid "Remove this transaction" msgstr "Șterge această tranzacție" #: wxbanker/transactionolv.py:219 msgid "Move this transaction to account" msgstr "Mută această tranzacție în cont" #: wxbanker/transactionolv.py:221 #, python-format msgid "Remove these %i transactions" msgstr "Șterge aceste %i tranzacții" #: wxbanker/transactionolv.py:222 #, python-format msgid "Move these %i transactions to account" msgstr "Mută aceste %i tranzacții în cont" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "de la" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Transfer" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Săptămânal" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Anual" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Niciodată" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "la fiecare" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Se termină:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Se repetă:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "zi" msgstr[1] "zile" msgstr[2] "de zile" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "săptămână" msgstr[1] "săptămâni" msgstr[2] "de săptămâni" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "lună" msgstr[1] "luni" msgstr[2] "de luni" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "an" msgstr[1] "ani" msgstr[2] "de ani" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Lun" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Mar" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Mie" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Joi" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Vin" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Sâm" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Dum" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Se repetă în zilele:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Începe:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Introdu această tranzacție" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Recurentă" #: wxbanker/newtransactionctrl.py:375 msgid "No amount entered in the 'Amount' field." msgstr "Nicio sumă introdusă în câmpul „Sumă”." #: wxbanker/newtransactionctrl.py:377 #, python-format msgid "'%s' is not a valid amount." msgstr "„%s” nu este o sumă validă." #: wxbanker/newtransactionctrl.py:380 msgid "Please enter a number such as 12.34 or -20." msgstr "Introduceți un număr cum ar fi 12.34 sau -20" #: wxbanker/newtransactionctrl.py:381 msgid "Invalid Transaction Amount" msgstr "Sumă invalidă pentru tranzacție" #: wxbanker/newtransactionctrl.py:392 msgid "Please select an account and then try again." msgstr "Alegeți un cont și încercați din nou" #: wxbanker/newtransactionctrl.py:393 wxbanker/newtransactionctrl.py:421 msgid "No account selected" msgstr "Niciun cont selectat" #: wxbanker/newtransactionctrl.py:406 msgid "A search is currently active." msgstr "O căutare este în curs" #: wxbanker/newtransactionctrl.py:406 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Ati dori sa stergeti cautarea curenta si sa faceti tranzactia in \"%s\"?" #: wxbanker/newtransactionctrl.py:407 msgid "Clear search?" msgstr "Ștergeți căutarea?" #: wxbanker/newtransactionctrl.py:420 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Această tranzacție este marcată drept un transfer. Alegeți contul destinație." #: wxbanker/newtransactionctrl.py:453 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Daca aceasta casuta este bifata vi se va solicita contul pe care sa il " "folositi ca sursa pentru transfer" #: wxbanker/newtransactionctrl.py:454 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "De exemplu, daca bifati aceasta casuta si introduceti o tranzactie de 50RON " "in acest cont , va substrade deasemenea 50RON din contul pe care il alegeti " "ca sursa." #: wxbanker/menubar.py:53 msgid "Auto-save" msgstr "Salvează automat" #: wxbanker/menubar.py:53 msgid "Automatically save changes" msgstr "Salvează modificările automat" #: wxbanker/menubar.py:55 msgid "Import from CSV" msgstr "Importă din CSV" #: wxbanker/menubar.py:55 msgid "Import transactions from a CSV file" msgstr "Importă tranzacțiile dintr-un fișier CSV" #: wxbanker/menubar.py:61 msgid "Previous account" msgstr "Contul precedent" #: wxbanker/menubar.py:62 msgid "Next account" msgstr "Contul urmator" #: wxbanker/menubar.py:65 msgid "Show zero-balance accounts" msgstr "Arata conturile cu balans zero" #: wxbanker/menubar.py:65 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Cand dezactiva , conturile cu balans de 0.00 vor fi ascunse din lista" #: wxbanker/menubar.py:74 msgid "&Currency" msgstr "Valută" #: wxbanker/menubar.py:74 msgid "Select currency to display" msgstr "Selectați valuta pentru afișare" #: wxbanker/menubar.py:83 msgid "Request a Currency" msgstr "Solicitați o valută" #: wxbanker/menubar.py:90 msgid "Integrate with Mint.com" msgstr "Integrare cu Mint.com" #: wxbanker/menubar.py:90 msgid "Sync account balances with an existing Mint.com account" msgstr "Sincronizeaza balansul cuntului cu un cont deja existent la Mint.com" #: wxbanker/menubar.py:96 msgid "View &FAQs" msgstr "Vedeți &FAQ-uri" #: wxbanker/menubar.py:96 msgid "View Frequently Asked Questions online" msgstr "Vedeți online întrebările puse frecvent" #: wxbanker/menubar.py:101 msgid "Ask a &Question" msgstr "Puneți o întrebare" #: wxbanker/menubar.py:101 msgid "Ask a question online" msgstr "Puneți online o întrebare" #: wxbanker/menubar.py:106 msgid "&Report a Bug" msgstr "Raportați o eroare" #: wxbanker/menubar.py:106 msgid "Report a bug to the developer online" msgstr "Raportați online o eroare către dezvoltatori" #: wxbanker/menubar.py:111 msgid "Request a Fea&ture" msgstr "Solicitați o funcționalitate" #: wxbanker/menubar.py:111 msgid "Request a new feature to be implemented" msgstr "Solicitați o funcționalitate nouă care să fie implementată" #: wxbanker/menubar.py:116 msgid "Tran&slate wxBanker" msgstr "Traduceți wxBanker" #: wxbanker/menubar.py:116 msgid "Translate wxBanker to another language" msgstr "Traduceți wxBanker într-o altă limbă" #: wxbanker/menubar.py:123 msgid "&About" msgstr "&Despre" #: wxbanker/menubar.py:123 msgid "More information about wxBanker" msgstr "Mai multe informații despre wxBanker" #: wxbanker/menubar.py:126 msgid "&File" msgstr "&Fișier" #: wxbanker/menubar.py:127 msgid "&View" msgstr "&Vizualizare" #: wxbanker/menubar.py:128 msgid "&Settings" msgstr "&Setări" #: wxbanker/menubar.py:129 msgid "&Help" msgstr "Ajutor" #: wxbanker/menubar.py:227 msgid "Copyright" msgstr "Drepturi de autor" #: wxbanker/menubar.py:228 msgid "A lightweight personal finance management application." msgstr "Un manager simplificat de finanțe personale." #: wxbanker/main.py:79 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "Tranzacția recurentă „%(description)s” are %(num)i tranzacții pregătite " "pentru %(amount)s pe %(datelist)s." #: wxbanker/main.py:84 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i tranzactii recursive au un total de %(totalnum)i tranzactii " "pregatite." #: wxbanker/main.py:95 wxbanker/csvimportframe.py:151 #: wxbanker/csvimportframe.py:153 msgid "Preview" msgstr "Previzualizează" #: wxbanker/main.py:104 msgid "Perform" msgstr "Efectuează" #: wxbanker/main.py:120 msgid "Recurring transaction successfully added." msgstr "Tranzacție recurentă adăugată cu succes." #: wxbanker/main.py:122 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "Prima tranzacție va avea loc pe %(date)s" #: wxbanker/main.py:186 msgid "It looks like this is your first time using wxBanker!" msgstr "Se pare că aceasta este prima oară cănd folosiți wxBanker!" #: wxbanker/main.py:187 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Pentru a începe, adăugați un cont folosind panoul de control al conturilor, " "din colțul stânga sus." #: wxbanker/main.py:188 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" "Butoanele din controlul counturilor vă permit să adăugați, să ștergeți și să " "redenumiți un cont." #: wxbanker/main.py:189 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Odată ce ați creat un cont, îi puteți adăuga tranzații (cum ar fi balanța " "inițială) utilizând controalele din dreapta jos, de sub grilă." #: wxbanker/main.py:190 msgid "Have fun!" msgstr "Distrați-vă!" #: wxbanker/main.py:192 msgid "Welcome!" msgstr "Bine ați venit!" #: wxbanker/main.py:200 msgid "Save changes?" msgstr "Salvați modificările?" #: wxbanker/main.py:201 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Ați efectuat modificări de la ultima salvare. Doriți să le salvați înainte " "de a ieși?" #: wxbanker/main.py:202 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Rețineți că, activând salvarea automată din meniul Fișier, nu va mai fi " "necesară salvarea manuală." #: wxbanker/searchctrl.py:36 msgid "Search transactions" msgstr "Caută tranzacții" #: wxbanker/searchctrl.py:39 msgid "More options" msgstr "Mai multe opțiuni" #: wxbanker/searchctrl.py:39 msgid "Less options" msgstr "Mai puține opțiuni" #: wxbanker/searchctrl.py:50 msgid "Match: " msgstr "Potrivește: " #: wxbanker/searchctrl.py:94 msgid "Show advanced search options" msgstr "Afișează opțiuni avansate de căutare" #: wxbanker/searchctrl.py:96 msgid "Hide advanced search options" msgstr "Ascunde opțiuni avansate de căutare" #: wxbanker/csvimportframe.py:28 msgid "CSV import" msgstr "Import CSV" #: wxbanker/csvimportframe.py:62 msgid "Target account" msgstr "Cont destinație" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:79 msgid "Import" msgstr "Importă" #: wxbanker/csvimportframe.py:89 msgid "CSV columns mapping" msgstr "Indentificare coloane CSV" #: wxbanker/csvimportframe.py:101 msgid "Date format" msgstr "Format dată" #: wxbanker/csvimportframe.py:108 msgid "Decimal separator" msgstr "Separator zecimale" #: wxbanker/csvimportframe.py:119 msgid "CSV file settings" msgstr "Setări fișier CSV" #: wxbanker/csvimportframe.py:128 msgid "Skip first line" msgstr "Sari prima linie" #: wxbanker/csvimportframe.py:131 msgid "Encoding" msgstr "Codificare" #: wxbanker/csvimportframe.py:135 msgid "Column delimiter" msgstr "Delimitator coloane" #: wxbanker/csvimportframe.py:146 msgid "File to import" msgstr "Fişier de importat" #: wxbanker/csvimportframe.py:166 msgid "CSV profiles" msgstr "Profiluri CSV" #: wxbanker/csvimportframe.py:171 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Biblioteca Python simplejson este necesară epntru a încărca/salva profile " "CSV." #: wxbanker/csvimportframe.py:181 msgid "Load" msgstr "Încarcă" #: wxbanker/csvimportframe.py:191 msgid "Delete" msgstr "Șterge" #: wxbanker/csvimportframe.py:245 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Codificarea fișierului pare să nu fie „%s”." #: wxbanker/csvimportframe.py:252 msgid "An error ocurred during the csv file import." msgstr "O eroare a avut loc la importul fișierului CSV." #: wxbanker/csvimportframe.py:253 msgid "CSV import error" msgstr "Eroare la importarea fișierului CSV" #: wxbanker/csvimportframe.py:303 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Un profil cu numele „%s” există deja. Îl suprascrieți?" #: wxbanker/csvimportframe.py:304 msgid "Overwrite profile ?" msgstr "Suprascrieți profilul?" #: wxbanker/csvimportframe.py:318 msgid "Select file and click \"Preview\"" msgstr "Selectați fișierul și apăsați \"Previzualizează\"" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Sumar:" #: wxbanker/currencies.py:277 msgid "detected" msgstr "detectat" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Nici o rată de schimb pentru valuta \"%s\"" wxbanker-0.9.1/wxbanker/po/ru.po0000644000175000017500000007311612243601243016536 0ustar mrooneymrooney# Russian translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2012-08-06 04:09+0000\n" "Last-Translator: Michael Rooney \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2012-08-07 04:45+0000\n" "X-Generator: Launchpad (build 15745)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Тенденция" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Мес" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Из" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "В" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Диаграмма" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Импорт CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Основной счет" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Отмена" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Импорт" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Привязка полей в CSV" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Дата" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Формат даты" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Сумма" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Разделитель дромной части" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Описание" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Параметры файла CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Пропустить линии" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Кодировка" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Разделитель колонн" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Файл для импорта" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "Профиль CSV" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "Для работы с CSV необходима библиотека Python simplejson." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Сохранить" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Удалить" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Кодировка файла не похожа на %s" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Произошла ошибка при импорте csv файла" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Ошибка при импорте CSV" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Профиль '%s' уже сеществует. Заменить его?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Перезаписать профиль?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Выберите файл и нажмите \"Предпросмотр\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "из" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Перевести" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Ежедневно" msgstr[1] "Каждые %(num)d дня" msgstr[2] "Каждые %(num)d дней" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Еженедельно" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Ежемесячно" msgstr[1] "Каждые %(num)d месяца" msgstr[2] "Каждые %(num)d месяцев" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Ежегодно" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Никогда" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "каждые" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Заканчивается:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Повторы:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "день" msgstr[1] "дня" msgstr[2] "дней" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "неделя" msgstr[1] "недели" msgstr[2] "недель" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "месяц" msgstr[1] "месяца" msgstr[2] "месяцев" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "год" msgstr[1] "года" msgstr[2] "лет" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Пн" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Вт" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Ср" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Чт" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Пт" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Сб" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Вс" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Повторяется:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Начинается:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Ввести эту операцию" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Повторение" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Начальный баланс" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Не введена сумма в поле \"Сумма\"" #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' является неверной суммой" #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Пожалуйста, введите число, например, 12.34 или -20" #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Неверная сумма перевода" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Пожалуйста, выберите счёт и попробуйте снова." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Не выбран счёт" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Идет поиск." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "Хотите ли Вы очистить текущий поиск и выполнить операцию в \"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Очистить поиск" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "Операция помечена для перемещения, Выберите счёт перевода." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Если этот флажок отмечен, то при добавлении транзакции Вы будете должны " "указать счёт-источник перевода." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Например, выбор этого поля и ввод 500р на этот счёт вычтет 500р из счёта, " "выбранного Вами как источник." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Искать операции" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Дополнительные параметры" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Показать меньше параметров" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Совпадение: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Показать расширенные параметры поиска" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Убрать дополнительные параметры" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "Повторяющаяся операция \"%(description)s\" имеет %(num)i готоывых переводов " "в размере %(amount)s %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i повторяющихся операций имеют в сумме %(totalnum)i готовых переводов." #: wxbanker/main.py:101 msgid "Preview" msgstr "Предпросмотр" #: wxbanker/main.py:110 msgid "Perform" msgstr "Выполнить" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Повторяющаяся операция успешно добавлена" #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "Последний перевод произойдёт %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Вы запустили wxBanker первый раз!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Для начала добавьте счёт, используя средства управления счетами в левом " "верхнем углу." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Кнопки управления учетными записями позволяют добавлять, переименовывать, " "настраивать и удалять счета, соответственно." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Однажды создав счёт, вы можете добавлять в него транзакции (такие как " "внутренний баланс), используя средства управления, расположенные под " "координатной сеткой в правом нижнем углу." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Удачи!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Добро пожаловать!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Сохранить изменения?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "У вас есть изменения с момента последнего сохранения. Желаете ли сохранить " "изменения перед выходом?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Заметьте, что включение автосохранение в меню Файл избавит от необходимости " "сохраняться вручную." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Нет курса обмена для валюты \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Счета" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Добавить новый счёт" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Удалить выбранный счёт" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Переименовать выбранный счёт" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Настроить выбранный счёт" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Все счета" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Не синхронизировано с Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Извините, такое имя счёта уже существует" #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Название счета не может быть пустым" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Название счета" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "Это полностью удалит счёт '%s' и все его транзакции. Продолжить?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Предупреждение" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Автосохранение" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Автоматически сохранять изменения" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Импорт из CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Импортировать операции из CSV файла" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Экспорт в CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Экспорт транзакций в файл CSV" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Предыдущий счёт" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Следующий счёт" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Показать счета с нулевым балансом" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "Если не выбрано, то счета с нулевым балансом будут скрыты из списка" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Валюта" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Выберите тип отображаемой валюты" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Запросить валюту" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Интеграция с Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Синхронизировать баланс счетов с существующим аккаунтом на Mint.com" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Просмотреть &ЧаВо" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Просмотреть Часто Задаваемые Вопросы онлайн" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Задать &вопрос" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Задать вопрос онлайн" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "Сообщить об ошибке" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Сообщить разработчику об ошибке онлайн" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Запросить фун&кцию" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Запросить запрограммировать новую функцию" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Пере&вести wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Перевести wxBanker на другой язык" #: wxbanker/menubar.py:133 msgid "&About" msgstr "О программе" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Больше информации о wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Файл" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Просмотр" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "Настройки" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Справка" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Авторские права" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Простая персональная бухгалтерия." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Еженедельно по рабочим дням" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Еженедельно по выходным" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Понедельники" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Вторники" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Среды" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Четверги" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Пятницы" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Субботы" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Воскресенья" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Еженедельно по %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Каждые %(num)d недель по %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " и %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Ежегодно" msgstr[1] "Каждые %(num)d года" msgstr[2] "Каждые %(num)d лет" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "до %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Без описания" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Передать из %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Передать в %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Сводка:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Показать калькулятор" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Спрятать калькулятор" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Операции" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Итог" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Нет введённых операций." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Нет подходящих транзакций" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Баланс" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Всего" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Отправить %s в калькулятор" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Добавить %s в калькулятор" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Вычесть %s из кулькулятора" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Удалить эту операцию" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Переместить эту операцию на счёт" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Нет меток" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Удалить эти %i операций" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Переместить эти %i операций на другой счет" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Пока что нет общих тэгов" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Добавить метку" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Метки" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Поиск по метке" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Удалить метку" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "баланс" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Тренд" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Общая сумма баланса с течением времени" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Время" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "ежемесячно" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "Чтобы использовать библиотеку вычерчивания '%s', установите следующие модули " "Python: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Отменить" #: wxbanker/currencies.py:334 msgid "detected" msgstr "обнаружено" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Отсутствует" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Mint.com credentials" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Сохранить доступ" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Обновление" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Имя пользователя:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Пароль:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Детали операции" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" "Это действие навсегда удалит эту повторяющуюся транзакцию. Продолжить?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "На данном счете нет повторяющихся операций" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Закрыть" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Удалить" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Повторяющиеся операции" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Соединение с Mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "Вы можете добавить тег (пометку) к транзакции, напечатав #имятега в любом " "месте описания." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Метка:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "Чтобы удалить этот тег позже, просто удалите его из описания или щелкните " "правой кнопкой мыши на транзакции." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Добавить метку" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Предупреждение: модуль numpy недоступен, вкладка \"Итог\" отключена. Чтобы " #~ "исправить это, установите numpy." #~ msgid "Sample Points" #~ msgstr "Образцовые точки" #~ msgid "Fit Curve Degree" #~ msgstr "Подобрать наклон кривой" #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "Кнопки управления счетами позволяют добавлять, удалять и переименовывать " #~ "счёт соответственно." #~ msgid "Total" #~ msgstr "Итого" #~ msgid "Current Account" #~ msgstr "Текущий счет" #~ msgid "A lightweight personal finance management application." #~ msgstr "Легковесная программа управления личными финансами." #~ msgid "All Accounts" #~ msgstr "Все счета" #~ msgid "In: " #~ msgstr "В: " #~ msgid "Show" #~ msgstr "Показать" #~ msgid "Case Sensitive" #~ msgstr "С учётом регистра" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "" #~ "Когда включено, счета с балансом в $0.00 не будут отображаться в списке" #~ msgid "Hide zero-balance accounts" #~ msgstr "Спрятать счета с нулевым балансом" #~ msgid "Transact" #~ msgstr "Совершить сделку" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Предупреждение: Невозможно связать DateCtrl's ENTER. Обновите wxPython до " #~ "версии >= 2.8.8.1." #~ msgid "transaction" #~ msgstr "транзакция" #~ msgid "transfer" #~ msgstr "передача" #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "Поиск уже идет. Хотите ли вы очистить текущий поиск и искать %s в \"%s\"?" #~ msgid "Which account will the money come from?" #~ msgstr "С какого счёта придут деньги?" #~ msgid "Other accounts" #~ msgstr "Другие счета" #~ msgid "Skip first line" #~ msgstr "Пропускать первую строку" #~ msgid "Load" #~ msgstr "Загрузить" #~ msgid "&Tools" #~ msgstr "&Инструменты" #~ msgid "Account" #~ msgstr "Учётная запись" #~ msgid "CSV Import" #~ msgstr "Импорт CSV" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "В любом случае соответствовать базирующемуся на капитализации" wxbanker-0.9.1/wxbanker/po/sk.po0000644000175000017500000005023012243601243016515 0ustar mrooneymrooney# Slovak translation for wxbanker # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-08-20 00:01-0700\n" "PO-Revision-Date: 2010-08-20 15:25+0000\n" "Last-Translator: JohnyN \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" "X-Launchpad-Export-Date: 2010-08-21 03:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Stupeň trendu" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Mesiace" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Od" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "do" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Graf" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "import CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Cieľový účet" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Zrušiť" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importovať" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "mapovanie stĺpcov CSV" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:63 msgid "Date" msgstr "Dátum" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Formát dátumu" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:65 msgid "Amount" msgstr "Suma" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Oddeľovač desatinného miesta" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:64 msgid "Description" msgstr "Popis" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Nastavenia CSV súboru" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Riadky na preskočenie" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Kódovanie" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Oddeľovač stĺpcov" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Súbor na import" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "Profily CSV" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Na načítanie alebo uloženie CSV profilu je potrebná knižnica Pythonu " "simplejson." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Uložiť" #: wxbanker/csvimportframe.py:198 wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Odstrániť" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Kódovanie súboru nie je v '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Pri importovaní CSV súboru došlo k chybe." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Chyba importu CSV." #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Profil s názvom '%s' už existuje. Prajete si ho prepísať?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Prepísať profil?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Vyberte súbor a kliknite na \"Náhľad\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "od" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Prenos" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Denne" msgstr[1] "Každých %(num)d dní" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Týždenne" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Mesačne" msgstr[1] "Každých %(num)d mesiacov" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Ročne" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Nikdy" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "každý" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Končí:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Opakovať:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "deň" msgstr[1] "dni" msgstr[2] "dní" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "týždeň" msgstr[1] "" msgstr[2] "týždne" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "mesiac" msgstr[1] "" msgstr[2] "mesiacov" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "rok" msgstr[1] "" msgstr[2] "rokov" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Po" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Ut" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "St" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Št" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Pi" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "So" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Ne" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Opakovať po dňoch:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Začína:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Vložiť túto transakciu" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Opakujúca sa" #: wxbanker/newtransactionctrl.py:341 msgid "Initial balance" msgstr "Počiatočný zostatok" #: wxbanker/newtransactionctrl.py:377 msgid "No amount entered in the 'Amount' field." msgstr "V poli hodnota chýba hodnota transkacie." #: wxbanker/newtransactionctrl.py:379 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' nie je platná hodnota." #: wxbanker/newtransactionctrl.py:382 msgid "Please enter a number such as 12.34 or -20." msgstr "Prosím vložte hodnotu ako napríklad 12.34 alebo -20." #: wxbanker/newtransactionctrl.py:383 msgid "Invalid Transaction Amount" msgstr "Neplatná hodnota transakcie" #: wxbanker/newtransactionctrl.py:394 msgid "Please select an account and then try again." msgstr "Prosím vyberte účet a skúste to znova." #: wxbanker/newtransactionctrl.py:395 wxbanker/newtransactionctrl.py:423 msgid "No account selected" msgstr "Žiadny účet nie je vybratý." #: wxbanker/newtransactionctrl.py:408 msgid "A search is currently active." msgstr "Prebieha vyhľadávanie." #: wxbanker/newtransactionctrl.py:408 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Prajete si vymazať súčasné vyhľadávanie a vykonať túto transakciu v \"%s\"?" #: wxbanker/newtransactionctrl.py:409 msgid "Clear search?" msgstr "Vymazať vyhľadávanie?" #: wxbanker/newtransactionctrl.py:422 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Táto transakcia je označená ako transfer. Prosím vyberte cieľový účet." #: wxbanker/newtransactionctrl.py:455 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Ak je táto možnosť pri vykonávaní transakcie povolená, je potrebné zadať " "číslo zdrojového účtu, z ktorého sa financie prevedú." #: wxbanker/newtransactionctrl.py:456 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Napríklad, ak je táto možnosť povolená, pri prevode $50 na váš účet sa zo " "zdrojového účtu odoberie rovnaká suma $50." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Vyhľadanie transakcie" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Viac možností" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Menej možností" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Zhoda: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Zobraziť pokročilé možnosti vyhľadávania" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Skryť pokročilé možnosti vyhľadávania" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "Opakujúca sa operácia \"%(description)s\" má %(num)i transakcie pripravené " "pre %(amount)s na %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i opakujúce sa operácie majú spolu %(totalnum)i pripravených " "transakcií." #: wxbanker/main.py:101 msgid "Preview" msgstr "Náhľad" #: wxbanker/main.py:110 msgid "Perform" msgstr "Vykonať" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Transakcia s opakovaním úspešne pridaná." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "Prvá transakcia prebehne %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Zdá sa, že ste spustili wxBanker prvýkrát!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Na začiatok pridajte svoj účet pomocou panelu účtov v ľavom hornom rohu." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" "Tlačidlá na paneli účtov umožňujú pridať, odstrániť alebo premenovať účet." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Po vytvorení účtu môžete pridať transakcie (napríklad aktuálny zostatok) " "využitím ovládacieho panelu vpravo dole." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Bavte sa!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Vitajte!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Uložiť zmeny?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "" #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:133 msgid "&About" msgstr "" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:136 msgid "&File" msgstr "" #: wxbanker/menubar.py:137 msgid "&View" msgstr "" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "" #: wxbanker/transactionolv.py:66 msgid "Total" msgstr "" #: wxbanker/transactionolv.py:212 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:213 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:214 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:226 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:227 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:228 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:230 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:231 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/transactionolv.py:232 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:234 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:257 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:270 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:271 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:75 msgid "balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:37 wxbanker/plots/wxplotpanel.py:44 #: wxbanker/plots/cairopanel.py:81 wxbanker/plots/cairopanel.py:122 msgid "Balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:85 msgid "Trend" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:121 msgid "Time" msgstr "" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "" #: wxbanker/currencies.py:334 msgid "detected" msgstr "" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" #~ msgid "Load" #~ msgstr "Otvoriť" wxbanker-0.9.1/wxbanker/po/sl.po0000644000175000017500000005057112243601243016526 0ustar mrooneymrooney# Slovenian translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-03 00:18-0800\n" "PO-Revision-Date: 2009-11-30 02:28+0000\n" "Last-Translator: Michael Rooney \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" "X-Launchpad-Export-Date: 2010-02-04 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/bankobjects/transaction.py:92 #, python-format msgid "Transfer from %s" msgstr "Prenesi iz %s" #: wxbanker/bankobjects/transaction.py:94 #, python-format msgid "Transfer to %s" msgstr "Prenesi na %s" #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Dnevno" msgstr[1] "Vsakih %(num)d dni" msgstr[2] "Vsakih %(num)d dni" msgstr[3] "Vsakih %(num)d dni" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Tedensko ob delavnikih" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Tedensko ob vikendih" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Nedelje" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Tedensko ob %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " in %s" #: wxbanker/bankobjects/recurringtransaction.py:171 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Letno" msgstr[1] "Vsakih %(num)d let" msgstr[2] "Vsakih %(num)d let" msgstr[3] "Vsakih %(num)d let" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "do %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Brez opisa" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Računi" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Dodaj nov račun" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Izbriši izbran račun" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Preimenuj izbran račun" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:62 msgid "All accounts" msgstr "Vsi računi" #: wxbanker/accountlistctrl.py:385 wxbanker/accountlistctrl.py:487 msgid "Sorry, an account by that name already exists." msgstr "Oprosti, račun s tem imenom že obstaja." #: wxbanker/accountlistctrl.py:387 wxbanker/accountlistctrl.py:489 msgid "Account names cannot be blank." msgstr "Račun mora biti poimenovan" #: wxbanker/accountlistctrl.py:421 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:460 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "To bo trajno izbrisalo račun '%s' in vse pripadajoče transakcije. Nadaljujem?" #: wxbanker/accountlistctrl.py:461 msgid "Warning" msgstr "Pozor" #: wxbanker/accountconfigdialog.py:32 msgid "" "wxBanker can synchronize account balances online if you have an account with " "mint.com" msgstr "" #: wxbanker/accountconfigdialog.py:40 msgid "Username" msgstr "Uporabniško Ime" #: wxbanker/accountconfigdialog.py:42 msgid "Password" msgstr "Geslo" #: wxbanker/accountconfigdialog.py:62 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:103 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:105 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:115 wxbanker/csvimportframe.py:184 msgid "Save" msgstr "Shrani" #: wxbanker/accountconfigdialog.py:116 msgid "Cancel" msgstr "" #: wxbanker/accountconfigdialog.py:136 msgid "Recurring Transactions" msgstr "" #: wxbanker/plots/cairopanel.py:72 wxbanker/plots/cairopanel.py:113 #: wxbanker/plots/wxplotpanel.py:35 wxbanker/plots/wxplotpanel.py:42 msgid "Balance" msgstr "Saldo" #: wxbanker/plots/cairopanel.py:76 wxbanker/plots/wxplotpanel.py:40 msgid "Trend" msgstr "Trend" #: wxbanker/plots/cairopanel.py:112 wxbanker/plots/wxplotpanel.py:42 msgid "Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 msgid "Total Balance Over Time" msgstr "Skupno stanje skozi čas" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:45 msgid "Dismiss" msgstr "Opusti" #: wxbanker/summarytab.py:42 msgid "From" msgstr "Od" #: wxbanker/summarytab.py:46 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "v" #: wxbanker/summarytab.py:50 msgid "Trend Degree" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Pokaži Kalkulator" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Skrij Kalkulator" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transakcije" #: wxbanker/managetab.py:109 msgid "Summary" msgstr "Povzetek" #: wxbanker/transactionolv.py:48 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:60 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:96 msgid "Date" msgstr "Datum" #: wxbanker/transactionolv.py:61 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:110 msgid "Description" msgstr "Opis" #: wxbanker/transactionolv.py:62 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:104 msgid "Amount" msgstr "Znesek" #: wxbanker/transactionolv.py:63 msgid "Total" msgstr "Skupaj" #: wxbanker/transactionolv.py:204 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:205 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:206 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:218 msgid "Remove this transaction" msgstr "Odstrani to transakcijo" #: wxbanker/transactionolv.py:219 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:221 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:222 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "od" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Prenos" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Tedensko" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Letno" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Nikoli" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Konec:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "dan" msgstr[1] "dni" msgstr[2] "dni" msgstr[3] "dni" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "teden" msgstr[1] "tednov" msgstr[2] "tednov" msgstr[3] "tednov" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "mesec" msgstr[1] "mesecev" msgstr[2] "mesecev" msgstr[3] "mesecev" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "leto" msgstr[1] "let" msgstr[2] "let" msgstr[3] "let" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "pon" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "tor" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "sre" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "čet" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "pet" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "ned" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Ponavlja se na dneve:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Začne:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Vnesi to transakcijo" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Ponovi se" #: wxbanker/newtransactionctrl.py:375 msgid "No amount entered in the 'Amount' field." msgstr "Polje za 'Znesek' je prazno." #: wxbanker/newtransactionctrl.py:377 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' ni veljaven znesek." #: wxbanker/newtransactionctrl.py:380 msgid "Please enter a number such as 12.34 or -20." msgstr "Prosim vnesite številko, npr. 12.34 ali -20." #: wxbanker/newtransactionctrl.py:381 msgid "Invalid Transaction Amount" msgstr "Napačen znesek transakcije" #: wxbanker/newtransactionctrl.py:392 msgid "Please select an account and then try again." msgstr "Prosim izberite račun in poskusite ponovno." #: wxbanker/newtransactionctrl.py:393 wxbanker/newtransactionctrl.py:421 msgid "No account selected" msgstr "Izbran ni bil noben račun" #: wxbanker/newtransactionctrl.py:406 msgid "A search is currently active." msgstr "Izvaja se iskanje." #: wxbanker/newtransactionctrl.py:406 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:407 msgid "Clear search?" msgstr "Počistim iskanje?" #: wxbanker/newtransactionctrl.py:420 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:453 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Če je ta kljukica omogočena, ko dodajate transakcijo, boste morali izbrati " "račun za izvor transakcije." #: wxbanker/newtransactionctrl.py:454 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Na primer, če omogočite to kljukico in vnesete $50 na ta račun, bo samodejno " "odštelo $50 iz računa, katerega ste izbrali kot izvor." #: wxbanker/menubar.py:52 msgid "Auto-save" msgstr "Samodejno shranjevanje" #: wxbanker/menubar.py:52 msgid "Automatically save changes" msgstr "Samodejno shrani nastavitve" #: wxbanker/menubar.py:54 msgid "Import from CSV" msgstr "Uvoz iz CSV" #: wxbanker/menubar.py:54 msgid "Import transactions from a CSV file" msgstr "Uvoz transakcij iz datoteke CSV" #: wxbanker/menubar.py:60 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:61 msgid "Next account" msgstr "" #: wxbanker/menubar.py:64 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:64 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:73 msgid "&Currency" msgstr "&Obtok" #: wxbanker/menubar.py:73 msgid "Select currency to display" msgstr "Izberite valuto prikaza" #: wxbanker/menubar.py:82 msgid "Request a Currency" msgstr "Zahtevajtev valuto" #: wxbanker/menubar.py:93 msgid "View &FAQs" msgstr "Poglej Pogosta vprašanja" #: wxbanker/menubar.py:93 msgid "View Frequently Asked Questions online" msgstr "Poglej Pogosto Zastavljena Vprašanja na spletu" #: wxbanker/menubar.py:98 msgid "Ask a &Question" msgstr "Postavite vprašanje" #: wxbanker/menubar.py:98 msgid "Ask a question online" msgstr "Postavite vprašanje na spletu" #: wxbanker/menubar.py:103 msgid "&Report a Bug" msgstr "Sporoči napako" #: wxbanker/menubar.py:103 msgid "Report a bug to the developer online" msgstr "Sporoči napako razvijalcu na spletu" #: wxbanker/menubar.py:108 msgid "Request a Fea&ture" msgstr "&Zahtevajte funkcionalnost" #: wxbanker/menubar.py:108 msgid "Request a new feature to be implemented" msgstr "Zahtevaj dodatne funkcionalnosti" #: wxbanker/menubar.py:113 msgid "Tran&slate wxBanker" msgstr "&Prevedite wxBanker-ja" #: wxbanker/menubar.py:113 msgid "Translate wxBanker to another language" msgstr "Prevedite wxBanker-ja v drugi jezik" #: wxbanker/menubar.py:120 msgid "&About" msgstr "&O programu" #: wxbanker/menubar.py:120 msgid "More information about wxBanker" msgstr "Več informacij o programu wxBanker" #: wxbanker/menubar.py:123 msgid "&File" msgstr "&Datoteka" #: wxbanker/menubar.py:124 msgid "&View" msgstr "" #: wxbanker/menubar.py:125 msgid "&Settings" msgstr "Na&stavitve" #: wxbanker/menubar.py:126 msgid "&Help" msgstr "&Pomoč" #: wxbanker/menubar.py:220 msgid "Copyright" msgstr "Avtorske pravice" #: wxbanker/menubar.py:221 msgid "A lightweight personal finance management application." msgstr "Preprosta aplikacija za urejanje osebnih financ." #: wxbanker/main.py:79 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:84 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:95 wxbanker/csvimportframe.py:149 #: wxbanker/csvimportframe.py:151 msgid "Preview" msgstr "Predogled" #: wxbanker/main.py:104 msgid "Perform" msgstr "Izvedi" #: wxbanker/main.py:120 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:122 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:186 msgid "It looks like this is your first time using wxBanker!" msgstr "Kot kaže, je to vaša prva uporaba programa wxBanker!" #: wxbanker/main.py:187 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Za začetek dodajte račun z uporabo nadzorne plošče računov v zgornjem levem " "kotu." #: wxbanker/main.py:188 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" "Gumbi v nadzorni plošči računov omogočajo dodajanje, odstranjevanje in " "preimenovanje računov." #: wxbanker/main.py:189 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Ko imate račun narejen mu lahko dodajate transakcije (npr. vaše začetno " "stanje) z uporabo orodij pod razpredelnico v spodnjem desnem predelu." #: wxbanker/main.py:190 msgid "Have fun!" msgstr "Veliko zabave!" #: wxbanker/main.py:192 msgid "Welcome!" msgstr "Dobrodošli!" #: wxbanker/main.py:200 msgid "Save changes?" msgstr "Shrani spremembe?" #: wxbanker/main.py:201 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:202 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/searchctrl.py:36 msgid "Search transactions" msgstr "Išči transakcije" #: wxbanker/searchctrl.py:39 msgid "More options" msgstr "Več možnosti" #: wxbanker/searchctrl.py:39 msgid "Less options" msgstr "Manj možnosti" #: wxbanker/searchctrl.py:50 msgid "Match: " msgstr "Primerjaj " #: wxbanker/searchctrl.py:94 msgid "Show advanced search options" msgstr "Prikaži napredne možnosti iskanja" #: wxbanker/searchctrl.py:96 msgid "Hide advanced search options" msgstr "Skrij napredne možnosti iskanja" #: wxbanker/csvimportframe.py:28 msgid "CSV import" msgstr "Uvoz iz CSV" #: wxbanker/csvimportframe.py:60 msgid "Target account" msgstr "Ciljni račun" #: wxbanker/csvimportframe.py:75 wxbanker/csvimportframe.py:77 msgid "Import" msgstr "Uvoz" #: wxbanker/csvimportframe.py:87 msgid "CSV columns mapping" msgstr "Imena CSV stolpcev" #: wxbanker/csvimportframe.py:99 msgid "Date format" msgstr "Oblika zapisa datuma" #: wxbanker/csvimportframe.py:106 msgid "Decimal separator" msgstr "Decimalno ločilo" #: wxbanker/csvimportframe.py:117 msgid "CSV file settings" msgstr "Nastavitve datoteke CSV" #: wxbanker/csvimportframe.py:126 msgid "Skip first line" msgstr "Preskoči prvo vrstico" #: wxbanker/csvimportframe.py:129 msgid "Encoding" msgstr "Kodiranje" #: wxbanker/csvimportframe.py:133 msgid "Column delimiter" msgstr "Ločilo stolpcev" #: wxbanker/csvimportframe.py:144 msgid "File to import" msgstr "Datoteka za uvoz" #: wxbanker/csvimportframe.py:164 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:169 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "Za upravljanje z CSV profili potrebujete python knjižnico simplejson" #: wxbanker/csvimportframe.py:179 msgid "Load" msgstr "Naloži" #: wxbanker/csvimportframe.py:189 msgid "Delete" msgstr "Briši" #: wxbanker/csvimportframe.py:243 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:250 msgid "An error ocurred during the csv file import." msgstr "Pri uvažanju iz CSV datoteke je prišlo do napake." #: wxbanker/csvimportframe.py:251 msgid "CSV import error" msgstr "Napaka pri CSV uvozu" #: wxbanker/csvimportframe.py:301 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Profil z imenom '%s' že obstaja. Prepišem?" #: wxbanker/csvimportframe.py:302 msgid "Overwrite profile ?" msgstr "Prepišem profil?" #: wxbanker/csvimportframe.py:316 msgid "Select file and click \"Preview\"" msgstr "Izberite datoteko in kliknite \"Predogled\"" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/currencies.py:277 msgid "detected" msgstr "prepoznan" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Za valuto \"%s\" ni menjalnega tečaja" #~ msgid "Sample Points" #~ msgstr "Vzorčne točke" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Opozorilo: modul Numpy ni na voljo, onemogočam jeziček Povzetek. Namestite " #~ "numpy za odpravo napake." #~ msgid "All Accounts" #~ msgstr "Vsi računi" #~ msgid "Current Account" #~ msgstr "Trenutni račun" #~ msgid "Case Sensitive" #~ msgstr "Loči velike in male črke" #~ msgid "Hide zero-balance accounts" #~ msgstr "Skrij račune z ničelnim stanjem" #~ msgid "Show" #~ msgstr "Pokaži" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "Ali naj upoštevam velike in male črke" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Pozor: Ne morem se povezati z DateCtrl ENTER. Nadgradi na wxPython >= " #~ "2.8.8.1 za odpravo napake." #~ msgid "transfer" #~ msgstr "prenesi" #~ msgid "transaction" #~ msgstr "transakcija" #~ msgid "Which account will the money come from?" #~ msgstr "Iz katerega računa bo denar prenešen?" #~ msgid "Other accounts" #~ msgstr "Ostali računi" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "Ko izbrano, bodo računi z stanjem $0.00 skriti iz seznama" #~ msgid "Transact" #~ msgstr "Transakcija" #~ msgid "In: " #~ msgstr "V " #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "Iskanje je trenutno v teku. Ali počistim trenutno iskanje in vstavim %s v %s?" #~ msgid "Fit Curve Degree" #~ msgstr "Utežnostni faktor krivulje" #~ msgid "account:" #~ msgstr "račun:" #~ msgid "Every" #~ msgstr "Vsakih" #~ msgid "Account" #~ msgstr "Račun" wxbanker-0.9.1/wxbanker/po/sr.po0000644000175000017500000006631412243601243016536 0ustar mrooneymrooney# Serbian translation for wxbanker # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2010. # Мирослав Николић , 01.01.2011. msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2011-11-15 11:43+0000\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Launchpad Serbian Translators\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2011-11-16 05:20+0000\n" "X-Generator: Launchpad (build 14291)\n" "Language: sr\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Степен очекивања" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Месеци" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Од" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "до" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "График" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "ЦСВ увожење" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Циљни налог" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Откажи" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Увези" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Мапирање ЦСВ колона" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Датум" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Облик датума" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Износ" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Децимални зарез" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Опис" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Поставке ЦСВ датотеке" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Линије за прескакање" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Кодирање" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Граничник колоне" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Датотека за увожење" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "ЦСВ профили" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Потребна је „Python simplejson“ библиотека за учитавање/чување цсв профила." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Сачувај" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Уклони" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Кодирање датотеке изгледа да није „%s“." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Дошло је до грешке приликом увожења цсв датотеке." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Грешка ЦСВ увожења" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Профил са именом „%s“ већ постоји. Да га препишем?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Да препишем профил ?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Изаберите датотеку и кликните „Претпреглед“" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "од" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Трансфер" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Дневно" msgstr[1] "Свака %(num)d дана" msgstr[2] "Сваких %(num)d дана" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Недељно" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Месечно" msgstr[1] "Свака %(num)d месеца" msgstr[2] "Сваких %(num)d месеци" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Годишње" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Никада" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "сваке/ог" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Завршава се:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Понављања:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "дана" msgstr[1] "дана" msgstr[2] "дана" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "недеље" msgstr[1] "недеље" msgstr[2] "недеља" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "месеца" msgstr[1] "месеца" msgstr[2] "месеци" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "године" msgstr[1] "године" msgstr[2] "година" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Пон" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Уто" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Сре" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Чет" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Пет" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Суб" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Нед" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Понављање данима:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Почни:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Унеси овај пренос" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Периодичност" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Почетно стање" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Није унешен износ у поље „Износ“." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "„%s“ није исправан износ." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Молим унесите бројеве као што су 12,34 или -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Неисправан износ преноса" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Молим изаберите неки налог и затим покушајте опет." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Налог није изабран" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Претрага је тренутно активна." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Да ли бисте хтели да очистите тренутну претрагу и да направите овај пренос у " "„%s“?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Очисти претрагу" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Ова трансакција је означена као пренос. Молим изаберите налог за пренос." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Ако је овај квадратић означен приликом додавања трансакције, бићете упитани " "који налог ће бити коришћен као извор преноса." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "На пример, ако означите овај квадратић и унесете трансакцију од 50 дин. у " "тај налог, онда ће такође бити умањено 50 дин. са налога који сте изабрали " "као извор." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Потражи трансакције" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Више опција" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Мање опција" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Подударање: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Прикажите напредне опције претраге" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Сакријте напредне опције претраге" # plural forms??? #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "Периодична трансакција „%(description)s“ има %(num)i спремне(их) " "трансакције(а) у износу од %(amount)s за %(datelist)s." # plural forms??? #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i периодичне(их) трансакције(а) имају укупно %(totalnum)i спремних " "трансакција." #: wxbanker/main.py:101 msgid "Preview" msgstr "Претпреглед" #: wxbanker/main.py:110 msgid "Perform" msgstr "Изврши" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Периодична трансакција је успешно додата." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "Прва трансакција ће бити извршена %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Изгледа да је ово први пут да користите вхБанкара!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Да започнете, додајте један налог користећи контролу налога у горњем левом " "углу." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Дугмад у контроли налога вам омогућавају да додате, преименујете, подесите и " "да уклоните налог, свако понаособ." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Када сте направили налог онда му можете додати и трансакцију (као што је " "ваше почетно стање) користећи контроле у доњем десном углу." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Уживајте!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Добродошли!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Сачувати измене?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Направили сте измене од последњег чувања. Да ли бисте желели да их сачувате " "пре него што завршите?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Знајте да ће укључивање аутоматског чувања из изборника „Датотека“ уклонити " "потребу за ручним чувањем." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Нема односа размене за валуту „%s“" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Налози" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Додајте нови налог" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Уклоните изабрани налог" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Преименујте изабрани налог" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Подесите изабрани налог" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Сви налози" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Није усклађено са Mint.com-ом" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Извините, налог са овим називом већ постоји." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Назив налога не може бити празан." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Назив налога" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Ово ће трајно уклонити налог „%s“ и све његове трансакције. Да наставим?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Упозорење" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Сам сачувај" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Сам чува измене" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Увези из ЦСВ-а" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Увезите трансакције из ЦСВ датотеке" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Извези у ЦСВ" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Извезите трансакције у ЦСВ датотеку" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Претходни налог" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Следећи налог" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Прикажи налоге са нултим стањем" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Када је искључено, налози са стањем од $0.00 неће бити приказани у списку" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Валуте" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Изаберите валуту за приказивање" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Затражи валуту" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Уједини са Mint.com-ом" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Ускладите стања налога са постојећим „Mint.com“ налогом" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "&Прегледајте ЧПП" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Прегледајте често постављана питања на мрежи" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "По&ставите питање" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Поставите питање на мрежи" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "Пријавите &грешку" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Пријавите грешку програмеру на мрежи" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Затражите &функцију" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Затражите примену нове функције" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Преве&дите вхБанкара" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Преведите вхБанкара на други језик" #: wxbanker/menubar.py:133 msgid "&About" msgstr "О &програму" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Више информација о вхБанкару" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Датотека" #: wxbanker/menubar.py:137 msgid "&View" msgstr "Пре&глед" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "По&ставке" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "По&моћ" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Ауторска права" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Једноставне личне финансије." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Недељно — радним данима" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Недељно — данима викенда" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "понедељком" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "уторком" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "средом" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "четвртком" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "петком" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "суботом" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "недељом" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Недељно — %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Сваке %(num)d° недеље — %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " и %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Годишње" msgstr[1] "Сваке %(num)d године" msgstr[2] "Сваких %(num)d година" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "све до %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Нема описа" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Пребаци са %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Пребаци на %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Извештај:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Прикажи калкулатор" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Сакриј калкулатор" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Трансакције" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Извештај" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Нема унешених трансакција." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Нема одговарајућих трансакција." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Стање" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "Ук_упно" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Пошаљи %s калкулатору" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Додај %s у калкулатор" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Одузми %s из калкулатора" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Уклони ову трансакцију" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Премести ову трансакцију у налог" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Још нема ознака" # plural forms??? #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Уклони ове %i трансакције" # plural forms??? #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Премести ове %i трансакције у налог" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Још нема заједничке ознаке" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Додајте ознаку" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Ознаке" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Потражи ову ознаку" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Уклони ову ознаку" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "стање" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Очекивање" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Укупно стање у времену" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Време" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "месечно" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" "Да бисте користили „%s“ библиотеке за исцртавање, инсталирајте следеће " "питонове модуле: „%s“." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Откажи" #: wxbanker/currencies.py:334 msgid "detected" msgstr "откривено" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "Ништа" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Минт.ком кредибилитети:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Сачувај кредибилитете у привезак кључева" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Одговарајући Минт налог за „%(name)s“:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Освежи" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Корисничко име:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Лозинка:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Детаљи трансакције" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "Ово ће трајно уклонити ову периодичну трансакцију. Наставити?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Овај налог тренутно нема периодичних трансакција." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Затвори" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Избриши" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Периодичне трансакције" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Минт.ком обједињавање" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "Можете да означите трансакцију тако што ћете поставити „#tagname“ (назив " "ознаке) било где у опису." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Ознака:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "Да касније уклоните ову ознаку, једноставно је уклоните из описа или " "кликните десним тастером миша на трансакцију." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Додај ознаку" #~ msgid "Load" #~ msgstr "Учитај" wxbanker-0.9.1/wxbanker/po/sv.po0000644000175000017500000006066112243601243016541 0ustar mrooneymrooney# Swedish translation for wxbanker # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2013-03-18 01:17+0000\n" "Last-Translator: Umut \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-03-19 05:31+0000\n" "X-Generator: Launchpad (build 16532)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Månader" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Från" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "till" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Diagram" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Importera CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Målkonto" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Avbryt" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Importera" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Kartläggning av CSV-kolumner" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Datum" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Datumformat" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Belopp" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Decimalavgränsare" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Beskrivning" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "CSV filinställningar" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Kodning" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Kolumnavskiljare" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Fil att importera" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV-profiler" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" "Pythons simplejson-bibliotek behövs för CVS-profilsladdning/sparning." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Spara" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Ta bort" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Filkodningen verkar inte vara '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Ett fel uppstod under importeringen av CSV-filen." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "CSV importeringsfel" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Profilen med namnet '%s' existerar redan. Skriv över?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Skriv över profil ?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Välj fil och klicka \"Förhandsvisa\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "från" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Överföring" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Dagligen" msgstr[1] "Var %(num)d dag" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Veckovis" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Månadsvis" msgstr[1] "Var %(num)d månad" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Årligen" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Aldrig" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "varje" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Slutar:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Återkommer:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "dag" msgstr[1] "dagar" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "vecka" msgstr[1] "veckor" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "månad" msgstr[1] "månader" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "år" msgstr[1] "år" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Mån" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Tis" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Ons" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Tor" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Fre" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Lör" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Sön" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Återkommer på dagarna:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Börjar:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Fyll i transaktionen" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Återkommande" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Inget belopp ifyllt i \"Belopp\"-fältet." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' är inget giltigt belopp." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Vänligen fyll i ett nummer som t.ex. 12.34 eller -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Ogiltigt transaktionsbelopp" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Vänligen välj ett konto och försök igen." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Inget konto valt" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "En sökning är för tillfället aktiv." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Vill du rensa nuvarande sökning och utföra denna transaktion i \"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Rensa sökning?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Den här transaktionen är markerad som en överföring. Var vänlig välj " "överföringskontot." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Om denna ruta är i kryssad när du lägger till en transaktion, kommer du " "behöva ange kontot som ska vara ursprungs kontot för överföringen." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "t.ex. kryssa i rutan och skriv in en transaktion på $50 på det här kontot " "kommer också att dra ifrån $50 från kontot som du valde som ursprungs konto." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Sök transaktioner" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Fler alternativ" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Färre alternativ" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Träff: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Visa avancerade sökalternativ" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Dölj avancerade sökalternativ" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "Den återkommande transaktionen \"%(description)s\" har %(num)i transaktioner " "klara för %(amount)s på %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i återkommande transaktioner har totalt %(totalnum)i färdiga " "transaktioner." #: wxbanker/main.py:101 msgid "Preview" msgstr "Förhandsgranskning" #: wxbanker/main.py:110 msgid "Perform" msgstr "Utför" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Återkommande transaktion har framgångsrikt lagts till." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "Den första transaktionen kommer att göras den %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Det ser ut som om det här är första gången du använder wxBanker!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "För att komma igång, lägg till ett konto via kontrollpanelen i översta " "vänstra hörnet." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "När du väl skapat ett konto kan du lägga till transaktioner (t.ex. ett " "initialt värde) genom att använda kontrollerna nere till höger." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Ha det så kul!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Välkommen!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Spara ändringar?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Du har gjort ändringar sedan du sparade sist. Vill du spara innan du " "avslutar?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Notera att aktiveringen av automatisk sparning från Arkiv-meyn kommer att " "eliminera behovet av manuell sparning." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Ingen växelkurs för valutan \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Konton" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Lägg till ett nytt konto" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Ta bort det valda kontot" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Ändra namn på valt konto" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Konfigurera valt konto" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Alla konton" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Ledsen, ett konto med det namnet existerar redan." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Kontonamn kan inte vara tomma." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Kontonamn" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Det här kommer att permanent ta bort kontot '%s' och alla dess " "transaktioner. Fortsätt?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Varning" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Automatisk sparning" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Spara ändringar automatiskt" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Importera från CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Importera transaktioner från en CSV-fil" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Exportera till CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Exportera transaktioner till en CSV-fil" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Föregående konto" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Nästa konto" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "När avaktiverad kommer konton med ett saldo av $0.00 att döljas från listan." #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Valuta" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Välj valuta som ska visas" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Begär en ny valuta" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Integrera med Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Visa &FAQ" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Visa Vanliga frågor online" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Ställ en &fråga" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Fråga en fråga online" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Rapportera en bugg" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Rapportera en bugg till utvecklaren online" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Begär en egenskap" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Begär en ny funktion som ska implementeras" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Över&sätt wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Översätt wxBanker till ett annat språk" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Om" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Mer information om wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Arkiv" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Visa" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "In&ställningar" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Hjälp" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Copyright" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Veckovis på vardagar" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Veckovis på helger" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Måndagar" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Tisdagar" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Onsdagar" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Torsdagar" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Fredagar" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Lördagar" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Söndagar" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Veckovis på %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " och %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Årligen" msgstr[1] "Vart %(num)d år" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "till och med %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Ingen beskrivning" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Överför från %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Överför till %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Sammanfattning:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Visa miniräknare" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Göm miniräknare" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Transaktioner" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Summering" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Inga transaktioner angivan." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Ingen matchade transaktion" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Balans" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Skicka %s till miniräknare" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Addera %s i miniräknare" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Subtrahera %s i miniräknare" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Ta bort den här transaktionen" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Flytta denna transaktion till konto" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Ta bort följande %i transaktioner" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Flytta dessa %i transaktioner till konto" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Lägg till tagg" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Trend" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Total balans över tid" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Tid" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Avfärda" #: wxbanker/currencies.py:334 msgid "detected" msgstr "upptäckt" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Användarnamn:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Lösenord:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Transaktionsdetaljer" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Det här kontot har för närvarande inga återkommande transaktioner" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Stäng" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Ta bort" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Återkommande Transaktioner" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Mint.com integration" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "" #~ "Respektive knappar i kontrollpanelen låter dig lägga till, ta bort och byta " #~ "namn på ditt konto" #~ msgid "Total" #~ msgstr "Totalt" #~ msgid "All Accounts" #~ msgstr "Alla konton" #~ msgid "Current Account" #~ msgstr "Nuvarande konto" #~ msgid "Case Sensitive" #~ msgstr "Skiftlägeskänslig" #~ msgid "Hide zero-balance accounts" #~ msgstr "Göm kontom som har noll i balans." #~ msgid "In: " #~ msgstr "I: " #~ msgid "Show" #~ msgstr "Visa" #~ msgid "transfer" #~ msgstr "överför" #~ msgid "transaction" #~ msgstr "transaktion" #~ msgid "Which account will the money come from?" #~ msgstr "Vilket konto kommer pengarna komma från?" #~ msgid "Other accounts" #~ msgstr "Andra konton" #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "" #~ "En sökning är aktiv för tillfället. Vill du rensa den nuvarande sökningen " #~ "och skriva %s i \"%s\"?" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "" #~ "När aktiverat kommer konton med en balans på $0.00 döljas från listan" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Varning: Oförmögen att binda till DateCtrl's ENTER. Uppgradera till wxPython " #~ ">= 2.8.8.1 för att ordna detta." #~ msgid "Sample Points" #~ msgstr "Sampelspunkter" #~ msgid "Transact" #~ msgstr "Transaktion" #~ msgid "A lightweight personal finance management application." #~ msgstr "Ett lättviktigt program för hantering av personliga finanser." #~ msgid "Whether or not to match based on capitalization" #~ msgstr "Huruvida träffar baseras på Versaler/Gemener eller inte" #~ msgid "Fit Curve Degree" #~ msgstr "Anpassa Bågens Grad" #~ msgid "Load" #~ msgstr "Ladda" #~ msgid "Account" #~ msgstr "Konto" #~ msgid "&Tools" #~ msgstr "&Verktyg" #~ msgid "CSV Import" #~ msgstr "CSV-importering" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Varning: Numpy-modulen är inte tillgänglig, avaktiverar summeringsfliken. " #~ "Installera numpy för att åtgärda detta." #~ msgid "Skip first line" #~ msgstr "Hoppa över första raden" wxbanker-0.9.1/wxbanker/po/tr.po0000644000175000017500000004520112243601243016527 0ustar mrooneymrooney# Turkish translation for wxbanker # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2011-10-12 20:04+0000\n" "Last-Translator: Burak Maleri \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2011-10-13 04:36+0000\n" "X-Generator: Launchpad (build 14124)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Ay" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Kimden" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "kime" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Çizge" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "CSV İçe Aktar" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Hedef Hesap" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "İptal" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "İçeri al" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "CSV Kolon Haritası" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Tarih" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Tarih biçimi" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Miktar" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Ondalık ayırıcı" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Açıklama" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "CSV Dosya Ayarları" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Kodlama" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "İmport edilecek dosya" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV Profili" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Kaydet" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Kaldır" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "kimden" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Aktarma" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Haftalık" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Yıllık" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Hiçbir zaman" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "her" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Sonlandırma" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "gün" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "hafta" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "ay(lar)" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "yıl(lar)" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Pts" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Sal" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Çrş" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Prş" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Cum" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Cts" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "Pzr" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Başlama" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Tekrarlayan" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "" #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "" #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Seçilmiş hesap yok" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Eşleşme: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:101 msgid "Preview" msgstr "Önizleme" #: wxbanker/main.py:110 msgid "Perform" msgstr "Gerçekleştir" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "İyi eğlenceler!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Hoş geldiniz!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Değişiklikler kaydedilsin mi?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Hesaplar" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Yeni bir hesap ekle" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Seçilen hesabı sil" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Seçilen hesabı yeniden adlandır" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Seçilen hesabı yapılandır" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Tüm hesaplar" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "" #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Hesap adı" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Uyarı" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "CSV'den içe aktar" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "CSV'ye dışa aktar" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Önceki hesap" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Sonraki hesap" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Hata bildir" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "_Yeni özellik talebi" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Hakkında" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Dosya" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Görünüm" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Ayarlar" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Yardım" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Telif" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Perşembe" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Cuma" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Cumartesi" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Pazar" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Açıklama yok" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Özet:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Aktarımlar" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Özet" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Bakiye" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Zaman" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "İptal Et" #: wxbanker/currencies.py:334 msgid "detected" msgstr "algılandı" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Güncelle" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Kullanıcı adı:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Parola:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Kapat" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Sil" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" #~ msgid "Load" #~ msgstr "Yükle" #~ msgid "Total" #~ msgstr "Toplam" wxbanker-0.9.1/wxbanker/po/uk.po0000644000175000017500000004723312243601243016530 0ustar mrooneymrooney# Ukrainian translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-02-03 00:18-0800\n" "PO-Revision-Date: 2009-04-16 16:59+0000\n" "Last-Translator: Eugene Babiy \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2010-02-04 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/bankobjects/transaction.py:92 #, python-format msgid "Transfer from %s" msgstr "Перемістити їз %s" #: wxbanker/bankobjects/transaction.py:94 #, python-format msgid "Transfer to %s" msgstr "Перемістити на %s" #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:171 #: wxbanker/newtransactionctrl.py:100 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Рахунки" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Додати новий рахунок" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Видалити вибраний рахунок" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Перейменувати вибраний рахунок" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Налаштувати вибраний рахунок" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:62 msgid "All accounts" msgstr "Усі рахунки" #: wxbanker/accountlistctrl.py:385 wxbanker/accountlistctrl.py:487 msgid "Sorry, an account by that name already exists." msgstr "Вибачте, рахунок з такою назвою вже існує." #: wxbanker/accountlistctrl.py:387 wxbanker/accountlistctrl.py:489 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:421 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:460 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:461 msgid "Warning" msgstr "Попередження" #: wxbanker/accountconfigdialog.py:32 msgid "" "wxBanker can synchronize account balances online if you have an account with " "mint.com" msgstr "" #: wxbanker/accountconfigdialog.py:40 msgid "Username" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Password" msgstr "" #: wxbanker/accountconfigdialog.py:62 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:103 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:105 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:115 wxbanker/csvimportframe.py:184 msgid "Save" msgstr "Зберегти" #: wxbanker/accountconfigdialog.py:116 msgid "Cancel" msgstr "" #: wxbanker/accountconfigdialog.py:136 msgid "Recurring Transactions" msgstr "" #: wxbanker/plots/cairopanel.py:72 wxbanker/plots/cairopanel.py:113 #: wxbanker/plots/wxplotpanel.py:35 wxbanker/plots/wxplotpanel.py:42 msgid "Balance" msgstr "Баланс" #: wxbanker/plots/cairopanel.py:76 wxbanker/plots/wxplotpanel.py:40 msgid "Trend" msgstr "Тенденція" #: wxbanker/plots/cairopanel.py:112 wxbanker/plots/wxplotpanel.py:42 msgid "Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 msgid "Total Balance Over Time" msgstr "Загальний Баланс за Період" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:45 msgid "Dismiss" msgstr "" #: wxbanker/summarytab.py:42 msgid "From" msgstr "" #: wxbanker/summarytab.py:46 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "" #: wxbanker/summarytab.py:50 msgid "Trend Degree" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Показати Калькулятор" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Приховати Калькулятор" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Транзакції" #: wxbanker/managetab.py:109 msgid "Summary" msgstr "" #: wxbanker/transactionolv.py:48 msgid "No transactions entered." msgstr "Не введено транзакцію" #: wxbanker/transactionolv.py:60 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:96 msgid "Date" msgstr "Дата" #: wxbanker/transactionolv.py:61 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:110 msgid "Description" msgstr "Опис" #: wxbanker/transactionolv.py:62 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:41 wxbanker/csvimportframe.py:104 msgid "Amount" msgstr "Сума" #: wxbanker/transactionolv.py:63 msgid "Total" msgstr "Всього" #: wxbanker/transactionolv.py:204 #, python-format msgid "Send %s to calculator" msgstr "Надіслати %s в калькулятор" #: wxbanker/transactionolv.py:205 #, python-format msgid "Add %s to calculator" msgstr "Додати %s в калькулятор" #: wxbanker/transactionolv.py:206 #, python-format msgid "Subtract %s from calculator" msgstr "Відняти %s з калькулятора" #: wxbanker/transactionolv.py:218 msgid "Remove this transaction" msgstr "Видалити цю транзакцію" #: wxbanker/transactionolv.py:219 msgid "Move this transaction to account" msgstr "Перемістити цю транзакцію на рахунок" #: wxbanker/transactionolv.py:221 #, python-format msgid "Remove these %i transactions" msgstr "Видалити ці %i транзакції" #: wxbanker/transactionolv.py:222 #, python-format msgid "Move these %i transactions to account" msgstr "Перемістити ці %i транзакції на рахунок" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Трансфер" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Введіть цю транзакцію" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:375 msgid "No amount entered in the 'Amount' field." msgstr "Не введено суму в полі ’Сума’." #: wxbanker/newtransactionctrl.py:377 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' - невірна сума." #: wxbanker/newtransactionctrl.py:380 msgid "Please enter a number such as 12.34 or -20." msgstr "Будьласка введіть цифру типу 12.34 або -20." #: wxbanker/newtransactionctrl.py:381 msgid "Invalid Transaction Amount" msgstr "Невірна Сума Транзакції" #: wxbanker/newtransactionctrl.py:392 msgid "Please select an account and then try again." msgstr "Будьласка виберіть рахунок та спробуйте ще раз." #: wxbanker/newtransactionctrl.py:393 wxbanker/newtransactionctrl.py:421 msgid "No account selected" msgstr "Рахунок не вибрано" #: wxbanker/newtransactionctrl.py:406 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:406 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" #: wxbanker/newtransactionctrl.py:407 msgid "Clear search?" msgstr "Очистити пошук?" #: wxbanker/newtransactionctrl.py:420 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:453 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:454 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/menubar.py:52 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:52 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:54 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:54 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:61 msgid "Next account" msgstr "" #: wxbanker/menubar.py:64 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:64 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:73 msgid "&Currency" msgstr "" #: wxbanker/menubar.py:73 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:82 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:93 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:93 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:98 msgid "Ask a &Question" msgstr "" #: wxbanker/menubar.py:98 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:103 msgid "&Report a Bug" msgstr "" #: wxbanker/menubar.py:103 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:108 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:108 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:113 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:113 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:120 msgid "&About" msgstr "" #: wxbanker/menubar.py:120 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:123 msgid "&File" msgstr "" #: wxbanker/menubar.py:124 msgid "&View" msgstr "" #: wxbanker/menubar.py:125 msgid "&Settings" msgstr "" #: wxbanker/menubar.py:126 msgid "&Help" msgstr "" #: wxbanker/menubar.py:220 msgid "Copyright" msgstr "" #: wxbanker/menubar.py:221 msgid "A lightweight personal finance management application." msgstr "" #: wxbanker/main.py:79 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:84 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:95 wxbanker/csvimportframe.py:149 #: wxbanker/csvimportframe.py:151 msgid "Preview" msgstr "Перегляд" #: wxbanker/main.py:104 msgid "Perform" msgstr "" #: wxbanker/main.py:120 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:122 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:186 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:187 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:188 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "" #: wxbanker/main.py:189 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:190 msgid "Have fun!" msgstr "" #: wxbanker/main.py:192 msgid "Welcome!" msgstr "" #: wxbanker/main.py:200 msgid "Save changes?" msgstr "" #: wxbanker/main.py:201 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:202 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/searchctrl.py:36 msgid "Search transactions" msgstr "Шукати транзакції" #: wxbanker/searchctrl.py:39 msgid "More options" msgstr "Більше опцій" #: wxbanker/searchctrl.py:39 msgid "Less options" msgstr "Меньше параметрів" #: wxbanker/searchctrl.py:50 msgid "Match: " msgstr "Відповідає: " #: wxbanker/searchctrl.py:94 msgid "Show advanced search options" msgstr "Показати розширені параметри пошуку" #: wxbanker/searchctrl.py:96 msgid "Hide advanced search options" msgstr "Приховати розширені параметри пошуку" #: wxbanker/csvimportframe.py:28 msgid "CSV import" msgstr "Імпорт CSV" #: wxbanker/csvimportframe.py:60 msgid "Target account" msgstr "Цільовий рахунок" #: wxbanker/csvimportframe.py:75 wxbanker/csvimportframe.py:77 msgid "Import" msgstr "Імпорт" #: wxbanker/csvimportframe.py:87 msgid "CSV columns mapping" msgstr "Призначення колонок CSV" #: wxbanker/csvimportframe.py:99 msgid "Date format" msgstr "Формат дати" #: wxbanker/csvimportframe.py:106 msgid "Decimal separator" msgstr "Десятковий розділювач" #: wxbanker/csvimportframe.py:117 msgid "CSV file settings" msgstr "Налаштування файла CSV" #: wxbanker/csvimportframe.py:126 msgid "Skip first line" msgstr "Пропустити перший рядок" #: wxbanker/csvimportframe.py:129 msgid "Encoding" msgstr "Кодування" #: wxbanker/csvimportframe.py:133 msgid "Column delimiter" msgstr "Розділювач колонки" #: wxbanker/csvimportframe.py:144 msgid "File to import" msgstr "Файл для імпорту" #: wxbanker/csvimportframe.py:164 msgid "CSV profiles" msgstr "Профілі CSV" #: wxbanker/csvimportframe.py:169 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:179 msgid "Load" msgstr "Завантажити" #: wxbanker/csvimportframe.py:189 msgid "Delete" msgstr "Знищити" #: wxbanker/csvimportframe.py:243 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Кодування файлу не відповідає '%s'." #: wxbanker/csvimportframe.py:250 msgid "An error ocurred during the csv file import." msgstr "Виникла помилка під час імпорту файлу CSV." #: wxbanker/csvimportframe.py:251 msgid "CSV import error" msgstr "Помилка імпорту CSV" #: wxbanker/csvimportframe.py:301 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Профіль з назвою '%s' вже існує. Перезаписати його ?" #: wxbanker/csvimportframe.py:302 msgid "Overwrite profile ?" msgstr "Перезаписати профіль ?" #: wxbanker/csvimportframe.py:316 msgid "Select file and click \"Preview\"" msgstr "Виберіть файл та натисніть \"Перегляд\"" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/currencies.py:277 msgid "detected" msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Немає обмінного курсу для валюти \"%s\"" #~ msgid "Hide zero-balance accounts" #~ msgstr "Приховати рахунки з нульовим балансом" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "Якщо увімкнено, рахунки з балансом $0.00 будуть приховані" #~ msgid "Transact" #~ msgstr "Провести" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "" #~ "Попередження: Неможливо отримати DateCtrl's ENTER. Оновіться до wxPython >= " #~ "2.8.8.1 для виправлення цього." #~ msgid "Which account will the money come from?" #~ msgstr "З якого рахунку надійдуть кошти?" #~ msgid "Other accounts" #~ msgstr "Інші рахунки" #~ msgid "transfer" #~ msgstr "трансфер" #~ msgid "transaction" #~ msgstr "транзакція" #~ msgid "Account" #~ msgstr "Рахунок" #~ msgid "All Accounts" #~ msgstr "Усі Рахунки" #~ msgid "Current Account" #~ msgstr "Поточний Рахунок" #~ msgid "In: " #~ msgstr "В: " #~ msgid "Show" #~ msgstr "Показати" #~ msgid "Case Sensitive" #~ msgstr "З урахуванням регістру" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "" #~ "Попередження: Модуль Numpy не доступний, що унеможливлює Вкладку Підсумків. " #~ "Встановіть numpy щоб виправити це." wxbanker-0.9.1/wxbanker/po/vi.po0000644000175000017500000005761012243601243016527 0ustar mrooneymrooney# Vietnamese translation for wxbanker # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2011-10-23 09:25+0000\n" "Last-Translator: Hoàng Ngọc Long \n" "Language-Team: Vietnamese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2011-10-24 05:12+0000\n" "X-Generator: Launchpad (build 14185)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "Cấp Xu hướng" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "Tháng" #: wxbanker/summarytab.py:48 msgid "From" msgstr "Từ" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "đến" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "Đồ thị" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "Nhập CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "Tài khoản đích" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "Huỷ bỏ" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "Nhập" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "Sắp xếp các cột CSV" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "Ngày" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "Định dạng ngày" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "Tổng số" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "Dấu thập phân" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "Mô tả" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "Các thiết đặt tệp CSV" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "Số dòng để bỏ qua" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "Mã hoá" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "Phân cách cột" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "Tệp để nhập" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "Hồ sơ CSV" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "Thư viện Python simplejson cần cho việc tải/lưu hồ sơ csv." #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "Lưu" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "Loại bỏ" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "Mã hoá của tệp có vẻ như không phải là '%s'." #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "Một lỗi đã xảy ra trong quá trình nhập tệp csv." #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "Lỗi nhập CSV" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "Hồ sơ với tên '%s' đã tồn tại. Ghi đè lên nó ?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "Ghi đè lên hồ sơ ?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "Chọn tệp và nhấn \"Xem trước\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "từ" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "Chuyển khoản" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "Hàng ngày" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "Hàng tuần" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "Hàng tháng" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "Hàng năm" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "Không bao giờ" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "mọi" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "Kết thúc:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "Lặp lại:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "ngày" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "tuần" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "tháng" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "năm" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "Hai" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "Ba" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "Tư" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "Năm" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "Sáu" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "Bảy" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "CN" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "Lặp lại vào những ngày:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "Bắt đầu:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "Nhập giao dịch" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "Định kỳ" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "Số dư ban đầu" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "Không có số lượng được nhập trong trường 'Tổng số'." #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' không phải là một số lượng hợp lệ." #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "Vui lòng nhập vào một số như 12,34 hay -20." #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "Số Lượng Giao Dịch Không Phù Hợp" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "Vui lòng chọn một tài khoản và sau đó thử lại." #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "Không có tài khoản nào được chọn" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "Một tìm kiếm hiện tại hoạt động." #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "" "Bạn có muốn xoá bỏ tìm kiếm hiện tại và thực hiện giao dịch này trong \"%s\"?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "Làm sạch tìm kiếm?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" "Giao dịch này được đánh dấu như một chuyển khoản. Vui lòng chọn tài khoản " "chuyển." #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" "Nếu ô này được kiểm khi thêm một giao dịch, bạn sẽ được nhắc về tài khoản " "dùng làm nguồn cho chuyển khoản." #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" "Ví dụ, kiểm ô này và nhập một giao dịch 50$ vào tài khoản này cũng sẽ trừ " "50$ từ tài khoản mà bạn chọn làm nguồn." #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "Tìm kiếm giao dịch" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "Nhiều tuỳ chọn hơn" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "Ít tuỳ chọn hơn" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "Khớp: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "Hiện những tuỳ chọn tìm kiếm nâng cao" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "Ẩn những tuỳ chọn tìm kiếm nâng cao" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "Giao dịch định kỳ \"%(description)s\" có %(num)i giao dịch sẵn sàng cho " "%(amount)s vào %(datelist)s." #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" "%(num)i giao dịch định kỳ có tổng số %(totalnum)i giao dịch sẵn sàng." #: wxbanker/main.py:101 msgid "Preview" msgstr "Xem trước" #: wxbanker/main.py:110 msgid "Perform" msgstr "Thực hiện" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "Giao dịch định kỳ được thêm thành công." #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "Giao dịch đầu tiên sẽ diễn ra vào %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "Đây có vẻ là lần đầu tiên bạn sử dụng wxBanker!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" "Để bắt đầu, thêm một tài khoản sử dụng điều khiển tài khoản ở góc trên bên " "trái." #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" "Các nút trong điều khiển tài khoản cho phép bạn thêm, đổi tên, cấu hình, và " "loại bỏ một tài khoản, theo thứ tự." #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" "Một khi bạn tạo một tài khoản bạn có thể thêm các giao dịch vào nó (như số " "dư ban đầu của bạn) sử dụng các điều khiển bên dưới lưới ở góc dưới bên phải." #: wxbanker/main.py:195 msgid "Have fun!" msgstr "Chúc vui!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "Xin chào!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "Lưu những thay đổi?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" "Bạn đã tạo những thay đổi kể từ lần lưu cuối. Bạn có muốn lưu trước khi " "thoát?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" "Lưu ý rằng cho phép tự động-lưu từ thực đơn Tệp sẽ loại bỏ việc cần thiết " "lưu thủ công." #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "Không có tỷ lệ quy đổi cho tiền tệ \"%s\"" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "Tài khoản" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "Thêm một tài khoản mới" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "Loại bỏ tài khoản đã chọn" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "Đổi tên tài khoản đã chọn" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "Cấu hình tài khoản đã chọn" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "Tất cả tài khoản" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "Không được đồng bộ với Mint.com" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "Xin lỗi, một tài khoản với tên đó đã tồn tại." #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "Tên tài khoản không thể để trống." #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "Tên tài khoản" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" "Việc này sẽ loại bỏ hẳn tài khoản '%s' và tất cả các giao dịch của nó. Tiếp " "tục?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "Cảnh báo" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "Tự động-lưu" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "Tự động lưu những thay đổi" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "Nhập từ CSV" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "Nhập các giao dịch từ một tệp CSV" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "Xuất ra CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "Xuất các giao dịch ra một tếp CSV" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "Tài khoản trước" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "Tài khoản kế tiếp" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "Hiện những tài khoản không còn tiền" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" "Khi bị vô hiệu, những tài khoản với số dư là 0,00$ sẽ bị ẩn khỏi danh sách" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&Tiền tệ" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "Chọn tiền tệ để hiển thị" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "Yêu cầu một Tiền tệ" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "Tích hợp với Mint.com" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "Đồng bộ những số dư tài khoản với một tài khoản Mint.com đã có" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "Xem &FAQ" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "Xem Những Câu hỏi Thường gặp trực tuyến" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "Đặt một &Câu hỏi" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "Đặt một câu hỏi trực tuyến" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&Báo cáo một lỗi" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "Báo cáo một lỗi cho người phát triển trực tuyến" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "Yêu cầu một Tính nă&ng" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "Yêu cầu một tính năng mới được hiện thức" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "Dị&ch wxBanker" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "Dịch wxBanker ra một ngôn ngữ khác" #: wxbanker/menubar.py:133 msgid "&About" msgstr "&Về" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "Thông tin thêm về wxBanker" #: wxbanker/menubar.py:136 msgid "&File" msgstr "&Tệp" #: wxbanker/menubar.py:137 msgid "&View" msgstr "&Xem" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "&Thiệt đặt" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "&Trợ giúp" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "Bản quyền" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "Tài chính cá nhân đơn giản." #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "Hàng tuần vào ngày thường trong tuần" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "Hàng tuần vào ngày cuối tuần" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "Thứ Hai" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "Thứ Ba" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "Thứ Tư" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "Thứ Năm" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "Thứ Sáu" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "Thứ Bảy" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "Chủ Nhật" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "Hàng tuần vào %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "Mỗi %(num)d tuần vào %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " and %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "Hàng năm" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "cho đến %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "Không có mô tả" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "Chuyển khoản từ %s" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "Chuyển khoản tới %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "Tóm tắt:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "Hiện Máy tính" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "Ẩn Máy tính" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "Các giao dịch" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "Tóm tắt" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "Không có giao dịch nào được nhập." #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "Không có giao dịch nào khớp." #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "Số dư" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "_Tổng số" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "Gửi %s tới máy tính" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "Thêm %s vào máy tính" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "Trừ %s từ máy tính" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "Loại bỏ giao dịch này" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "Chuyển giao dịch này vào tài khoản" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "Chưa gắn thẻ" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "Loại bỏ %i giao dịch này" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "Chuyển %i giao dịch này vào tài khoản" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "Chưa gắn thẻ thông thường" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "Thêm một thẻ" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "Thẻ" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "Tìm kiếm thẻ này" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "Loại bỏ thẻ này" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "số dư" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "Xu hướng" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "Tổng Số dư Theo Thời gian" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "Thời gian" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "hàng tháng" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "Để sử dụng thư viện vẽ '%s', cài đặt các mô-đun python sau: %s." #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "Bỏ qua" #: wxbanker/currencies.py:334 msgid "detected" msgstr "được phát hiện" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "không có" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Chứng danh Mint.com:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "Lưu các chứng danh vào vòng khoá" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "Tài khoản Mint tương ứng cho %(name)s:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "Cập nhật" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "Tên người dùng:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "Mật khẩu:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "Chi tiết giao dịch" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "Việc này sẽ laoij bỏ hẳn giao dịch định kỳ này. Tiếp tục?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "Tài khoản này hiện tại không có giao dịch định kỳ nào." #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "Đóng" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "Xoá" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "Giao dịch Định kỳ" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Tích hợp Mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" "Bạn cũng có thể gắn thẻ cho một giao dịch bằng cách đặt #tagname ở bất kỳ " "đâu trong phần mô tả." #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "Thẻ:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" "Để loại bỏ thẻ này sau, đơn giản loại bỏ nó khỏi mô tả hay nhấn-chuột phải " "vào giao dịch." #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "Thêm thẻ" wxbanker-0.9.1/wxbanker/po/wxbanker.pot0000644000175000017500000004324512243601243020115 0ustar mrooneymrooney# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-10-04 03:01-0700\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=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "" #: wxbanker/summarytab.py:48 msgid "From" msgstr "" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "" #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "" #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "" #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "" #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "" #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in \"%s" "\"?" msgstr "" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "" #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "" #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "" #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:101 msgid "Preview" msgstr "" #: wxbanker/main.py:110 msgid "Perform" msgstr "" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "" #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "" #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "" #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "" #: wxbanker/menubar.py:133 msgid "&About" msgstr "" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "" #: wxbanker/menubar.py:136 msgid "&File" msgstr "" #: wxbanker/menubar.py:137 msgid "&View" msgstr "" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "" #: wxbanker/currencies.py:334 msgid "detected" msgstr "" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" wxbanker-0.9.1/wxbanker/po/zh_CN.po0000644000175000017500000006026312243601243017110 0ustar mrooneymrooney# Simplified Chinese translation for wxbanker # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-10-04 03:01-0700\n" "PO-Revision-Date: 2012-08-06 04:09+0000\n" "Last-Translator: Michael Rooney \n" "Language-Team: Simplified Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2012-08-07 04:46+0000\n" "X-Generator: Launchpad (build 15745)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "拟合曲线阶数" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "月" #: wxbanker/summarytab.py:48 msgid "From" msgstr "从" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "至" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "图表" #: wxbanker/csvimportframe.py:30 msgid "CSV import" msgstr "导入 CSV" #: wxbanker/csvimportframe.py:65 msgid "Target account" msgstr "目标帐户" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:78 #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "取消" #: wxbanker/csvimportframe.py:81 wxbanker/csvimportframe.py:82 msgid "Import" msgstr "导入" #: wxbanker/csvimportframe.py:104 msgid "CSV columns mapping" msgstr "CSV 列对应关系" #: wxbanker/csvimportframe.py:113 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:66 msgid "Date" msgstr "日期" #: wxbanker/csvimportframe.py:116 msgid "Date format" msgstr "日期格式" #: wxbanker/csvimportframe.py:121 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:68 msgid "Amount" msgstr "金额" #: wxbanker/csvimportframe.py:123 msgid "Decimal separator" msgstr "十进制分隔符" #: wxbanker/csvimportframe.py:127 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:67 msgid "Description" msgstr "描述" #: wxbanker/csvimportframe.py:134 msgid "CSV file settings" msgstr "CSV 文件设置" #: wxbanker/csvimportframe.py:144 msgid "Lines to skip" msgstr "忽略行数" #: wxbanker/csvimportframe.py:147 msgid "Encoding" msgstr "编码" #: wxbanker/csvimportframe.py:151 msgid "Column delimiter" msgstr "列分隔符" #: wxbanker/csvimportframe.py:162 msgid "File to import" msgstr "被导入文件" #: wxbanker/csvimportframe.py:176 msgid "CSV profiles" msgstr "CSV 配置文件" #: wxbanker/csvimportframe.py:181 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "需要安装 Python simplejson 库文件以载入或保存 CSV 配置文件。" #: wxbanker/csvimportframe.py:192 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "保存" #: wxbanker/csvimportframe.py:198 msgid "Remove" msgstr "删除" #: wxbanker/csvimportframe.py:252 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "此文件的编码不像是 '%s'。" #: wxbanker/csvimportframe.py:257 msgid "An error ocurred during the csv file import." msgstr "在导入 CSV 文件时发生错误。" #: wxbanker/csvimportframe.py:258 msgid "CSV import error" msgstr "CSV 导入错误" #: wxbanker/csvimportframe.py:300 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "名为 '%s' 的配置文件已经存在。要覆盖原文件吗?" #: wxbanker/csvimportframe.py:301 msgid "Overwrite profile ?" msgstr "覆盖配置文件?" #: wxbanker/csvimportframe.py:315 msgid "Select file and click \"Preview\"" msgstr "选择文件并点击 “预览”" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "从" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "转账" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "每天" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "每周" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "每月" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "每年" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "从不" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "每" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "结束:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "重复:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "天" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "周" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "月" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "年" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "一" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "二" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "三" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "四" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "五" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "六" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "日" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "重复:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "开始:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "输入此条交易记录" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "循环利息" #: wxbanker/newtransactionctrl.py:344 msgid "Initial balance" msgstr "初始余额" #: wxbanker/newtransactionctrl.py:380 msgid "No amount entered in the 'Amount' field." msgstr "没有在 “金额” 栏中输入交易金额。" #: wxbanker/newtransactionctrl.py:382 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s' 不是一个有效的金额。" #: wxbanker/newtransactionctrl.py:385 msgid "Please enter a number such as 12.34 or -20." msgstr "请输入一个数字,例如 12.34 或 -20。" #: wxbanker/newtransactionctrl.py:386 msgid "Invalid Transaction Amount" msgstr "无效的交易金额" #: wxbanker/newtransactionctrl.py:397 msgid "Please select an account and then try again." msgstr "请选择一个帐户并重试。" #: wxbanker/newtransactionctrl.py:398 wxbanker/newtransactionctrl.py:426 msgid "No account selected" msgstr "没有选择帐户" #: wxbanker/newtransactionctrl.py:411 msgid "A search is currently active." msgstr "目前指定了搜索条件。" #: wxbanker/newtransactionctrl.py:411 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "您愿意清除当前搜索结果并执行“%s”操作吗?" #: wxbanker/newtransactionctrl.py:412 msgid "Clear search?" msgstr "清除搜索?" #: wxbanker/newtransactionctrl.py:425 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "当前操作被设置成转账,请选择一个转账的账户。" #: wxbanker/newtransactionctrl.py:458 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "如果此选项框被勾选,当增加一笔交易时,您将会被提示输入作为转移来源的帐户。" #: wxbanker/newtransactionctrl.py:459 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "例如,勾选这个选项框并输入一笔金额为 50 元的交易,将会同时从来源帐户中扣除 50 元。" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "搜索交易记录" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "更多选项" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "较少选项" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "匹配: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "显示高级搜索选项" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "隐藏高级搜索选项" #: wxbanker/main.py:85 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" "经常发生的交易 \"%(description)s\" 有 %(num)i 项交易在 %(amount)s 的 %(datelist)s 已经发生。" #: wxbanker/main.py:90 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "%(num)i 经常发生的交易已经有一个总计为 %(totalnum)i 的交易。" #: wxbanker/main.py:101 msgid "Preview" msgstr "预览" #: wxbanker/main.py:110 msgid "Perform" msgstr "执行" #: wxbanker/main.py:126 msgid "Recurring transaction successfully added." msgstr "经常性交易添加成功。" #: wxbanker/main.py:128 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "第一次交易将会发生在 %(date)s" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "这似乎是您第一次使用 wxBanker!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "要开始使用本软件,请先在左上角的帐户控制区中增加一个帐户。" #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, rename, configure, and " "remove an account, respectively." msgstr "用账户控制中的按钮,您可以添加、重命名、配置、删除账户。" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "一旦您创建了一个帐户,您可以通过右下角的控件向其中增加交易记录(例如您的帐户初始金额)。" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "祝用的开心!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "欢迎!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "保存修改?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "自从上一次保存后您做了一些修改。想要在退出前保存吗?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "注意:勾选 “文件” 菜单中的自动保存选项会禁止手动保存。" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "没有为货币\"%s\"设置汇率" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "帐户" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "添加一个新帐户" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "删除选中的帐户" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "重命名选中的帐户" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "配置选中的帐户" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "所有帐户" #: wxbanker/accountlistctrl.py:158 msgid "Not synchronized with Mint.com" msgstr "无法与 Mint.com 同步" #: wxbanker/accountlistctrl.py:442 wxbanker/accountlistctrl.py:543 msgid "Sorry, an account by that name already exists." msgstr "抱歉,已经存在相同名称的帐户" #: wxbanker/accountlistctrl.py:444 wxbanker/accountlistctrl.py:545 msgid "Account names cannot be blank." msgstr "帐户名称不能为空" #: wxbanker/accountlistctrl.py:478 msgid "Account name" msgstr "账户名" #: wxbanker/accountlistctrl.py:517 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "将会永久删除帐户 '%s' 和它所有的交易记录。要继续吗?" #: wxbanker/accountlistctrl.py:518 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "警告" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "自动保存" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "自动保存修改" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "从 CSV 导入" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "从一个 CSV 文件中导入交易项目" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "导出到 CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "将交易记录导出到 CSV 文件" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "上一个账户" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "下一个账户" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "显示收支差额为零的账户" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "当被禁用时,收支差额为零的账户将从列表中隐藏" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "货币(&C)" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "选择显示的货币类型" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "需要其他货币类型" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "与 Mint.com 集成" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "与 Mint.com 上的帐户同步" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "查看常见问题解答(&F)" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "在线查看常见问题与解答" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "提出问题(&Q)" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "在线提问" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "报告程序错误(&R)" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "向开发人员在线报告程序错误" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "需要新功能(&T)" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "请求实现新的功能" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "翻译wxBanker(&S)" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "将wxBanker翻译到其他语言" #: wxbanker/menubar.py:133 msgid "&About" msgstr "关于(&A)" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "关于wxBanker的更多信息" #: wxbanker/menubar.py:136 msgid "&File" msgstr "文件(&F)" #: wxbanker/menubar.py:137 msgid "&View" msgstr "查看(&V)" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "设置(&S)" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "帮助(&H)" #: wxbanker/menubar.py:247 msgid "Copyright" msgstr "版权" #: wxbanker/menubar.py:248 msgid "Simple personal finance." msgstr "简单的个人财务管理" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "每周工作日" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "每周末" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "周一" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "周二" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "周三" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "周四" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "周五" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "周六" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "周日" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "每周 %s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "每隔 %(num)d 周的 %%s" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " 和 %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "每年" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "直到 %s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "没有描述" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "从 %s 转移" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "转移到 %s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "摘要:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "显示计算器" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "隐藏计算器" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "交易记录" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "摘要" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "没有输入交易项。" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "没有匹配的结果" #: wxbanker/transactionolv.py:69 wxbanker/plots/wxplotpanel.py:37 #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:82 #: wxbanker/plots/cairopanel.py:123 msgid "Balance" msgstr "余额" #: wxbanker/transactionolv.py:172 msgid "_Total" msgstr "合计(_T)" #: wxbanker/transactionolv.py:234 #, python-format msgid "Send %s to calculator" msgstr "将%s发送到计算器" #: wxbanker/transactionolv.py:235 #, python-format msgid "Add %s to calculator" msgstr "将%s加到计算器" #: wxbanker/transactionolv.py:236 #, python-format msgid "Subtract %s from calculator" msgstr "从计算器中减去%s" #: wxbanker/transactionolv.py:248 msgid "Remove this transaction" msgstr "删除此项交易" #: wxbanker/transactionolv.py:249 msgid "Move this transaction to account" msgstr "将此项交易转移到帐户" #: wxbanker/transactionolv.py:250 msgid "No tags yet" msgstr "尚未设定标签" #: wxbanker/transactionolv.py:252 #, python-format msgid "Remove these %i transactions" msgstr "删除这 %i 项交易记录" #: wxbanker/transactionolv.py:253 #, python-format msgid "Move these %i transactions to account" msgstr "将这 %i 项交易记录转移到帐户" #: wxbanker/transactionolv.py:254 msgid "No common tags yet" msgstr "无共有标签" #: wxbanker/transactionolv.py:256 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "添加一个标签" #: wxbanker/transactionolv.py:279 msgid "Tags" msgstr "标签" #: wxbanker/transactionolv.py:292 msgid "Search for this tag" msgstr "搜索相同标签" #: wxbanker/transactionolv.py:293 msgid "Remove this tag" msgstr "移除这个标签" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:76 msgid "balance" msgstr "余额" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:86 msgid "Trend" msgstr "趋势" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "余额历史记录" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:122 msgid "Time" msgstr "时间" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "每月" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "要使用 '%s' 绘图库,请先安装以下 python 模块:%s" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "忽略" #: wxbanker/currencies.py:334 msgid "detected" msgstr "找到" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "无" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Mint.com 凭证:" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "将凭证存储到密钥环中" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "与 %(name)s 相对应的 Mint 账户:" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "更新" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "用户名:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "密码:" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "交易细节" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "即将永久删除这条经常性交易。是否继续?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "这个账户目前没有经常性交易。" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "关闭" #: wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "删除" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "经常性交易" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "Mint.com 集成" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "您也可以在描述中添加 #标签名 来为交易添加标签" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "标签:" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "以后若要删除标签,只需要将它从描述中去除,或者在交易上点击鼠标右键" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "添加标签" #~ msgid "Load" #~ msgstr "载入" #~ msgid "Skip first line" #~ msgstr "忽略第一行" #~ msgid "Total" #~ msgstr "合计" #~ msgid "Transact" #~ msgstr "交易" #~ msgid "" #~ "Warning: Unable to bind to DateCtrl's ENTER. Upgrade to wxPython >= 2.8.8.1 " #~ "to fix this." #~ msgstr "警告:无法绑定日期控件的输入。请升级 wxPython 到 2.8.8.1 或更高版本来修正此问题。" #~ msgid "Which account will the money come from?" #~ msgstr "这笔钱来自于哪个帐户?" #~ msgid "transfer" #~ msgstr "转移" #~ msgid "transaction" #~ msgstr "交易" #~ msgid "Other accounts" #~ msgstr "其他帐户" #~ msgid "Account" #~ msgstr "帐户" #~ msgid "Sample Points" #~ msgstr "采样点" #~ msgid "Fit Curve Degree" #~ msgstr "拟合曲线阶数" #~ msgid "All Accounts" #~ msgstr "全部帐户" #~ msgid "Current Account" #~ msgstr "当前帐户" #~ msgid "In: " #~ msgstr "在: " #~ msgid "Show" #~ msgstr "显示" #~ msgid "Case Sensitive" #~ msgstr "区分大小写" #~ msgid "" #~ "Warning: Numpy module not available, disabling Summary tab. Install numpy to " #~ "fix this." #~ msgstr "警告:Numpy 模块不可用,摘要栏已被禁用。请安装 numpy 以修正此问题。" #~ msgid "" #~ "The buttons in the account control allow you to add, remove, and rename an " #~ "account, respectively." #~ msgstr "在帐户控制区中的按钮允许您添加、删除和重命名一个帐户。" #~ msgid "CSV Import" #~ msgstr "CSV 导入" #~ msgid "A lightweight personal finance management application." #~ msgstr "一个轻量级的个人财政管理软件。" #~ msgid "&Tools" #~ msgstr "工具(&T)" #, python-format #~ msgid "" #~ "A search is currently active. Would you like to clear the current search and " #~ "make this %s in \"%s\"?" #~ msgstr "一项搜索已经激活。您是否想清除当前搜索并在“%s”中添加%s?" #~ msgid "Whether or not to match based on capitalization" #~ msgstr "是否要区分大小写字母" #~ msgid "" #~ "When enabled, accounts with a balance of $0.00 will be hidden from the list" #~ msgstr "当选中时,将在列表中隐藏余额为零的帐户。" #~ msgid "Hide zero-balance accounts" #~ msgstr "隐藏余额为零的帐户" wxbanker-0.9.1/wxbanker/po/zh_TW.po0000644000175000017500000005203612243601243017141 0ustar mrooneymrooney# Chinese (Traditional) translation for wxbanker # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the wxbanker package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: wxbanker\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-08-10 00:01-0700\n" "PO-Revision-Date: 2010-08-10 05:27+0000\n" "Last-Translator: Michael Rooney \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2010-08-11 03:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: wxbanker/summarytab.py:30 msgid "Trend Degree" msgstr "" #: wxbanker/summarytab.py:30 msgid "Months" msgstr "月" #: wxbanker/summarytab.py:48 msgid "From" msgstr "從" #: wxbanker/summarytab.py:49 wxbanker/newtransactionctrl.py:31 msgid "to" msgstr "到" #: wxbanker/summarytab.py:50 msgid "Graph" msgstr "圖表" #: wxbanker/csvimportframe.py:28 msgid "CSV import" msgstr "匯入CSV" #: wxbanker/csvimportframe.py:62 msgid "Target account" msgstr "目標帳戶" #: wxbanker/csvimportframe.py:77 wxbanker/csvimportframe.py:79 msgid "Import" msgstr "匯入" #: wxbanker/csvimportframe.py:89 msgid "CSV columns mapping" msgstr "CSV資料欄對應" #: wxbanker/csvimportframe.py:98 wxbanker/bankcontrols.py:52 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:63 msgid "Date" msgstr "日期" #: wxbanker/csvimportframe.py:101 msgid "Date format" msgstr "日期格式" #: wxbanker/csvimportframe.py:106 wxbanker/newtransactionctrl.py:249 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:65 msgid "Amount" msgstr "金額" #: wxbanker/csvimportframe.py:108 msgid "Decimal separator" msgstr "小數點分隔符號" #: wxbanker/csvimportframe.py:112 wxbanker/newtransactionctrl.py:248 #: wxbanker/searchctrl.py:44 wxbanker/transactionolv.py:64 msgid "Description" msgstr "描述" #: wxbanker/csvimportframe.py:119 msgid "CSV file settings" msgstr "CSV檔設定值" #: wxbanker/csvimportframe.py:128 msgid "Lines to skip" msgstr "" #: wxbanker/csvimportframe.py:131 msgid "Encoding" msgstr "編碼" #: wxbanker/csvimportframe.py:135 msgid "Column delimiter" msgstr "欄位分隔符號" #: wxbanker/csvimportframe.py:146 msgid "File to import" msgstr "要匯入的檔案" #: wxbanker/csvimportframe.py:151 wxbanker/csvimportframe.py:153 #: wxbanker/main.py:100 msgid "Preview" msgstr "預覽" #: wxbanker/csvimportframe.py:166 msgid "CSV profiles" msgstr "CSV設定檔" #: wxbanker/csvimportframe.py:171 msgid "Python simplejson library is needed for csv profile loading/saving." msgstr "載入或儲存CSV設定檔需要Python simplejson函式庫" #: wxbanker/csvimportframe.py:181 msgid "Load" msgstr "載入" #: wxbanker/csvimportframe.py:186 wxbanker/accountconfigdialog.py:58 #: wxbanker/accountconfigdialog.py:227 msgid "Save" msgstr "儲存" #: wxbanker/csvimportframe.py:191 wxbanker/accountconfigdialog.py:226 msgid "Delete" msgstr "刪除" #: wxbanker/csvimportframe.py:245 #, python-format msgid "The file encoding does not seem to be '%s'." msgstr "" #: wxbanker/csvimportframe.py:252 msgid "An error ocurred during the csv file import." msgstr "匯入CSV檔時有錯誤發生" #: wxbanker/csvimportframe.py:253 msgid "CSV import error" msgstr "匯入CSV發生錯誤" #: wxbanker/csvimportframe.py:303 #, python-format msgid "Profile with the name '%s' exists already. Overwrite it ?" msgstr "設定檔名稱'%s'已經存在,覆蓋它?" #: wxbanker/csvimportframe.py:304 msgid "Overwrite profile ?" msgstr "覆蓋設定檔?" #: wxbanker/csvimportframe.py:318 msgid "Select file and click \"Preview\"" msgstr "選擇檔案並點擊\"預覽\"" #: wxbanker/newtransactionctrl.py:31 msgid "from" msgstr "從" #: wxbanker/newtransactionctrl.py:35 wxbanker/newtransactionctrl.py:258 msgid "Transfer" msgstr "傳送" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:147 #: wxbanker/bankobjects/recurringtransaction.py:154 #, python-format msgid "Daily" msgid_plural "Every %(num)d days" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Weekly" msgstr "每週" #: wxbanker/newtransactionctrl.py:100 #: wxbanker/bankobjects/recurringtransaction.py:171 #, python-format msgid "Monthly" msgid_plural "Every %(num)d months" msgstr[0] "" msgstr[1] "" #: wxbanker/newtransactionctrl.py:100 msgid "Yearly" msgstr "每年" #: wxbanker/newtransactionctrl.py:109 msgid "Never" msgstr "永不" #: wxbanker/newtransactionctrl.py:130 msgid "every" msgstr "每" #: wxbanker/newtransactionctrl.py:135 msgid "Ends:" msgstr "結束於:" #: wxbanker/newtransactionctrl.py:140 msgid "Repeats:" msgstr "重複:" #: wxbanker/newtransactionctrl.py:169 msgid "day" msgid_plural "days" msgstr[0] "天" #: wxbanker/newtransactionctrl.py:171 msgid "week" msgid_plural "weeks" msgstr[0] "週" #: wxbanker/newtransactionctrl.py:174 msgid "month" msgid_plural "months" msgstr[0] "月" #: wxbanker/newtransactionctrl.py:176 msgid "year" msgid_plural "years" msgstr[0] "年" #: wxbanker/newtransactionctrl.py:214 msgid "Mon" msgstr "週一" #: wxbanker/newtransactionctrl.py:214 msgid "Tue" msgstr "週二" #: wxbanker/newtransactionctrl.py:214 msgid "Wed" msgstr "週三" #: wxbanker/newtransactionctrl.py:214 msgid "Thu" msgstr "週四" #: wxbanker/newtransactionctrl.py:214 msgid "Fri" msgstr "週五" #: wxbanker/newtransactionctrl.py:214 msgid "Sat" msgstr "週六" #: wxbanker/newtransactionctrl.py:214 msgid "Sun" msgstr "週日" #: wxbanker/newtransactionctrl.py:221 msgid "Repeats on days:" msgstr "重覆日數:" #: wxbanker/newtransactionctrl.py:244 msgid "Starts:" msgstr "開始:" #: wxbanker/newtransactionctrl.py:253 msgid "Enter this transaction" msgstr "輸入此筆交易資料" #: wxbanker/newtransactionctrl.py:262 msgid "Recurring" msgstr "定期" #: wxbanker/newtransactionctrl.py:341 msgid "Initial balance" msgstr "開始結餘" #: wxbanker/newtransactionctrl.py:377 msgid "No amount entered in the 'Amount' field." msgstr "\"金額\"欄沒有輸入任何金額" #: wxbanker/newtransactionctrl.py:379 #, python-format msgid "'%s' is not a valid amount." msgstr "'%s'不是一個有效的金額" #: wxbanker/newtransactionctrl.py:382 msgid "Please enter a number such as 12.34 or -20." msgstr "請輸入像12.34或-20此類的數字" #: wxbanker/newtransactionctrl.py:383 msgid "Invalid Transaction Amount" msgstr "無效的交易金額" #: wxbanker/newtransactionctrl.py:394 msgid "Please select an account and then try again." msgstr "請選擇一個帳戶並再次嘗試" #: wxbanker/newtransactionctrl.py:395 wxbanker/newtransactionctrl.py:423 msgid "No account selected" msgstr "未選取任何帳戶" #: wxbanker/newtransactionctrl.py:408 msgid "A search is currently active." msgstr "執行搜尋中" #: wxbanker/newtransactionctrl.py:408 #, python-format msgid "" "Would you like to clear the current search and make this transaction in " "\"%s\"?" msgstr "您要清除此次搜尋並產生\"%s\"這筆交易資料嗎?" #: wxbanker/newtransactionctrl.py:409 msgid "Clear search?" msgstr "清除搜尋?" #: wxbanker/newtransactionctrl.py:422 msgid "" "This transaction is marked as a transfer. Please select the transfer account." msgstr "此筆交易資料已標示\"傳送\"。請選擇傳送帳戶" #: wxbanker/newtransactionctrl.py:455 msgid "" "If this box is checked when adding a transaction, you will be prompted for " "the account to use as the source of the transfer." msgstr "當增加一筆交易時選擇此框,會提示您使用此帳戶作為傳送來源。" #: wxbanker/newtransactionctrl.py:456 msgid "" "For example, checking this box and entering a transaction of $50 into this " "account will also subtract $50 from the account that you choose as the " "source." msgstr "例如選擇此框並輸入$50至帳戶中時,會從您選擇作為來源的帳戶裡扣除$50。" #: wxbanker/searchctrl.py:39 msgid "Search transactions" msgstr "搜尋交易資料" #: wxbanker/searchctrl.py:42 msgid "More options" msgstr "較多選項" #: wxbanker/searchctrl.py:42 msgid "Less options" msgstr "較少選項" #: wxbanker/searchctrl.py:54 msgid "Match: " msgstr "比對: " #: wxbanker/searchctrl.py:124 msgid "Show advanced search options" msgstr "顯示進階搜尋選項" #: wxbanker/searchctrl.py:126 msgid "Hide advanced search options" msgstr "隱藏進階搜尋選項" #: wxbanker/main.py:84 #, python-format msgid "" "The recurring transaction \"%(description)s\" has %(num)i transactions ready " "for %(amount)s on %(datelist)s." msgstr "" #: wxbanker/main.py:89 #, python-format msgid "" "%(num)i recurring transactions have a total of %(totalnum)i transactions " "ready." msgstr "" #: wxbanker/main.py:109 msgid "Perform" msgstr "" #: wxbanker/main.py:125 msgid "Recurring transaction successfully added." msgstr "定期交易已經成功增加" #: wxbanker/main.py:127 #, python-format msgid "The first transaction will occur on %(date)s" msgstr "" #: wxbanker/main.py:191 msgid "It looks like this is your first time using wxBanker!" msgstr "似乎這是您第一次使用wxBaner!" #: wxbanker/main.py:192 msgid "" "To get started, add an account using the account control in the top left " "corner." msgstr "開始時,使用左上角的帳戶控制鈕新增一個帳戶" #: wxbanker/main.py:193 msgid "" "The buttons in the account control allow you to add, remove, and rename an " "account, respectively." msgstr "帳戶控制鈕允許您分別新增、移除並變更帳戶名稱。" #: wxbanker/main.py:194 msgid "" "Once you have created an account you can add transactions to it (such as " "your initial balance) using the controls below the grid on the bottom right." msgstr "當您建立一個新帳戶時,您可使用右下角的控制鈕格子於其中增加交易(例如開始結餘)" #: wxbanker/main.py:195 msgid "Have fun!" msgstr "祝您愉快!" #: wxbanker/main.py:197 msgid "Welcome!" msgstr "歡迎!" #: wxbanker/main.py:205 msgid "Save changes?" msgstr "是否儲存變更?" #: wxbanker/main.py:206 msgid "" "You have made changes since the last save. Would you like to save before " "exiting?" msgstr "自從上次儲存後您已有某些變更。您要在離開前儲存這些變更嗎?" #: wxbanker/main.py:207 msgid "" "Note that enabling auto-save from the File menu will eliminate the need for " "manual saving." msgstr "注意:可從檔案選單中手動取消自動儲存" #: wxbanker/currconvert.py:59 #, python-format msgid "No exchange rate for currency \"%s\"" msgstr "無\"%s\"的貨幣匯率" #: wxbanker/accountlistctrl.py:45 msgid "Accounts" msgstr "帳戶" #: wxbanker/accountlistctrl.py:56 msgid "Add a new account" msgstr "增加新的帳戶" #: wxbanker/accountlistctrl.py:60 msgid "Remove the selected account" msgstr "移除選擇的帳戶" #: wxbanker/accountlistctrl.py:65 msgid "Rename the selected account" msgstr "變更選擇的帳戶名稱" #: wxbanker/accountlistctrl.py:70 msgid "Configure the selected account" msgstr "選擇的帳戶組態" #: wxbanker/accountlistctrl.py:87 wxbanker/menubar.py:68 msgid "All accounts" msgstr "所有帳戶" #: wxbanker/accountlistctrl.py:154 msgid "Not synchronized with Mint.com" msgstr "未與Mint.com同步" #: wxbanker/accountlistctrl.py:438 wxbanker/accountlistctrl.py:539 msgid "Sorry, an account by that name already exists." msgstr "抱歉,已有相同的帳戶名稱存在" #: wxbanker/accountlistctrl.py:440 wxbanker/accountlistctrl.py:541 msgid "Account names cannot be blank." msgstr "帳戶名稱不能空白" #: wxbanker/accountlistctrl.py:474 msgid "Account name" msgstr "帳戶名稱" #: wxbanker/accountlistctrl.py:513 #, python-format msgid "" "This will permanently remove the account '%s' and all its transactions. " "Continue?" msgstr "這會永久移除帳戶'%s'並所有交易,要繼續?" #: wxbanker/accountlistctrl.py:514 wxbanker/accountconfigdialog.py:203 msgid "Warning" msgstr "警告" #: wxbanker/menubar.py:57 msgid "Auto-save" msgstr "自動儲存" #: wxbanker/menubar.py:57 msgid "Automatically save changes" msgstr "自動儲存更變" #: wxbanker/menubar.py:59 msgid "Import from CSV" msgstr "從CSV檔匯入" #: wxbanker/menubar.py:59 msgid "Import transactions from a CSV file" msgstr "從CVS檔匯入交易資料" #: wxbanker/menubar.py:60 msgid "Export to CSV" msgstr "匯出至 CSV" #: wxbanker/menubar.py:60 msgid "Export transactions to a CSV file" msgstr "匯出交易資料至CSV檔" #: wxbanker/menubar.py:66 msgid "Previous account" msgstr "前一個帳戶" #: wxbanker/menubar.py:67 msgid "Next account" msgstr "下一個帳戶" #: wxbanker/menubar.py:70 msgid "Show zero-balance accounts" msgstr "顯示零結存帳戶" #: wxbanker/menubar.py:70 msgid "" "When disabled, accounts with a balance of $0.00 will be hidden from the list" msgstr "停用時,零結存帳戶會從清單中隱藏" #: wxbanker/menubar.py:79 msgid "&Currency" msgstr "&貨幣" #: wxbanker/menubar.py:79 msgid "Select currency to display" msgstr "選擇顯示的貨幣" #: wxbanker/menubar.py:92 msgid "Request a Currency" msgstr "詢問貨幣" #: wxbanker/menubar.py:100 msgid "Integrate with Mint.com" msgstr "與Mint.com整合" #: wxbanker/menubar.py:100 msgid "Sync account balances with an existing Mint.com account" msgstr "與已存在Mint.com的帳戶同步結餘" #: wxbanker/menubar.py:106 msgid "View &FAQs" msgstr "瀏覽常見問題" #: wxbanker/menubar.py:106 msgid "View Frequently Asked Questions online" msgstr "線上瀏覽經常詢問的問題" #: wxbanker/menubar.py:111 msgid "Ask a &Question" msgstr "詢問及問題" #: wxbanker/menubar.py:111 msgid "Ask a question online" msgstr "線上詢問問題" #: wxbanker/menubar.py:116 msgid "&Report a Bug" msgstr "&回報錯誤" #: wxbanker/menubar.py:116 msgid "Report a bug to the developer online" msgstr "線上回報錯誤給開發者" #: wxbanker/menubar.py:121 msgid "Request a Fea&ture" msgstr "詢問功能" #: wxbanker/menubar.py:121 msgid "Request a new feature to be implemented" msgstr "" #: wxbanker/menubar.py:126 msgid "Tran&slate wxBanker" msgstr "翻譯wxBaner" #: wxbanker/menubar.py:126 msgid "Translate wxBanker to another language" msgstr "將wxBaner翻譯成其它語言" #: wxbanker/menubar.py:133 msgid "&About" msgstr "關於(&A)" #: wxbanker/menubar.py:133 msgid "More information about wxBanker" msgstr "更多關於wxBaner的訊息" #: wxbanker/menubar.py:136 msgid "&File" msgstr "檔案 (&F)" #: wxbanker/menubar.py:137 msgid "&View" msgstr "檢視(&V)" #: wxbanker/menubar.py:138 msgid "&Settings" msgstr "設定(&S)" #: wxbanker/menubar.py:139 msgid "&Help" msgstr "說明(&H)" #: wxbanker/menubar.py:246 msgid "Copyright" msgstr "版權所有" #: wxbanker/menubar.py:247 msgid "Simple personal finance." msgstr "簡易個人理財" #: wxbanker/bankobjects/recurringtransaction.py:150 msgid "Weekly on weekdays" msgstr "每週週日" #: wxbanker/bankobjects/recurringtransaction.py:152 msgid "Weekly on weekends" msgstr "每週週六" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Mondays" msgstr "週一" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Tuesdays" msgstr "週二" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Wednesdays" msgstr "週三" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Thursdays" msgstr "週四" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Fridays" msgstr "週五" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Saturdays" msgstr "週六" #: wxbanker/bankobjects/recurringtransaction.py:156 msgid "Sundays" msgstr "週日" #: wxbanker/bankobjects/recurringtransaction.py:160 #, python-format msgid "Weekly on %s" msgstr "每週%s" #: wxbanker/bankobjects/recurringtransaction.py:162 #, python-format msgid "Every %(num)d weeks on %%s" msgstr "" #: wxbanker/bankobjects/recurringtransaction.py:169 #, python-format msgid " and %s" msgstr " 和 %s" #: wxbanker/bankobjects/recurringtransaction.py:173 #, python-format msgid "Annually" msgid_plural "Every %(num)d years" msgstr[0] "" msgstr[1] "" #: wxbanker/bankobjects/recurringtransaction.py:177 #, python-format msgid "until %s" msgstr "直到%s" #: wxbanker/bankobjects/recurringtransaction.py:194 msgid "No description" msgstr "沒有說明" #: wxbanker/bankobjects/transaction.py:95 #, python-format msgid "Transfer from %s" msgstr "從%s傳送" #: wxbanker/bankobjects/transaction.py:97 #, python-format msgid "Transfer to %s" msgstr "傳送到%s" #: wxbanker/recurringsummaryrow.py:45 msgid "Summary:" msgstr "摘要:" #: wxbanker/managetab.py:43 msgid "Show Calculator" msgstr "顯示計算機" #: wxbanker/managetab.py:43 msgid "Hide Calculator" msgstr "隱藏計算機" #: wxbanker/managetab.py:97 msgid "Transactions" msgstr "交易資料" #: wxbanker/managetab.py:110 msgid "Summary" msgstr "摘要" #: wxbanker/transactionolv.py:38 msgid "No transactions entered." msgstr "未輸入任何交易資料" #: wxbanker/transactionolv.py:39 msgid "No matching transactions." msgstr "無任何符合的交易資料" #: wxbanker/transactionolv.py:66 msgid "Total" msgstr "總計" #: wxbanker/transactionolv.py:212 #, python-format msgid "Send %s to calculator" msgstr "傳送%s至計算機" #: wxbanker/transactionolv.py:213 #, python-format msgid "Add %s to calculator" msgstr "增加%s至計算機" #: wxbanker/transactionolv.py:214 #, python-format msgid "Subtract %s from calculator" msgstr "從計算機扣除%s" #: wxbanker/transactionolv.py:226 msgid "Remove this transaction" msgstr "移除此筆交易資料" #: wxbanker/transactionolv.py:227 msgid "Move this transaction to account" msgstr "移動交易資料至帳戶" #: wxbanker/transactionolv.py:228 msgid "No tags yet" msgstr "" #: wxbanker/transactionolv.py:230 #, python-format msgid "Remove these %i transactions" msgstr "移動這些%i交易資料" #: wxbanker/transactionolv.py:231 #, python-format msgid "Move these %i transactions to account" msgstr "移動這些%i交易資料至帳戶" #: wxbanker/transactionolv.py:232 msgid "No common tags yet" msgstr "" #: wxbanker/transactionolv.py:234 wxbanker/tagtransactiondialog.py:100 msgid "Add a tag" msgstr "" #: wxbanker/transactionolv.py:257 msgid "Tags" msgstr "" #: wxbanker/transactionolv.py:270 msgid "Search for this tag" msgstr "" #: wxbanker/transactionolv.py:271 msgid "Remove this tag" msgstr "" #: wxbanker/plots/wxplotpanel.py:16 wxbanker/plots/cairopanel.py:75 msgid "balance" msgstr "結餘" #: wxbanker/plots/wxplotpanel.py:37 wxbanker/plots/wxplotpanel.py:44 #: wxbanker/plots/cairopanel.py:81 wxbanker/plots/cairopanel.py:122 msgid "Balance" msgstr "結餘" #: wxbanker/plots/wxplotpanel.py:42 wxbanker/plots/cairopanel.py:85 msgid "Trend" msgstr "趨勢" #: wxbanker/plots/wxplotpanel.py:44 msgid "Total Balance Over Time" msgstr "一段時間的總結餘" #: wxbanker/plots/wxplotpanel.py:44 wxbanker/plots/cairopanel.py:121 msgid "Time" msgstr "時間" #: wxbanker/plots/cairopanel.py:33 msgid "monthly" msgstr "每月" #: wxbanker/plots/plotfactory.py:51 #, python-format msgid "To use '%s' plotting library, install following python modules: %s." msgstr "欲使用'%s'繪圖函式庫,請安裝下列python模組: %s" #: wxbanker/messagepanel.py:47 msgid "Dismiss" msgstr "解除" #: wxbanker/currencies.py:334 msgid "detected" msgstr "檢測" #: wxbanker/accountconfigdialog.py:36 msgid "None" msgstr "無" #: wxbanker/accountconfigdialog.py:37 msgid "Mint.com credentials:" msgstr "Mint.com憑證" #: wxbanker/accountconfigdialog.py:42 msgid "Save credentials in keyring" msgstr "儲存憑證金鑰" #: wxbanker/accountconfigdialog.py:44 #, python-format msgid "Corresponding Mint account for %(name)s:" msgstr "" #: wxbanker/accountconfigdialog.py:46 msgid "Update" msgstr "更新" #: wxbanker/accountconfigdialog.py:49 msgid "Username:" msgstr "使用者名稱:" #: wxbanker/accountconfigdialog.py:51 msgid "Password:" msgstr "密碼:" #: wxbanker/accountconfigdialog.py:59 wxbanker/accountconfigdialog.py:228 #: wxbanker/tagtransactiondialog.py:43 msgid "Cancel" msgstr "取消" #: wxbanker/accountconfigdialog.py:160 msgid "Transaction details" msgstr "交易資料明細" #: wxbanker/accountconfigdialog.py:202 msgid "This will permanently remove this recurring transaction. Continue?" msgstr "這會永久移除此定期性交易資料,要繼續?" #: wxbanker/accountconfigdialog.py:213 msgid "This account currently has no recurring transactions." msgstr "此帳戶最近無定期性交易資料" #: wxbanker/accountconfigdialog.py:215 msgid "Close" msgstr "關閉" #: wxbanker/accountconfigdialog.py:251 msgid "Recurring Transactions" msgstr "定期性交易資料" #: wxbanker/accountconfigdialog.py:252 msgid "Mint.com Integration" msgstr "整合Mint.com" #: wxbanker/tagtransactiondialog.py:29 msgid "" "You can also tag a transaction by putting #tagname anywhere in the " "description." msgstr "" #: wxbanker/tagtransactiondialog.py:30 msgid "Tag:" msgstr "" #: wxbanker/tagtransactiondialog.py:32 msgid "" "To remove this tag later, simply remove it from the description or right-" "click on the transaction." msgstr "" #: wxbanker/tagtransactiondialog.py:42 msgid "Add Tag" msgstr "" wxbanker-0.9.1/wxbanker/recurringsummaryrow.py0000644000175000017500000000366212243601243021651 0ustar mrooneymrooney# https://launchpad.net/wxbanker # recurringsummaryrow.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx from wxbanker import bankcontrols class RecurringSummaryText(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) self.SetBackgroundColour(wx.BLACK) self.contentPanel = wx.Panel(self) self.contentPanel.SetBackgroundColour(wx.Colour(224,238,238)) self.Sizer = wx.BoxSizer() self.Sizer.Add(self.contentPanel, 1, wx.EXPAND|wx.ALL, 1) self.summaryText = wx.StaticText(self.contentPanel, label="Summary", name="RecurringSummaryText") self.contentPanel.Sizer = wx.BoxSizer() self.contentPanel.Sizer.Add(self.summaryText, 0, wx.ALIGN_CENTER|wx.ALL, 2) def SetLabel(self, text): self.summaryText.Label = text class RecurringSummaryRow(bankcontrols.GBRow): def __init__(self, parent, row): bankcontrols.GBRow.__init__(self, parent, row) self.summaryText = RecurringSummaryText(parent) self.AddNext(wx.StaticText(parent, label=_("Summary:"))) self.AddNext(self.summaryText, span=(1,3)) def UpdateSummary(self, recurringObj): self.summaryText.SetLabel(recurringObj.GetRecurrance()) wxbanker-0.9.1/wxbanker/searchctrl.py0000644000175000017500000001304212243601243017626 0ustar mrooneymrooney# https://launchpad.net/wxbanker # searchctrl.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx from wxbanker import bankcontrols from wx.lib.pubsub import Publisher class SearchCtrl(wx.Panel): def __init__(self, parent, bankController): wx.Panel.__init__(self, parent) self.ID_TIMER = wx.NewId() self.SearchTimer = wx.Timer(self, self.ID_TIMER) self.bankController = bankController self.searchCtrl = bankcontrols.UpdatableSearchCtrl(self, value="", size=(200, -1), style=wx.TE_PROCESS_ENTER) # Try to grab the GTK system icon for clearing a search, otherwise we'll get the wxPython one. clearBitmap = wx.ArtProvider.GetBitmap('edit-clear') if clearBitmap: self.searchCtrl.SetCancelBitmap(clearBitmap) self.searchCtrl.ShowCancelButton(True) self.searchCtrl.ShowSearchButton(False) self.searchCtrl.DescriptiveText = _("Search transactions") # The More/Less button. self.moreButton = bankcontrols.MultiStateButton(self, labelDict={True: _("More options"), False: _("Less options")}, state=True) self.matchChoices = [_("Amount"), _("Description"), _("Date")] self.descriptionSelection = 1 self.matchBox = bankcontrols.CompactableComboBox(self, value=self.matchChoices[1], choices=self.matchChoices, style=wx.CB_READONLY) topSizer = wx.BoxSizer() topSizer.Add(self.searchCtrl, 0, wx.ALIGN_CENTER_VERTICAL) topSizer.AddSpacer(10) topSizer.Add(self.moreButton, 0, wx.ALIGN_CENTER_VERTICAL) self.moreSizer = moreSizer = wx.BoxSizer() moreSizer.Add(wx.StaticText(self, label=_("Match: ")), 0, wx.ALIGN_CENTER_VERTICAL) moreSizer.Add(self.matchBox, 0, wx.ALIGN_CENTER_VERTICAL) self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(topSizer, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 2) self.Sizer.Add(moreSizer, 0, wx.ALIGN_RIGHT|wx.BOTTOM, 2) self.matchBox.Compact() self.Layout() self.searchCtrl.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, self.onCancel) self.searchCtrl.Bind(wx.EVT_TEXT, self.onText) #self.searchCtrl.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN, self.onSearch) self.searchCtrl.Bind(wx.EVT_TEXT_ENTER, self.onSearch) self.moreButton.Bind(wx.EVT_BUTTON, self.onToggleMore) # Bindings to search on settings change automatically. self.matchBox.Bind(wx.EVT_COMBOBOX, self.onSearchTrigger) self.Bind(wx.EVT_TIMER, self.onSearchTimer) Publisher.subscribe(self.onExternalSearch, "SEARCH.EXTERNAL") # Initially hide the extra search options. self.onToggleMore() def onText(self, event): self.SearchTimer.Start(500, wx.TIMER_ONE_SHOT) def onSearchTimer(self, event): self.onSearch() def onSearchTrigger(self, event): event.Skip() self.onSearch() def onSearch(self, event=None): # Stop any timer that may be active, in the case of a manual search. self.SearchTimer.Stop() searchString = self.searchCtrl.Value # For a date, should be YYYY-MM-DD. matchType = self.matchChoices.index(self.matchBox.Value) searchInfo = (searchString, matchType) # Consider a blank search as a search cancellation. if searchString == "": self.onCancel() else: Publisher.sendMessage("SEARCH.INITIATED", searchInfo) def onExternalSearch(self, message): # If something else performs a search (such as Tag context menu), update the Value and search. tagObj = message.data fullTag = str(tagObj) # An external search is on description, so set that. self.matchBox.Selection = self.descriptionSelection self.searchCtrl.UpdateValue(fullTag) # A SetValue will trigger a search after the timer, but let's trigger one immediately for responsiveness. self.onSearch() def onCancel(self, event=None): # Don't clear the value if there isn't one, it will trigger an EVT_TEXT, causing an infinite search -> cancel loop. if self.searchCtrl.Value: self.searchCtrl.Value = "" Publisher.sendMessage("SEARCH.CANCELLED") def onToggleMore(self, event=None): # Show or hide the advanced search options. showLess = self.Sizer.IsShown(self.moreSizer) self.Sizer.Show(self.moreSizer, not showLess) # Update appropriate strings, and make them fully translatable. self.moreButton.State = showLess if showLess: tipActionStr = _("Show advanced search options") else: tipActionStr = _("Hide advanced search options") self.moreButton.SetToolTipString(tipActionStr) # Give or take the appropriate amount of space. self.Parent.Layout() Publisher.sendMessage("SEARCH.MORETOGGLED") wxbanker-0.9.1/wxbanker/smoothsizer.py0000644000175000017500000005625112243601243020073 0ustar mrooneymrooney# https://launchpad.net/wxbanker # smoothsizer.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . """ A Sizer mixin that allows Insertions (Add/Insert/Prepend), Hides amd Removals to be done "smoothly", by gradually adding or removing the necessary space. Smooth methods supported: Insert, Add, Prepend, Hide, Remove @author Mike Rooney @date 08/06/2007 @version 0.3 Changes: -------- 0.3 - added a SmoothRemove method in the Mixin 0.2 - SmoothHide no longer changes the number of children in the sizer temporarily - added a SmoothStaticBoxSizer - added a Smooth property - various code cleanup and commenting 0.1 - initial implementation with ability to smoothly Insert/Add/Prepend, and Hide items - an example SmoothBoxSizer Todo: - a smooth Show - a SmoothAdapter of some kind? - verify that smooth insert/remove work with smooth=False """ import wx class SmoothSizerMixin: """ This class is a mixin to allow items to be "smoothly" added/removed/hidden to a sizer. When using a sizer with this mixin, smooth actions will be the default. To instantly perform an action, pass smooth=False into the Add/Prepend/Insert/Hide/Remove call. """ def __init__(self, delay=200, increment=15): self._delay = delay/1000.0 self._increment = increment/1000.0 self._actives = {} self._isSmooth = True def GetObject(self, sizerItem): """ This method gets the actual object in the sizer, given a SizerItem. You would think this would be a little easier. """ if sizerItem.IsWindow(): return sizerItem.Window elif sizerItem.IsSizer(): return sizerItem.Sizer else: return sizerItem.Spacer def GetSmooth(self): return self._isSmooth def SetSmooth(self, boolval): self._isSmooth = boolval def GetDelay(self): return self._delay def SetDelay(self, delay): self._delay = delay def GetIncrement(self): return self._increment def SetIncrement(self, increment): self._increment = increment def Prepend(self, item, *args, **kwargs): return self.Insert(0, item, *args, **kwargs) def Add(self, item, *args, **kwargs): return self.Insert(len(self.GetChildren()), item, *args, **kwargs) def GetMyPos(self, index): return self._actives[index][0] def GetMyDelay(self, index): return self._actives[index][2] def GetMyIncrement(self, index): return self._actives[index][3] def LayoutProper(self): """ Attempt a layout of one level up, since we may need more or less space to look proper. Attempts to Layout the Parent of the containing window first, but if None is found it settles for the containing window. """ self.Layout() #not sure why this is necessary first but it is. parentWin = self.GetContainingWindow() if parentWin: if parentWin.Parent: parentWin.Parent.Layout() else: parentWin.Layout() def SmoothInsertOrig(self, item, prop=0, flag=0, border=0, userData=None, expandIn=(1, 1), smooth=None, index=-1, spacer=None, pixels=None): """ This method is the heart of the mixin. Initially it creates a boxsizer and inside it puts a spacer (initially (0,0)), followed by the actual item to insert. It is done this way so that the item is always a child of this sizer, but the length of the sizer is not "inflated" temporarily by containing both a spacer and the item. It then checks if the space it has allocated for the item via the spacer is enough for the control (or if the insertion is not smooth). If either of these are true, it detaches the subsizer and adds the item to THIS sizer appropriately based on *args and **kwargs. If the spacer is not yet large enough to accomodate the item, it increases the dimensions of the sizer and tells wx to call it again according to the specified increment time, upon which this process will repeat. A bunch of this logic is to handle multiple insertions occurring at once, which is done using the _actives list. This keeps track of the position in the sizer that we are modifying (which will change if something else is inserted before us while we are inserting), and how much space we have currently allocated. """ if smooth is None: smooth = self.GetSmooth() if spacer is None: #this is our first time here #figure out the position of the item #pos = self.GetChildren().index(sizerItem) #why doesn't this work for i, sitem in enumerate(self.Children): if self.GetObject(sitem) is self.GetObject(sizerItem): pos = i; break index = int(wx.NewId()) #okay way to get unique id? self._actives[index] = [pos, [0, 0], self.Delay, self.Increment, "I"] #we are going to be temporarily inserting the item to get its size, so don't show it if self.GetContainingWindow(): self.GetContainingWindow().Freeze() #create a gridsizer sizer = wx.BoxSizer() #add the spacer and item spacer = sizer.AddSpacer((0,0)) sizer.Add(self.GetObject(self.GetItem(pos))) #calculate the size of the item sizer.Layout() space = pixels = [int(expandBool)*size for expandBool, size in zip(expandIn, item.Size)] #now hide it sizer.Hide(item) #and put the temporary sizer where the item will eventually go wx.Sizer.Insert(self, pos, sizer) if self.GetContainingWindow(): self.GetContainingWindow().Thaw() #if there is a pending insertion after us, they will have their index off by one now #so we need to increment all indexes equal to or after us by one for i, data in self._actives.items(): if i is not index and data[0] >= pos: self._actives[i][0] += 1 else: pos = self.GetMyPos(index) space = self._actives[index][1] #a Hide will set our space to None if this insertion has been "cancelled" by a Hide on the same item if space is None: #wx.Sizer.Detach(self, pos) del self._actives[index] return #figure out the new size of the spacer iters = self.GetMyDelay(index)/self.GetMyIncrement(index) offset = [size/iters for size in pixels] self._actives[index][1][0] += offset[0] self._actives[index][1][1] += offset[1] space = self._actives[index][1] #now either add the control if we have created enough space, or add a bigger spacer if not if not smooth or space > pixels: #detach the temporary sizer, and add and show the actual item wx.Sizer.Detach(self, pos) result = wx.Sizer.Insert(self, pos, item, prop, flag, border, userData) self.Show(item) #remove ourselves from the dictionary, we don't want it to keep increasing del self._actives[index] else: #not enough space yet, keep enlarging spacer spacer.SetSpacer(space) result = wx.CallLater(self.Increment*1000, self.SmoothInsert, pos, item, prop, flag, border, userData, expandIn, smooth, index, spacer, pixels) #layout each iteration self.LayoutProper() return result def SmoothShow(self, item, pixels=None, smooth=None, index=-1, spacer=None, callback=None, *args, **kwargs): """ This method smoothly (by default) adds an item to a sizer. It does this by first hiding the item, and then creating a spacer the same size as the item was. Then each iteration it reduces the size of the spacer until it is (0,0), at which point it detaches the spacer and is done. """ if smooth is None: smooth = self.GetSmooth() if spacer is None: #this is our first time here #if the window is already hidden, just return True that it was found/hidden sizerItem = self.GetItem(item) if sizerItem.IsShown(): ##X return True #figure out the position of the item #pos = self.GetChildren().index(sizerItem) #why doesn't this work for i, sitem in enumerate(self.Children): if self.GetObject(sitem) is self.GetObject(sizerItem): pos = i; break #we know it is not shown, so grab the size (how much space we need to hide) ###X if self.GetContainingWindow(): self.GetContainingWindow().Freeze() wx.Sizer.Show(self, item) self.Layout() pixels = self.GetItem(item).Size #print pixels wx.Sizer.Hide(self, item) if self.GetContainingWindow(): self.GetContainingWindow().Thaw() #grab these now before we change anything sProp, sFlag, sBorder, sUserData = sizerItem.Proportion, sizerItem.Flag, sizerItem.Border, sizerItem.UserData #add ourselves to the list of actives index = int(wx.NewId()) #okay way to get unique id? self._actives[index] = [pos, [0,0], self.Delay, self.Increment, "I"] ##X for i, data in self._actives.items(): #if there is a pending action on the current item already: if i is not index and data[0] == pos: if data[4] == "H": ### #we are being told to hide an item which is in the process of being inserted! #tell it to stop, and use the current space it has allocated self._actives[index][1] = self._actives[i][1] self._actives[i][1] = None elif data[4] == "I": ### #we are being told to show an item, which is already being shown. that's silly. #remove ourselves, return, and let the previous show continue del self._actives[index] return True else: raise Exception("Unable to identify an entry in my dictionary!") #we CAN'T change the number of items in the sizer, the user may depend on it #hide the item initially #wx.Sizer.Hide(self, item, *args, **kwargs) ## not necessary for a show but not harmful either #detach it from this sizer, replace it with a sizer with the item and the spacer, #so as not to change the number of items itemObj = self.GetObject(self.Children[pos]) wx.Sizer.Detach(self, pos) tempSizer = wx.BoxSizer() #add the item tempSizer.Add(itemObj, 1, wx.EXPAND) #add the spacer which we will reduce to nothing spacer = tempSizer.AddSpacer(pixels) #now add the sizer, mimicking the original item wx.Sizer.Insert(self, pos, tempSizer, sProp, sFlag, sBorder, sUserData) #figure out the new size of the spacer iters = self.GetMyDelay(index)/self.GetMyIncrement(index) offset = [size/iters for size in pixels] ## multiple by -1 when appropriate self._actives[index][1][0] += offset[0] self._actives[index][1][1] += offset[1] space = self._actives[index][1] print tuple(space), pixels, tuple(space) > tuple(pixels) #now either remove the spacer if we have removed enough space, or remove more space if not if not smooth or tuple(space) > tuple(pixels): ## space > pixels print 1 #grab the temp sizer tempSizerItem = self.Children[self.GetMyPos(index)] tempSizer = tempSizerItem.Sizer realItemObj = self.GetObject(tempSizer.Children[0]) #detach the item from it tempSizer.Detach(0) #add the item back to THIS sizer wx.Sizer.Insert(self, self.GetMyPos(index), realItemObj, tempSizerItem.Proportion, tempSizerItem.Flag, tempSizerItem.Border, tempSizerItem.UserData) #and remove the temp sizer wx.Sizer.Remove(self, tempSizer) #remove ourselves from the dictionary, so it doesn't get large del self._actives[index] wx.Sizer.Show(self, item) #if there is a callback, call it! if callback: callback() else: #still space left, reduce size of spacer print 0 spacer.SetSpacer(space) result = wx.CallLater(self.Increment*1000, self.SmoothShow, item, pixels, smooth, index, spacer, callback, *args, **kwargs) ##X #layout each iteration self.LayoutProper() def SmoothHide(self, item, pixels=None, smooth=None, index=-1, spacer=None, callback=None, *args, **kwargs): """ This method smoothly (by default) removes an item from a sizer. It does this by first hiding the item, and then creating a spacer the same size as the item was. Then each iteration it reduces the size of the spacer until it is (0,0), at which point it detaches the spacer and is done. """ if smooth is None: smooth = self.GetSmooth() if spacer is None: #this is our first time here #if the window is already hidden, just return True that it was found/hidden sizerItem = self.GetItem(item) if not sizerItem.IsShown(): ## return True #figure out the position of the item #pos = self.GetChildren().index(sizerItem) #why doesn't this work for i, sitem in enumerate(self.Children): if self.GetObject(sitem) is self.GetObject(sizerItem): pos = i; break #we know it is shown, so grab the size (how much space we need to hide) pixels = sizerItem.Size #grab these now before we change anything sProp, sFlag, sBorder, sUserData = sizerItem.Proportion, sizerItem.Flag, sizerItem.Border, sizerItem.UserData #add ourselves to the list of actives index = int(wx.NewId()) #okay way to get unique id? self._actives[index] = [pos, pixels, self.Delay, self.Increment, "H"] ## for i, data in self._actives.items(): #if there is a pending action on the current item already: if i is not index and data[0] == pos: if data[4] == "I": ### #we are being told to hide an item which is in the process of being inserted! #tell it to stop, and use the current space it has allocated self._actives[index][1] = self._actives[i][1] self._actives[i][1] = None elif data[4] == "H": ### #we are being told to hide an item, which is already being hidden. that's silly. #remove ourselves, return, and let the previous hide continue del self._actives[index] return True else: raise Exception("Unable to identify an entry in my dictionary!") #we CAN'T change the number of items in the sizer, the user may depend on it #hide the item initially wx.Sizer.Hide(self, item, *args, **kwargs) ## not necessary for a show but not harmful either #detach it from this sizer, replace it with a sizer with the item and the spacer, #so as not to change the number of items itemObj = self.GetObject(self.Children[pos]) wx.Sizer.Detach(self, pos) tempSizer = wx.BoxSizer() #add the item tempSizer.Add(itemObj, 1, wx.EXPAND) #add the spacer which we will reduce to nothing spacer = tempSizer.AddSpacer(pixels) #now add the sizer, mimicking the original item wx.Sizer.Insert(self, pos, tempSizer, sProp, sFlag, sBorder, sUserData) #figure out the new size of the spacer iters = self.GetMyDelay(index)/self.GetMyIncrement(index) offset = [size/iters for size in pixels] ## multiple by -1 when appropriate self._actives[index][1][0] -= offset[0] self._actives[index][1][1] -= offset[1] space = self._actives[index][1] #now either remove the spacer if we have removed enough space, or remove more space if not if not smooth or tuple(space) <= (0, 0): ## space > pixels #grab the temp sizer tempSizerItem = self.Children[self.GetMyPos(index)] tempSizer = tempSizerItem.Sizer realItemObj = self.GetObject(tempSizer.Children[0]) #detach the item from it tempSizer.Detach(0) #add the item back to THIS sizer wx.Sizer.Insert(self, self.GetMyPos(index), realItemObj, tempSizerItem.Proportion, tempSizerItem.Flag, tempSizerItem.Border, tempSizerItem.UserData) #and remove the temp sizer wx.Sizer.Remove(self, tempSizer) #remove ourselves from the dictionary, so it doesn't get large del self._actives[index] #if there is a callback, call it! if callback: callback() else: #still space left, reduce size of spacer spacer.SetSpacer(space) result = wx.CallLater(self.Increment*1000, self.SmoothHide, item, pixels, smooth, index, spacer, callback, *args, **kwargs) #layout each iteration self.LayoutProper() def SmoothInsert(self, pos, item, *args, **kwargs): """ A smooth insert is basically a smooth show except that the item is inserted first. """ smooth = True if 'smooth' in kwargs: smooth = kwargs['smooth'] del kwargs['smooth'] wx.Sizer.Insert(self, pos, item, *args, **kwargs) if smooth: wx.Sizer.Hide(self, pos) self.SmoothShow(pos, *args, **kwargs) def SmoothRemove(self, item, *args, **kwargs): """ A smooth remove is basically a smooth hide except that the item is deleted in the end. Note that the size of the sizer in children won't change until the hide is complete. """ self.SmoothHide(item, callback=lambda: wx.Sizer.Remove(self, item), *args, **kwargs) Smooth = property(GetSmooth, SetSmooth) Delay = property(GetDelay, SetDelay) Increment = property(GetIncrement, SetIncrement) class SmoothBoxSizer(SmoothSizerMixin, wx.BoxSizer): """ An example of using the SmoothSizerMixin to create a SmoothBoxSizer. There is no special logic here specific to a BoxSizer. Is there a better way to do this, then? """ def __init__(self, orient=wx.HORIZONTAL): wx.BoxSizer.__init__(self, orient) SmoothSizerMixin.__init__(self) def Insert(self, *args, **kwargs): return self.SmoothInsert(*args, **kwargs) def Hide(self, *args, **kwargs): return self.SmoothHide(*args, **kwargs) def Remove(self, *args, **kwargs): return self.SmoothRemove(*args, **kwargs) class SmoothStaticBoxSizer(SmoothSizerMixin, wx.StaticBoxSizer): """ A StaticBoxSizer using the SmoothSizerMixin. """ def __init__(self, box, orient=wx.HORIZONTAL): wx.StaticBoxSizer.__init__(self, box, orient) SmoothSizerMixin.__init__(self) def Insert(self, pos, item, *args, **kwargs): return self.SmoothInsert(pos, item, *args, **kwargs) def Hide(self, item, *args, **kwargs): return self.SmoothHide(item, *args, **kwargs) def Remove(self, *args, **kwargs): return self.SmoothRemove(*args, **kwargs) class DemoFrame(wx.Frame): def __init__(self, parent=None): wx.Frame.__init__(self, parent) self.panel = panel = wx.Panel(self) #you can change the orient and it works self.leftSizer = leftSizer = SmoothBoxSizer(wx.VERTICAL) leftSizer.Add(wx.Button(panel, label="Hello world!"), smooth=False) leftSizer.Add(wx.Button(panel, label="How are you?"), smooth=False) self.delayCtrl = wx.lib.intctrl.IntCtrl(panel, value=200, min=0, limited=True, size=(50, -1)) self.incrementCtrl = wx.lib.intctrl.IntCtrl(panel, value=15, min=0, limited=True, size=(50, -1)) rightSizer = wx.GridBagSizer(3,5) rightSizer.Add(wx.StaticText(panel, label="Delay (milliseconds):"), (0,0)) rightSizer.Add(wx.StaticText(panel, label="Increment (milliseconds):"), (1,0)) rightSizer.Add(self.delayCtrl, (0, 1)) rightSizer.Add(self.incrementCtrl, (1,1)) rightSizer.Add(wx.Button(panel, label="Prepend a control"), (2,0)) rightSizer.Add(wx.Button(panel, label="Insert a sizer second"), (3,0)) rightSizer.Add(wx.Button(panel, label="Hide the second item"), (4,0)) rightSizer.Add(wx.Button(panel, label="Hide every other item"), (5,0)) rightSizer.Add(wx.Button(panel, label="Remove the first item"), (6,0)) sizer = wx.BoxSizer() sizer.Add(leftSizer, 1) sizer.Add(rightSizer) panel.Sizer = sizer sizer.Layout() self.Bind(wx.EVT_BUTTON, self.onClick) self.Show(True) def onClick(self, event): self.leftSizer.Increment = float(int(self.incrementCtrl.Value)/1000.0) self.leftSizer.Delay = float(int(self.delayCtrl.Value)/1000.0) label = event.EventObject.Label if label == "Prepend a control": self.leftSizer.Prepend(wx.Button(self.panel, label="First")) elif label == "Hide the second item": self.leftSizer.Hide(1) elif label == "Insert a sizer second": self.Freeze() sizer = wx.BoxSizer() subsizer = wx.BoxSizer(wx.VERTICAL) subsizer.Add(wx.StaticText(self.panel, label="Hello.")) subsizer.Add(wx.StaticText(self.panel, label="How are you?")) sizer.Add(subsizer) sizer.Add(wx.TextCtrl(self.panel)) self.Thaw() self.leftSizer.Insert(1, sizer) elif label == "Hide every other item": for i in range(len(self.leftSizer.GetChildren())): if i%2: self.leftSizer.Hide(i) elif label == "Remove the first item": self.leftSizer.Remove(0) if __name__ == "__main__": app = wx.App(False) import wx.lib.intctrl frame = DemoFrame() app.MainLoop() wxbanker-0.9.1/wxbanker/summarytab.py0000644000175000017500000001314712243601243017666 0ustar mrooneymrooney# https://launchpad.net/wxbanker # summarytab.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker import localization, bankcontrols, helpers import wx, datetime from wx.lib.pubsub import Publisher class SummaryPanel(wx.Panel): def __init__(self, parent, plotFactory, bankController): wx.Panel.__init__(self, parent) self.plotFactory = plotFactory self.bankController = bankController self.plotSettings = {'FitDegree': 2, 'Granularity': 100, 'Account': None, 'Months': 12} self.plotLabels = [_("Trend Degree"), _("Months")] self.currentPlotIndex = 0 self.cachedData = None self.dateRange = None self.isActive = False # create the plot panel self.plotPanel = plotFactory.createPanel(self, bankController) # create the controls at the bottom controlSizer = wx.BoxSizer() self.graphChoice = wx.Choice(self, choices=[plot.NAME for plot in plotFactory.Plots]) self.optionCtrl = wx.SpinCtrl(self, min=1, max=24, initial=self.plotSettings['FitDegree']) # the date range controls self.startDate = bankcontrols.DateCtrlFactory(self) self.endDate = bankcontrols.DateCtrlFactory(self) self.optionText = wx.StaticText(self, label=self.plotLabels[0]) self.fromText = wx.StaticText(self, label=_("From")) self.toText = wx.StaticText(self, label=_("until")) controlSizer.Add(wx.StaticText(self, label=_("Graph")), 0, wx.ALIGN_CENTER_VERTICAL) controlSizer.AddSpacer(5) controlSizer.Add(self.graphChoice, 0, wx.ALIGN_CENTER_VERTICAL) controlSizer.AddSpacer(10) controlSizer.Add(self.fromText, 0, wx.ALIGN_CENTER_VERTICAL) controlSizer.AddSpacer(5) controlSizer.Add(self.startDate, 0, wx.ALIGN_CENTER_VERTICAL) controlSizer.AddSpacer(5) controlSizer.Add(self.toText, 0, wx.ALIGN_CENTER_VERTICAL) controlSizer.AddSpacer(5) controlSizer.Add(self.endDate, 0, wx.ALIGN_CENTER_VERTICAL) controlSizer.AddSpacer(10) controlSizer.Add(self.optionText, 0, wx.ALIGN_CENTER_VERTICAL) controlSizer.AddSpacer(5) controlSizer.Add(self.optionCtrl, 0, wx.ALIGN_CENTER_VERTICAL) self.optionCtrl.SetMinSize = (20, -1) # put it all together self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.Add(self.plotPanel, 1, wx.EXPAND) self.Sizer.Add(controlSizer, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 6) self.Layout() # bind to the spin buttons self.graphChoice.Bind(wx.EVT_CHOICE, self.onGraphChoice) self.optionCtrl.Bind(wx.EVT_SPINCTRL, self.onOptionSpin) self.Bind(wx.EVT_DATE_CHANGED, self.onDateRangeChanged) Publisher.subscribe(self.onAccountSelect, "view.account changed") def onGraphChoice(self, event): index = self.graphChoice.GetSelection() # Replace the graph newPlot = self.plotFactory.createPanel(self, self.bankController, index) self.Sizer.Replace(self.plotPanel, newPlot) self.plotPanel = newPlot self.currentPlotIndex = index self.generateData(useCache=True) # Update the controls self.optionText.Label = self.plotLabels[index] self.optionCtrl.Value = self.plotSettings[self.getOptionKey(index)] for ctrl in (self.fromText, self.toText, self.startDate, self.endDate): ctrl.Show(index == 0) # A replace does not Layout, and we have made some changes. self.Layout() def onDateRangeChanged(self, event): self.generateData() def getOptionKey(self, index): return ['FitDegree', 'Months'][index] def getDateRange(self): return [helpers.wxdate2pydate(date) for date in (self.startDate.Value, self.endDate.Value)] def onAccountSelect(self, message): account = message.data self.plotSettings['Account'] = account # If this tab isn't being viewed, no need to generate anything just yet. if self.isActive: self.generateData() def onOptionSpin(self, event): self.plotSettings[self.getOptionKey(self.currentPlotIndex)] = event.EventObject.Value self.generateData(useCache=True) def onEnter(self): self.isActive = True self.dateRange = self.bankController.Model.GetDateRange() self.startDate.Value = helpers.pydate2wxdate(self.dateRange[0]) self.endDate.Value = helpers.pydate2wxdate(self.dateRange[1]) self.generateData() def onExit(self): self.isActive = False def generateData(self, useCache=False): if useCache and self.cachedData is not None: totals = self.cachedData else: totals = self.bankController.Model.GetXTotals(self.plotSettings['Account'], daterange=self.getDateRange()) self.cachedData = totals self.plotPanel.plotBalance(totals, self.plotSettings) wxbanker-0.9.1/wxbanker/tagtransactiondialog.py0000644000175000017500000001030012243601243021667 0ustar mrooneymrooney# https://launchpad.net/wxbanker # tagtransactiondialog.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx from wxbanker.bankobjects.tag import Tag, EmptyTagException class TagTransactionsPanel(wx.Panel): def __init__(self, parent, transactions): wx.Panel.__init__(self, parent) self.Transactions = transactions self.Sizer = wx.BoxSizer(wx.VERTICAL) self.Sizer.AddSpacer(6) introText = wx.StaticText(self, label=_("You can also tag a transaction by putting #tagname anywhere in the description.")) textCtrlText = wx.StaticText(self, label=_("Tag:")) self.textCtrl = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER) removalText = wx.StaticText(self, label=_("To remove this tag later, simply remove it from the description or right-click on the transaction.")) textCtrlSizer = wx.BoxSizer() textCtrlSizer.Add(textCtrlText, flag=wx.ALIGN_CENTER_VERTICAL) textCtrlSizer.AddSpacer(9) textCtrlSizer.Add(wx.StaticText(self, label=Tag.TAG_CHAR), flag=wx.ALIGN_CENTER_VERTICAL) textCtrlSizer.Add(self.textCtrl) # Button sizer self.buttonSizer = wx.BoxSizer() tagButton = wx.Button(self, label=_("Add Tag"), id=wx.ID_OK) cancelButton = wx.Button(self, label=_("Cancel"), id=wx.ID_CANCEL) self.buttonSizer.AddStretchSpacer() self.buttonSizer.Add(tagButton) self.buttonSizer.AddSpacer(6) self.buttonSizer.Add(cancelButton) self.buttonSizer.AddSpacer(6) # Main sizer self.Sizer.AddSpacer(12) self.Sizer.Add(introText) self.Sizer.AddSpacer(12) self.Sizer.Add(textCtrlSizer) self.Sizer.AddSpacer(24) self.Sizer.Add(removalText) self.Sizer.AddSpacer(12) self.Sizer.Add(self.buttonSizer, flag=wx.ALIGN_RIGHT|wx.EXPAND) self.Sizer.AddSpacer(6) for text in (introText, removalText): text.Wrap(400) # Focus the textctrl so the user can just start typing. self.textCtrl.SetFocus() self.textCtrl.Bind(wx.EVT_TEXT_ENTER, self.onTagEnter) self.Bind(wx.EVT_BUTTON, self.onButton) def onTagEnter(self, event): self.applyTag() # Dialogs auto-close on certain IDs but a text entry is not one of them. self.Parent.Destroy() def onButton(self, event): """If the tag button was clicked tag the transactions, and close the dialog in any case (Cancel).""" assert event.Id in (wx.ID_OK, wx.ID_CANCEL) if event.Id == wx.ID_OK: self.applyTag() #self.Parent.Destroy() event.Skip() def applyTag(self): # Strip the tag character in case the user was unclear about needing to use it. tag = self.textCtrl.Value.strip(Tag.TAG_CHAR) # If there's no tag, there's no tagging to do. if not tag: return # Apply the tag to each transaction selected. for transaction in self.Transactions: transaction.AddTag(tag) class TagTransactionsDialog(wx.Dialog): def __init__(self, parent, transactions): wx.Dialog.__init__(self, parent, title=_("Add a tag")) self.Sizer = wx.BoxSizer() tagPanel = TagTransactionsPanel(self, transactions) self.Sizer.AddSpacer(6) self.Sizer.Add(tagPanel, 1, wx.EXPAND) self.Sizer.AddSpacer(6) self.Fit() wxbanker-0.9.1/wxbanker/templater.py0000644000175000017500000000275512243601243017502 0ustar mrooneymrooney#!/usr/bin/env python # https://launchpad.net/wxbanker # templater.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import os, subprocess def compiletranslations(): poBase = "wxbanker/po/" poFiles = [f for f in os.listdir(poBase) if f.endswith(".po")] failed = [] for poFile in poFiles: locale = poFile[:-3] path = "locale/%s/LC_MESSAGES/wxbanker.mo" % locale if not os.path.exists(path): os.makedirs(os.path.split(path)[0]) try: subprocess.check_call(("msgfmt", "-v", poBase+poFile, "-o", path), stdout=subprocess.PIPE) except: failed.append(poFile) subprocess.check_call(("bzr", "add", "locale/")) print "Failed to compile: %s" % failed or None if __name__ == "__main__": compiletranslations() wxbanker-0.9.1/wxbanker/tests/0000755000175000017500000000000012243601243016264 5ustar mrooneymrooneywxbanker-0.9.1/wxbanker/tests/__init__.py0000644000175000017500000000000012243601243020363 0ustar mrooneymrooneywxbanker-0.9.1/wxbanker/tests/alltests.py0000644000175000017500000000302312243601243020467 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # alltests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase, xmlrunner import unittest, os, sys # Find the modules to test. ignores = ('__init__.py', 'testbase.py', 'alltests.py', 'xmlrunner.py') files = [f for f in os.listdir(testbase.testdir) if f.endswith(".py") and f not in ignores] modules = [m.replace(".py", "") for m in files] def main(): if "--xml" in sys.argv: runner = xmlrunner.XMLTestRunner(filename="pyunit.xml") else: runner = unittest.TextTestRunner() suite = unittest.TestLoader().loadTestsFromNames(modules) runner.run(suite) incomplete = testbase.INCOMPLETE_TESTS if incomplete: print "Incomplete tests: %i!" % incomplete if __name__ == "__main__": main() wxbanker-0.9.1/wxbanker/tests/analyzertests.py0000644000175000017500000000612712243601243021554 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # analyzertests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase from wxbanker.analyzers import MonthlyAnalyzer import unittest, datetime class AnalyzerTests(testbase.TestCaseWithController): def setUp(self): testbase.TestCaseWithController.setUp(self) a = self.Model.CreateAccount("A") for i in xrange(1, 13): a.AddTransaction(amount=i, date=datetime.date(2009, i, 15)) def createMonthly(self, *args, **kwargs): monthly = MonthlyAnalyzer(*args, **kwargs) monthly.Today = datetime.date(2010, 1, 15) return monthly def testMonthlyDateRangeDefault(self): monthly = self.createMonthly() start, end = monthly.GetDateRange() self.assertEqual(start, datetime.date(2009, 1, 1)) self.assertEqual(end, datetime.date(2009, 12, 31)) def testMonthlyDateRangeOne(self): monthly = self.createMonthly(months=1) start, end = monthly.GetDateRange() self.assertEqual(start, datetime.date(2009, 12, 1)) self.assertEqual(end, datetime.date(2009, 12, 31)) def testMonthlyAmountsDefault(self): monthly = self.createMonthly() earnings = monthly.GetEarnings(self.Model.GetTransactions()) self.assertEqual( earnings, [('2009.01', 1), ('2009.02', 2), ('2009.03', 3), ('2009.04', 4), ('2009.05', 5), ('2009.06', 6), ('2009.07', 7), ('2009.08', 8), ('2009.09', 9), ('2009.10', 10), ('2009.11', 11), ('2009.12', 12)] ) def testMonthlyAmountsOne(self): monthly = self.createMonthly(months=1) earnings = monthly.GetEarnings(self.Model.GetTransactions()) self.assertEqual(earnings, [("2009.12", 12)]) def testMonthlyAmountsEmpty(self): # With no transactions from a previous month, we should have a zero for all months to show. (LP: #623055) self.Model.Accounts[0].Remove() monthly = self.createMonthly() earnings = monthly.GetEarnings(self.Model.GetTransactions()) self.assertEqual( earnings, [('2009.01', 0), ('2009.02', 0), ('2009.03', 0), ('2009.04', 0), ('2009.05', 0), ('2009.06', 0), ('2009.07', 0), ('2009.08', 0), ('2009.09', 0), ('2009.10', 0), ('2009.11', 0), ('2009.12', 0)] )wxbanker-0.9.1/wxbanker/tests/csvexportertests.py0000644000175000017500000000352112243601243022306 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # csvexportertests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase import unittest, datetime, os, tempfile from wxbanker.csvexporter import CsvExporter class CsvExporterTest(testbase.TestCaseWithController): def assertTransactionExports(self, description): model = self.Model a = model.CreateAccount("foo") a.AddTransaction(1, description, "2010-5-24") handle, path = tempfile.mkstemp() try: CsvExporter.Export(model, path) result = open(path).read().decode("utf8") finally: os.remove(path) expected = [ u'Account,Description,Amount,Date', u'foo,%s,1.0,2010-05-24' % (description), ] expected = u'\r\n'.join(expected)+u"\r\n" self.assertEquals(expected, result) def testExpectedOutput(self): self.assertTransactionExports("Bar") def testExpectedOutputWithUnicode(self): self.assertTransactionExports(u'\u0143') if __name__ == "__main__": unittest.main() wxbanker-0.9.1/wxbanker/tests/csvimportertests.py0000644000175000017500000000570512243601243022305 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # csvimportertests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase import unittest, datetime from wxbanker.csvimporter import CsvImporter, CsvImporterProfileManager class CsvImporterTest(unittest.TestCase): def setUp(self): self.importer = CsvImporter() def getTransactions(self, csvtype): path = testbase.fixturefile("%s.csv"%csvtype) profile = CsvImporterProfileManager().getProfile(csvtype) container = CsvImporter().getTransactionsFromFile(path, profile) return container.Transactions def testParseAmountWithSpaceAsThousandsSep(self): # Regression test for LP: #370571 decimalSeparator = ',' self.assertEquals(self.importer.parseAmount('-1 000,00', decimalSeparator), -1000.0) self.assertEquals(self.importer.parseAmount('$ -1 000,00 ', decimalSeparator), -1000.0) def testCanImportMintData(self): transactions = self.getTransactions("mint") transactions.sort() self.assertEqual(len(transactions), 3) self.assertAlmostEqual(sum(t.Amount for t in transactions), 29.46) self.assertEqual(transactions[-1].Date, datetime.date(2009, 7, 21)) self.assertEqual(transactions[-1].Description, "Teavana San Mateo") def testCanImportSparkasseData(self): transactions = self.getTransactions("Sparkasse") self.assertEqual(len(transactions), 5) tran = transactions[1] self.assertEqual(tran.Date, datetime.date(2009, 7, 17)) self.assertEqual(tran.Description, "PHONE CORP, ### , LASTSCHRIFT") self.assertEqual(tran.Amount, -31.24) def testCanImportComdirectData(self): transactions = self.getTransactions("comdirect") self.assertEqual(len(transactions), 5) tran = transactions[2] self.assertEqual(tran.Date, datetime.date(2010, 3, 8)) self.assertEqual(tran.Description, "Auftraggeber: XYZ SAGT DANKE Buchungstext: XYZ SAGT DANKE EC 123456789 06.03 14.53 CE0 Ref. ABCDFER213456789/1480 (Lastschrift Einzug)") self.assertEqual(tran.Amount, -32.27) if __name__ == "__main__": unittest.main() wxbanker-0.9.1/wxbanker/tests/currconverttests.py0000644000175000017500000000333012243601243022274 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # currconverttests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase import unittest from wxbanker import currencies, currconvert class CurrConvertTest(unittest.TestCase): def setUp(self): self.CC = currconvert.CurrencyConverter() def testConversionToSameCurrencyIsSame(self): amount = 5.23 self.assertEqual(self.CC.Convert(amount, "EUR", "EUR"), amount) def testConversionWithStockValuesIsExpected(self): rate = self.CC.Exchanges['USD'] = 1.2345 self.assertEqual(self.CC.Convert(1, "EUR", "USD"), rate) self.assertEqual(self.CC.Convert(1, "USD", "EUR"), 1/rate) def testInvalidCurrencyIsExpectedException(self): self.assertRaises(currconvert.ConversionException, lambda: self.CC.Convert(1, "FOO", "USD")) self.assertRaises(currconvert.ConversionException, lambda: self.CC.Convert(1, "USD", "BAR")) if __name__ == "__main__": unittest.main() wxbanker-0.9.1/wxbanker/tests/currencytests.py0000644000175000017500000001347512243601243021565 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # currencytests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase import unittest, locale from wxbanker import currencies class CurrencyTest(unittest.TestCase): def tearDown(self): testbase.resetLocale() def testUSD(self): usd = currencies.UnitedStatesCurrency() self.assertEqual(usd.float2str(1), '$1.00') self.assertEqual(usd.float2str(-2.1), '-$2.10') self.assertEqual(usd.float2str(-10.17), '-$10.17') self.assertEqual(usd.float2str(-777), '-$777.00') self.assertEqual(usd.float2str(12345.67), '$12,345.67') self.assertEqual(usd.float2str(12345), '$12,345.00') self.assertEqual(usd.float2str(-12345.67), '-$12,345.67') self.assertEqual(usd.float2str(-12345.6), '-$12,345.60') self.assertEqual(usd.float2str(-123456), '-$123,456.00') self.assertEqual(usd.float2str(1234567890), '$1,234,567,890.00') self.assertEqual(usd.float2str(.01), '$0.01') self.assertEqual(usd.float2str(.01, 8), ' $0.01') def testNoNegativeZeroes(self): usd = currencies.UnitedStatesCurrency() tinyNegative = 2.1-2.2+.1 self.assertTrue(tinyNegative < 0) self.assertEqual(usd.float2str(tinyNegative), u'$0.00') def testCurrencyLocalizes(self): russianLocale = testbase.LOCALES[1] self.assertEqual(locale.setlocale(locale.LC_ALL, russianLocale), russianLocale) self.assertEqual(currencies.LocalizedCurrency().float2str(1), u'1.00 руб') def testCurrencyDisplay(self): americanLocale = testbase.LOCALES[0] self.assertEqual(locale.setlocale(locale.LC_ALL, americanLocale), americanLocale) testAmount = 1234.5 self.assertEqual(currencies.LocalizedCurrency().float2str(testAmount), u'$1,234.50') self.assertEqual(currencies.UnitedStatesCurrency().float2str(testAmount), u'$1,234.50') self.assertEqual(currencies.EuroCurrency().float2str(testAmount), u'1 234,50 €') self.assertEqual(currencies.GreatBritainCurrency().float2str(testAmount), u'£1,234.50') self.assertEqual(currencies.JapaneseCurrency().float2str(testAmount), u'¥1,234') self.assertEqual(currencies.RussianCurrency().float2str(testAmount), u'1 234.50 руб') self.assertEqual(currencies.UkranianCurrency().float2str(testAmount), u'1 234,50 гр') self.assertEqual(currencies.MexicanCurrency().float2str(testAmount), u'$1,234.50') self.assertEqual(currencies.SwedishCurrency().float2str(testAmount), u'1 234,50 kr') self.assertEqual(currencies.SaudiCurrency().float2str(testAmount), u'1234.50 ريال') self.assertEqual(currencies.NorwegianCurrency().float2str(testAmount), u'kr1 234,50') self.assertEqual(currencies.ThaiCurrency().float2str(testAmount), u'฿ 1,234.50') self.assertEqual(currencies.VietnameseCurrency().float2str(testAmount), u'1.234₫') self.assertEqual(currencies.IndianCurrency().float2str(testAmount), u'₨ 1,234.50') self.assertEqual(currencies.RomanianCurrency().float2str(testAmount), u'Lei 1.234,50') self.assertEqual(currencies.ArabEmiratesCurrency().float2str(testAmount), u'د.إ. 1,234.500') self.assertEqual(currencies.LithuanianCurrency().float2str(testAmount), u'1.234,50 Lt') self.assertEqual(currencies.SerbianCurrency().float2str(testAmount), u'1.234,50 дин') self.assertEqual(currencies.HungarianCurrency().float2str(testAmount), u'1.234,50 Ft') self.assertEqual(currencies.IsraeliCurrency().float2str(testAmount), u'שח 1,234.50') self.assertEqual(currencies.EgyptianCurrency().float2str(testAmount), u'ج.م. 1,234.500') self.assertEqual(currencies.PolishCurrency().float2str(testAmount), u'1.234,50 zł') self.assertEqual(currencies.CzechCurrency().float2str(testAmount), u'1 234,50 Kč') self.assertEqual(currencies.ArgentineCurrency().float2str(testAmount), u'$ 1.234,50') self.assertEqual(currencies.TaiwanCurrency().float2str(testAmount), u'NT$1,234.50') self.assertEqual(currencies.GuatemalaCurrency().float2str(testAmount), u'Q 1,234.50') self.assertEqual(currencies.ChineseCurrency().float2str(testAmount), u'¥1,234.50') self.assertEqual(currencies.MoroccanCurrency().float2str(testAmount), u'د.م. 1,234.500') self.assertEqual(currencies.MacedonianCurrency().float2str(testAmount), u'1 234,50 ден') self.assertEqual(currencies.IndonesianCurrency().float2str(testAmount), u'Rp1.234,50') self.assertEqual(currencies.CanadianCurrency().float2str(testAmount), u'$1,234.50') self.assertEqual(currencies.KazakhstanCurrency().float2str(testAmount), u'1 234.50 тг') self.assertEqual(currencies.TunisianCurrency().float2str(testAmount), u'د.ت. 1,234.500') self.assertEqual(currencies.MalaysianCurrency().float2str(testAmount), u'RM1,234.50') self.assertEqual(currencies.SouthAfricanCurrency().float2str(testAmount), u'R1 234,50') # __CURRENCY_ASSERTION__ if __name__ == "__main__": unittest.main() wxbanker-0.9.1/wxbanker/tests/dbupgradetests.py0000644000175000017500000000717612243601243021671 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # dbupgradetests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase from wxbanker.controller import Controller import unittest, shutil, os, tempfile, datetime class DBUpgradeTest(testbase.TestCaseHandlingConfig): def setUp(self): testbase.TestCaseHandlingConfig.setUp(self) self.tmpFile = None def tearDown(self): if self.tmpFile: os.remove(self.tmpFile) def getController(self, ver): origpath = testbase.fixturefile("bank-%s.db"%ver) self.tmpFile = tempfile.mkstemp()[1] shutil.copyfile(origpath, self.tmpFile) return Controller(path=self.tmpFile) def doBaseTest(self, ver): c = self.getController(ver) model = c.Model accounts = model.Accounts self.assertEqual([a.Name for a in accounts], ["Another", "My Checking"]) self.assertEqual(accounts[1].Balance, 25) self.assertEqual(accounts[0].Balance, -123.45) # Make sure it is persisted! model2 = model.Store.GetModel(useCached=False) accounts = model2.Accounts self.assertEqual([a.Name for a in accounts], ["Another", "My Checking"]) self.assertEqual(accounts[1].Balance, 25) self.assertEqual(accounts[0].Balance, -123.45) return c def testUpgradeFrom04(self): c = self.doBaseTest("0.4") def testUpgradeFrom04Broken(self): # A 0.4 -> 0.6 upgrade left dbs in a broken state, let's handle it. c = self.doBaseTest("0.4-broken") def testUpgradeFrom05(self): c = self.doBaseTest("0.5") def testUpgradeFrom06Broken(self): # Test we can upgrade/run if LP #514183 has already occurred. c = self.getController("0.6-broken") transactions = c.Model.Accounts[0].Transactions self.assertEqual(len(transactions), 1) t = transactions[0] self.assertEqual(t.Date, datetime.date(2010, 1, 30)) self.assertEqual(t.Amount, -1.1) self.assertEqual(t.Description, "a") self.assertEqual(t.LinkedTransaction, None) def testCanDeleteAccountWithOldTransfer(self): model = self.getController("0.7-605591").Model a = model.Accounts[1] model.RemoveAccount(a.Name) model2 = model.Store.GetModel(useCached=False) self.assertEqual(model, model2) def testOrphanedTransactionsAreDeleted(self): model = self.getController("0.7-605591-orphaned").Model # This will raise an Exception if the orphans aren't deleted. self.assertEqual(len(model.Accounts[0].Transactions), 4) def testUpgradeFromPre08GetsTags(self): # Import a db with pre-tag tags in the description, make sure they are real tags. self.markTestIncomplete("TODO") def main(): unittest.main() wxbanker-0.9.1/wxbanker/tests/guitests.py0000644000175000017500000002753212243601243020516 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # guitests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase from wxbanker import main, controller import os, wx, unittest from wx.lib.pubsub import Publisher class GUITests(testbase.TestCaseHandlingConfigBase): def setUp(self): testbase.TestCaseHandlingConfigBase.setUp(self) if not hasattr(wx, "appInst"): wx.appInst = main.init(":memory:", welcome=False) self.App = wx.appInst self.Frame = self.App.TopWindow self.Model = self.Frame.Panel.bankController.Model self.OLV = wx.FindWindowByName("TransactionOLV") self.AccountListCtrl = wx.FindWindowByName("AccountListCtrl") self.NewTransactionCtrl = wx.FindWindowByName("NewTransactionCtrl") def tearDown(self): for account in self.Model.Accounts[:]: self.Model.RemoveAccount(account.Name) # Clear out any state of the NTC. self.NewTransactionCtrl.clear() testbase.TestCaseHandlingConfigBase.tearDown(self) def assertCurrentAccount(self, account): alc = self.AccountListCtrl.GetCurrentAccount() self.assertEqual(alc, account, alc and alc.Name) if account is None: expectedTransactions = self.Model.GetTransactions() else: expectedTransactions = account.Transactions self.assertEqual(self.OLV.GetObjects(), expectedTransactions) self.assertEqual(self.NewTransactionCtrl.CurrentAccount, account) def testAutoSaveSetAndSaveDisabled(self): self.assertTrue( self.Frame.MenuBar.autoSaveMenuItem.IsChecked() ) self.assertFalse( self.Frame.MenuBar.saveMenuItem.IsEnabled() ) def testShowZeroEnabled(self): self.assertTrue( self.Frame.MenuBar.showZeroMenuItem.IsChecked() ) def testControlFocus(self): # This test is only half-useful, because we're testing the methods directly and not # that they happen when expected via events; for some reason that doesn't work. newCtrl = self.NewTransactionCtrl newCtrl.initialFocus() self.assertEqual(wx.Window.FindFocus(), newCtrl.dateCtrl) newCtrl.defaultFocus() self.assertEqual(wx.Window.FindFocus(), newCtrl.descCtrl) def testKeyboardAccountShortcuts(self): model = self.Model accountList = self.AccountListCtrl a = model.CreateAccount("A") a.AddTransaction(1) b = model.CreateAccount("B") b.AddTransaction(2) c = model.CreateAccount("C") c.AddTransaction(3) self.assertCurrentAccount(c) Publisher.sendMessage("user.previous account") self.assertCurrentAccount(b) Publisher.sendMessage("user.previous account") self.assertCurrentAccount(a) Publisher.sendMessage("user.previous account") self.assertCurrentAccount(a) Publisher.sendMessage("user.next account") self.assertCurrentAccount(b) Publisher.sendMessage("user.next account") self.assertCurrentAccount(c) Publisher.sendMessage("user.account changed", None) self.assertCurrentAccount(None) Publisher.sendMessage("user.next account") self.assertCurrentAccount(None) Publisher.sendMessage("user.previous account") self.assertCurrentAccount(c) # Bring "B" to zero, and test that it gets skipped over when not viewing zero balances. b.AddTransaction(-2) Publisher.sendMessage("user.showzero_toggled", False) try: Publisher.sendMessage("user.previous account") self.assertCurrentAccount(a) Publisher.sendMessage("user.next account") self.assertCurrentAccount(c) finally: Publisher.sendMessage("user.showzero_toggled", True) def testToggleShowZero(self): # Create two accounts, make sure they are visible. a = self.Model.CreateAccount("A") b = self.Model.CreateAccount("B") b.AddTransaction(1) self.assertEqual(self.AccountListCtrl.GetVisibleCount(), 2) # Disable showing zero balance accounts, make sure the menu item is unchecked and one account is hidden. Publisher.sendMessage("user.showzero_toggled", False) self.assertFalse( self.Frame.MenuBar.showZeroMenuItem.IsChecked() ) self.assertEqual(self.AccountListCtrl.GetVisibleCount(), 1) # Make sure that a balance going to / coming from zero results in a visibility toggle. b.AddTransaction(-1) self.assertEqual(self.AccountListCtrl.GetVisibleCount(), 0) def testAppHasController(self): self.assertTrue( hasattr(self.App, "Controller") ) def testCanAddAndRemoveUnicodeAccount(self): self.Model.CreateAccount(u"Lópezहिंदी") # Make sure the account ctrl has the first (0th) selection. mainPanel = self.Frame.Panel.mainPanel self.assertEqual(0, self.AccountListCtrl.currentIndex) # Mock out the account removal dialog in-place to just return "Yes" mainPanel.accountCtrl.showModal = lambda *args, **kwargs: wx.ID_YES # Now remove the account and make sure there is no selection. mainPanel.accountCtrl.onRemoveButton(None) self.assertCurrentAccount(None) def testInitialBalanceHint(self): # Test LP: 520285 self.assertEqual(self.NewTransactionCtrl.descCtrl.Value, "") a = self.Model.CreateAccount("testInitialBalanceHint") self.assertEqual(self.NewTransactionCtrl.descCtrl.Value, "Initial balance") def testCanAddTransaction(self): a = self.Model.CreateAccount("testCanAddTransaction") self.assertEquals(len(a.Transactions), 0) self.assertEquals(a.Balance, 0) self.NewTransactionCtrl.amountCtrl.Value = "12.34" self.NewTransactionCtrl.onNewTransaction() self.assertEquals(len(a.Transactions), 1) self.assertEquals(a.Balance, 12.34) def testCanAddRecurringTransaction(self): model = self.Model a = model.CreateAccount("testCanAddRecurringTransaction") self.assertEquals(len(a.Transactions), 0) self.assertEquals(a.Balance, 0) self.NewTransactionCtrl.amountCtrl.Value = "12.34" self.NewTransactionCtrl.recursCheck.Value = True # Test the default of this field, and that it doesn't end. summaryText = wx.FindWindowByName("RecurringSummaryText") self.assertTrue(summaryText.Label.startswith("Weekly on ")) self.assertFalse("until" in summaryText.Label) # Now set an end date and make sure that gets displayed. rb = wx.FindWindowByName("EndsSometimeRadio") rb.Value = True # Setting the value programmatically doesn't trigger an event, so do so. wx.FindWindowByName("RecurringPanel").Update() self.assertTrue("until" in summaryText.Label) self.NewTransactionCtrl.onNewTransaction() self.assertEquals(len(a.Transactions), 0) self.assertEquals(a.Balance, 0) self.assertEquals(len(a.RecurringTransactions), 1) def testCanCheckRecurringTransactions(self): self.assertEqual(self.Frame.Panel.CheckRecurringTransactions(), 0) a = self.Model.CreateAccount("A") rt = a.AddRecurringTransaction(1, "fun", testbase.today, 0) self.assertEqual(self.Frame.Panel.CheckRecurringTransactions(), 1) def testAccountNoneIsAllAccounts(self): a = self.Model.CreateAccount("A") b = self.Model.CreateAccount("B") ta = a.AddTransaction(1) tb = b.AddTransaction(2) # B was added most recently and as such should be selected. self.assertEqual(self.OLV.GetObjects(), [tb]) self.AccountListCtrl.SelectItem(None) # Selecting None should show all transactions. self.assertEqual(self.OLV.GetObjects(), [ta, tb]) def testOLVTotals(self): """Test the OLV total column works as expected.""" def totals(): totals = [] for i in range(len(self.OLV.GetObjects())): totals.append(self.OLV.GetValueAt(self.OLV.GetObjectAt(i), 3)) return totals self.assertEqual(len(self.OLV.GetObjects()), 0) a = self.Model.CreateAccount("B") self.OLV.SortBy(self.OLV.COL_DATE) # Super basic test, one transaction. t1 = a.AddTransaction(1) self.assertEqual(totals(), [1]) # Now add one at the end t3 = a.AddTransaction(.5, date=testbase.tomorrow) self.assertEqual(totals(), [1, 1.5]) # Add one first. t2 = a.AddTransaction(2, date=testbase.yesterday) self.assertEqual(totals(), [2, 3, 3.5]) # Remove one not at the end. a.RemoveTransaction(t2) self.assertEqual(t1, self.OLV.GetObjectAt(0)) self.assertEqual(totals(), [1, 1.5]) # Now change an existing amount. t1.Amount = 1.75 self.assertEqual(totals(), [1.75, 2.25]) # Now change an existing date which should cause a re-order. t3.Date = testbase.yesterday self.assertEqual(totals(), [0.5, 2.25]) # Now add two transactions on the same date but in descending # alphabetical order t4 = a.AddTransaction(5, "BB", testbase.tomorrow) t5 = a.AddTransaction(6, "AA", testbase.tomorrow) self.assertEqual(totals(), [0.5, 2.25, 7.25, 13.25]) # Test that sorting by date always sorts transactions in the # correct order, even transactions on the same date (bug #653697) self.OLV.SortBy(self.OLV.COL_DESCRIPTION) self.OLV.SortBy(self.OLV.COL_DATE) self.assertEqual(totals(), [0.5, 2.25, 7.25, 13.25]) self.OLV.SortBy(self.OLV.COL_DESCRIPTION, ascending=False) self.OLV.SortBy(self.OLV.COL_DATE, ascending=False) self.assertEqual(totals(), [13.25, 7.25, 2.25, 0.5]) def testSearch(self): a = self.Model.CreateAccount("A") b = self.Model.CreateAccount("B") t1 = a.AddTransaction(1, "Cat") t2 = a.AddTransaction(1, "Dog") t3 = b.AddTransaction(1, "Pig") t4 = b.AddTransaction(1, "Dog") # Ensure b is selected self.assertEqual(set(self.OLV.GetObjects()), set([t3, t4])) # Search for dog, make sure b's matching transaction is shown. Publisher.sendMessage("SEARCH.INITIATED", ("Dog", 1)) self.assertEqual(self.OLV.GetObjects(), [t4]) # Change to a, make sure we see a's match. Publisher.sendMessage("user.account changed", a) self.assertEqual(self.OLV.GetObjects(), [t2]) # Switch to all accounts, make sure we see both matches. Publisher.sendMessage("user.account changed", None) self.assertEqual(set(self.OLV.GetObjects()), set([t2, t4])) if __name__ == "__main__": unittest.main() wxbanker-0.9.1/wxbanker/tests/localetests.py0000644000175000017500000000527712243601243021173 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # localetests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase from wxbanker import currencies import unittest, locale def assertLocale(loc=None): result = locale.setlocale(locale.LC_ALL, loc) assert result == loc, (loc, result) reload(currencies) class LocaleTests(unittest.TestCase): TEST_AMOUNT = 1234.5 def tearDown(self): testbase.resetLocale() def testDateParsing(self): #INCOMPLETE assertLocale(testbase.LOCALES[0]) def testLocaleCurrencyRobustness(self): # Test locale.format() thousand separator workaround. # Also calculator bug LP: #375308 # Depends on language-pack-(ru/fr)-base for loc in testbase.LOCALES: assertLocale(loc) # The test is that none of these calls throw an exception including the unicode conversion. for curr in currencies.CurrencyList: unicode(curr().float2str(1000)) # Automatically generate some tests for locales. localeDisplays = {} for loc in testbase.LOCALES: assertLocale(loc) localeDisplays[loc] = currencies.LocalizedCurrency().float2str(LocaleTests.TEST_AMOUNT) for loc in testbase.LOCALES: assertLocale(loc) localecurr = currencies.LocalizedCurrency() locales = [ currencies.UnitedStatesCurrency, currencies.RussianCurrency, currencies.EuroCurrency, ] for i, desiredloc in enumerate(testbase.LOCALES): desiredcurr = locales[i]() def test(self, localecurr=localecurr, desiredcurr=desiredcurr, desiredloc=desiredloc): self.assertEqual(localeDisplays[desiredloc], desiredcurr.float2str(LocaleTests.TEST_AMOUNT)) testName = ("test%sDisplays%sProperly"%(localecurr.GetCurrencyNick(), desiredcurr.GetCurrencyNick())).replace(" ", "") setattr(LocaleTests, testName, test) testbase.resetLocale() if __name__ == "__main__": unittest.main() wxbanker-0.9.1/wxbanker/tests/modeldisktests.py0000644000175000017500000004263312243601243021704 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # modeldisktests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase from wxbanker import controller, bankobjects from wxbanker.bankobjects.recurringtransaction import RecurringTransaction from wxbanker.bankobjects.tag import Tag from wxbanker.tests.testbase import today, tomorrow import os, unittest from wx.lib.pubsub import Publisher class ModelDiskTests(testbase.TestCaseWithControllerOnDisk): """ These are tests which require an actual database on disk. Thankfully using PRAGMA synchronous=off makes these still very quick. """ def testAutoSaveDisabledSimple(self): self.Controller.AutoSave = False self.assertFalse( self.Controller.AutoSave ) model1 = self.Controller.Model a1 = model1.CreateAccount("Checking Account") model2 = self.Controller.LoadPath("test.db") self.assertNotEqual(model1, model2) def testAutoSaveDisabledComplex(self): model1 = self.Controller.Model a1 = model1.CreateAccount("Checking Account") t1 = a1.AddTransaction(-10, "Description 1") model2 = self.Controller.LoadPath("test.db") self.assertEqual(model1, model2) self.Controller.Close(model2) self.Controller.AutoSave = False t2 = a1.AddTransaction(-10, "Description 3") model3 = self.Controller.LoadPath("test.db") self.assertFalse(model1 is model3) self.assertNotEqual(model1, model3) self.Controller.Close(model3) model1.Save() model4 = self.Controller.LoadPath("test.db") self.assertEqual(model1, model4) self.Controller.Close(model4) t1.Description = "Description 2" model5 = self.Controller.LoadPath("test.db") self.assertNotEqual(model1, model5) model1.Save() model6 = self.Controller.LoadPath("test.db") self.assertEqual(model1, model6) def testEnablingAutoSaveSaves(self): self.Controller.AutoSave = False self.Model.CreateAccount("A") # The model has unsaved changes, a new one should be different. model2 = self.Controller.LoadPath("test.db") self.assertNotEqual(self.Model, model2) self.Controller.Close(model2) # Setting AutoSave to true should trigger a save. self.Controller.AutoSave = True # Now a newly loaded should be equal. model3 = self.Controller.LoadPath("test.db") self.assertEqual(self.Model, model3) self.Controller.Close(model3) def testSaveEventSaves(self): self.Controller.AutoSave = False model1 = self.Controller.Model # Create an account, don't save. self.assertEqual(len(model1.Accounts), 0) model1.CreateAccount("Hello!") self.assertEqual(len(model1.Accounts), 1) # Make sure that account doesn't exist on a new model model2 = self.Controller.LoadPath("test.db") self.assertEqual(len(model2.Accounts), 0) self.assertNotEqual(model1, model2) # Save Publisher.sendMessage("user.saved") # Make sure it DOES exist after saving. model3 = self.Controller.LoadPath("test.db") self.assertEqual(len(model3.Accounts), 1) self.assertEqual(model1, model3) self.assertNotEqual(model2, model3) def testModelIsNotCached(self): # If this test fails, test*IsStored tests will pass but are no longer testing for regressions! model1 = self.Controller.Model model2 = model1.Store.GetModel(useCached=False) self.assertFalse(model1 is model2) self.assertEqual(model1, model2) # Now make sure a diversion in one makes them unequal. model1.CreateAccount("foo") self.assertNotEqual(model1, model2) def testRenameIsStored(self): model1 = self.Controller.Model a = model1.CreateAccount("A") a.Name = "B" model2 = model1.Store.GetModel(useCached=False) self.assertEqual(model2.Accounts[0].Name, "B") self.assertEqual(model1, model2) def testBalanceIsStored(self): model1 = self.Controller.Model a1 = model1.CreateAccount("A") self.assertEqual(a1.Balance, 0) a1.AddTransaction(1) self.assertEqual(a1.Balance, 1) model2 = model1.Store.GetModel(useCached=False) a2 = model2.Accounts[0] self.assertEqual(model1, model2) self.assertEqual(a1.Balance, a2.Balance) def testTransactionChangeIsStored(self): model1 = self.Controller.Model a1 = model1.CreateAccount("A") t1 = a1.AddTransaction(-1.25) t1.Description = "new" t1.Amount = -1.50 t1.Date = tomorrow model2 = model1.Store.GetModel(useCached=False) t2 = model2.GetTransactions()[0] self.assertEqual(t2.Description, "new") self.assertEqual(model1, model2) def testLinkedTransferIsStored(self): a, b, atrans, btrans = self.createLinkedTransfers() model1 = self.Controller.Model model2 = model1.Store.GetModel(useCached=False) a2, b2 = model2.Accounts self.assertEqual(a2.Name, "A") self.assertEqual(b2.Name, "B") bt = b2.Transactions[0] self.assertEqual(bt.Parent, b) self.assertEqual(bt.Parent, b2) link = bt.LinkedTransaction self.assertEqual(link.Parent, a) self.assertEqual(link.Parent, a2) self.assertTrue(bt in b2.Transactions) self.assertTrue(b2.Transactions[0] is bt) self.assertTrue(link in a2.Transactions) def testRecurringTransactionIsStored(self): model1 = self.Controller.Model a = model1.CreateAccount("A") a.AddRecurringTransaction(1, "test", today, repeatType=1) model2 = model1.Store.GetModel(useCached=False) self.assertEqual(model1, model2) repeatOn = model2.GetRecurringTransactions()[0].RepeatOn self.assertEqual(len(repeatOn), 7) self.assertEqual(sum(repeatOn), 1) def testRecurringRepeatTypeIsStoredOnUpdate(self): model1 = self.Controller.Model a = model1.CreateAccount("A") rt = a.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) self.assertEqual(rt.RepeatType, 0) rt.RepeatType = 2 model2 = model1.Store.GetModel(useCached=False) rt2 = model2.GetRecurringTransactions()[0] self.assertEqual(rt2.RepeatType, 2) self.assertEqual(model1, model2) def testRecurringRepeatEveryIsStoredOnUpdate(self): model1 = self.Controller.Model a = model1.CreateAccount("A") rt = a.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) self.assertEqual(rt.RepeatEvery, 1) rt.RepeatEvery = 2 model2 = model1.Store.GetModel(useCached=False) self.assertEqual(model2.GetRecurringTransactions()[0].RepeatEvery, 2) self.assertEqual(model1, model2) def testRecurringRepeatOnIsStoredOnUpdate(self): model1 = self.Controller.Model a = model1.CreateAccount("A") rt = a.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) self.assertEqual(rt.RepeatOn, None) rt.RepeatOn = [5,6] model2 = model1.Store.GetModel(useCached=False) self.assertEqual(model2.GetRecurringTransactions()[0].RepeatOn, [5,6]) self.assertEqual(model1, model2) def testRecurringEndDateIsStoredOnUpdate(self): model1 = self.Controller.Model a = model1.CreateAccount("A") rt = a.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) self.assertEqual(rt.EndDate, None) rt.EndDate = today model2 = model1.Store.GetModel(useCached=False) self.assertEqual(model2.GetRecurringTransactions()[0].EndDate, today) self.assertEqual(model1, model2) def testRecurringInheritedPropsAreStoredOnUpdate(self): model1 = self.Controller.Model a = model1.CreateAccount("A") rt = a.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) self.assertEqual(rt.Amount, 1) self.assertEqual(rt.Date, today) self.assertEqual(rt.Description, "test") rt.Amount = 2 rt.Date = tomorrow rt.Description = "new" model2 = model1.Store.GetModel(useCached=False) t = model2.GetRecurringTransactions()[0] self.assertEqual(t.Amount, 2) self.assertEqual(t.Date, tomorrow) self.assertEqual(t.Description, "new") self.assertEqual(model1, model2) def testRecurringLastUpdatesIsStoredOnUpdate(self): model1 = self.Controller.Model a = model1.CreateAccount("A") rt = a.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) self.assertEqual(rt.LastTransacted, None) rt.PerformTransactions() self.assertEqual(rt.LastTransacted, today) model2 = model1.Store.GetModel(useCached=False) self.assertEqual(model2.GetRecurringTransactions()[0].LastTransacted, today) self.assertEqual(model1, model2) def testRecurringSourceIsStoredOnUpdate(self): model1 = self.Controller.Model a = model1.CreateAccount("A") b = model1.CreateAccount("B") rt = a.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) self.assertEqual(rt.Source, None) rt.Source = b self.assertEqual(rt.Source, b) model2 = model1.Store.GetModel(useCached=False) self.assertEqual(model2.GetRecurringTransactions()[0].Source, b) self.assertEqual(model1, model2) def testTransactionParentIsRestored(self): model1 = self.Controller.Model a = model1.CreateAccount("A") t = a.AddTransaction(1) self.assertEqual(t.Parent, a) model2 = model1.Store.GetModel(useCached=False) t2 = model2.GetTransactions()[0] self.assertEqual(t2.Parent, a) def testLinkedTransferObjectIsInParent(self): a, b, atrans, btrans = self.createLinkedTransfers() # First make sure the state of these is as expected before we load fresh. link = atrans.LinkedTransaction self.assertTrue(link is btrans) self.assertEqual(a._Transactions, None) self.assertEqual(b._Transactions, None) bts = b.Transactions self.assertEqual(len(bts), 1) self.assertTrue(btrans is bts[0]) self.assertTrue(bts[0] is link) # Now load from disk and see how we are doing. model2 = self.Model.Store.GetModel(useCached=False) a, b = model2.Accounts self.assertEqual((a.Name, b.Name), ("A", "B")) self.assertEqual(a._Transactions, None) self.assertEqual(b._Transactions, None) link = a.Transactions[0].LinkedTransaction self.assertTrue(link in b.Transactions) # Here is the real trick. These instances should be the same or it isn't QUITE the real link. self.assertTrue(link is b.Transactions[0]) def testTransferDescriptionSetsCorrectly(self): a, b, atrans, btrans = self.createLinkedTransfers() self.assertEqual(atrans.Description, "Transfer from B (test)") self.assertEqual(atrans._Description, "test") atrans.Description = "cats" self.assertEqual(atrans.Description, "Transfer from B (cats)") self.assertEqual(atrans._Description, "cats") model2 = self.Model.Store.GetModel(useCached=False) a, b = model2.Accounts self.assertEqual((a.Name, b.Name), ("A", "B")) atrans2 = a.Transactions[0] self.assertEqual(atrans2.Description, "Transfer from B (cats)") self.assertEqual(atrans2._Description, "cats") def testTransactionRecurringParentIsStored(self): model1 = self.Controller.Model a = model1.CreateAccount("A") rt = a.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY, endDate=today) rt.PerformTransactions() model2 = model1.Store.GetModel(useCached=False) t2 = model2.GetTransactions()[0] rt2 = model2.GetRecurringTransactions()[0] self.assertEqual(t2.RecurringParent, rt) self.assertTrue(t2.RecurringParent is rt2) def testLastAccountIsStored(self): model1 = self.Controller.Model a = model1.CreateAccount("A") model1.LastAccountId = a.ID model2 = model1.Store.GetModel(useCached=False) self.assertEqual(model2.LastAccountId, a.ID) def testTransferFieldsAreLinked(self): """Test that changing the date, description, and amount in one transaction changes the link as well.""" model = self.Controller.Model a = model.CreateAccount("A") b = model.CreateAccount("B") at, bt = a.AddTransaction(1, description="Happy Yogurt", source=b) self.assertEqual(at.Description, "Transfer from B (Happy Yogurt)") self.assertEqual(bt.Description, "Transfer to A (Happy Yogurt)") # Update the description, make sure it updates the link. at.Description = "Pizza My Heart" self.assertEqual(at.Description, "Transfer from B (Pizza My Heart)") self.assertEqual(bt.Description, "Transfer to A (Pizza My Heart)") # Update the amount, make sure it updates the link. at.Amount = 2 self.assertEqual(at.Amount, 2) self.assertEqual(bt.Amount, -2) # Update the date, make sure it updates the link. at.Date = tomorrow self.assertEqual(at.Date, tomorrow) self.assertEqual(bt.Date, tomorrow) model2 = model.Store.GetModel(useCached=False) self.assertEqual(model, model2) def testTransactionPropertiesChangedViaMethodsAreStored(self): model = self.Model a = model.CreateAccount("A") t = a.AddTransaction(1, description="foo", date=today) t.SetAmount(2) t.SetDescription("bar") t.SetDate(tomorrow) model2 = model.Store.GetModel(useCached=False) self.assertEqual(model, model2) def testHandlesDeletingALinkedTransaction(self): a, b, atrans, btrans = self.createLinkedTransfers() self.assertEqual(a.Balance, 1) self.assertEqual(a.Transactions, [atrans]) model = self.Model model.RemoveAccount(b.Name) self.assertEqual(a.Balance, 1) self.assertEqual(a.Transactions, [atrans]) model2 = model.Store.GetModel(useCached=False) self.assertEqual(model, model2) def testMintIntegrationEnabledIsStored(self): model = self.Model self.assertEqual(model.MintEnabled, False) model.MintEnabled = True self.assertEqual(model.MintEnabled, True) model2 = model.Store.GetModel(useCached=False) self.assertEqual(model2.MintEnabled, True) # Test equality self.assertEqual(model, model2) model.MintEnabled = False self.assertNotEqual(model, model2) def testTagsAreStored(self): model = self.Model a = model.CreateAccount("A") t = a.AddTransaction(amount=1, description="testing #foo") self.assertEqual(t.Tags, set([Tag("foo")])) self.assertEqual(model.Tags, set([Tag("foo")])) model2 = model.Store.GetModel(useCached=False) a2 = model2.Accounts[0] t2 = a2.Transactions[0] self.assertEqual(t2.Tags, set([Tag("foo")])) self.assertEqual(model2.Tags, set([Tag("foo")])) def testDeletedRecurringTransactionIsStored(self): model1 = self.Controller.Model a = model1.CreateAccount("A") rt = a.AddRecurringTransaction(1, "test", today, repeatType=1) rt.PerformTransactions() self.assertLength(a.Transactions, 1) self.assertEqual(a.Transactions[0].RecurringParent, rt) a.RemoveRecurringTransaction(rt) self.assertLength(a.RecurringTransactions, 0) self.assertEqual(a.Transactions[0].RecurringParent, None) # Make sure it has no RecurringTransactions and that the existing transaction has no RecurringParent. model2 = model1.Store.GetModel(useCached=False) self.assertEqual(model1, model2) a2 = model2.Accounts[0] self.assertEqual(a2.RecurringTransactions, []) self.assertEqual(model2.Accounts[0].Transactions[0].RecurringParent, None) if __name__ == "__main__": unittest.main() wxbanker-0.9.1/wxbanker/tests/modelequalitytests.py0000644000175000017500000000756712243601243022616 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # modelequalitytests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase from wxbanker.bankobjects.transaction import Transaction import unittest class ModelEqualityTest(testbase.TestCaseWithController): def testBlankModelsAreEqual(self): model1 = self.Controller.Model model2 = self.Controller.LoadPath(":memory:") self.assertEqual(model1, model2) def testAccountsWithDifferentNamesArentEqual(self): model1 = self.Controller.Model model2 = self.Controller.LoadPath(":memory:") model1.CreateAccount("A") self.assertNotEqual(model1, model2) model2.CreateAccount("B") self.assertNotEqual(model1, model2) def testAccountWithRecurringTransactionsIsNotEqualToAccountWithout(self): # make sure a model with rts is not equal to one without model1 = self.Controller.Model model2 = self.Controller.LoadPath(":memory:") a = model1.CreateAccount("A") b = model2.CreateAccount("A") self.assertEqual(model1, model2) a.AddRecurringTransaction(0, "", None, 0) self.assertNotEqual(model1, model2) return model1, model2, a, b def assertChangingAttributeTogglesEquality(self, obj, attr, val, model1, model2): self.assertEqual(model1, model2) oldVal = getattr(obj, attr) setattr(obj, attr, val) self.assertNotEqual(model1, model2) setattr(obj, attr, oldVal) self.assertEqual(model1, model2) def testDifferentRecurringTransactionsArentEqual(self): model1, model2, a, b = self.testAccountWithRecurringTransactionsIsNotEqualToAccountWithout() self.assertNotEqual(model1, model2) rt = b.AddRecurringTransaction(0, "", None, 0) self.assertEqual(model1, model2) self.assertChangingAttributeTogglesEquality(rt, "Amount", 5, model1, model2) self.assertChangingAttributeTogglesEquality(rt, "RepeatType", 5, model1, model2) self.assertChangingAttributeTogglesEquality(rt, "RepeatEvery", "2", model1, model2) self.assertChangingAttributeTogglesEquality(rt, "RepeatOn", [1,3], model1, model2) self.assertChangingAttributeTogglesEquality(rt, "EndDate", testbase.yesterday, model1, model2) self.assertChangingAttributeTogglesEquality(rt, "Source", a, model1, model2) self.assertChangingAttributeTogglesEquality(rt, "LastTransacted", testbase.yesterday, model1, model2) def testModelTagEquality(self): model1 = self.Controller.Model model2 = self.Controller.LoadPath(":memory:") self.assertEqual(model1, model2) model2._Tags = {"foo": 1} self.assertNotEqual(model1, model2) def testTransactionTagEquality(self): t1 = Transaction(None, None, 1, "", None) t2 = Transaction(None, None, 1, "", None) self.assertEqual(t1, t2) t2._Tags = set(["foo"]) self.assertFalse(t1 == t2) # Why does assertNotEquals(t1, t2) not work? if __name__ == "__main__": unittest.main() wxbanker-0.9.1/wxbanker/tests/modeltests.py0000644000175000017500000005226612243601243021034 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # modeltests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase import os, datetime, unittest from wxbanker import controller, bankexceptions, currencies from wx.lib.pubsub import Publisher from wxbanker.bankobjects.account import Account from wxbanker.mint import api as mintapi from wxbanker.tests.testbase import today, yesterday, tomorrow class ModelTests(testbase.TestCaseWithController): def testRobustTransactionAmountParsing(self): model = self.Controller.Model a = model.CreateAccount("Test") self.assertEquals(a.ParseAmount("3"), 3) self.assertEquals(a.ParseAmount(".3"), .3) self.assertEquals(a.ParseAmount(".31"), .31) self.assertEquals(a.ParseAmount(",3"), .3) self.assertEquals(a.ParseAmount(",31"), .31) self.assertEquals(a.ParseAmount("1.5"), 1.5) self.assertEquals(a.ParseAmount("1,5"), 1.5) self.assertEquals(a.ParseAmount("10"), 10) self.assertEquals(a.ParseAmount("10."), 10) self.assertEquals(a.ParseAmount("10.1"), 10.1) self.assertEquals(a.ParseAmount("10.23"), 10.23) self.assertEquals(a.ParseAmount("10,"), 10) self.assertEquals(a.ParseAmount("10,1"), 10.1) self.assertEquals(a.ParseAmount("10,23"), 10.23) self.assertEquals(a.ParseAmount("1 000"), 1000) self.assertEquals(a.ParseAmount("1 000."), 1000) self.assertEquals(a.ParseAmount("1 000,"), 1000) self.assertEquals(a.ParseAmount("1,000"), 1000) self.assertEquals(a.ParseAmount("1,000."), 1000) self.assertEquals(a.ParseAmount("1,000.2"), 1000.2) self.assertEquals(a.ParseAmount("1.000.23"), 1000.23) self.assertEquals(a.ParseAmount("1 000.23"), 1000.23) self.assertEquals(a.ParseAmount("1,000.23"), 1000.23) self.assertEquals(a.ParseAmount("1.000,23"), 1000.23) self.assertEquals(a.ParseAmount("1 000,23"), 1000.23) self.assertEquals(a.ParseAmount("1234567890"), 1234567890) def testFreshAccount(self): a = self.Model.CreateAccount("Fresh") self.assertEqual(a.Balance, 0) self.assertEqual(a.Transactions, []) self.assertEqual(a.Name, "Fresh") def testCannotRemoveNonexistentAccount(self): self.assertRaisesWithMsg(self.Model.RemoveAccount, ["Foo"], bankexceptions.InvalidAccountException, "Invalid account 'Foo' specified.") def testCannotCreateAccountWithSameName(self): a = self.Model.CreateAccount("A") self.assertRaisesWithMsg(self.Model.CreateAccount, ["A"], bankexceptions.AccountAlreadyExistsException, "Account 'A' already exists.") def testControllerIsAutoSavingByDefault(self): self.assertTrue( self.Controller.AutoSave ) def testNewAccountIsSameCurrencyAsOthers(self): # This test is only valid so long as only one currency is allowed. # Otherwise it needs to test a new account gets the right default currency, probably Localized model = self.Controller.Model account = model.CreateAccount("Hello") self.assertEqual(account.Currency, currencies.LocalizedCurrency()) account.Currency = currencies.EuroCurrency() self.assertEqual(account.Currency, currencies.EuroCurrency()) account2 = model.CreateAccount("Another!") self.assertEqual(account2.Currency, currencies.EuroCurrency()) def testLoadingTransactionsPreservesReferences(self): a = self.Model.CreateAccount("A") t = a.AddTransaction(1, "First") self.assertEqual(t.Description, "First") # When we do a.Transactions, the list gets loaded with new # transaction objects, so let's see if the containership test works. self.assertTrue(t in a.Transactions) # 't' is the original transaction object created before Transactions # was loaded, but it should be in the list due to magic. t.Description = "Second" self.assertEqual(a.Transactions[0].Description, "Second") def testSimpleMove(self): model1 = self.Controller.Model a = model1.CreateAccount("A") t1 = a.AddTransaction(-1) b = model1.CreateAccount("B") a.MoveTransaction(t1, b) self.assertFalse(t1 in a.Transactions) self.assertTrue(t1 in b.Transactions) self.assertNotEqual(t1.Parent, a) self.assertEqual(t1.Parent, b) def testTransactionPropertyBug(self): model1 = self.Controller.Model a = model1.CreateAccount("A") t1 = a.AddTransaction(-1) self.assertEqual(len(a.Transactions), 1) def testDirtyExitWarns(self): """ This test is kind of hilarious. We want to make sure we are warned of exiting with a dirty model, so we create an account, register a callback which will change its name when the dirty warning goes out, then trigger a dirty exit and make sure the account name has changed. """ self.Controller.AutoSave = False a = self.Model.CreateAccount("Unwarned!") # Create and register our callback to test for the warning message. def cb(message): a.Name = "Warned" Publisher.subscribe(cb, "warning.dirty exit") # Now send the exiting message, which should cause our callback to fire if everything is well. Publisher.sendMessage("exiting") self.assertEqual(a.Name, "Warned") def testAnnouncedAccountHasParent(self): """ Make sure the account has a Parent when it announces itself. To do this we need to test this in a listener. """ parent = [] def listener(message): account = message.data parent.append(account.Parent) # Subscribe our listener Publisher.subscribe(listener, "account.created") # Create an account, which should trigger the listener baby = self.Model.CreateAccount("Baby") # Make sure the listener updated state appropriately self.assertTrue(parent) def testSiblingsSingleAccount(self): baby = self.Model.CreateAccount("Baby") self.assertEqual(baby.GetSiblings(), []) def testSiblingsTwoAccounts(self): a = self.Model.CreateAccount("A") b = self.Model.CreateAccount("B") self.assertEqual(a.GetSiblings(), [b]) self.assertEqual(b.GetSiblings(), [a]) def testTransfersAreLinked(self): a, b, atrans, btrans = self.createLinkedTransfers() self.assertEqual(atrans.Parent, a) self.assertEqual(btrans.Parent, b) self.assertEqual(atrans.LinkedTransaction, btrans) self.assertEqual(btrans.LinkedTransaction, atrans) self.assertEqual(a.Transactions, [atrans]) self.assertEqual(b.Transactions, [btrans]) def testDeletingTransferDeletesBoth(self): a, b, atrans, btrans = self.createLinkedTransfers() model = self.Controller.Model self.assertEqual(len(model.Accounts), 2) self.assertEqual(model.GetTransactions(), [atrans, btrans]) self.assertEqual(model.Balance, 0) self.assertEqual(len(a.Transactions), 1) self.assertEqual(len(b.Transactions), 1) a.RemoveTransaction(atrans) self.assertEqual(len(a.Transactions), 0) self.assertEqual(len(b.Transactions), 0) self.assertEqual(model.GetTransactions(), []) self.assertEqual(model.Balance, 0) def testEmptyAccountNameInvalidForNewAccount(self): self.assertRaises(bankexceptions.BlankAccountNameException, lambda: self.Controller.Model.CreateAccount(""), ) def testEmptyAccountNameInvalidForRename(self): a = self.Controller.Model.CreateAccount("Test") def blankName(): a.Name = "" self.assertRaises(bankexceptions.BlankAccountNameException, blankName) def testGetDateRangeWhenEmpty(self): self.assertEqual(self.Controller.Model.GetDateRange(), (datetime.date.today(), datetime.date.today())) def testGetDateRangeWithTransactions(self): model = self.Controller.Model a = model.CreateAccount("A") a.AddTransaction(1, date=yesterday) a.AddTransaction(1, date=tomorrow) self.assertEqual(model.GetDateRange(), (yesterday, tomorrow)) def testGetDateRangeSorts(self): # Make sure that the transactions don't need to be in order for GetDateRange to work. model = self.Controller.Model a = model.CreateAccount("A") a.AddTransaction(1, date=today) a.AddTransaction(1, date=yesterday) self.assertEqual(model.GetDateRange(), (yesterday, today)) def testAccountRename(self): model = self.Controller.Model a = model.CreateAccount("A") self.assertEqual(a.Name, "A") a.Name = "B" self.assertEqual(a.Name, "B") self.assertRaisesWithMsg(model.RemoveAccount, ["A"], bankexceptions.InvalidAccountException, "Invalid account 'A' specified.") def testTransactionDescriptionChange(self): model = self.Controller.Model a = model.CreateAccount("A") t = a.AddTransaction(1, "test") self.assertEqual(t.Description, "test") t.Description = "new" self.assertEqual(t.Description, "new") def testBalanceIsUpdatedOnTransactionAdded(self): model = self.Controller.Model a = model.CreateAccount("A") self.assertEqual(a.Balance, 0) a.AddTransaction(1) self.assertEqual(a.Balance, 1) def testBalanceIsUpdatedOnTransactionRemoved(self): model = self.Controller.Model a = model.CreateAccount("A") self.assertEqual(a.Balance, 0) t = a.AddTransaction(1) self.assertEqual(a.Balance, 1) a.RemoveTransaction(t) self.assertEqual(a.Balance, 0) def testBalanceIsUpdatedOnTransactionAmountModified(self): model = self.Controller.Model a = model.CreateAccount("A") self.assertEqual(a.Balance, 0) t = a.AddTransaction(1) self.assertEqual(a.Balance, 1) t.Amount = 2 self.assertEqual(a.Balance, 2) def testModelBalance(self): model = self.Controller.Model self.assertEqual(model.Balance, 0) a = model.CreateAccount("A") a.AddTransaction(1) self.assertEqual(model.Balance, 1) b = model.CreateAccount("B") b.AddTransaction(2) self.assertEqual(model.Balance, 3) def testRemovingTransactionsReturnsSources(self): model = self.Controller.Model a = model.CreateAccount("A") b = model.CreateAccount("B") t = a.AddTransaction(1) result = a.RemoveTransaction(t) self.assertEqual(result, [None]) ta, tb = a.AddTransaction(1, source=b) result = a.RemoveTransaction(ta) self.assertEqual(result, [b], result[0].Name) def testCanMoveTransferSource(self): model = self.Controller.Model a = model.CreateAccount("A") b = model.CreateAccount("B") atrans, btrans = a.AddTransaction(1, source=b) self.assertEqual(len(model.GetTransactions()), 2) self.assertEqual(model.Balance, 0) self.assertEqual(atrans.Description, "Transfer from B") self.assertEqual(btrans.Description, "Transfer to A") c = model.CreateAccount("C") b.MoveTransaction(btrans, c) self.assertEqual(b.Transactions, []) self.assertEqual(len(a.Transactions), 1) self.assertEqual(len(c.Transactions), 1) atrans = a.Transactions[0] ctrans = c.Transactions[0] self.assertEqual(atrans.LinkedTransaction, ctrans) self.assertEqual(ctrans.LinkedTransaction, atrans) self.assertEqual(atrans.Description, "Transfer from C") self.assertEqual(ctrans.Description, "Transfer to A") def testCanMoveTransferDestination(self): model = self.Controller.Model a = model.CreateAccount("A") b = model.CreateAccount("B") atrans, btrans = a.AddTransaction(1, source=b) self.assertEqual(len(model.GetTransactions()), 2) self.assertEqual(model.Balance, 0) self.assertEqual(atrans.Description, "Transfer from B") self.assertEqual(btrans.Description, "Transfer to A") c = model.CreateAccount("C") a.MoveTransaction(atrans, c) self.assertEqual(a.Transactions, []) self.assertEqual(len(b.Transactions), 1) self.assertEqual(len(c.Transactions), 1) btrans = b.Transactions[0] ctrans = c.Transactions[0] self.assertEqual(btrans.LinkedTransaction, ctrans) self.assertEqual(ctrans.LinkedTransaction, btrans) self.assertEqual(btrans.Description, "Transfer to C") self.assertEqual(ctrans.Description, "Transfer from B") def testTransferDescriptionWithoutDescription(self): model = self.Controller.Model a = model.CreateAccount("A") b = model.CreateAccount("B") at, bt = a.AddTransaction(1, source=b) self.assertEqual(at._Description, "") self.assertEqual(bt._Description, "") self.assertEqual(at.Description, "Transfer from B") self.assertEqual(bt.Description, "Transfer to A") def testTransferDescriptionWithDescription(self): model = self.Controller.Model a = model.CreateAccount("A") b = model.CreateAccount("B") at, bt = a.AddTransaction(1, description="hello world", source=b) self.assertEqual(at._Description, "hello world") self.assertEqual(bt._Description, "hello world") self.assertEqual(at.Description, "Transfer from B (hello world)") self.assertEqual(bt.Description, "Transfer to A (hello world)") def testTransferMoveDescriptionWithDescription(self): model = self.Controller.Model a = model.CreateAccount("A") b = model.CreateAccount("B") c = model.CreateAccount("C") at, bt = a.AddTransaction(1, description="hello world", source=b) a.MoveTransaction(at, c) bt, ct = b.Transactions[0], c.Transactions[0] self.assertEqual(ct._Description, "hello world") self.assertEqual(bt._Description, "hello world") self.assertEqual(ct.Description, "Transfer from B (hello world)") self.assertEqual(bt.Description, "Transfer to C (hello world)") def testUnicodeTransactionDescription(self): unicodeString = u'¥' unicodeString2 = u'¥2' model = self.Controller.Model a = model.CreateAccount("A") t = a.AddTransaction(1, description=unicodeString) self.assertEqual(t.Description, unicodeString) t.Description = unicodeString2 self.assertEqual(t.Description, unicodeString2) def testUnicodeSearch(self): unicodeString = u'¥' model = self.Controller.Model a = model.CreateAccount("A") self.assertEqual(model.Search(unicodeString), []) t = a.AddTransaction(1, description=unicodeString) self.assertEqual(model.Search(unicodeString), [t]) def testAccountsAreSorted(self): model = self.Controller.Model b = model.CreateAccount("B") self.assertEqual(model.Accounts, [b]) a = model.CreateAccount("A") self.assertEqual(model.Accounts, [a, b]) a.Name = "Z" self.assertEqual(model.Accounts, [b, a]) def testDefaultLastAccountIsNone(self): model = self.Controller.Model self.assertEqual(model.LastAccountId, None) def testLastAccountIsUpdated(self): model = self.Controller.Model a = model.CreateAccount("A") self.assertEqual(model.LastAccountId, None) Publisher.sendMessage("view.account changed", a) self.assertEqual(model.LastAccountId, a.ID) def testTransactionDateMassaging(self): model = self.Controller.Model t = model.CreateAccount("A").AddTransaction(1) self.assertEqual(t.Date, today) t.Date = "2001/01/01" self.assertEqual(t.Date, datetime.date(2001, 1, 1)) t.Date = "2008-01-06" self.assertEqual(t.Date, datetime.date(2008, 1, 6)) t.Date = "08-01-06" self.assertEqual(t.Date, datetime.date(2008, 1, 6)) t.Date = "86-01-06" self.assertEqual(t.Date, datetime.date(1986, 1, 6)) t.Date = "11-01-06" self.assertEqual(t.Date, datetime.date(2011, 1, 6)) t.Date = "0-1-6" self.assertEqual(t.Date, datetime.date(2000, 1, 6)) t.Date = "0/1/6" self.assertEqual(t.Date, datetime.date(2000, 1, 6)) t.Date = datetime.date(2008, 1, 6) self.assertEqual(t.Date, datetime.date(2008, 1, 6)) t.Date = None self.assertEqual(t.Date, datetime.date.today()) def testDeletingAccountDoesNotDeleteSiblingLinkedTransfers(self): """If you close (delete) an account, it is still true that the transfers occurred.""" a, b, atrans, btrans = self.createLinkedTransfers() model = self.Model self.assertTrue(atrans in a.Transactions) self.assertTrue(btrans in b.Transactions) self.assertEqual(atrans.LinkedTransaction, btrans) self.assertEqual(btrans.LinkedTransaction, atrans) model.RemoveAccount(b.Name) self.assertTrue(atrans in a.Transactions) self.assertEqual(atrans.LinkedTransaction, None) def testDefaultMintIntegrationIsFalse(self): self.assertEqual(self.Model.MintEnabled, False) def testAccountMintSync(self): mintapi.Mint._CachedAccounts = {1218040: {'name': 'PayPal PayPal', 'balance': -4277.24}} model = self.Model a = model.CreateAccount("Foo") self.assertFalse(a.IsMintEnabled()) self.assertRaises(bankexceptions.MintIntegrationException, a.IsInSync) a.MintId = 1218040 self.assertEquals(1218040, a.GetMintId()) self.assertTrue(a.IsMintEnabled()) self.assertFalse(a.IsInSync()) # Add the balance and we should be in sync. a.AddTransaction(-4277.24) self.assertTrue(a.IsInSync()) self.assertEqual(a.GetSyncString(), "PayPal PayPal: -$4,277.24") def testAccountMintSyncWithFutureDates(self): mintapi.Mint._CachedAccounts = {1218040: {'name': 'foo', 'balance': -4277.24}} model = self.Model a = model.CreateAccount("Foo") a.MintId = 1218040 # Add the balance and we should be in sync. a.AddTransaction(-4277.24) self.assertTrue(a.IsInSync()) # Add a transaction today, we should be out of sync. t = a.AddTransaction(1) self.assertFalse(a.IsInSync()) # Change the date to tomorrow, we should be back in sync as of today. t.Date = tomorrow self.assertTrue(a.IsInSync()) def testAccountMintIdIsInt(self): model = self.Model a = model.CreateAccount("Foo") a.MintId = "12345" self.assertEquals(a.MintId, 12345) def testAccountCurrentBalance(self): model = self.Model a = model.CreateAccount("Bar") self.assertEqual(a.Balance, 0) self.assertEqual(a.CurrentBalance, 0) t1 = a.AddTransaction(1) self.assertEqual(a.Balance, 1) self.assertEqual(a.CurrentBalance, 1) t2 = a.AddTransaction(1, date=tomorrow) self.assertEqual(a.Balance, 2) self.assertEqual(a.CurrentBalance, 1) # Make sure that it isn't just by transaction order but actually date. t2.Date = today t1.Date = tomorrow self.assertEqual(a.Balance, 2) self.assertEqual(a.CurrentBalance, 1) def testAccountBalanceAndCurrencyNotNone(self): model = self.Model accounts = [ Account(model, None, "Foo"), Account(model, None, "Bar", currency=None), Account(model, None, "Food", balance=None), Account(model, None, "Pub", currency=None, balance=None) ] for account in accounts: self.assertEqual(account.Currency, currencies.CurrencyList[0]()) self.assertEqual(account.Balance, 0.0) self.assertTrue(type(account.Balance) is float) if __name__ == "__main__": unittest.main() wxbanker-0.9.1/wxbanker/tests/recurringtests.py0000644000175000017500000004076712243601243021737 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # recurringtests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase import unittest, datetime from bankobjects.recurringtransaction import RecurringTransaction from testbase import today, yesterday, tomorrow, one class RecurringTest(testbase.TestCaseWithController): def createAccount(self): model = self.Controller.Model return model, model.CreateAccount("A") def testRecurringTransactionsAreInitiallyEmpty(self): self.assertEqual(self.Controller.Model.GetRecurringTransactions(), []) def testGetChildren(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY, endDate=today) # Initially empty. self.assertLength(rt.GetChildren(), 0) # Make a transaction that shouldn't be a child. t = account.AddTransaction(1) self.assertLength(rt.GetChildren(), 0) rt.PerformTransactions() self.assertLength(rt.GetChildren(), 1) def testCanDeleteRecurringTransaction(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY, endDate=today) self.assertEqual(account.RecurringTransactions, [rt]) rt.PerformTransactions() self.assertEqual(len(account.Transactions), 1) self.assertEqual(account.Transactions[0].RecurringParent, rt) # Now remove it and make sure it is gone. account.RemoveRecurringTransaction(rt) self.assertEqual(account.RecurringTransactions, []) # The performed transaction should still exist but have no RecurringParent. self.assertEqual(len(account.Transactions), 1) self.assertEqual(account.Transactions[0].RecurringParent, None) def testRecurringDefaults(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) self.assertEqual(rt.RepeatType, RecurringTransaction.DAILY) self.assertEqual(rt.RepeatEvery, 1) self.assertEqual(rt.RepeatOn, None) self.assertEqual(rt.EndDate, None) self.assertEqual(rt.LastTransacted, None) def testRecurringWeeklyDefault(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", today, RecurringTransaction.WEEKLY) self.assertEqual(rt.RepeatType, RecurringTransaction.WEEKLY) self.assertEqual(rt.RepeatOn, [i==today.weekday() for i in range(7)]) def testCanCreateRecurringTransaction(self): model, account = self.createAccount() account.AddRecurringTransaction(1, "test", today, repeatType=RecurringTransaction.DAILY) rts = model.GetRecurringTransactions() self.assertEqual(len(rts), 1) def testRecurringDateDailySimple(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) dates = rt.GetUntransactedDates() self.assertEqual(dates, [today]) def testRecurringDateDailyWithEvery(self): model, account = self.createAccount() start = today - one*7 rt = account.AddRecurringTransaction(1, "test", start, RecurringTransaction.DAILY, repeatEvery=3) dates = rt.GetUntransactedDates() self.assertEqual(dates, [start, start+one*3, start+one*6]) def testRecurringDateDailyWithEnd(self): model, account = self.createAccount() start = today - one*4 rt = account.AddRecurringTransaction(1, "test", start, RecurringTransaction.DAILY, endDate=today-one*2) dates = rt.GetUntransactedDates() self.assertEqual(dates, [start, start+one, start+one*2]) def testRecurringDateWeeklySimple(self): model, account = self.createAccount() start = today - one*14 rt = account.AddRecurringTransaction(1, "test", start, RecurringTransaction.WEEKLY) dates = rt.GetUntransactedDates() self.assertEqual(dates, [start, start+one*7, start+one*14]) def testRecurringDateWeeklyEveryOtherWeekendDay(self): model, account = self.createAccount() start = datetime.date(2009, 1, 1) rt = account.AddRecurringTransaction(1, "test", start, RecurringTransaction.WEEKLY, repeatEvery=2, repeatOn=[0,0,0,0,0,1,1], endDate=datetime.date(2009, 1, 31)) dates = rt.GetUntransactedDates() self.assertEqual(dates, [datetime.date(2009, 1, 3), datetime.date(2009, 1, 4), datetime.date(2009, 1, 17), datetime.date(2009, 1, 18), datetime.date(2009, 1, 31)]) def testRecurringDateMonthly(self): model, account = self.createAccount() start = datetime.date(2009, 1, 1) rt = account.AddRecurringTransaction(1, "test", start, RecurringTransaction.MONTLY, endDate=datetime.date(2009, 3, 15)) dates = rt.GetUntransactedDates() self.assertEqual(dates, [start, datetime.date(2009, 2, 1), datetime.date(2009, 3, 1)]) def testRecurringDateMonthlyShortMonths(self): # Months should clamp their dates if the day number is too high. model, account = self.createAccount() start = datetime.date(2009, 1, 31) rt = account.AddRecurringTransaction(1, "test", start, RecurringTransaction.MONTLY, endDate=datetime.date(2009, 5, 1)) dates = rt.GetUntransactedDates() self.assertEqual(dates, [start, datetime.date(2009, 2, 28), datetime.date(2009, 3, 31), datetime.date(2009, 4, 30)]) def testRecurringDateMonthlyQuarterly(self): model, account = self.createAccount() start = datetime.date(2009, 1, 1) rt = account.AddRecurringTransaction(1, "test", start, RecurringTransaction.MONTLY, repeatEvery=3, endDate=datetime.date(2009, 12, 31)) dates = rt.GetUntransactedDates() self.assertEqual(dates, [start, datetime.date(2009, 4, 1), datetime.date(2009, 7, 1), datetime.date(2009, 10, 1)]) def testRecurringDateYearly(self): model, account = self.createAccount() start = datetime.date(2005, 1, 6) rt = account.AddRecurringTransaction(1, "birthday!", start, RecurringTransaction.YEARLY, repeatEvery=2, endDate=datetime.date(2009, 12, 31)) dates = rt.GetUntransactedDates() self.assertEqual(dates, [start, datetime.date(2007, 1, 6), datetime.date(2009, 1, 6)]) def testRecurringDateYearlyLeapYear(self): # If a transaction is entered on a leap day, it should only occur on future leap days. model, account = self.createAccount() start = datetime.date(2004, 2, 29) rt = account.AddRecurringTransaction(1, "leap day wee", start, RecurringTransaction.YEARLY, endDate=datetime.date(2009, 12, 31)) dates = rt.GetUntransactedDates() self.assertEqual(dates, [start, datetime.date(2008, 2, 29)]) def testUpdatesLastTransacted(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) self.assertEqual(rt.LastTransacted, None) rt.PerformTransactions() self.assertEqual(rt.LastTransacted, today) def testCanPerformTransactions(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", yesterday, RecurringTransaction.DAILY) self.assertEqual(account.Transactions, []) rt.PerformTransactions() transactions = model.GetTransactions() self.assertEqual(len(transactions), 2) t = transactions[0] self.assertEqual(t.Amount, 1) self.assertEqual(t.Description, "test") self.assertEqual(t.Date, yesterday) t = transactions[1] self.assertEqual(t.Amount, 1) self.assertEqual(t.Description, "test") self.assertEqual(t.Date, today) def testRecurringTransfer(self): model, account = self.createAccount() account2 = model.CreateAccount("B") rt = account.AddRecurringTransaction(5, "test", today, RecurringTransaction.DAILY, source=account2) self.assertEqual(model.GetTransactions(), []) rt.PerformTransactions() transactions = model.GetTransactions() self.assertEqual(len(transactions), 2) self.assertEqual(account.Transactions[0].Amount, 5) self.assertEqual(account2.Transactions[0].Amount, -5) def testDoesntMakeTransactionsAfterLastUpdated(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) self.assertEqual(len(account.Transactions), 0) rt.PerformTransactions() self.assertEqual(len(account.Transactions), 1) rt.PerformTransactions() self.assertEqual(len(account.Transactions), 1) def testUntransactedEndsTodayAtLatest(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", yesterday, RecurringTransaction.DAILY, endDate=tomorrow) dates = rt.GetUntransactedDates() self.assertEqual(dates, [yesterday, today]) def testStartCooperatesWithLastTransactedMonthly(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", datetime.date(2009, 1, 15), RecurringTransaction.MONTLY, endDate=datetime.date(2009, 2, 28)) dates = rt.GetUntransactedDates() self.assertEqual(len(dates), 2) # Now let's say we performed it on 2/1, there shouldn't be a transaction for 2/2 because it thinks the start is LastTransacted + 1. rt.LastTransacted = datetime.date(2009, 2, 1) dates = rt.GetUntransactedDates() self.assertEqual(dates, [datetime.date(2009, 2, 15)]) def testStartCooperatesWithLastTransactedYearly(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", datetime.date(2008, 1, 15), RecurringTransaction.YEARLY, endDate=datetime.date(2009, 2, 28)) dates = rt.GetUntransactedDates() self.assertEqual(len(dates), 2) # Now let's say we performed it on 2/1, there shouldn't be a transaction for 1/2 because it thinks the start is LastTransacted + 1. rt.LastTransacted = datetime.date(2009, 1, 1) dates = rt.GetUntransactedDates() self.assertEqual(dates, [datetime.date(2009, 1, 15)]) def testGettingUntransactedInFuture(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", tomorrow, RecurringTransaction.DAILY, endDate=tomorrow) self.assertEqual(rt.GetUntransactedDates(), []) self.assertEqual(rt.GetNext(), tomorrow) def testRecurringTransactionLinkIsNoneOnNormalTransaction(self): model, account = self.createAccount() t = account.AddTransaction(1) self.assertEqual(t.RecurringParent, None) def testRecurringTransactionLinkIsCorrectOnRecurringTransaction(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY, endDate=today) rt.PerformTransactions() ts = account.Transactions self.assertEqual(len(ts), 1) self.assertEqual(ts[0].RecurringParent, rt) def testRecurringSummaryDaily(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", today, RecurringTransaction.DAILY) self.assertEqual(rt.GetRecurrance(), "Daily") rt.EndDate = today self.assertEqual(rt.GetRecurrance(), "Daily until %s" % today) def testRecurringSummaryWeekly(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", datetime.date(2009, 1, 6), RecurringTransaction.WEEKLY) self.assertEqual(rt.GetRecurrance(), "Weekly on Tuesdays") rt.RepeatOn = [0,0,0,0,0,0,0] self.assertEqual(rt.GetRecurrance(), "Never") rt.RepeatOn = [1,1,1,1,1,1,1] self.assertEqual(rt.GetRecurrance(), "Daily") rt.RepeatOn = [1,1,1,1,1,0,0] self.assertEqual(rt.GetRecurrance(), "Weekly on weekdays") rt.RepeatOn = [0,0,0,0,0,1,1] self.assertEqual(rt.GetRecurrance(), "Weekly on weekends") rt.RepeatOn = [1,0,1,0,0,0,0] self.assertEqual(rt.GetRecurrance(), "Weekly on Mondays and Wednesdays") rt.RepeatOn = [1,0,1,0,0,1,0] self.assertEqual(rt.GetRecurrance(), "Weekly on Mondays, Wednesdays and Saturdays") rt.EndDate = today self.assertEqual(rt.GetRecurrance(), "Weekly on Mondays, Wednesdays and Saturdays until %s" % today) rt.RepeatEvery = 2 self.assertEqual(rt.GetRecurrance(), "Every 2 weeks on Mondays, Wednesdays and Saturdays until %s" % today) def testRecurringSummaryMonthly(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", today, RecurringTransaction.MONTLY) self.assertEqual(rt.GetRecurrance(), "Monthly") rt.RepeatEvery = 3 self.assertEqual(rt.GetRecurrance(), "Every 3 months") rt.EndDate = today self.assertEqual(rt.GetRecurrance(), "Every 3 months until %s" % today) def testRecurringSummaryYearly(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "test", today, RecurringTransaction.YEARLY) self.assertEqual(rt.GetRecurrance(), "Annually") rt.EndDate = today self.assertEqual(rt.GetRecurrance(), "Annually until %s" % today) rt.RepeatEvery = 10 self.assertEqual(rt.GetRecurrance(), "Every 10 years until %s" % today) def testGetDueString(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "Example Description", yesterday, RecurringTransaction.DAILY) self.assertEqual(rt.GetDueString(), "Example Description, $1.00: %s, %s" % (yesterday, today)) def testGetDescriptionString(self): model, account = self.createAccount() rt = account.AddRecurringTransaction(1, "Example Description", yesterday, RecurringTransaction.DAILY) self.assertEqual(rt.GetDescriptionString(), "Example Description, $1.00: Daily") def testUpdateFrom(self): model, account = self.createAccount() account2 = model.CreateAccount("Giggles") rt = account.AddRecurringTransaction(1, "Example Description", yesterday, RecurringTransaction.DAILY) rt2 = account.AddRecurringTransaction(2, "Other Description", today, RecurringTransaction.WEEKLY, repeatEvery=2, repeatOn=(1,1,0,0,0,0,0), endDate=tomorrow, source=account2) rt.LastTransacted = yesterday rt2.LastTransacted = today rt.UpdateFrom(rt2) # Make sure everything is updated. self.assertEqual(rt.Amount, 2) self.assertEqual(rt.Description, "Other Description") self.assertEqual(rt.Date, today) self.assertEqual(rt.RepeatType, RecurringTransaction.WEEKLY) self.assertEqual(rt.RepeatEvery, 2) self.assertEqual(rt.RepeatOn, (1,1,0,0,0,0,0)) self.assertEqual(rt.EndDate, tomorrow) self.assertEqual(rt.Source, account2) # Except LastTransacted should NOT be updated, that should stay the same as it was. self.assertEqual(rt.LastTransacted, yesterday) if __name__ == "__main__": unittest.main() wxbanker-0.9.1/wxbanker/tests/storetests.py0000644000175000017500000000323512243601243021060 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # storetests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase class StoreTests(testbase.TestCaseWithController): def testRemovingAccountRemovesTransactions(self): model = self.Model def howmany(query): return len(model.Store.dbconn.cursor().execute(query).fetchall()) self.assertEqual(howmany("SELECT * FROM accounts"), 0) self.assertEqual(howmany("SELECT * FROM transactions"), 0) foo = model.CreateAccount("Foo") foo.AddTransaction(1) self.assertEqual(howmany("SELECT * FROM accounts"), 1) self.assertEqual(howmany("SELECT * FROM transactions"), 1) model.RemoveAccount(foo.Name) self.assertEqual(howmany("SELECT * FROM accounts"), 0) self.assertEqual(howmany("SELECT * FROM transactions"), 0) wxbanker-0.9.1/wxbanker/tests/summarytests.py0000644000175000017500000001134312243601243021420 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # summarytests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase from wxbanker import bankobjects import unittest, datetime from wxbanker.tests.testbase import today, yesterday, one from wxbanker.plots.baseplot import BasePlot class SummaryTests(testbase.TestCaseWithController): def setUp(self): testbase.TestCaseWithController.setUp(self) self.basePlot = BasePlot() def get(self, transactionsData, numPoints, *args): # Remove all existing accounts, it is assumed that none exist for account in self.Model.Accounts: self.Model.RemoveAccount(account.Name) a = self.Model.CreateAccount("A") for (date, amount) in transactionsData: a.AddTransaction(amount=amount, date=date) return self.basePlot.getPoints(self.Model.GetXTotals(*args), numPoints) def testGetTenPointsWithNoTransactions(self): result = self.get([], 10) self.assertEqual(result[0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) self.assertEqual(result[1], datetime.date.today()) # Make sure it is close to zero but not zero. self.assertNotEqual(result[2], 0) self.assertAlmostEqual(result[2], 0) def testGetPointsWithOneTransaction(self): result = self.get([("2008/1/6", 1)], 3) self.assertEqual(result[0], [1.0, 1.0, 1.0]) result = self.get([(today, 1)], 2) self.assertEqual(result[0], [1.0, 1.0]) self.assertEqual(result[1], today) self.assertNotEqual(result[2], 0) def testGetOnePointWithTwoTransactionsYesterdayAndToday(self): result = self.get([(today-one, 1), (today, 2)], 1) self.assertEqual(result[0], [3.0]) self.assertEqual(result[1], today - one) self.assertEqual(result[2], 1.0) def testGetPointsWithTwoSequentialDays(self): self.assertEqual(self.get([(today-one, 1), (today, 2)], 4)[0], [1.0, 1.0, 1.0, 3.0]) self.assertEqual(self.get([(today, 1), (today+one, 2)], 2)[0], [1.0, 3.0]) self.assertEqual(self.get([(today, 1), (today+one, 2)], 3)[0], [1.0, 1.0, 3.0]) def testGetPointsWithNonSequentialDays(self): self.assertEqual(self.get([(today-one*9, 1), (today, 2)], 10)[0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0]) self.assertEqual(self.get([(today, 1), (today+one*2, 2), (today+one*9, 3)], 10)[0], [1.0, 1.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 6.0]) def testGetPointsWithRange(self): daterange = (today+one, today+one*2) points, start, dpp = self.get([(today, 3), (today+one, 5), (today+one*2, 7), (today+one*3, 11)], 2, None, daterange) self.assertEqual(points, [8.0, 15.0]) self.assertEqual(start, today+one) self.assertEqual(dpp, 0.5) def testGetPointsWithRangeNoTransactions(self): result = self.get([], 10, None, (today-one, today+one)) self.assertEqual(result[0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) self.assertEqual(result[1], datetime.date.today()) # Make sure it is close to zero but not zero. self.assertNotEqual(result[2], 0) self.assertAlmostEqual(result[2], 0) def testOutOfBoundsDateRangeIsRespected(self): amounts, start, delta = self.get([(today, 1)], 4, None, (today-one*2, today+one)) self.assertEqual(amounts, [0.0, 0.0, 1.0, 1.0]) self.assertEqual(start, today-one*2) self.assertEqual(delta, .75) def testTransactionsBeforeRangeAreCounted(self): amounts, start, delta = self.get([(today-one, 3), (today, 2), (today+one, 1)], 3, None, (today, today+one)) self.assertEqual(amounts, [5.0, 5.0, 6.0]) def testDateRangeEndingBeforeTodayWorks(self): amounts, start, delta = self.get([(today-one*2, 3), (today-one, 2), (today, 1)], 2, None, (today-one*2, today-one)) # Make sure 'today' isn't counted as it isn't in our date range. self.assertEqual(amounts, [3.0, 5.0]) if __name__ == "__main__": unittest.main()wxbanker-0.9.1/wxbanker/tests/tagtests.py0000644000175000017500000001250712243601243020501 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # tagtests.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . from wxbanker.tests import testbase from wxbanker.bankobjects.tag import Tag, EmptyTagException class TagTests(testbase.TestCaseWithController): def getTransaction(self): return self.Model.CreateAccount("A").AddTransaction(1) def testEmptyModelHasNoTags(self): model = self.Model self.assertEqual(model.Tags, set()) a = model.CreateAccount("A") t = a.AddTransaction(1) self.assertEqual(t.Tags, set()) # For sanity. self.assertEqual(model.Tags, set()) def testCannotCreateEmptyTag(self): self.assertRaisesWithMsg(Tag, [""], EmptyTagException, "Tags cannot be empty") def testTaggingTransferDoesNotNestDescription(self): model = self.Model a = model.CreateAccount("A") b = model.CreateAccount("B") ta, tb = a.AddTransaction(1, description="test", source=b) self.assertEqual(ta.Description, "Transfer from B (test)") ta.AddTag("dontmessup") self.assertEqual(ta.Description, "Transfer from B (test #dontmessup)") self.assertEqual(tb.Description, "Transfer to A (test #dontmessup)") def testTagStringValue(self): tag = Tag("Foobar") self.assertEqual(str(tag), "#Foobar") self.assertEqual(tag.Name, "Foobar") def testTagAddition(self): t = self.getTransaction() t.Description = "Bats and Snakes" self.assertEqual(t.Tags, set()) t.AddTag("warning") self.assertEqual(t.Tags, set([Tag("warning")])) self.assertEqual(t.Description, "Bats and Snakes #warning") return t def testDuplicateTagAddition(self): # Test that adding a tag which already exists does nothing. t = self.testTagAddition() self.assertEqual(t.Description, "Bats and Snakes #warning") t.AddTag("warning") self.assertEqual(t.Description, "Bats and Snakes #warning") def testTagRemovalFromEndSubtag(self): t = self.getTransaction() # This is a test to make sure that when we replace '#greet' with nothing, # we don't also remove the beginning of the '#greeting' tag. t.Description = "hello there #greeting #greet" t.RemoveTag("greet") self.assertEqual(t.Description, "hello there #greeting") self.assertEqual(t.Tags, set([Tag("greeting")])) def testTagRemovalFromBeginning(self): t = self.getTransaction() t.Description = "#groceries Whole Foods" t.RemoveTag("groceries") self.assertEqual(t.Description, "Whole Foods") self.assertEqual(t.Tags, set()) def testTagRemovalWithTagObject(self): # Remove a Tag object should also be valid, and this is how the OLV does it. t = self.getTransaction() t.Description = "#groceries Whole Foods" t.RemoveTag(Tag("groceries")) self.assertEqual(t.Description, "Whole Foods") self.assertEqual(t.Tags, set()) def testTagEquality(self): a = Tag("A") self.assertEqual(a, a) self.assertNotEqual(a, None) a2 = Tag("A") self.assertEqual(a, a2) a3 = Tag("B") self.assertNotEqual(a3, a) self.assertNotEqual(a3, a2) def testTaggingAndUntagging(self): model = self.Model a = model.CreateAccount("A") t = a.AddTransaction(amount=1, description="testing #foo") self.assertEqual([Tag("foo")], [Tag("foo")]) self.assertEqual(set([Tag("foo")]), set([Tag("foo")])) self.assertEqual(t.Tags, set([Tag("foo")])) self.assertEqual(model.Tags, set([Tag("foo")])) # foo should be untagged, bar should be tagged. t.Description = "another #bar" self.assertEqual(t.Tags, set([Tag("bar")])) self.assertEqual(model.Tags, set([Tag("bar")])) t2 = a.AddTransaction(amount=1, description="testing #bar #baz") self.assertEqual(t.Tags, set([Tag("bar")])) self.assertEqual(t2.Tags, set([Tag("bar"), Tag("baz")])) self.assertEqual(model.Tags, set([Tag("bar"), Tag("baz")])) # Make sure the transaction tags are expected, and model still has bar from 't'. t2.Description = "nothing special" self.assertEqual(t.Tags, set([Tag("bar")])) self.assertEqual(t2.Tags, set()) self.assertEqual(model.Tags, set([Tag("bar")])) if __name__ == "__main__": import unittest; unittest.main()wxbanker-0.9.1/wxbanker/tests/testbase.py0000644000175000017500000001226212243601243020453 0ustar mrooneymrooney#!/usr/bin/env python # -*- coding: utf-8 -*- # https://launchpad.net/wxbanker # testbase.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import os, sys, datetime, locale, unittest from wxbanker import main, currencies INCOMPLETE_TESTS = 0 # Make sure path contains both the test dir and its parent (wxbanker root dir). here = os.path.dirname(__file__) testdir = here rootdir = os.path.dirname(testdir) # We must insert since if wxbanker is installed on the system this would otherwise pull in that package first. sys.path.insert(0, testdir) sys.path.insert(0, rootdir) # Set up some convenience dates. today = datetime.date.today() yesterday = today - datetime.timedelta(days=1) tomorrow = today + datetime.timedelta(days=1) one = datetime.timedelta(1) # The list of locales tested and assumed to be installed and available. if sys.platform == "linux2": LOCALES = ['en_US.utf8', 'ru_RU.utf8', 'fr_FR.utf8'] elif sys.platform == "darwin": LOCALES = ['en_US.UTF-8', 'ru_RU.UTF-8', 'fr_FR.UTF-8'] elif sys.platform == "win32": LOCALES = ['English_United States.1252', 'Russian_Russia.1251', 'French_France.1252'] else: print "WARNING: Unknown locale mappings for your system: '%s'. Unable to run locale-specific tests." % sys.platform LOCALES = [] # Import wxbanker here so wx gets initialized first, so wxversion calls work properly. import wxbanker from wxbanker import controller, fileservice from wx.lib.pubsub import Publisher def fixturefile(name): return fileservice.getSharedFilePath("fixtures", name) def resetLocale(): assert bool(locale.setlocale(locale.LC_ALL, "")) reload(currencies) class TestCase(unittest.TestCase): def markTestIncomplete(self, msg): # Globals are hacky but hey, this is hacking something into unittest. global INCOMPLETE_TESTS INCOMPLETE_TESTS += 1 class TestCaseHandlingConfigBase(TestCase): """ Handle not stomping over the config file. """ def setUp(self): self.ConfigPath = fileservice.getConfigFilePath(controller.Controller.CONFIG_NAME) self.ConfigPathBackup = self.ConfigPath + ".backup" if os.path.exists(self.ConfigPath): os.rename(self.ConfigPath, self.ConfigPathBackup) def tearDown(self): # The backup won't exist if there wasn't an original config to back-up. if os.path.exists(self.ConfigPathBackup): os.rename(self.ConfigPathBackup, self.ConfigPath) def assertRaisesWithMsg(self, function, args, exception, msg): try: function(*args) except exception, e: self.assertEqual(str(e), msg) else: fail() def assertLength(self, iterable, expectedLength): self.assertEqual(len(list(iterable)), expectedLength) class TestCaseHandlingConfig(TestCaseHandlingConfigBase): """ This class is basically its parent but unsubscribes everything in setUp and tearDown. The GUI tests can't use this because they can't lose subscriptions, so they use the base. """ def setUp(self): Publisher.unsubAll() TestCaseHandlingConfigBase.setUp(self) def tearDown(self): TestCaseHandlingConfigBase.tearDown(self) Publisher.unsubAll() class TestCaseWithController(TestCaseHandlingConfig): """ This is an abstract test case which handles setting up a database (by default in memory) with a controller and model. """ def setUp(self, path=":memory:"): TestCaseHandlingConfig.setUp(self) self.Controller = controller.Controller(path) self.Model = self.Controller.Model def tearDown(self): self.Controller.Close() TestCaseHandlingConfig.tearDown(self) def createLinkedTransfers(self): a = self.Model.CreateAccount("A") b = self.Model.CreateAccount("B") atrans, btrans = a.AddTransaction(1, "test", None, source=b) return a, b, atrans, btrans class TestCaseWithControllerOnDisk(TestCaseWithController): """ An extension of TestCaseWithController which puts the db on disk and handles clean up of it. """ DBFILE = "test.db" def removeTestDbIfExists(self): if os.path.exists(self.DBFILE): os.remove(self.DBFILE) def setUp(self): self.removeTestDbIfExists() TestCaseWithController.setUp(self, path=self.DBFILE) def tearDown(self): TestCaseWithController.tearDown(self) self.removeTestDbIfExists() wxbanker-0.9.1/wxbanker/tests/xmlrunner.py0000644000175000017500000003066012243601243020675 0ustar mrooneymrooney""" XML Test Runner for PyUnit """ # Written by Sebastian Rittau and placed in # the Public Domain. With contributions by Paolo Borelli. __revision__ = "$Id: /private/python/stdlib/xmlrunner.py 16654 2007-11-12T12:46:35.368945Z srittau $" import os.path import re import sys import time import traceback import unittest from StringIO import StringIO from xml.sax.saxutils import escape from StringIO import StringIO class _TestInfo(object): """Information about a particular test. Used by _XMLTestResult. """ def __init__(self, test, time): _pieces = test.id().split('.') (self._class, self._method) = ('.'.join(_pieces[:-1]), _pieces[-1]) self._time = time self._error = None self._failure = None def print_report(self, stream): """Print information about this test case in XML format to the supplied stream. """ stream.write(' ' % \ { "class": self._class, "method": self._method, "time": self._time, }) if self._failure != None: self._print_error(stream, 'failure', self._failure) if self._error != None: self._print_error(stream, 'error', self._error) stream.write('\n') def _print_error(self, stream, tagname, error): """Print information from a failure or error to the supplied stream.""" text = escape(str(error[1])) stream.write('\n') stream.write(' <%s type="%s">%s\n' \ % (tagname, issubclass(error[0], Exception) and error[0].__name__ or str(error[0]), text)) tb_stream = StringIO() traceback.print_tb(error[2], None, tb_stream) stream.write(escape(tb_stream.getvalue())) stream.write(' \n' % tagname) stream.write(' ') # Module level functions since Python 2.3 doesn't grok decorators def create_success(test, time): """Create a _TestInfo instance for a successful test.""" return _TestInfo(test, time) def create_failure(test, time, failure): """Create a _TestInfo instance for a failed test.""" info = _TestInfo(test, time) info._failure = failure return info def create_error(test, time, error): """Create a _TestInfo instance for an erroneous test.""" info = _TestInfo(test, time) info._error = error return info class _XMLTestResult(unittest.TestResult): """A test result class that stores result as XML. Used by XMLTestRunner. """ def __init__(self, classname): unittest.TestResult.__init__(self) self._test_name = classname self._start_time = None self._tests = [] self._error = None self._failure = None def startTest(self, test): unittest.TestResult.startTest(self, test) self._error = None self._failure = None self._start_time = time.time() def stopTest(self, test): time_taken = time.time() - self._start_time unittest.TestResult.stopTest(self, test) if self._error: info = create_error(test, time_taken, self._error) elif self._failure: info = create_failure(test, time_taken, self._failure) else: info = create_success(test, time_taken) self._tests.append(info) def addError(self, test, err): unittest.TestResult.addError(self, test, err) self._error = err def addFailure(self, test, err): unittest.TestResult.addFailure(self, test, err) self._failure = err def print_report(self, stream, time_taken, out, err): """Prints the XML report to the supplied stream. The time the tests took to perform as well as the captured standard output and standard error streams must be passed in.a """ stream.write('\n' % \ { "n": self._test_name, "t": self.testsRun, "time": time_taken, }) for info in self._tests: info.print_report(stream) stream.write(' \n' % out) stream.write(' \n' % err) stream.write('\n') class XMLTestRunner(object): """A test runner that stores results in XML format compatible with JUnit. XMLTestRunner(stream=None) -> XML test runner The XML file is written to the supplied stream. If stream is None, the results are stored in a file called TEST-..xml in the current working directory (if not overridden with the path property), where and are the module and class name of the test class. """ def __init__(self, *args, **kwargs): self._stream = kwargs.get('stream') self._filename = kwargs.get('filename') self._path = "." def run(self, test): """Run the given test case or test suite.""" class_ = test.__class__ classname = class_.__module__ + "." + class_.__name__ if self._stream == None: filename = "TEST-%s.xml" % classname if self._filename: filename = self._filename stream = file(os.path.join(self._path, filename), "w") stream.write('\n') else: stream = self._stream result = _XMLTestResult(classname) start_time = time.time() # TODO: Python 2.5: Use the with statement old_stdout = sys.stdout old_stderr = sys.stderr sys.stdout = StringIO() sys.stderr = StringIO() try: test(result) try: out_s = sys.stdout.getvalue() except AttributeError: out_s = "" try: err_s = sys.stderr.getvalue() except AttributeError: err_s = "" finally: sys.stdout = old_stdout sys.stderr = old_stderr time_taken = time.time() - start_time result.print_report(stream, time_taken, out_s, err_s) if self._stream == None: stream.close() return result def _set_path(self, path): self._path = path path = property(lambda self: self._path, _set_path, None, """The path where the XML files are stored. This property is ignored when the XML file is written to a file stream.""") class XMLTestRunnerTest(unittest.TestCase): def setUp(self): self._stream = StringIO() def _try_test_run(self, test_class, expected): """Run the test suite against the supplied test class and compare the XML result against the expected XML string. Fail if the expected string doesn't match the actual string. All time attribute in the expected string should have the value "0.000". All error and failure messages are reduced to "Foobar". """ runner = XMLTestRunner(self._stream) runner.run(unittest.makeSuite(test_class)) got = self._stream.getvalue() # Replace all time="X.YYY" attributes by time="0.000" to enable a # simple string comparison. got = re.sub(r'time="\d+\.\d+"', 'time="0.000"', got) # Likewise, replace all failure and error messages by a simple "Foobar" # string. got = re.sub(r'(?s).*?', r'Foobar', got) got = re.sub(r'(?s).*?', r'Foobar', got) self.assertEqual(expected, got) def test_no_tests(self): """Regression test: Check whether a test run without any tests matches a previous run. """ class TestTest(unittest.TestCase): pass self._try_test_run(TestTest, """ """) def test_success(self): """Regression test: Check whether a test run with a successful test matches a previous run. """ class TestTest(unittest.TestCase): def test_foo(self): pass self._try_test_run(TestTest, """ """) def test_failure(self): """Regression test: Check whether a test run with a failing test matches a previous run. """ class TestTest(unittest.TestCase): def test_foo(self): self.assert_(False) self._try_test_run(TestTest, """ Foobar """) def test_error(self): """Regression test: Check whether a test run with a erroneous test matches a previous run. """ class TestTest(unittest.TestCase): def test_foo(self): raise IndexError() self._try_test_run(TestTest, """ Foobar """) def test_stdout_capture(self): """Regression test: Check whether a test run with output to stdout matches a previous run. """ class TestTest(unittest.TestCase): def test_foo(self): print "Test" self._try_test_run(TestTest, """ """) def test_stderr_capture(self): """Regression test: Check whether a test run with output to stderr matches a previous run. """ class TestTest(unittest.TestCase): def test_foo(self): print >>sys.stderr, "Test" self._try_test_run(TestTest, """ """) class NullStream(object): """A file-like object that discards everything written to it.""" def write(self, buffer): pass def test_unittests_changing_stdout(self): """Check whether the XMLTestRunner recovers gracefully from unit tests that change stdout, but don't change it back properly. """ class TestTest(unittest.TestCase): def test_foo(self): sys.stdout = XMLTestRunnerTest.NullStream() runner = XMLTestRunner(self._stream) runner.run(unittest.makeSuite(TestTest)) def test_unittests_changing_stderr(self): """Check whether the XMLTestRunner recovers gracefully from unit tests that change stderr, but don't change it back properly. """ class TestTest(unittest.TestCase): def test_foo(self): sys.stderr = XMLTestRunnerTest.NullStream() runner = XMLTestRunner(self._stream) runner.run(unittest.makeSuite(TestTest)) class XMLTestProgram(unittest.TestProgram): def runTests(self): if self.testRunner is None: self.testRunner = XMLTestRunner() unittest.TestProgram.runTests(self) main = XMLTestProgram if __name__ == "__main__": main(module=None) wxbanker-0.9.1/wxbanker/transactionctrl.py0000644000175000017500000001076412243601243020716 0ustar mrooneymrooney# https://launchpad.net/wxbanker # transactionctrl.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . import wx, datetime from wx.lib.pubsub import Publisher from wxbanker.newtransactionctrl import TransferRow, NewTransactionRow, RecurringRow, WeeklyRecurringRow from wxbanker.recurringsummaryrow import RecurringSummaryRow from wxbanker.bankobjects.recurringtransaction import RecurringTransaction class TransactionCtrl(wx.Panel): RECURRING_ROW = 0 WEEKLY_ROW = 1 SUMMARY_ROW = 2 TRANSFER_ROW = 3 TRANSACTION_ROW = 4 def __init__(self, parent, editing=None): wx.Panel.__init__(self, parent) # Create the recurring object we will use internally. self.recurringObj = RecurringTransaction(None, None, 0, "", datetime.date.today(), RecurringTransaction.DAILY) self.Sizer = wx.GridBagSizer(0, 3) self.Sizer.SetEmptyCellSize((0,0)) self.Sizer.AddGrowableCol(1, 1) self.recurringRow = RecurringRow(self, self.RECURRING_ROW) self.recurringSummaryRow = RecurringSummaryRow(self, self.SUMMARY_ROW) self.weeklyRecurringRow = WeeklyRecurringRow(self, self.WEEKLY_ROW) self.transferRow = TransferRow(self, self.TRANSFER_ROW) self.transactionRow = NewTransactionRow(self, self.TRANSACTION_ROW, editing=editing) # RecurringRow needs an update once both it and the other controls exist. self.recurringRow.Update() # Hide everything up to the actual transaction row initially. if not editing: for i in range(self.TRANSACTION_ROW): self.ShowRow(i, False) ctrlId = id(self.transactionRow) Publisher.subscribe(self.onTransferToggled, "newtransaction.%i.transfertoggled"%ctrlId) Publisher.subscribe(self.onRecurringToggled, "newtransaction.%i.recurringtoggled"%ctrlId) def onTransferToggled(self, message): transfer = message.data self.ShowRow(self.TRANSFER_ROW, transfer) def onRecurringToggled(self, message): recurring = message.data for row in (self.SUMMARY_ROW, self.RECURRING_ROW, self.WEEKLY_ROW): self.ShowRow(row, recurring) def ShowRow(self, row, show=True): self.Freeze() for child in self.Sizer.GetChildren(): if child.Pos[0] == row: child.Show(show) self.Parent.Layout() self.Thaw() def ShowWeekly(self, show=True): self.ShowRow(self.WEEKLY_ROW, show) def UpdateSummary(self): self.recurringSummaryRow.UpdateSummary(self.recurringObj) def IsTransfer(self): return self.transactionRow.transferCheck.Value def GetSettings(self): repeatType, repeatEvery, end = self.recurringRow.GetSettings() repeatsOn = None if repeatType == RecurringTransaction.WEEKLY: repeatsOn = self.weeklyRecurringRow.GetSettings() return repeatType, repeatEvery, repeatsOn, end def FromRecurring(self, rt): self.ShowRow(self.TRANSFER_ROW, bool(rt.Source)) self.ShowRow(self.WEEKLY_ROW, rt.IsWeekly()) self.recurringRow.FromRecurring(rt) self.recurringSummaryRow.UpdateSummary(rt) self.weeklyRecurringRow.FromRecurring(rt) self.transferRow.FromRecurring(rt) self.transactionRow.FromRecurring(rt) def ToRecurring(self): """Save any settings to the internal transaction object that aren't automatically saved.""" self.recurringRow.ToRecurring() self.transferRow.ToRecurring(self.recurringObj) self.transactionRow.ToRecurring(self.recurringObj) if __name__ == "__main__": app = wx.App() f = wx.Frame(None) TransactionCtrl(f) f.Show() app.MainLoop() wxbanker-0.9.1/wxbanker/transactionolv.py0000644000175000017500000004631512243601243020553 0ustar mrooneymrooney#!/usr/bin/env python # # https://launchpad.net/wxbanker # transactionolv.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . """ A refactor of TransactionGrid, using ObjectListView. TODO (for feature parity): - disable sorting on Total column - flickerless repositioning when changing date - flickerless RefreshObjects - flickerless remove transaction - handle batch events at UI level """ import threading import wx, datetime from wx.lib.pubsub import Publisher from wxbanker.ObjectListView import GroupListView, ColumnDefn, CellEditorRegistry from wxbanker import bankcontrols, tagtransactiondialog from wxbanker.currencies import GetCurrencyInt class TransactionOLV(GroupListView): EMPTY_MSG_NORMAL = _("No transactions entered.") EMPTY_MSG_SEARCH = _("No matching transactions.") def __init__(self, parent, bankController): GroupListView.__init__(self, parent, style=wx.LC_REPORT|wx.SUNKEN_BORDER, name="TransactionOLV") self.LastSearch = None self.CurrentAccount = None self.BankController = bankController self.showGroups = False #WXTODO: figure out these (and the text color, or is that already?) from theme (LP: ???) self.evenRowsBackColor = wx.Colour(224,238,238) self.oddRowsBackColor = wx.WHITE self.cellEditMode = GroupListView.CELLEDIT_DOUBLECLICK self.SetEmptyListMsg(self.EMPTY_MSG_NORMAL) # Calculate the necessary width for the date column. dateStr = str(datetime.date.today()) dateWidth = self.GetTextExtent(dateStr)[0] + 10 # Define some constants to use throughout. self.COL_DATE = 0 self.COL_DESCRIPTION = 1 self.COL_AMOUNT = 2 self.COL_TOTAL = 3 # If you change these column names, update sizeAmounts()! self.SetColumns([ ColumnDefn(_("Date"), valueGetter=self.getDateAndIDOf, valueSetter=self.setDateOf, stringConverter=self.renderDateIDTuple, editFormatter=self.renderEditDate, width=dateWidth), ColumnDefn(_("Description"), valueGetter="Description", isSpaceFilling=True, editFormatter=self.renderEditDescription), ColumnDefn(_("Amount"), "right", valueGetter=self.getAmount, valueSetter=self.setAmount, stringConverter=self.renderFloat, editFormatter=self.renderEditFloat), ColumnDefn(_("Balance"), "right", valueGetter=self.getTotal, stringConverter=self.renderFloat, isEditable=False), ]) # Our custom hack in OLV.py:2017 will render amount floats appropriately as %.2f when editing. # By default, sort by the date column, ascending. self.SORT_COL = self.COL_DATE self.SortBy(self.SORT_COL) self.Bind(wx.EVT_RIGHT_DOWN, self.onRightDown) self.Subscriptions = ( (self.onSearch, "SEARCH.INITIATED"), (self.onSearchCancelled, "SEARCH.CANCELLED"), (self.onSearchMoreToggled, "SEARCH.MORETOGGLED"), (self.onTransactionAdded, "transaction.created"), (self.onTransactionsRemoved, "transactions.removed"), (self.onCurrencyChanged, "currency_changed"), (self.onShowCurrencyNickToggled, "controller.show_currency_nick_toggled"), (self.updateTotals, "ormobject.updated.Transaction.Amount"), (self.onTransactionDateUpdated, "ormobject.updated.Transaction.Date"), ) for callback, topic in self.Subscriptions: Publisher.subscribe(callback, topic) def SetObjects(self, objs, *args, **kwargs): """ Override the default SetObjects to properly refresh the auto-size, and clear out any cached Totals as they may not be valid IE when we search and have a subset of transactions. """ # Remove any previously cached totals, to fix search totals. GroupListView.SetObjects(self, objs, *args, **kwargs) self.updateTotals() # Force a re-size here, in the case that the vscrollbar-needed state # changed by this set account, to size correctly. wx.CallLater(50, self._ResizeSpaceFillingColumns) def IsSearchActive(self): return self.GrandParent.searchActive def SetSearchActive(self, value): self.GrandParent.searchActive = value def onTransactionDateUpdated(self, message): transaction = message.data self.RefreshObject(transaction) self.SortBy(self.SORT_COL) self.updateTotals() def getDateAndIDOf(self, transaction): # A date and ID two-tuple is used to allow for correct sorting # by date (bug #653697) return (transaction.Date, transaction.ID) def setDateOf(self, transaction, date): transaction.Date = date self.Freeze() self.SortBy(self.SORT_COL) self.Thaw() def setAmount(self, transaction, amount): transaction.Amount = amount self.Freeze() self.SortBy(self.SORT_COL) self.Thaw() def getTotal(self, transObj): if not hasattr(transObj, "_Total"): self.updateTotals() return transObj._Total def updateTotals(self, message=None): first = self.GetObjectAt(0) if first is None: return if not self.CurrentAccount: #This means we are in 'All accounts' so we need to convert each total # to the global currency balance_currency = self.BankController.Model.GlobalCurrency else: #we are just viewing a single account # balance currency = accounts currency balance_currency = GetCurrencyInt(self.CurrentAccount.GetCurrency()) first._Total = first.GetAmount(balance_currency) b = first for i in range(1, len(self.GetObjects())): a, b = b, self.GetObjectAt(i) b._Total = a._Total + b.GetAmount(balance_currency) def renderDateIDTuple(self, pair): return str(pair[0]) def getAmount(self, obj): #Return the whole transaction/float since we need to use its #renderAmount method to support multiple currencies. return obj def renderFloat(self, value): if isinstance(value, float): #this is a 'balance' column, its ok to use the bank model's float2str # as long as we'r not in an account. if self.CurrentAccount: return self.CurrentAccount.float2str(value) else: return self.BankController.Model.float2str(value) else: #this is a trnasaction, so it belogns to the 'Amount' column, render # it with its appropieate currency return value.RenderAmount() def renderEditDate(self, transaction): return str(transaction.Date) def renderEditFloat(self, modelObj): return "%.2f" % modelObj.Amount def renderEditDescription(self, modelObj): return modelObj._Description def _sizeAmounts(self): """Set the width of the Amount and Total columns based on the approximated widest value.""" transactions = self.GetObjects() # If there aren't any transactions, there's nothing to do. if len(transactions) == 0: return for i, attr in enumerate(("Amount", "_Total")): # Sort by amount, then compare the highest and lowest, to take into account a negative sign. sortedtrans = list(sorted(transactions, cmp=lambda a,b: cmp(getattr(a, attr), getattr(b, attr)))) high, low = sortedtrans[0], sortedtrans[-1] # Get the (translated) displayed column name to calculate width. header = _({"_Total": "Balance"}.get(attr, attr)) # Take the max of the two as well as the column header width, as we need to at least display that. widestWidth = max([self.GetTextExtent(header)[0]] + [self.GetTextExtent(self.renderFloat(getattr(t, attr)))[0] for t in (high, low)]) wx.CallAfter(self.SetColumnFixedWidth, *(self.COL_AMOUNT+i, widestWidth + 10)) def sizeAmounts(self): threading.Thread(target=self._sizeAmounts).start() def setAccount(self, account, scrollToBottom=True): self.CurrentAccount = account if account is None: # None represents the "All accounts" option, so we want all transactions. transactions = self.BankController.Model.GetTransactions() else: transactions = account.Transactions self.SetObjects(transactions) # Update the width of the amount/total columns. self.sizeAmounts() # Unselect everything. self.SelectObjects([], deselectOthers=True) if scrollToBottom: self.ensureVisible(-1) if self.IsSearchActive(): self.doSearch(self.LastSearch) def ensureVisible(self, index): length = self.GetItemCount() # If there are no items, ensure a no-op (LP: #338697) if length: if index < 0: index = length + index self.EnsureCellVisible(index, 0) def onRightDown(self, event): itemID, flag, col = self.HitTestSubItem(event.Position) # Don't do anything for right-clicks not on items. if itemID != -1: if not self.GetItemState(itemID, wx.LIST_STATE_SELECTED): self._SelectAndFocus(itemID) transactions = self.GetSelectedObjects() self.showContextMenu(transactions, col) def showContextMenu(self, transactions, col, removeOnly=False): # This seems unlikely but let's defend against it. if not transactions: return menu = wx.Menu() # removeOnly means only show the remove entry, such as from the CSV import frame. if not removeOnly: # If the right-click was on the total column, use the total, otherwise the amount. if col == self.COL_TOTAL: # Use the last total if multiple are selected. amount = transactions[-1]._Total else: amount = sum((t.Amount for t in transactions)) val = self.BankController.Model.float2str(amount) actions = [ (_("Send %s to calculator") % val, "wxART_calculator_edit"), (_("Add %s to calculator") % val, "wxART_calculator_add"), (_("Subtract %s from calculator") % val, "wxART_calculator_delete"), ] for i, (actionStr, artHint) in enumerate(actions): item = wx.MenuItem(menu, -1, actionStr) item.SetBitmap(wx.ArtProvider.GetBitmap(artHint)) menu.Bind(wx.EVT_MENU, lambda e, i=i: self.onCalculatorAction(transactions, col, i), source=item) menu.AppendItem(item) menu.AppendSeparator() # Always show the Remove context entry. if len(transactions) == 1: removeStr = _("Remove this transaction") moveStr = _("Move this transaction to account") tagStr = _("No tags yet") else: removeStr = _("Remove these %i transactions") % len(transactions) moveStr = _("Move these %i transactions to account") % len(transactions) tagStr = _("No common tags yet") addTagStr = _("Add a tag") removeItem = wx.MenuItem(menu, -1, removeStr) menu.Bind(wx.EVT_MENU, lambda e: self.onRemoveTransactions(transactions), source=removeItem) removeItem.SetBitmap(wx.ArtProvider.GetBitmap('wxART_delete')) menu.AppendItem(removeItem) if not removeOnly: # Create the sub-menu of sibling accounts to the move to. moveToAccountItem = wx.MenuItem(menu, -1, moveStr) accountsMenu = wx.Menu() if self.CurrentAccount is None: siblings = [] else: siblings = self.CurrentAccount.GetSiblings() for account in siblings: accountItem = wx.MenuItem(menu, -1, account.GetName()) accountsMenu.AppendItem(accountItem) accountsMenu.Bind(wx.EVT_MENU, lambda e, account=account: self.onMoveTransactions(transactions, account), source=accountItem) moveToAccountItem.SetSubMenu(accountsMenu) moveMenuItem = menu.AppendItem(moveToAccountItem) # The tag menu. tagsItem = wx.MenuItem(menu, -1, _("Tags")) tagsMenu = wx.Menu() ## The initial tags are the ones in the first transaction. If there are more, intersect across them. commonTags = set(transactions[0].Tags) for transaction in transactions[1:]: commonTags = commonTags.intersection(transaction.Tags) ## If we have any common tags, add them to the menu, otherwise the no tags item. if commonTags: for tag in commonTags: tagItem = wx.MenuItem(tagsMenu, -1, tag.Name) tagItemMenu = wx.Menu() searchItem = tagItemMenu.Append(-1, _("Search for this tag")) removeItem = tagItemMenu.Append(-1, _("Remove this tag")) tagItem.SetSubMenu(tagItemMenu) tagsMenu.AppendItem(tagItem) tagItemMenu.Bind(wx.EVT_MENU, lambda e, tag=tag: self.onTagSearch(tag), source=searchItem) tagItemMenu.Bind(wx.EVT_MENU, lambda e, tag=tag: self.onTagRemoval(tag, transactions), source=removeItem) else: noTagsItem = tagsMenu.Append(-1, tagStr) menu.Enable(noTagsItem.Id, False) tagsMenu.AppendSeparator() addItem = tagsMenu.Append(-1, addTagStr) tagsItem.SetSubMenu(tagsMenu) tagsMenu.Bind(wx.EVT_MENU, lambda e: self.onTagTransactions(transactions), source=addItem) ## Append it at the bottom after a separator. menu.AppendSeparator() menu.AppendItem(tagsItem) # If there are no siblings, disable the item, but leave it there for consistency. if not siblings: menu.Enable(moveMenuItem.Id, False) # Show the menu and then destroy it afterwards. self.PopupMenu(menu) menu.Destroy() def onCalculatorAction(self, transactions, col, i): """ Given an action to perform on the calculator, and the row and col, generate the string of characters necessary to perform that action in the calculator, and push them. """ if col == self.COL_TOTAL: # Use the last total if multiple are selected. amount = transactions[-1]._Total else: amount = sum((t.Amount for t in transactions)) pushStr = ('C%s', '+%s=', '-%s=')[i] # Send, Add, Subtract commands pushStr %= amount Publisher.sendMessage("CALCULATOR.PUSH_CHARS", pushStr) def onRemoveTransactions(self, transactions): """Remove the transactions from the account.""" if self.CurrentAccount: self.CurrentAccount.RemoveTransactions(transactions) # We won't have a CurrentAccount when viewing all accounts (LP: #620924) else: for transaction in transactions: transaction.Parent.RemoveTransaction(transaction) def onMoveTransactions(self, transactions, targetAccount): """Move the transactions to the target account.""" self.CurrentAccount.MoveTransactions(transactions, targetAccount) def frozenResize(self): self.Parent.Layout() self.Parent.Thaw() def onTransactionsRemoved(self, message): account, transactions = message.data if account is self.CurrentAccount: # Remove the item from the list. self.RemoveObjects(transactions) self.updateTotals() self.sizeAmounts() def onTransactionAdded(self, message): account, transaction = message.data if account is self.CurrentAccount: self.AddObject(transaction) self.updateTotals() self.Reveal(transaction) self.sizeAmounts() def onTagSearch(self, tag): Publisher.sendMessage("SEARCH.EXTERNAL", str(tag)) def onTagRemoval(self, tag, transactions): for transaction in transactions: transaction.RemoveTag(tag) # The removal won't appear unless we refresh the affected transactions. self.RefreshObjects(transactions) def onTagTransactions(self, transactions): dlg = tagtransactiondialog.TagTransactionsDialog(self, transactions) dlg.ShowModal() # Unconditionally refresh, since hitting enter in the tag field requires a refresh but doesn't provide a useful result. self.RefreshObjects(transactions) def onSearch(self, message): self.SetEmptyListMsg(self.EMPTY_MSG_SEARCH) self.LastSearch = message.data self.doSearch(self.LastSearch) def doSearch(self, searchData): searchString, match = searchData account = self.CurrentAccount matches = self.BankController.Model.Search(searchString, account=account, matchIndex=match) self.SetObjects(matches) self.SetSearchActive(True) def onSearchCancelled(self, message): # Ignore cancels on an inactive search to avoid silly refreshes. if self.IsSearchActive(): self.SetSearchActive(False) self.setAccount(self.CurrentAccount) self.SetEmptyListMsg(self.EMPTY_MSG_NORMAL) def onSearchMoreToggled(self, message): # Perhaps necessary to not glitch overlap on Windows? self.Refresh() def onCurrencyChanged(self, message): # Refresh all the transaction objects, re-rendering the amounts. self.RefreshObjects() # The current likely changed the widths of the amount/total column. self.sizeAmounts() # Now we need to adjust the description width so we don't have a horizontal scrollbar. self.AutoSizeColumns() def onShowCurrencyNickToggled(self, message): # Refresh all the transaction objects, re-rendering the amounts. self.RefreshObjects() # The current likely changed the widths of the amount/total column. self.sizeAmounts() # Now we need to adjust the description width so we don't have a horizontal scrollbar. self.AutoSizeColumns() def __del__(self): for callback, topic in self.Subscriptions: Publisher.unsubscribe(callback) wxbanker-0.9.1/wxbanker/version.py0000644000175000017500000000150512243601243017162 0ustar mrooneymrooney#! /usr/bin/python # # https://launchpad.net/wxbanker # version.py: Copyright 2007-2010 Mike Rooney # # This file is part of wxBanker. # # wxBanker 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. # # wxBanker 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 wxBanker. If not, see . NUMBER = "0.9.1"