pax_global_header00006660000000000000000000000064124530555070014520gustar00rootroot0000000000000052 comment=956224ee6f75154f42587ecbeae03bfaca1b037c picard-release-1.3.2/000077500000000000000000000000001245305550700144035ustar00rootroot00000000000000picard-release-1.3.2/.gitignore000066400000000000000000000002231245305550700163700ustar00rootroot00000000000000build build.cfg .pydevproject .project .idea *.pyc *.pyd *.dll *.so locale *.exe .DS_Store po/countries/countries.pot po/attributes/attributes.pot picard-release-1.3.2/.travis.yml000066400000000000000000000015661245305550700165240ustar00rootroot00000000000000language: python python: # Picard currently supports Python >=2.6 and <3 # However, since apt-get only installs PyQt4 for Py2.7, we only test against that :/ - "2.7" virtualenv: system_site_packages: true cache: - apt - $HOME/.pip/cache env: global: - PIP_INSTALL="pip install --download-cache='$HOME/.pip/cache'" matrix: - DISCID="" - DISCID="$PIP_INSTALL python-libdiscid" - DISCID="$PIP_INSTALL discid" before_install: - sudo apt-get update -qq - sudo apt-get install -qq python-qt4 - sudo apt-get install -qq libdiscid0 libdiscid0-dev install: # Install dependencies - $PIP_INSTALL 'Mutagen>=1.20' - $DISCID # Set up Picard - python setup.py build_ext -i - python setup.py build_locales -i # Run the tests! script: "python setup.py test" # Tell people that tests were run notifications: irc: "chat.freenode.net#musicbrainz-devel" picard-release-1.3.2/.tx/000077500000000000000000000000001245305550700151145ustar00rootroot00000000000000picard-release-1.3.2/.tx/config000066400000000000000000000006301245305550700163030ustar00rootroot00000000000000[main] host = https://www.transifex.com [musicbrainz.picard] file_filter = po/.po source_file = po/picard.pot source_lang = en type = PO [musicbrainz.countries] file_filter = po/countries/.po source_file = po/countries/countries.pot source_lang = en type = PO [musicbrainz.attributes] file_filter = po/attributes/.po source_file = po/attributes/attributes.pot source_lang = en type = PO picard-release-1.3.2/AUTHORS.txt000066400000000000000000000004021245305550700162650ustar00rootroot00000000000000Lukáš Lalinský Robert Kaye Philipp Wolfer Picard icons by Carlin Mangar The icons in this program are from the Tango Desktop Project . picard-release-1.3.2/COPYING.txt000066400000000000000000000431051245305550700162570ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. 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 Program or any portion of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, 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 Program, 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 Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) 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; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, 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 executable. However, as a special exception, the source code 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. If distribution of executable or 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 counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. 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 Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program 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 to this License. 7. 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 Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program 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 Program. 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. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program 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. 9. The Free Software Foundation may publish revised and/or new versions of the 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 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 Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, 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 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. 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 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. 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 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) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. picard-release-1.3.2/HACKING.txt000066400000000000000000000001201245305550700162010ustar00rootroot00000000000000Translations ============ See po/README.md for information about translations. picard-release-1.3.2/INSTALL.txt000066400000000000000000000042061245305550700162540ustar00rootroot00000000000000MusicBrainz Picard Installation =============================== Dependencies ------------ Before installing Picard, you need to have these: * Python 2.6 or newer (Picard will not work with Python 3) http://python.org/download * PyQt 4.5 or newer http://www.riverbankcomputing.co.uk/software/pyqt/download * Mutagen 1.20 or newer http://code.google.com/p/mutagen/downloads * gettext Windows: http://gnuwin32.sourceforge.net/packages/gettext.htm * a compiler Windows should work with Visual C++ 2008 Express: http://go.microsoft.com/?linkid=7729279 * chromaprint (optional) For fingerprinting (scanning) files http://acoustid.org/chromaprint * python-discid or python-libdiscid (optional) Required for CD lookups. https://python-discid.readthedocs.org/ Depends on libdiscid: http://musicbrainz.org/doc/libdiscid Due to slowdowns in reading the CD TOC, using libdiscid versions 0.3.0 - 0.4.1 is not recommended. On Windows it is recommended to use Pip for Windows: https://sites.google.com/site/pydatalog/python/pip-for-windows and then just: pip install mutagen pip install discid there for Mutagen and python-discid. The binaries for Python, GetText (msgfmt), fpcalc and discid.dll have to be in the %PATH% on Windows. Installation ------------ After installing the dependencies, you can install Picard by running: sudo python setup.py install This will automatically build and install all required Python modules. On Windows you need to have Administrator rights, but don't put "sudo" in front of the command. To start Picard now you can use: picard Running From the Source Tree ---------------------------- If you want to run Picard from the source directory without installing, you need to build the C extensions and locales manually: python setup.py build_ext -i python setup.py build_locales -i And to start Picard use: python tagger.py Running the Test Suite ---------------------- To run the included tests, follow the instructions for "Running From the Source Tree". Afterward you can run the tests using setup.py: python setup.py test Alternatively, use a test runner such as nose. picard-release-1.3.2/NEWS.txt000066400000000000000000000774661245305550700157440ustar00rootroot00000000000000Version 1.3.2 - 2015-01-07 * Bugfix: Fixed tags from filename dialog not opening on new installations Version 1.3.1 - 2014-12-20 * Bugfix: Picard should use the correct Accept header when talking to web services. (PICARD-273) * Bugfix: Picard refuses to load files if any path component happens to be hidden (PICARD-589) * Bugfix: ConfigUpgradeError: Error during config upgrade from version 0.0.0dev0 to 1.0.0final0 (PICARD-642) * Bugfix: Windows installer sets working directory to %PROGRAMFILES%\MusicBrainz Picard\locale (PICARD-649) * Bugfix: Last.fm plus tooltip help elements are all messed up (PICARD-655) * Bugfix: Regression: Tagger script for cover art filename does not work anymore (PICARD-661) * Bugfix: Retrieving collections causes AttributeError: release_list (PICARD-662) * Bugfix: Artist name makes it impossible to save (PICARD-663) * Improvement: Support the new pregap and data tracks (PICARD-658) * Improvement: Set the originalyear tag when loading a release (PICARD-659) * Improvement: Web service calls to ports 80 and 443 do not need explicit port specification. 443 should be automatically made https. (PICARD-665) Version 1.3 - 2014-10-20 * The "About" window now displays the versions of libraries used by Picard * Picard now correctly handles matching of MP3 files saved in ID3v2.3 tags (which is the version that Microsoft Windows and iTunes both use). Note: You may need to re-save your tags once to get them to match in future. * A sort tags plugin is now provided as tag data is no longer displayed sorted by default. * A new tag, musicbrainz_releasetrackid, containing the MusicBrainz Track MBID introduced in the May 2013 schema change release, is now written to files. * Add %_recordingtitle% (PICARD-515) * Fix plugin install bugs (PICARD-444) * Fix Options / File naming examples to handle primary/secondary release types (PICARD-516) * A new advanced option is available to permanently set the starting directory for the file browser and "Add files/folder" buttons. * Requests to Musicbrainz against your own account e.g. for collections are now handled through SSL (PICARD-337) * Refresh of Albums using Ctrl-R and selection of Other Releases are now more responsive during batch lookups. * Main window is now emitting a "selection_updated" signal, plugin api version bumps to 1.3.0 * Append system information to user-agent string * Compilation tag/variable functionality (for tagging & file naming) has been split into two: - %compilation% is now aligned with iTunes, and set only for Various Artists type compilations - %_multiartist% variable now indicates whether this release has tracks by multiple artists (in order to prepend the artist name to the filename as shown in the default file naming script) * autodetect the CD drive on Mac OS X (PICARD-123) * Ignore directories and files while indexing when show_hidden_files option is set to False (PICARD-528) * Add ignore_regex option which allows one to ignore matching paths, can be set in Options > Advanced (PICARD-528) * Added an "artists" multi-value tag to track metadata, based on the one in Jaikoz, which contains the individual artist names from the artist credit. Also useful in scripts (joining phrases like 'feat:' are omitted) and plugins. * Added "_artists_sort", "_albumartists", "_albumartists_sort" variables for scripts and plugins. * Made Picard use the country names also used on the MusicBrainz website (PICARD-205) * New setup.py command `get_po_files` (Retrieve po files from transifex) * New setup.py command `regen_pot_file` (Regenerate po/picard.pot) * New Work tag (which for Classical music is often different from the track title) saved as ID3 TOAL tag. * New Composer Sort Order tag (variable %composersort%). * Improve the Other Releases list to prioritise and separate releases which match the correct number of tracks and your Options / Metadata / Prefered Releases settings for Country and Format. * New %_absolutetracknumber% variable numbering tracks sequentially regardless of disc structure (so you can numbers tracks on multi-disc releases without a disc number) * Support dropping image directly from Google image results to cover art box * Add %_musicbrainz_tracknumber% to hold track # as shown on MusicBrainz release web-page e.g. vinyl/cassette style A1, A2, B1, B2 * Show the ID3 version of the file in the Info... dialog (Ctrl-I) (PICARD-218) * Fixed a bug where Picard crashed if a MP3 file had malformed TRCK or TPOS tags (PICARD-112) * Add --files option to setup.py build_ui, used to force .ui to .py regeneration (PICARD-566) * New setup.py command `update_constants` (Regenerate countries.py and attributes.py) * Made Picard use release groups, medium formats and cover art types also used on the MusicBrainz website * Use MusicBrainz Server translations for release groups, medium formats and cover art types * Add checkbox to toggle debug at runtime in log/debug view dialog * Add a plugin to add Artist Official Homepage relationships to the website tag (ID3 WOAR tag) * Add integrated functions $eq_any, $ne_all, $eq_all, $ne_any, $swapprefix and $delprefix. * Add %_performance_attributes%, containing performance attributes for the work e.g. live, cover, medley etc. Use $inmulti in file naming scripts i.e. ...$if($inmulti(%_performance_attributes%,medley), (Medley),) * Add optional `priority` parameter to `register_album_metadata_processor()` and `register_track_metadata_processor()` Default priority is `PluginPriority.NORMAL`, plugins registered with `PluginPriority.HIGH` will be run first, plugins registered with `PluginPriority.LOW` will run last * Add Standardise Performers plugin to convert e.g. Performer [piano and guitar] into Performer [piano] and Performer [guitar]. * Add support for release group cover art fallback (PICARD-418, PICARD-53) * Add a clear button to search box * Honour preferred release formats when matching AcoustIds (PICARD-631) * Prevent ZeroDivisionError in some rare cases (PICARD-630) Version 1.2 - 2013-03-30 * Picard now requires at least Python 2.6 * Removed support for AmpliFIND/PUIDs * Add support for the Ogg Opus file format * It's now possible to download cover images without any plugin. Cover Art Archive images can be downloaded by image type * Improved directory scanning performance * Prefer already-loaded releases of the same RG when matching files * Allow dropping new files onto specific targets * Add basic collections management support (PICARD-84) * Allow adding custom tags in the tag editing dialog (PICARD-349) * Fix replacing of Windows-incompatible characters (PICARD-393) * Save both primary and secondary release types (PICARD-240) * Handle errors from the AcoustID service better (PICARD-391) * Accept HTTPS URLs on drag-and-drop (PICARD-378) Version 1.1 - 2012-09-03 * Always show basic tags in metadata comparison box, even if empty (title, artist, album, tracknumber, ~length, date) (PICARD-201) * Fixed AcoustID submission failure after removing files from Picard (PICARD-82) * Allow multi-select in new MetaDataBox for delete/remove tags (PICARD-194) * File browser remembers last directory/no longer crashes on OS X (PICARD-104) * Removed the "Run Picard" option from the Windows installer (PICARD-11) * Refreshing a non-album track correctly clears previous track metadata (PICARD-220) * Fixed the preserved tags setting for tags with uppercase characters (PICARD-217) * Added a completion box to the preserved tags setting, and clarified how it works * Store lyrics language in tags instead of text representation language (PICARD-242) * Fix various oddities in the metadata comparison box (PICARD-255, PICARD-256) Version 1.0 - 2012-06-02 * New UI: Extended comparison of existing vs. MB metadata & tags (PICARD-43) * Merged the renaming and moving options pages * Removed the VA file naming format option (there is now a single format option) (PICARD-159) * Add %license% tag * Made %writer% available to tagger scripts and plugins with contents of songwriter (PICARD-21) * Allow two multi-valued variables to be merged in tagger scripting (PICARD-139) * Allow multi-valued variables to be transformed in tagger script and then set back in tags as multi-valued (PICARD-147) * Fix $copy not preserving multi-value variables as documented (PICARD-138) * Load/save free-text tags for ID3 as TXXX frames (PICARD-148) * Fix writing of MusicBrainz Work Id / musicbrainz_workid to tags (PICARD-88) * Handle mimetype for embedding cover art from EXIF jpegs (PICARD-27) * Change cover art box to open MusicBrainz release rather than Amazon * Support manual drag-and-drop of cover art onto a release via cover art box * Only open browser on left-click of cover art box (PICARD-190) * Fix Lookup in Browser (previously 'tag lookup') for clusters (PICARD-186) * Lookup in Browser will now not use MBIDs to lookup unmatched files/clusters * Add Date/Country to CD Lookup results dialog (PICARD-198) * Fix/reset album folksonomy tag counts while refreshing releases (PICARD-4) * Plugins actions can now create sub-menus using the MENU class attribute * New plugin hook register_clusterlist_action * Display the port Picard is listening on at bottom right status bar (PICARD-191) * Make album drops from right hand pane to left default to "unmatched files" again (PICARD-33) * Remove .DS_Store, desktop.ini, and Thumbs.db from otherwise empty directories (PICARD-75) * Update artist translation to use new alias features (primary flag, sort names) (PICARD-200) * Deleted tags aren't indicated as changes (PICARD-165) * Picard log entries have inaccurate timestamp (PICARD-45) * Interface doesn't allow keyboard only management (PICARD-103) * Added option to preserve timestamps of tagged files (PICARD-31) * Added keyboard shortcut to reload release (PICARD-99) * Medium formats weren't listed in order in the "Other versions" menu (PICARD-91) * Couldn't select multiple directories in "Add Folder" window on OS X (PICARD-74) Version 0.16 - 2011-10-23 * Added AcoustID support. * Fixed track metadata plugins. * Added new internal %_totalalbumtracks% tag field. (PICARD-16) * Track metadata plugins now run also on non-album tracks. (PICARD-7) * Fixed custom Various Artists name on the %albumartist% field. (PICARD-5) * Album artist is now correctly "translated". (PICARD-1) * Unicode punctuation is now converted to ASCII by default. * WavPack correction files are moved together with the main files. (PICARD-15) * Unicode filename normalization on OS X. * Original release date is now saved into %originaldate%. * Allow tagging with localized artist aliases (PICARD-17) * Added a quit confirmation dialog. (PICARD-46) * Standalone recordings can be tagged with relationships now. (PICARD-10) * Refreshing an album will refresh its "other versions" listing. (PICARD-8) * "Unicode punctuation to ASCII" now works on album-level metadata. (PICARD-50) * DJ-mix tags should only be written to the medium where they apply. (PICARD-20) * Support URL redirects in web service/network request module (PICARD-54) * Jamendo and Archive.org cover art is displayed on web page, but not loaded by Picard plugin (PICARD-52) * Edits to metadata in "Details..." menu not reflected in UI (PICARD-13) * The status bar/new metadata box is updated when a selected file/track is changed. (PICARD-14) Version 0.15.1 - 2011-07-31 * "Other versions" menu now displays release labels and catalog numbers. * Added CD-R, 8cm CD to the format mapping. * Picard no longer fails to load releases with new or unknown media formats. * Threading issues that could occasionally cause Picard to stop loading files have been fixed. * Fixed album metadata processor plugins not working (#5960) * Fixed loading of standalone recordings (#5961) * Fixed requests stopping at midnight (#5963) * Stopped using QDateTime for timing requests (for Qt 4.6 compatibility) (#5967) * Fixed display of ampersands in the "other versions" menu. (#5969) * Fixed use of numerical functions in advanced scripting. Version 0.15 - 2011-07-17 * Added options for using standardized track, release, and artist metadata. * Added preferred release format support. * Expanded preferred release country support to allow multiple countries. * Added support for tagging non-album tracks (standalone recordings). * Plugins can now be installed via drag and drop, or a file browser. * Added several new tags: %_originaldate%, %_recordingcomment%, and %_releasecomment% * Changes to request queuing: added separate high and low priority queues for each host. * Tagger scripts now run after metadata plugins finish (#5850) * The "compilation" tag can now be $unset or modified via tagger script. * Added a shortcut (Ctrl+I) for Edit->Details. * Miscellaneous bug fixes. Version 0.15beta1 - 2011-05-29 * Support for the NGS web service Version 0.14 - 2011-05-15 * Fixed a problem with network operations hanging after a network error (#5794, #5884) * ID3v2.3 with UTF-16 is now the default ID3 version * Option to set preferred release types for improved album matching * Added support for sorting the album/file lists (#75) * Fixed OptimFROG tag reading (#5859) * Fixed colors for a white-on-black color scheme (#5846) * Added an option to replace non-ASCII punctuation (#5834) * Support for writing release group and work IDs, currently unused (#5805) * Fixed saving of the release event format tag (#5250) * Added support for the language and script tags (#943) * Plugins can now use track-track relationships (#5849) * Allowed external drives to be visible in the file browser panel on OS X (#5308) Version 0.13 - 2011-03-06 * Changed Picard icon license to CC by-sa * Small UI consistency changes * Albums with tracks linked to more than one file are never marked as "completed". * Fixed matching of scanned files to tracks while the album is still loading. * Support for properly embedded FLAC pictures * Existing embedded images in APE and ASF files are removed only if there are new images to replace them. * More strict tagger script validation. * Fixed the $truncate tagger script function. * Proper rounding of track durations. * Fixed a bug with saving images larger than 64k to WMA files. * Added a $swapprefix tagger script function. * Release events with a date are preferred over the ones without a date. * Files that are being saved as marked as pending. * Updated .desktop file to allow opening Picard with multiple files. * Handle the "open file" event on Mac OS X. * Added timeouts to the HTTP web service client. * Fixed a bug with albums missing the expand/collapse icons Version 0.12.1 - 2009-11-01 * Fixed deletion of all COMM frames in ID3, which was introduced with the iTunNORM fix in Picard 0.12.0. * Restored native add folder dialog. Version 0.12 - 2009-10-25 * Live syntax checking for tagger script and naming strings. (Nikolai Prokoschenko) * Support ratings. (Philipp Wolfer) * Support for user folskonomy tags. (Lukáš Lalinský) * Embed cover art into APEv2 tags. (Lukáš Lalinský) * Embed cover art into WMA tags. (Philipp Wolfer) * New high quality application icon (Carlin Mangar) * Support for originaldate tag. (Philipp Wolfer) * Restructured file naming options. (Nikolai Prokoschenko) * Added option to select the user interface language. (Philipp Wolfer) * Highlight fully matched albums. (Nikolai Prokoschenko) * New script functions $matchedtracks(), $initials(), $firstalphachar(), $truncate() and $firstwords() * CD drive dropdown selection on Linux. (Philipp Wolfer) * Add disc ID to album metadata if loaded via disc lookup. (Philipp Wolfer) * Add expand/collapse all actions to tree views. (Philipp Wolfer) * Added DCC media format. * Removed unncecessary and confusing PUID lookup threshold. (Philipp Wolfer) * Fixed saving of copyright in ASF metadata. (#5419, Philipp Wolfer) * Write TRACKTOTAL and DISCTOTAL to vorbis files. (#4088, Philipp Wolfer) * Added keyboard shortcut to toggle file browser (#3954, Philipp Wolfer) * Write ISRCs from MusicBrainz into tags (Philipp Wolfer) * UI improvements on cover art box and icons (Carlin Mangar) * New Windows installer (Carlin Mangar) * New plugin extension point ui_init (Gary van der Merwe) * Updated plugin options page (Carlin Mangar) * Python 2.6 fixes. (Gary van der Merwe) * Fix PUID generation on big endian machines. (Jon Hermansen) * Fix lookup encoding for non latin characters. (#5233, Philip Jägenstedt) * Fix infinite loop when using Qt 4.5. (Lukáš Lalinský) * Ensure 16-byte memory alignment for avcodec, fixes issues with enabled SSE2 instructions. (#5263, Philipp Wolfer) * Use default CD device for disc ID lookups if no device was specified. (Philipp Wolfer) * Preserve file information (bitrate, extension etc.) on saving. (#3236, Philipp Wolfer) * Allow empty release events (#4818, Philipp Wolfer) * Respect the option "clear existing tags" when saving WMA files. (Philipp Wolfer) * Detect image format of cover images. (#4863, Philipp Wolfer) * Don't load CD stubs. (#4251, Philipp Wolfer) * Set match background color relative to the base color. (#4740, Philipp Wolfer) * Fix infinite loop when using Qt 4.5. (Lukáš Lalinský) * Fixed various issues with the PUID submission button. (Philipp Wolfer) * Fixed copy and paste (#5428, Philipp Wolfer) * Fixed loading of files with corrupted PUIDs (#5331, Carlin Mangar) * Fixed redirection handling (Lukáš Lalinský) * Fixed writng of iTunNORM tags in ID3 (Carlin Mangar) * Always restore window position so that the window is visible (Carlin Mangar) * Updated translations. Version 0.11 - 2008-12-02 * Support for new FFmpeg install locations * Automatically remove whitespaces from MB hostname in options * Release date from MB is now optional * Fixed per-track folksonomy tag support * Evaluate tagger script for album metadata * Show donation info in the about dialog * Support for .oga files (Ogg FLAC, Ogg Speex or Ogg Vorbis) * Fixed loading of performer tags from Vorbis Comments * Load embedded cover art from COVERART/COVERARTMIME Vorbis Comments * Allow setting the "Move Files To" location from the internal file browser * Copy&paste support in the file details dialog * Correct handling of "; " as a separator for sort names * Minimal support for TAK files * Fixed parsing of the "Pseudo-Release" release status * Fixed reading performers with empty role from ID3 tags * Don't allow empty file naming formats * Interactive password dialog * Fixed checking for non-Latin characters when using sort name as the main artist name Version 0.10 - 2008-07-27 * Fixed crash when reading CD TOC on 64-bit systems * Fixed handling of MP4 files with no metadata * Change the hotkey for help to the right key for OS X * Replace special characters after tagger script evalutaion to allow special characters being replaced by tagger script * Actually ignore 'ignored (folksonomy) tags' * Remove dependency on Mutagen 1.13, version 1.11 is enough now * Escape ampersand in release selection (#3748) Version 0.10.0rc1 - 2008-05-25 * Stop analyzing files that have been removed. (#3352, Gary van der Merwe) * Automatically disable CD lookup if no CD device is specified. (Will Holcomb) * Don't abort directory reading on invalid filename. (#2829, amckinle) * Add an option to select multiple directories from the 'Add Directory' window. (#3541, Will Holcomb) * Avoid scanning files that had been removed from the tagger. (#3352, Gary van der Merwe) * Folksonomy tags/genre support. (Lukáš Lalinský) * Added menu items (with keyboard shortcuts) for CD lookup / Scan / Lookup / Cluster. (Lukáš Lalinský) * Add taggerscript function $performer(). (Lukáš Lalinský) * Lower the default PUID lookup threshold to 10%. (Lukáš Lalinský) * Compare tracknumber and totaltracks as numbers, not strings. (Lukáš Lalinský) * Correctly escape special Lucene characters for searches/lookups. (#3448, Lukáš Lalinský) * Use MusicIP Mixer "archived analysis" to speed up PUID lookups. (Lukáš Lalinský) * Add language and script to variables. (#3635, Nikki) * Option to initiate searches with advanced query syntax on by default. (#3526, Lukáš Lalinský) * "Save Tags" item in options menu. (#3519, Lukáš Lalinský) * Create empty "plugins" directory by default on installation. (#3529, Lukáš Lalinský) * Added default release country option. (#3452, Philipp Wolfer) * Added release format type to release selection. (#3074, Philipp Wolfer) * Convert Vorbis tag "tracktotal" to "totaltracks" on load. (Philipp Wolfer) * Save 'arranger' to ID3 tags. (Lukáš Lalinský) * Store cover art in Ogg and FLAC files. (#3647, Hendrik van Antwerpen) * Album title not updated when related 'Unkown files' are modified. (#3682, Hendrik van Antwerpen) * Match selected release event to existing files. (#3687, Hendrik van Antwerpen) * Allow multiple files to be linked to a single track. (#3729, Gary van der Merwe) * Don't use mmap to resize files on Windows. (Lukáš Lalinský) Version 0.9.0 - 2007-12-16 * More custom tags in MP4 files (compatible with MediaMonkey and Jaikoz) (#3379) * Fixed MP4 fingerprinting on Windows. (#3454, #3374) * Fixed CD lookups on Windows. (#3462, #3362, #3386) * Set the %compilation% tag correctly. (#3263) * Fixed location of saved cover art files. (#3345) * The Picard window now won't start as hidden. (#2104, #2429) * Fixed reading of length of MP3 files with VBRI headers. (#3409) * Fixed WMA saving. (#3417) * Fixed saving of comment to ID3 tags. (#3418) * New mapping of "chorus master" AR to "conductor" tag. * Fixed system-wide plugin path on Linux. (#3430) * Use the earliest release date by default. (#3456) Version 0.9.0beta1 - 2007-10-28 * Save ASIN to MP4 files. * Add a --disable-locales option to setup.py build. (Santiago M. Mola) * New threading code, should make Picard crash less and be faster. * Replace initial dot in file and directory names. (#3204, Philipp Wolfer) * Fixed caps in the default cover art image. (#3242, Bogdan Butnaru) * Fixed broken naming preview. (#3214, Daniel Bumke) * Re-enable the drag/drop target indicators. (#3106) * Fix adding files and directories from the command line. (#3075) * Don't show the cover art box by default. * Lookup files individually for "Unmatched Files", not as a cluster. Version 0.9.0alpha14 - 2007-08-05 * Fixed PUID submissions. * Fixed drag&drop from Finder to Picard on Mac OS X. * Don't save files from "Unmatched Files" when saving an album. * Renamed "Analyze" to "Scan", to avoid confusion with MusicIP Mixer analysis. * Added plugin API versioning. Plugins now need to define constant PLUGIN_API_VERSIONS, otherwise they won't be loaded. * Added option to overwrite cover art by default. * Never wait more than second for the next HTTP request. * Fixed setting of the "Move Tagged Files To" folder, if the name contains non-ASCII characters. Version 0.9.0alpha13 - 2007-07-29 * Bug Fixes: * Fixed drag&drop issue on Windows Vista. http://forums.musicbrainz.org/viewtopic.php?id=693 Version 0.9.0alpha12 - 2007-07-29 * Changes: * "User directory" location changed: - On Windows from "%HOMEPATH%\Local Settings\Application Data\MusicBrainz Picard" to "%HOMEPATH%\Application Data\MusicBrainz\Picard" - On UNIX from "~/.picard" to "$XDG_CONFIG_HOME/MusicBrainz/Picard" (usually "~/.config/MusicBrainz/Picard") * Picard no longer logs every action and doesn't saves the logs. To enable more debug logging, use command line argument "-d" or "--debug" or environment variable "PICARD_DEBUG". * For plugins: - metadata["~#length"] is now metadata.length - metadata["~#artwork"] is now metadata.images * New Features: * Save embedded images to MP4 files. * Added option to select release events for albums. * Added internal log viewer. * Track and file context menu hooks for plugins. * Bug Fixes: * Deleting files from clusters increments total time rather than decrementing it. (#2965) * Update metadata boxes and cover art for selected items. (#2498) * Display error message for tracks. * Fixed drag-and-drop bugs on Mac OS X. * Added %releasecountry% to the file renaming preview. * Cluster multi-disc albums identified by tags, not (disc x). (#2555) Version 0.9.0alpha11 - 2007-05-27 * New Features: * Added "Edit" button to the tag editor. * Bug Fixes: * Fixed initialization of gettext translations. Version 0.9.0alpha10 - 2007-05-27 * New Features: * New TaggerScript function $len(text). (#2843) * Don't compress huge ID3 frames. (#2850) * Move "Add Cluster As Release" to a plugin. * Allow horizontal scrollbar in the file browser panel. (#2856) * Removed "Basic" tab from the "Details" window, "Advanced" tab renamed to "Metadata". * The tag editor can be used to edit multiple files. (#2893) * Bug Fixes: * F1 for Help instead of CTRL+H on Windows and Linux. (#2485, Nikolai Prokoschenko) * Tabbing focus transition from search isn't as expected. (#2546, Nikolai Prokoschenko) * Display an error message if launching a web browser failed. * Fixed web-service error caused PUID submissions. * Change function $gt(), $gte(), $lt(), $lte() to compare numbers, not strings. (#2848) * Fixed kfmclient launching under KDE/Python 2.5. * Fixed similarity calculation of non-latin texts. (#2891) * Don't try to auto-analyze files with "loading" errors. (#2862) Version 0.9.0alpha9 - 2007-05-12 * New Features: * The tag editor now accepts free-text tag names. * Load 'DJ-mixed by' AR data to %djmixer% tag. * Load 'Mixed by' AR data to %mixer% tag. * Delay the webservice client to do max. 1 request per second. * Sort files in clusters by disc number, track number and file name. (#2547) * Support for any text frame in special variable %_id3:%. * Ignore empty ID3 text values. * Windows installer: * Removed DirectX-based decoder. * FFmpeg compiled with AAC (faad2) support. * Bug Fixes: * Save XSOP frame to ID3v2.3 tags. (#2484) * Use attributes like 'guest' or 'additional' also from generic performer ARs. * Fixed capitalization of %releasetype% in file naming preview. (#2762) * Fixed 'python setup.py build_ext' if py2app and setuptools are loaded. * ID3v2.3 frame TDAT should be written in format DDMM, not MMDD. (#2770) * Don't display an error on Ogg and FLAC files with no tags. * Remove video files from the list of supported formats. * Always use musicbrainz.org for PUID submissions. (#2764) * Files/Pending Files count not reset/recalculated after removing files. (#2541) * Removed files still get processed during fingerprinting. (#2738) * Read only text values from APEv2 tags. (#2828) Version 0.9.0alpha8 - 2007-04-15 * New Features: * Notification of changed files in releases. (#2632, #2702) * Bux Fixes: * Don't open the file for analyzing twice. (#2733, #2734) * Save ASIN and release country to ID3 tags. (#2484, #2456) * Variable %country% renamed to %releasecountry%. * Save release country to MP4 and WMA tags. * Don't take unsupported tags into account when checking if the tags are 'complete' and the file should have 100% match. This fixes problems with showing the green check-marks for file with limited tag formats, like MP4 or WMA. * Ignore missing tag in $unset(). Version 0.9.0alpha7 - 2007-04-14 * New Features * Remember location in the file browser. (#2618) * Added FFmpeg support on Windows (MP3, Vorbis, FLAC, WavPack and many other audio formats). * Lowercase the extension on file renaming/moving. (#2701) * TaggerScript function `$copy(new,old)` to copy metadata from variable `old` to `new`. The difference between `$set(new,%old%)` is that `$copy(new,old)` copies multi-value variables without flattening them. * Added special purpose TaggerScript variable `%_id3:%` for direct setting of ID3 frames. Currently it supports only TXXX frames in format `%_id3:TXXX:%`, for example: `$copy(_id3:TXXX:PERFORMERSORTORDER,artistsort)`. * Support for WAV files. (#2537) * Removed GStreamer-based decoder. * Implemented `python setup.py install_locales`. * Bug Fixes: * Failed PUID submission deactivates the submit button. (#2673) * Unable to specify album art file name mask. (#2655) * Fixed incorrect copying of album metadata to tracks. (#2698) * Added options to un-hide toolbars. (#2631) * Fixed problem with saving extra performer FLAC tags containing non-ASCII characters. (#2719) * Read only the first date from ID3v2.3 tags. (#2460) * If the remembered directory for add dialogs and file browser was removed, try to find an existing directory in the same path. Version 0.9.0alpha6 - 2007-04-04 * New Features: * Added option --disable-autoupdate for 'build' and 'install' commands of the setup script. (#2551) * Automatically parse track numbers from file names like 01.flac for better cluster->album matching with untagged files. * Support for the new sorting tags in MP4 tags from iTunes 7.1. * Strip white-space from directory names. (#2558) * When replacing characters with their ascii equivalent, 'ß' should be replaced by 'ss'. (#2610) * Track level performer ARs. (#2561) * Remove leading and trailing whitespace from tags on file saving. (#892, #2665) * Support for labels, catalog numbers and barcodes. * Bug Fixes: * Artist names from ARs should be translated, too. * Freeze after answering no to "download the new version" prompt. (#2542) * %musicbrainz_albumid% not working in file renaming. (#2543) * Track time appears to display incorrectly if it's unknown on MusicBrainz. (#2548) * Fixed problem with removing albums/files after submitting PUIDs (#2556) * The user's script should be applied also to album metadata. * Fixed moving of additional files from paths with "special" characters. * Internals: * The browser integration HTTP server rewritten using QTcpServer. Version 0.9.0alpha5 - 2007-03-18 * New Features: * Replace Æ with AE in file/directory names. (#2512) * "Add cluster as release" (#1049) * Text labels under icon buttons. (#2476) * Bug Fixes: * Fixed fileId generator (caused problems with drag&drop if files with multiple formats are used). * Original Metadata not greyed out when no tracks are attached. (#2461) * Better detecting of the default Windows browser, with fallback to Internet Explorer. (#2502) * Better album/track lookup. (#2521) * File browser stays 'hidden' after first time use. (#2480) * Track length changed in Original Metadata after save. (#2510) * "Send PUIDs" button not disabled after albums are removed. (#2506) * The Windows package now includes JPEG loader to show cover art images correctly. (#2478) Version 0.9.0alpha4 - 2007-03-09 * Bug Fixes: * Fixed case-insentive file renaming. (#2457, #2513) Version 0.9.0alpha3 - 2007-03-08 * New Features: * Using of 'performed by' AR types (without instrument or vocal). * The "Replace non-ASCII characters" option will try to remove accents first. (#2466) * Added option to auto-analyze all files. (#2465) * Bug Fixes: * Fixed file clustering. * Added %albumartistsort%, %releasetype% and %releasestatus% to the file naming example (#2458) * Sanitize dates from ID3 tags. (#2460) * Fixed page switching in the options window on error. (#2455) * Correct case-insensitive file renaming on Windows (#1003, #2457) * Relative paths in the 'Move files to' option are relative to the current path of the file. (#2454) * Added a .desktop file. (#2470) * Release type and status should be in lower case. (#2489) Version 0.9.0alpha2 - 2007-03-04 * New Features: * New variable %_extension% (#2447) * File naming format tester. (#2448) * Added automatic checking for new versions. * Bug Fixes: * Fixed window position saving/restoring. (#2449) * Fixed iTunes compilation flag saving. (#2450) Version 0.9.0alpha1 - 2007-03-03 * First release. picard-release-1.3.2/README.md000066400000000000000000000020331245305550700156600ustar00rootroot00000000000000MusicBrainz Picard ================== [MusicBrainz Picard](http://picard.musicbrainz.org) is a cross-platform (Linux/Mac OS X/Windows) application written in Python and is the official [MusicBrainz](http://musicbrainz.org) tagger. Picard supports the majority of audio file formats, is capable of using audio fingerprints ([AcoustIDs](http://musicbrainz.org/doc/AcoustID)), performing CD lookups and [disc ID](http://musicbrainz.org/doc/Disc_ID) submissions, and it has excellent Unicode support. Additionally, there are several plugins available that extend Picard's features. When tagging files, Picard uses an album-oriented approach. This approach allows it to utilize the MusicBrainz data as effectively as possible and correctly tag your music. For more information, [see the illustrated quick start guide to tagging](http://picard.musicbrainz.org/docs/guide/). Picard is named after Captain Jean-Luc Picard from the TV series Star Trek: The Next Generation. Binary downloads are available [here](http://picard.musicbrainz.org/downloads/). picard-release-1.3.2/contrib/000077500000000000000000000000001245305550700160435ustar00rootroot00000000000000picard-release-1.3.2/contrib/plugins/000077500000000000000000000000001245305550700175245ustar00rootroot00000000000000picard-release-1.3.2/contrib/plugins/addrelease.py000066400000000000000000000145141245305550700221740ustar00rootroot00000000000000# -*- coding: utf-8 -*- PLUGIN_NAME = u"Add Cluster As Release" PLUGIN_AUTHOR = u'Frederik "Freso" S. Olesen, Lukáš Lalinský, Philip Jägenstedt' PLUGIN_DESCRIPTION = "Adds a plugin context menu option to clusters and single\ files to help you quickly add them as releases or standalone recordings to\ the MusicBrainz database via the website by pre-populating artists,\ track names and times." PLUGIN_VERSION = "0.5" PLUGIN_API_VERSIONS = ["1.0.0"] from picard.cluster import Cluster from picard.file import File from picard.util import webbrowser2 from picard.ui.itemviews import BaseAction, register_cluster_action, register_file_action import codecs import os import tempfile HTML_HEAD = """ %s
""" HTML_INPUT = """ """ HTML_TAIL = """
""" HTML_ATTR_ESCAPE = { "&": "&", '"': """ } class AddObjectAsEntity(BaseAction): NAME = "Add Object As Entity..." objtype = None submit_url = 'http://musicbrainz.org/' def __init__(self): super(AddObjectAsEntity, self).__init__() self.form_values = {} def check_object(self, objs, objtype): """ Checks if a given object array is valid (ie., has one item) and that its item is an object of the given type. Returns either False (if conditions are not met), or the object in the array. """ if not isinstance(objs[0], objtype) or len(objs) != 1: return False else: return objs[0] def add_form_value(self, key, value): "Add global (e.g., release level) name-value pair." self.form_values[key] = value def set_form_values(self, objdata): return def generate_html_file(self, form_values): (fd, fp) = tempfile.mkstemp(suffix=".html") f = codecs.getwriter("utf-8")(os.fdopen(fd, "w")) def esc(s): return "".join(HTML_ATTR_ESCAPE.get(c, c) for c in s) # add a global (release-level) name-value def nv(n, v): f.write(HTML_INPUT % (esc(n), esc(v))) f.write(HTML_HEAD % (self.NAME, self.submit_url)) for key in form_values: nv(key, form_values[key]) f.write(HTML_TAIL % (self.NAME)) f.close() return fp def open_html_file(self, fp): webbrowser2.open("file://" + fp) def callback(self, objs): objdata = self.check_object(objs, self.objtype) try: if objdata: self.set_form_values(objdata) html_file = self.generate_html_file(self.form_values) self.open_html_file(html_file) finally: self.form_values.clear() class AddClusterAsRelease(AddObjectAsEntity): NAME = "Add Cluster As Release..." objtype = Cluster submit_url = 'http://musicbrainz.org/release/add' def set_form_values(self, cluster): nv = self.add_form_value nv("artist_credit.names.0.artist.name", cluster.metadata["albumartist"]) nv("name", cluster.metadata["album"]) discnumber_shift = -1 for i, file in enumerate(cluster.files): try: i = int(file.metadata["tracknumber"]) - 1 except: pass # As per https://musicbrainz.org/doc/Development/Release_Editor_Seeding#Tracklists_and_Mediums # the medium numbers ("m") must be starting with 0. # Maybe the existing tags don't have disc numbers in them or # they're starting with something smaller than or equal to 0, so try # to produce a sane disc number. try: m = int(file.metadata.get("discnumber", 1)) if m <= 0: # A disc number was smaller than or equal to 0 - all other # disc numbers need to be changed to accommodate that. discnumber_shift = max(discnumber_shift, 0 - m) m = m + discnumber_shift except Exception as e: # The most likely reason for an exception at this point is a # ValueError because the disc number in the tags was not a # number. Just log the exception and assume the medium number # is 0. file.log.info("Trying to get the disc number of %s caused the following error: %s; assuming 0", file.filename, e) m = 0 # add a track-level name-value def tnv(n, v): nv("mediums.%d.track.%d.%s" % (m, i, n), v) tnv("name", file.metadata["title"]) if file.metadata["artist"] != cluster.metadata["albumartist"]: tnv("artist_credit.names.0.name", file.metadata["artist"]) tnv("length", str(file.metadata.length)) class AddFileAsRecording(AddObjectAsEntity): NAME = "Add File As Standalone Recording..." objtype = File submit_url = 'http://musicbrainz.org/recording/create' def set_form_values(self, track): nv = self.add_form_value nv("edit-recording.name", track.metadata["title"]) nv("edit-recording.artist_credit.names.0.artist.name", track.metadata["artist"]) nv("edit-recording.length", track.metadata["~length"]) class AddFileAsRelease(AddObjectAsEntity): NAME = "Add File As Release..." objtype = File submit_url = 'http://musicbrainz.org/release/add' def set_form_values(self, track): nv = self.add_form_value # Main album attributes if track.metadata["albumartist"]: nv("artist_credit.names.0.artist.name", track.metadata["albumartist"]) else: nv("artist_credit.names.0.artist.name", track.metadata["artist"]) if track.metadata["album"]: nv("name", track.metadata["album"]) else: nv("name", track.metadata["title"]) # Tracklist nv("mediums.0.track.0.name", track.metadata["title"]) nv("mediums.0.track.0.artist_credit.names.0.name", track.metadata["artist"]) nv("mediums.0.track.0.length", str(track.metadata.length)) register_cluster_action(AddClusterAsRelease()) register_file_action(AddFileAsRecording()) register_file_action(AddFileAsRelease()) picard-release-1.3.2/contrib/plugins/albumartist_website.py000066400000000000000000000116721245305550700241560ustar00rootroot00000000000000# -*- coding: utf-8 -*- PLUGIN_NAME = _(u'Album Artist Website') PLUGIN_AUTHOR = u'Sophist' PLUGIN_DESCRIPTION = u'''Add's the album artist(s) Official Homepage(s) (if they are defined in the MusicBrainz database).''' PLUGIN_VERSION = '0.3' PLUGIN_API_VERSIONS = ["0.15.0", "0.15.1", "0.16.0", "1.0.0", "1.1.0", "1.2.0", "1.3.0"] from picard import config, log from picard.util import LockableObject from picard.metadata import register_track_metadata_processor from functools import partial class AlbumArtistWebsite: class ArtistWebsiteQueue(LockableObject): def __init__(self): LockableObject.__init__(self) self.queue = {} def __contains__(self, name): return name in self.queue def __iter__(self): return self.queue.__iter__() def __getitem__(self, name): self.lock_for_read() value = self.queue[name] if name in self.queue else None self.unlock() return value def __setitem__(self, name, value): self.lock_for_write() self.queue[name] = value self.unlock() def append(self, name, value): self.lock_for_write() if name in self.queue: self.queue[name].append(value) value = False else: self.queue[name] = [value] value = True self.unlock() return value def remove(self, name): self.lock_for_write() value = None if name in self.queue: value = self.queue[name] del self.queue[name] self.unlock() return value def __init__(self): self.website_cache = {} self.website_queue = self.ArtistWebsiteQueue() def add_artist_website(self, album, track_metadata, trackXmlNode, releaseXmlNode): albumArtistIds = dict.get(track_metadata,'musicbrainz_albumartistid', []) for artistId in albumArtistIds: if artistId in self.website_cache: if self.website_cache[artistId]: track_metadata['website'] = self.website_cache[artistId] else: # Jump through hoops to get track object!! self.website_add_track(album, album._new_tracks[-1], artistId) def website_add_track(self, album, track, artistId): self.album_add_request(album) if self.website_queue.append(artistId, (track, album)): host = config.setting["server_host"] port = config.setting["server_port"] path = "/ws/2/%s/%s?inc=%s" % ('artist', artistId, 'url-rels') return album.tagger.xmlws.get(host, port, path, partial(self.website_process, artistId), xml=True, priority=True, important=False) def website_process(self, artistId, response, reply, error): if error: log.error("%s: %r: Network error retrieving artist record", PLUGIN_NAME, artistId) tuples = self.website_queue.remove(artistId) for track, album in tuples: self.album_remove_request(album) return urls = self.artist_process_metadata(artistId, response) self.website_cache[artistId] = urls tuples = self.website_queue.remove(artistId) log.debug("%s: %r: Artist Official Homepages = %r", PLUGIN_NAME, artistId, urls) for track, album in tuples: self.album_remove_request(album) if urls: tm = track.metadata tm['website'] = urls for file in track.iterfiles(True): fm = file.metadata fm['website'] = urls def album_add_request(self, album): album._requests += 1 def album_remove_request(self, album): album._requests -= 1 if album._requests == 0: album._finalize_loading(None) def artist_process_metadata(self, artistId, response): if 'metadata' in response.children: if 'artist' in response.metadata[0].children: if 'relation_list' in response.metadata[0].artist[0].children: if 'relation' in response.metadata[0].artist[0].relation_list[0].children: return self.artist_process_relations(response.metadata[0].artist[0].relation_list[0].relation) else: log.error("%s: %r: MusicBrainz artist xml result not in correct format - %s", PLUGIN_NAME, artistId, response) return None def artist_process_relations(self, relations): urls = [] for relation in relations: if relation.type == 'official homepage' \ and 'target' in relation.children: urls.append(relation.target[0].text) return urls register_track_metadata_processor(AlbumArtistWebsite().add_artist_website) picard-release-1.3.2/contrib/plugins/classicdiscnumber.py000066400000000000000000000014041245305550700235720ustar00rootroot00000000000000PLUGIN_NAME = 'Classic Disc Numbers' PLUGIN_AUTHOR = 'Lukas Lalinsky' PLUGIN_DESCRIPTION = '''Moves disc numbers and subtitles from the separate tags to album titles.''' PLUGIN_VERSION = "0.1" PLUGIN_API_VERSIONS = ["0.15"] from picard.metadata import register_track_metadata_processor import re def add_discnumbers(tagger, metadata, release, track): if int(metadata["totaldiscs"] or "0") > 1: if "discsubtitle" in metadata: metadata["album"] = "%s (disc %s: %s)" % ( metadata["album"], metadata["discnumber"], metadata["discsubtitle"]) else: metadata["album"] = "%s (disc %s)" % ( metadata["album"], metadata["discnumber"]) register_track_metadata_processor(add_discnumbers) picard-release-1.3.2/contrib/plugins/cuesheet.py000066400000000000000000000147051245305550700217120ustar00rootroot00000000000000# -*- coding: utf-8 -*- PLUGIN_NAME = u"Generate Cuesheet" PLUGIN_AUTHOR = u"Lukáš Lalinský" PLUGIN_DESCRIPTION = "Generate cuesheet (.cue file) from an album." PLUGIN_VERSION = "0.1" PLUGIN_API_VERSIONS = ["0.10", "0.15"] import os.path import re from PyQt4 import QtCore, QtGui from picard.util import find_existing_path, encode_filename from picard.ui.itemviews import BaseAction, register_album_action _whitespace_re = re.compile('\s', re.UNICODE) _split_re = re.compile('\s*("[^"]*"|[^ ]+)\s*', re.UNICODE) def msfToMs(msf): msf = msf.split(":") return ((int(msf[0]) * 60 + int(msf[1])) * 75 + int(msf[2])) * 1000 / 75 class CuesheetTrack(list): def __init__(self, cuesheet, index): list.__init__(self) self.cuesheet = cuesheet self.index = index def set(self, *args): self.append(args) def find(self, prefix): return [i for i in self if tuple(i[:len(prefix)]) == tuple(prefix)] def getTrackNumber(self): return self.index def getLength(self): try: nextTrack = self.cuesheet.tracks[self.index + 1] index0 = self.find((u"INDEX", u"01")) index1 = nextTrack.find((u"INDEX", u"01")) return msfToMs(index1[0][2]) - msfToMs(index0[0][2]) except IndexError: return 0 def getField(self, prefix): try: return self.find(prefix)[0][len(prefix)] except IndexError: return u"" def getArtist(self): return self.getField((u"PERFORMER",)) def getTitle(self): return self.getField((u"TITLE",)) def setArtist(self, artist): found = False for item in self: if item[0] == u"PERFORMER": if not found: item[1] = artist found = True else: del item if not found: self.append((u"PERFORMER", artist)) artist = property(getArtist, setArtist) class Cuesheet(object): def __init__(self, filename): self.filename = filename self.tracks = [] def read(self): f = open(encode_filename(self.filename)) self.parse(f.readlines()) f.close() def unquote(self, string): if string.startswith('"'): if string.endswith('"'): return string[1:-1] else: return string[1:] return string def quote(self, string): if _whitespace_re.search(string): return '"' + string.replace('"', '\'') + '"' return string def parse(self, lines): track = CuesheetTrack(self, 0) self.tracks = [track] isUnicode = False for line in lines: # remove BOM if line.startswith('\xfe\xff'): isUnicode = True line = line[1:] # decode to unicode string line = line.strip() if isUnicode: line = line.decode('UTF-8', 'replace') else: line = line.decode('ISO-8859-1', 'replace') # parse the line split = [self.unquote(s) for s in _split_re.findall(line)] keyword = split[0].upper() if keyword == 'TRACK': trackNum = int(split[1]) track = CuesheetTrack(self, trackNum) self.tracks.append(track) track.append(split) def write(self): lines = [] for track in self.tracks: num = track.index for line in track: indent = 0 if num > 0: if line[0] == "TRACK": indent = 2 elif line[0] != "FILE": indent = 4 line2 = u" ".join([self.quote(s) for s in line]) lines.append(" " * indent + line2.encode("UTF-8") + "\n") f = open(encode_filename(self.filename), "wt") f.writelines(lines) f.close() class GenerateCuesheet(BaseAction): NAME = "Generate &Cuesheet..." def callback(self, objs): album = objs[0] current_directory = self.config.persist["current_directory"] or QtCore.QDir.homePath() current_directory = find_existing_path(unicode(current_directory)) selected_format = QtCore.QString() filename = QtGui.QFileDialog.getSaveFileName(None, "", current_directory, "Cuesheet (*.cue)", selected_format) if filename: filename = unicode(filename) cuesheet = Cuesheet(filename) #try: cuesheet.read() #except IOError: pass while len(cuesheet.tracks) <= len(album.tracks): track = CuesheetTrack(cuesheet, len(cuesheet.tracks)) cuesheet.tracks.append(track) #if len(cuesheet.tracks) > len(album.tracks) - 1: # cuesheet.tracks = cuesheet.tracks[0:len(album.tracks)+1] t = cuesheet.tracks[0] t.set("PERFORMER", album.metadata["albumartist"]) t.set("TITLE", album.metadata["album"]) t.set("REM", "MUSICBRAINZ_ALBUM_ID", album.metadata["musicbrainz_albumid"]) t.set("REM", "MUSICBRAINZ_ALBUM_ARTIST_ID", album.metadata["musicbrainz_albumartistid"]) if "date" in album.metadata: t.set("REM", "DATE", album.metadata["date"]) index = 0.0 for i, track in enumerate(album.tracks): mm = index / 60.0 ss = (mm - int(mm)) * 60.0 ff = (ss - int(ss)) * 75.0 index += track.metadata.length / 1000.0 t = cuesheet.tracks[i + 1] t.set("TRACK", "%02d" % (i + 1), "AUDIO") t.set("PERFORMER", track.metadata["artist"]) t.set("TITLE", track.metadata["title"]) t.set("REM", "MUSICBRAINZ_TRACK_ID", track.metadata["musicbrainz_trackid"]) t.set("REM", "MUSICBRAINZ_ARTIST_ID", track.metadata["musicbrainz_artistid"]) t.set("INDEX", "01", "%02d:%02d:%02d" % (mm, ss, ff)) for file in track.linked_files: audio_filename = file.filename if os.path.dirname(filename) == os.path.dirname(audio_filename): audio_filename = os.path.basename(audio_filename) cuesheet.tracks[i].set("FILE", audio_filename, "MP3") cuesheet.write() action = GenerateCuesheet() register_album_action(action) picard-release-1.3.2/contrib/plugins/discnumber.py000066400000000000000000000016751245305550700222420ustar00rootroot00000000000000PLUGIN_NAME = 'Disc Numbers' PLUGIN_AUTHOR = 'Lukas Lalinsky' PLUGIN_DESCRIPTION = '''Moves disc numbers and subtitles from album titles to separate tags. For example:
"Aerial (disc 1: A Sea of Honey)"
  • album = "Aerial"
  • discnumber = "1"
  • discsubtitle = "A Sea of Honey"
''' PLUGIN_VERSION = "0.1" PLUGIN_API_VERSIONS = ["0.9.0", "0.10", "0.15"] from picard.metadata import register_album_metadata_processor import re _discnumber_re = re.compile(r"\s+\(disc (\d+)(?::\s+([^)]+))?\)") def remove_discnumbers(tagger, metadata, release): matches = _discnumber_re.search(metadata["album"]) if matches: metadata["discnumber"] = matches.group(1) if matches.group(2): metadata["discsubtitle"] = matches.group(2) metadata["album"] = _discnumber_re.sub('', metadata["album"]) register_album_metadata_processor(remove_discnumbers) picard-release-1.3.2/contrib/plugins/featartist.py000066400000000000000000000010431245305550700222420ustar00rootroot00000000000000PLUGIN_NAME = 'Feat. Artists Removed' PLUGIN_AUTHOR = 'Lukas Lalinsky, Bryan Toth' PLUGIN_DESCRIPTION = 'Removes feat. artists from track titles. Substitution is case insensitive.' PLUGIN_VERSION = "0.2" PLUGIN_API_VERSIONS = ["0.9.0", "0.10", "0.15", "0.16"] from picard.metadata import register_track_metadata_processor import re def remove_featartists(tagger, metadata, release, track): metadata["title"] = re.sub(r"\s+\(feat. [^)]*\)", "", metadata["title"], flags=re.IGNORECASE) register_track_metadata_processor(remove_featartists) picard-release-1.3.2/contrib/plugins/featartistsintitles.py000066400000000000000000000020311245305550700241770ustar00rootroot00000000000000PLUGIN_NAME = 'Feat. Artists in Titles' PLUGIN_AUTHOR = 'Lukas Lalinsky, Michael Wiencek, Bryan Toth' PLUGIN_DESCRIPTION = 'Move "feat." from artist names to album and track titles. Match is case insensitive.' PLUGIN_VERSION = "0.2" PLUGIN_API_VERSIONS = ["0.9.0", "0.10", "0.15", "0.16"] from picard.metadata import register_album_metadata_processor, register_track_metadata_processor import re def move_album_featartists(tagger, metadata, release): match = re.match(r"([\s\S]+) feat.([\s\S]+)", metadata["albumartist"], re.IGNORECASE) if match: metadata["albumartist"] = match.group(1) metadata["album"] += " (feat.%s)" % match.group(2) def move_track_featartists(tagger, metadata, release, track): match = re.match(r"([\s\S]+) feat.([\s\S]+)", metadata["artist"], re.IGNORECASE) if match: metadata["artist"] = match.group(1) metadata["title"] += " (feat.%s)" % match.group(2) register_album_metadata_processor(move_album_featartists) register_track_metadata_processor(move_track_featartists) picard-release-1.3.2/contrib/plugins/lastfm/000077500000000000000000000000001245305550700210125ustar00rootroot00000000000000picard-release-1.3.2/contrib/plugins/lastfm/__init__.py000066400000000000000000000155621245305550700231340ustar00rootroot00000000000000# -*- coding: utf-8 -*- PLUGIN_NAME = u'Last.fm' PLUGIN_AUTHOR = u'Lukáš Lalinský' PLUGIN_DESCRIPTION = u'Use tags from Last.fm as genre.' PLUGIN_VERSION = "0.4" PLUGIN_API_VERSIONS = ["0.15"] from PyQt4 import QtCore from picard.metadata import register_track_metadata_processor from picard.ui.options import register_options_page, OptionsPage from picard.config import BoolOption, IntOption, TextOption from picard.plugins.lastfm.ui_options_lastfm import Ui_LastfmOptionsPage from picard.util import partial import traceback LASTFM_HOST = "ws.audioscrobbler.com" LASTFM_PORT = 80 # From http://www.last.fm/api/tos, 2011-07-30 # 4.4 (...) You will not make more than 5 requests per originating IP address per second, averaged over a # 5 minute period, without prior written consent. (...) from picard.webservice import REQUEST_DELAY REQUEST_DELAY[(LASTFM_HOST, LASTFM_PORT)] = 200 # Cache for Tags to avoid re-requesting tags within same Picard session _cache = {} # Keeps track of requests for tags made to webservice API but not yet returned (to avoid re-requesting the same URIs) _pending_xmlws_requests = {} # TODO: move this to an options page TRANSLATE_TAGS = { "hip hop": u"Hip-Hop", "synth-pop": u"Synthpop", "electronica": u"Electronic", } TITLE_CASE = True def _tags_finalize(album, metadata, tags, next): if next: next(tags) else: tags = list(set(tags)) if tags: join_tags = album.tagger.config.setting["lastfm_join_tags"] if join_tags: tags = join_tags.join(tags) metadata["genre"] = tags def _tags_downloaded(album, metadata, min_usage, ignore, next, current, data, reply, error): try: try: intags = data.toptags[0].tag except AttributeError: intags = [] tags = [] for tag in intags: name = tag.name[0].text.strip() try: count = int(tag.count[0].text.strip()) except ValueError: count = 0 if count < min_usage: break try: name = TRANSLATE_TAGS[name] except KeyError: pass if name.lower() not in ignore: tags.append(name.title()) url = str(reply.url().path()) _cache[url] = tags _tags_finalize(album, metadata, current + tags, next) # Process any pending requests for the same URL if url in _pending_xmlws_requests: pending = _pending_xmlws_requests[url] del _pending_xmlws_requests[url] for delayed_call in pending: delayed_call() except: album.tagger.log.error("Problem processing downloaded tags in last.fm plugin: %s", traceback.format_exc()) raise finally: album._requests -= 1 album._finalize_loading(None) def get_tags(album, metadata, path, min_usage, ignore, next, current): """Get tags from an URL.""" url = str(QtCore.QUrl.fromPercentEncoding(path)) if url in _cache: _tags_finalize(album, metadata, current + _cache[url], next) else: # If we have already sent a request for this URL, delay this call until later if url in _pending_xmlws_requests: _pending_xmlws_requests[url].append(partial(get_tags, album, metadata, path, min_usage, ignore, next, current)) else: _pending_xmlws_requests[url] = [] album._requests += 1 album.tagger.xmlws.get(LASTFM_HOST, LASTFM_PORT, path, partial(_tags_downloaded, album, metadata, min_usage, ignore, next, current), priority=True, important=True) def encode_str(s): # Yes, that's right, Last.fm prefers double URL-encoding s = QtCore.QUrl.toPercentEncoding(s) s = QtCore.QUrl.toPercentEncoding(unicode(s)) return s def get_track_tags(album, metadata, artist, track, min_usage, ignore, next, current): """Get track top tags.""" path = "/1.0/track/%s/%s/toptags.xml" % (encode_str(artist), encode_str(track)) get_tags(album, metadata, path, min_usage, ignore, next, current) def get_artist_tags(album, metadata, artist, min_usage, ignore, next, current): """Get artist top tags.""" path = "/1.0/artist/%s/toptags.xml" % (encode_str(artist),) get_tags(album, metadata, path, min_usage, ignore, next, current) def process_track(album, metadata, release, track): tagger = album.tagger use_track_tags = tagger.config.setting["lastfm_use_track_tags"] use_artist_tags = tagger.config.setting["lastfm_use_artist_tags"] min_tag_usage = tagger.config.setting["lastfm_min_tag_usage"] ignore_tags = tagger.config.setting["lastfm_ignore_tags"].lower().split(",") if use_track_tags or use_artist_tags: artist = metadata["artist"] title = metadata["title"] if artist: if use_artist_tags: get_artist_tags_func = partial(get_artist_tags, album, metadata, artist, min_tag_usage, ignore_tags, None) else: get_artist_tags_func = None if title and use_track_tags: get_track_tags(album, metadata, artist, title, min_tag_usage, ignore_tags, get_artist_tags_func, []) elif get_artist_tags_func: get_artist_tags_func([]) class LastfmOptionsPage(OptionsPage): NAME = "lastfm" TITLE = "Last.fm" PARENT = "plugins" options = [ BoolOption("setting", "lastfm_use_track_tags", False), BoolOption("setting", "lastfm_use_artist_tags", False), IntOption("setting", "lastfm_min_tag_usage", 15), TextOption("setting", "lastfm_ignore_tags", "seen live,favorites"), TextOption("setting", "lastfm_join_tags", ""), ] def __init__(self, parent=None): super(LastfmOptionsPage, self).__init__(parent) self.ui = Ui_LastfmOptionsPage() self.ui.setupUi(self) def load(self): self.ui.use_track_tags.setChecked(self.config.setting["lastfm_use_track_tags"]) self.ui.use_artist_tags.setChecked(self.config.setting["lastfm_use_artist_tags"]) self.ui.min_tag_usage.setValue(self.config.setting["lastfm_min_tag_usage"]) self.ui.ignore_tags.setText(self.config.setting["lastfm_ignore_tags"]) self.ui.join_tags.setEditText(self.config.setting["lastfm_join_tags"]) def save(self): self.config.setting["lastfm_use_track_tags"] = self.ui.use_track_tags.isChecked() self.config.setting["lastfm_use_artist_tags"] = self.ui.use_artist_tags.isChecked() self.config.setting["lastfm_min_tag_usage"] = self.ui.min_tag_usage.value() self.config.setting["lastfm_ignore_tags"] = unicode(self.ui.ignore_tags.text()) self.config.setting["lastfm_join_tags"] = unicode(self.ui.join_tags.currentText()) register_track_metadata_processor(process_track) register_options_page(LastfmOptionsPage) picard-release-1.3.2/contrib/plugins/lastfm/options_lastfm.ui000066400000000000000000000114031245305550700244110ustar00rootroot00000000000000 LastfmOptionsPage 0 0 305 317 9 6 Last.fm 9 2 Use track tags Use artist tags Tags 9 2 Ignore tags: 0 6 5 5 4 0 Join multiple tags with: 5 0 1 0 true / , 0 6 7 5 0 0 Minimal tag usage: min_tag_usage % 100 Qt::Vertical 263 21 use_track_tags ignore_tags picard-release-1.3.2/contrib/plugins/lastfm/ui_options_lastfm.py000066400000000000000000000126731245305550700251330ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_LastfmOptionsPage(object): def setupUi(self, LastfmOptionsPage): LastfmOptionsPage.setObjectName(_fromUtf8("LastfmOptionsPage")) LastfmOptionsPage.resize(305, 317) self.vboxlayout = QtGui.QVBoxLayout(LastfmOptionsPage) self.vboxlayout.setMargin(9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.rename_files = QtGui.QGroupBox(LastfmOptionsPage) self.rename_files.setObjectName(_fromUtf8("rename_files")) self.vboxlayout1 = QtGui.QVBoxLayout(self.rename_files) self.vboxlayout1.setMargin(9) self.vboxlayout1.setSpacing(2) self.vboxlayout1.setObjectName(_fromUtf8("vboxlayout1")) self.use_track_tags = QtGui.QCheckBox(self.rename_files) self.use_track_tags.setObjectName(_fromUtf8("use_track_tags")) self.vboxlayout1.addWidget(self.use_track_tags) self.use_artist_tags = QtGui.QCheckBox(self.rename_files) self.use_artist_tags.setObjectName(_fromUtf8("use_artist_tags")) self.vboxlayout1.addWidget(self.use_artist_tags) self.vboxlayout.addWidget(self.rename_files) self.rename_files_2 = QtGui.QGroupBox(LastfmOptionsPage) self.rename_files_2.setObjectName(_fromUtf8("rename_files_2")) self.vboxlayout2 = QtGui.QVBoxLayout(self.rename_files_2) self.vboxlayout2.setMargin(9) self.vboxlayout2.setSpacing(2) self.vboxlayout2.setObjectName(_fromUtf8("vboxlayout2")) self.ignore_tags_2 = QtGui.QLabel(self.rename_files_2) self.ignore_tags_2.setObjectName(_fromUtf8("ignore_tags_2")) self.vboxlayout2.addWidget(self.ignore_tags_2) self.ignore_tags = QtGui.QLineEdit(self.rename_files_2) self.ignore_tags.setObjectName(_fromUtf8("ignore_tags")) self.vboxlayout2.addWidget(self.ignore_tags) self.hboxlayout = QtGui.QHBoxLayout() self.hboxlayout.setMargin(0) self.hboxlayout.setSpacing(6) self.hboxlayout.setObjectName(_fromUtf8("hboxlayout")) self.ignore_tags_4 = QtGui.QLabel(self.rename_files_2) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Policy(5), QtGui.QSizePolicy.Policy(5)) sizePolicy.setHorizontalStretch(4) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.ignore_tags_4.sizePolicy().hasHeightForWidth()) self.ignore_tags_4.setSizePolicy(sizePolicy) self.ignore_tags_4.setObjectName(_fromUtf8("ignore_tags_4")) self.hboxlayout.addWidget(self.ignore_tags_4) self.join_tags = QtGui.QComboBox(self.rename_files_2) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Policy(5), QtGui.QSizePolicy.Policy(0)) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.join_tags.sizePolicy().hasHeightForWidth()) self.join_tags.setSizePolicy(sizePolicy) self.join_tags.setEditable(True) self.join_tags.setObjectName(_fromUtf8("join_tags")) self.join_tags.addItem(_fromUtf8("")) self.join_tags.setItemText(0, _fromUtf8("")) self.join_tags.addItem(_fromUtf8("")) self.join_tags.addItem(_fromUtf8("")) self.hboxlayout.addWidget(self.join_tags) self.vboxlayout2.addLayout(self.hboxlayout) self.hboxlayout1 = QtGui.QHBoxLayout() self.hboxlayout1.setMargin(0) self.hboxlayout1.setSpacing(6) self.hboxlayout1.setObjectName(_fromUtf8("hboxlayout1")) self.label_4 = QtGui.QLabel(self.rename_files_2) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Policy(7), QtGui.QSizePolicy.Policy(5)) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_4.sizePolicy().hasHeightForWidth()) self.label_4.setSizePolicy(sizePolicy) self.label_4.setObjectName(_fromUtf8("label_4")) self.hboxlayout1.addWidget(self.label_4) self.min_tag_usage = QtGui.QSpinBox(self.rename_files_2) self.min_tag_usage.setMaximum(100) self.min_tag_usage.setObjectName(_fromUtf8("min_tag_usage")) self.hboxlayout1.addWidget(self.min_tag_usage) self.vboxlayout2.addLayout(self.hboxlayout1) self.vboxlayout.addWidget(self.rename_files_2) spacerItem = QtGui.QSpacerItem(263, 21, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.label_4.setBuddy(self.min_tag_usage) self.retranslateUi(LastfmOptionsPage) QtCore.QMetaObject.connectSlotsByName(LastfmOptionsPage) LastfmOptionsPage.setTabOrder(self.use_track_tags, self.ignore_tags) def retranslateUi(self, LastfmOptionsPage): self.rename_files.setTitle(_("Last.fm")) self.use_track_tags.setText(_("Use track tags")) self.use_artist_tags.setText(_("Use artist tags")) self.rename_files_2.setTitle(_("Tags")) self.ignore_tags_2.setText(_("Ignore tags:")) self.ignore_tags_4.setText(_("Join multiple tags with:")) self.join_tags.setItemText(1, _(" / ")) self.join_tags.setItemText(2, _(", ")) self.label_4.setText(_("Minimal tag usage:")) self.min_tag_usage.setSuffix(_(" %")) picard-release-1.3.2/contrib/plugins/lastfmplus/000077500000000000000000000000001245305550700217165ustar00rootroot00000000000000picard-release-1.3.2/contrib/plugins/lastfmplus/__init__.py000066400000000000000000001625241245305550700240410ustar00rootroot00000000000000# -*- coding: utf-8 -*- PLUGIN_NAME = u'Last.fm.Plus' PLUGIN_AUTHOR = u'RifRaf, Lukáš Lalinský, voiceinsideyou' PLUGIN_DESCRIPTION = u'''Uses folksonomy tags from Last.fm to
* Sort music into major and minor genres based on configurable genre "whitelists"
* Add "mood", "occasion" and other custom categories
* Add "original release year" and "decade" tags, as well as populate blank dates.''' PLUGIN_VERSION = "0.14" PLUGIN_API_VERSIONS = ["0.15"] from PyQt4 import QtGui, QtCore from picard.metadata import register_track_metadata_processor from picard.ui.options import register_options_page, OptionsPage from picard.config import BoolOption, IntOption, TextOption from picard.plugins.lastfmplus.ui_options_lastfm import Ui_LastfmOptionsPage from picard.util import partial import traceback import re LASTFM_HOST = "ws.audioscrobbler.com" LASTFM_PORT = 80 # From http://www.last.fm/api/tos, 2011-07-30 # 4.4 (...) You will not make more than 5 requests per originating IP address per second, averaged over a # 5 minute period, without prior written consent. (...) from picard.webservice import REQUEST_DELAY REQUEST_DELAY[(LASTFM_HOST, LASTFM_PORT)] = 200 # Cache for Tags to avoid re-requesting tags within same Picard session _cache = {} # Keeps track of requests for tags made to webservice API but not yet returned (to avoid re-requesting the same URIs) _pending_xmlws_requests = {} # Cache to Find the Genres and other Tags ALBUM_GENRE = {} ALBUM_SUBGENRE = {} ALBUM_COUNTRY = {} ALBUM_CITY = {} ALBUM_DECADE = {} ALBUM_YEAR = {} ALBUM_OCCASION = {} ALBUM_CATEGORY = {} ALBUM_MOOD = {} #noinspection PyDictCreation GENRE_FILTER = {} GENRE_FILTER["_loaded_"] = False GENRE_FILTER["major"] = ["audiobooks, blues, classic rock, classical, country, dance, electronica, folk, hip-hop, indie, jazz, kids, metal, pop, punk, reggae, rock, soul, trance"] GENRE_FILTER["minor"] = ["2 tone, a cappella, abstract hip-hop, acid, acid jazz, acid rock, acoustic, acoustic guitar, acoustic rock, adult alternative, adult contemporary, alternative, alternative country, alternative folk, alternative metal, alternative pop, alternative rock, ambient, anti-folk, art rock, atmospheric, aussie hip-hop, avant-garde, ballads, baroque, beach, beats, bebop, big band, blaxploitation, blue-eyed soul, bluegrass, blues rock, boogie rock, boogie woogie, bossa nova, breakbeat, breaks, brit pop, brit rock, british invasion, broadway, bubblegum pop, cabaret, calypso, cha cha, choral, christian rock, classic country, classical guitar, club, college rock, composers, contemporary country, contemporary folk, country folk, country pop, country rock, crossover, dance pop, dancehall, dark ambient, darkwave, delta blues, dirty south, disco, doo wop, doom metal, downtempo, dream pop, drum and bass, dub, dub reggae, dubstep, east coast rap, easy listening, electric blues, electro, electro pop, elevator music, emo, emocore, ethnic, eurodance, europop, experimental, fingerstyle, folk jazz, folk pop, folk punk, folk rock, folksongs, free jazz, french rap, funk, funk metal, funk rock, fusion, g-funk, gaelic, gangsta rap, garage, garage rock, glam rock, goa trance, gospel, gothic, gothic metal, gothic rock, gregorian, groove, grunge, guitar, happy hardcore, hard rock, hardcore, hardcore punk, hardcore rap, hardstyle, heavy metal, honky tonk, horror punk, house, humour, hymn, idm, indie folk, indie pop, indie rock, industrial, industrial metal, industrial rock, instrumental, instrumental hip-hop, instrumental rock, j-pop, j-rock, jangle pop, jazz fusion, jazz vocal, jungle, latin, latin jazz, latin pop, lounge, lovers rock, lullaby, madchester, mambo, medieval, melodic rock, minimal, modern country, modern rock, mood music, motown, neo-soul, new age, new romantic, new wave, noise, northern soul, nu metal, old school rap, opera, orchestral, philly soul, piano, political reggae, polka, pop life, pop punk, pop rock, pop soul, post punk, post rock, power pop, progressive, progressive rock, psychedelic, psychedelic folk, psychedelic punk, psychedelic rock, psychobilly, psytrance, punk rock, quiet storm, r&b, ragga, rap, rap metal, reggae pop, reggae rock, rock and roll, rock opera, rockabilly, rocksteady, roots, roots reggae, rumba, salsa, samba, screamo, shock rock, shoegaze, ska, ska punk, smooth jazz, soft rock, southern rock, space rock, spoken word, standards, stoner rock, surf rock, swamp rock, swing, symphonic metal, symphonic rock, synth pop, tango, techno, teen pop, thrash metal, traditional country, traditional folk, tribal, trip-hop, turntablism, underground, underground hip-hop, underground rap, urban, vocal trance, waltz, west coast rap, western swing, world, world fusion"] GENRE_FILTER["country"] = ["african, american, arabic, australian, austrian, belgian, brazilian, british, canadian, caribbean, celtic, chinese, cuban, danish, dutch, eastern europe, egyptian, estonian, european, finnish, french, german, greek, hawaiian, ibiza, icelandic, indian, iranian, irish, island, israeli, italian, jamaican, japanese, korean, mexican, middle eastern, new zealand, norwegian, oriental, polish, portuguese, russian, scandinavian, scottish, southern, spanish, swedish, swiss, thai, third world, turkish, welsh, western"] GENRE_FILTER["city"] = ["acapulco, adelaide, amsterdam, athens, atlanta, atlantic city, auckland, austin, bakersfield, bali, baltimore, bangalore, bangkok, barcelona, barrie, beijing, belfast, berlin, birmingham, bogota, bombay, boston, brasilia, brisbane, bristol, brooklyn, brussels, bucharest, budapest, buenos aires, buffalo, calcutta, calgary, california, cancun, caracas, charlotte, chicago, cincinnati, cleveland, copenhagen, dallas, delhi, denver, detroit, dublin, east coast, edmonton, frankfurt, geneva, glasgow, grand rapids, guadalajara, halifax, hamburg, hamilton, helsinki, hong kong, houston, illinois, indianapolis, istanbul, jacksonville, kansas city, kiev, las vegas, leeds, lisbon, liverpool, london, los angeles, louisville, madrid, manchester, manila, marseille, mazatlan, melbourne, memphis, mexico city, miami, michigan, milan, minneapolis, minnesota, mississippi, monterrey, montreal, munich, myrtle beach, nashville, new jersey, new orleans, new york, new york city, niagara falls, omaha, orlando, oslo, ottawa, palm springs, paris, pennsylvania, perth, philadelphia, phoenix, phuket, pittsburgh, portland, puebla, raleigh, reno, richmond, rio de janeiro, rome, sacramento, salt lake city, san antonio, san diego, san francisco, san jose, santiago, sao paulo, seattle, seoul, shanghai, sheffield, spokane, stockholm, sydney, taipei, tampa, texas, tijuana, tokyo, toledo, toronto, tucson, tulsa, vancouver, victoria, vienna, warsaw, wellington, westcoast, windsor, winnipeg, zurich"] GENRE_FILTER["mood"] = ["angry, bewildered, bouncy, calm, cheerful, chill, cold, complacent, crazy, crushed, cynical, depressed, dramatic, dreamy, drunk, eclectic, emotional, energetic, envious, feel good, flirty, funky, groovy, happy, haunting, healing, high, hopeful, hot, humorous, inspiring, intense, irritated, laidback, lonely, lovesongs, meditation, melancholic, melancholy, mellow, moody, morose, passionate, peace, peaceful, playful, pleased, positive, quirky, reflective, rejected, relaxed, retro, sad, sentimental, sexy, silly, smooth, soulful, spiritual, suicidal, surprised, sympathetic, trippy, upbeat, uplifting, weird, wild, yearning"] GENRE_FILTER["decade"] = ["1800s, 1810s, 1820s, 1830s, 1980s, 1850s, 1860s, 1870s, 1880s, 1890s, 1900s, 1910s, 1920s, 1930s, 1940s, 1950s, 1960s, 1970s, 1980s, 1990s, 2000s"] GENRE_FILTER["year"] = ["1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020"] GENRE_FILTER["occasion"] = ["background, birthday, breakup, carnival, chillout, christmas, death, dinner, drinking, driving, graduation, halloween, hanging out, heartache, holiday, late night, love, new year, party, protest, rain, rave, romantic, sleep, spring, summer, sunny, twilight, valentine, wake up, wedding, winter, work"] GENRE_FILTER["category"] = ["animal songs, attitude, autumn, b-side, ballad, banjo, bass, beautiful, body parts, bootlegs, brass, cafe del mar, chamber music, clarinet, classic, classic tunes, compilations, covers, cowbell, deceased, demos, divas, dj, drugs, drums, duets, field recordings, female, female vocalists, film score, flute, food, genius, girl group, great lyrics, guitar solo, guitarist, handclaps, harmonica, historical, horns, hypnotic, influential, insane, jam, keyboard, legends, life, linedance, live, loved, lyricism, male, male vocalists, masterpiece, melodic, memories, musicals, nostalgia, novelty, number songs, old school, oldie, oldies, one hit wonders, orchestra, organ, parody, poetry, political, promos, radio programs, rastafarian, remix, samples, satire, saxophone, showtunes, sing-alongs, singer-songwriter, slide guitar, solo instrumentals, songs with names, soundtracks, speeches, stories, strings, stylish, synth, title is a full sentence, top 40, traditional, trumpet, unique, unplugged, violin, virtuoso, vocalization, vocals"] GENRE_FILTER["translate"] = { "drum 'n' bass": u"drum and bass", "drum n bass": u"drum and bass" } def matches_list(s, lst): if s in lst: return True for item in lst: if '*' in item: if re.match(re.escape(item).replace(r'\*', '.*?'), s): return True return False # Function to sort/compare a 2 Element of Tupel def cmp1(a, b): return cmp(a[1], b[1]) * -1 # Special Compare/Sort-Function to sort downloaded Tags def cmptaginfo(a, b): return cmp(a[1][0], b[1][0]) * -1 def _lazy_load_filters(cfg): if not GENRE_FILTER["_loaded_"]: GENRE_FILTER["major"] = cfg["lastfm_genre_major"].split(',') GENRE_FILTER["minor"] = cfg["lastfm_genre_minor"].split(',') GENRE_FILTER["decade"] = cfg["lastfm_genre_decade"].split(',') GENRE_FILTER["year"] = cfg["lastfm_genre_year"].split(',') GENRE_FILTER["country"] = cfg["lastfm_genre_country"].split(',') GENRE_FILTER["city"] = cfg["lastfm_genre_city"].split(',') GENRE_FILTER["mood"] = cfg["lastfm_genre_mood"].split(',') GENRE_FILTER["occasion"] = cfg["lastfm_genre_occasion"].split(',') GENRE_FILTER["category"] = cfg["lastfm_genre_category"].split(',') GENRE_FILTER["translate"] = dict([item.split(',') for item in cfg["lastfm_genre_translations"].split("\n")]) GENRE_FILTER["_loaded_"] = True def apply_translations_and_sally(tag_to_count, sally, factor): ret = {} for name, count in tag_to_count.iteritems(): # apply translations try: name = GENRE_FILTER["translate"][name.lower()] except KeyError: pass # make sure it's lowercase lower = name.lower() if lower not in ret or ret[lower][0] < (count * factor): ret[lower] = [count * factor, sally] return ret.items() def _tags_finalize(album, metadata, tags, next): """Processes the tag metadata to decide which tags to use and sets metadata""" if next: next(tags) else: cfg = album.tagger.config.setting # last tag-weight for inter-tag comparsion lastw = {"n": False, "s": False} # List: (use sally-tags, use track-tags, use artist-tags, use # drop-info,use minweight,searchlist, max_elems info = {"major" : [True, True, True, True, True, GENRE_FILTER["major"], cfg["lastfm_max_group_tags"]], "minor" : [True, True, True, True, True, GENRE_FILTER["minor"], cfg["lastfm_max_minor_tags"]], "country" : [True, False, True, False, False, GENRE_FILTER["country"], 1], "city" : [True, False, True, False, False, GENRE_FILTER["city"], 1], "decade" : [True, True, False, False, False, GENRE_FILTER["decade"], 1], "year" : [True, True, False, False, False, GENRE_FILTER["year"], 1], "year2" : [True, True, False, False, False, GENRE_FILTER["year"], 1], "year3" : [True, True, False, False, False, GENRE_FILTER["year"], 1], "mood" : [True, True, True, False, False, GENRE_FILTER["mood"], cfg["lastfm_max_mood_tags"]], "occasion": [True, True, True, False, False, GENRE_FILTER["occasion"], cfg["lastfm_max_occasion_tags"]], "category": [True, True, True, False, False, GENRE_FILTER["category"], cfg["lastfm_max_category_tags"]] } hold = {"all/tags": []} # Init the Album-Informations albid = album.id if cfg["write_id3v23"]: year_tag = '~id3:TORY' else: year_tag = '~id3:TDOR' glb = {"major" : {'metatag' : 'grouping', 'data' : ALBUM_GENRE}, "country" : {'metatag' : 'comment:Songs-DB_Custom3', 'data' : ALBUM_COUNTRY}, "city" : {'metatag' : 'comment:Songs-DB_Custom3', 'data' : ALBUM_CITY}, "year" : {'metatag' : year_tag, 'data' : ALBUM_YEAR}, "year2" : {'metatag' : 'originalyear', 'data' : ALBUM_YEAR}, "year3" : {'metatag' : 'date', 'data' : ALBUM_YEAR} } for elem in glb.keys(): if not albid in glb[elem]['data']: glb[elem]['data'][albid] = {'count': 1, 'genres': {}} else: glb[elem]['data'][albid]['count'] += 1 if tags: # search for tags tags.sort(cmp=cmptaginfo) for lowered, [weight, stype] in tags: name = lowered.title() # if is tag which should only used for extension (if too few # tags found) s = stype == 1 arttag = stype > 0 # if is artist tag if not name in hold["all/tags"]: hold["all/tags"].append(name) # Decide if tag should be searched in major and minor fields drop = not (s and (not lastw['s'] or (lastw['s'] - weight) < cfg["lastfm_max_artisttag_drop"])) and not ( not s and (not lastw['n'] or (lastw['n'] - weight) < cfg["lastfm_max_tracktag_drop"])) if not drop: if s: lastw['s'] = weight else: lastw['n'] = weight below = (s and weight < cfg["lastfm_min_artisttag_weight"]) or ( not s and weight < cfg["lastfm_min_tracktag_weight"]) for group, ielem in info.items(): if matches_list(lowered, ielem[5]): if below and ielem[4]: # If Should use min-weigh information break if drop and ielem[3]: # If Should use the drop-information break if s and not ielem[0]: # If Sally-Tag and should not be used break if arttag and not ielem[2]: # If Artist-Tag and should not be used break if not arttag and not ielem[1]: # If Track-Tag and should not be used break # prefer Not-Sally-Tags (so, artist OR track-tags) if not s and group + "/sally" in hold and name in hold[group + "/sally"]: hold[group + "/sally"].remove(name) hold[group + "/tags"].remove(name) # Insert Tag if not group + "/tags" in hold: hold[group + "/tags"] = [] if not name in hold[group + "/tags"]: if s: if not group + "/sally" in hold: hold[group + "/sally"] = [] hold[group + "/sally"].append(name) # collect global genre information for special # tag-filters if not arttag and group in glb: if not name in glb[group]['data'][albid]['genres']: glb[group]['data'][albid][ 'genres'][name] = weight else: glb[group]['data'][albid][ 'genres'][name] += weight # append tag hold[group + "/tags"].append(name) # Break becase every Tag should be faced only by one # GENRE_FILTER break # cut to wanted size for group, ielem in info.items(): while group + "/tags" in hold and len(hold[group + "/tags"]) > ielem[6]: # Remove first all Sally-Tags if group + "/sally" in hold and len(hold[group + "/sally"]) > 0: deltag = hold[group + "/sally"].pop() hold[group + "/tags"].remove(deltag) else: hold[group + "/tags"].pop() # join the information join_tags = cfg["lastfm_join_tags_sign"] def join_tags_or_not(list): if join_tags: return join_tags.join(list) return list if 1: used = [] # write the major-tags if "major/tags" in hold and len(hold["major/tags"]) > 0: metadata["grouping"] = join_tags_or_not(hold["major/tags"]) used.extend(hold["major/tags"]) # write the decade-tags if "decade/tags" in hold and len(hold["decade/tags"]) > 0 and cfg["lastfm_use_decade_tag"]: metadata["comment:Songs-DB_Custom1"] = join_tags_or_not( [item.lower() for item in hold["decade/tags"]]) used.extend(hold["decade/tags"]) # write country tag if "country/tags" in hold and len(hold["country/tags"]) > 0 and "city/tags" in hold and len(hold["city/tags"]) > 0 and cfg["lastfm_use_country_tag"] and cfg["lastfm_use_city_tag"]: metadata["comment:Songs-DB_Custom3"] = join_tags_or_not( hold["country/tags"] + hold["city/tags"]) used.extend(hold["country/tags"]) used.extend(hold["city/tags"]) elif "country/tags" in hold and len(hold["country/tags"]) > 0 and cfg["lastfm_use_country_tag"]: metadata["comment:Songs-DB_Custom3"] = join_tags_or_not( hold["country/tags"]) used.extend(hold["country/tags"]) elif "city/tags" in hold and len(hold["city/tags"]) > 0 and cfg["lastfm_use_city_tag"]: metadata["comment:Songs-DB_Custom3"] = join_tags_or_not( hold["city/tags"]) used.extend(hold["city/tags"]) # write the mood-tags if "mood/tags" in hold and len(hold["mood/tags"]) > 0: metadata["mood"] = join_tags_or_not(hold["mood/tags"]) used.extend(hold["mood/tags"]) # write the occasion-tags if "occasion/tags" in hold and len(hold["occasion/tags"]) > 0: metadata["comment:Songs-DB_Occasion"] = join_tags_or_not( hold["occasion/tags"]) used.extend(hold["occasion/tags"]) # write the category-tags if "category/tags" in hold and len(hold["category/tags"]) > 0: metadata["comment:Songs-DB_Custom2"] = join_tags_or_not( hold["category/tags"]) used.extend(hold["category/tags"]) # include major tags as minor tags also copy major to minor if # no minor genre if cfg["lastfm_app_major2minor_tag"] and "major/tags" in hold and "minor/tags" in hold and len(hold["minor/tags"]) > 0: used.extend(hold["major/tags"]) used.extend(hold["minor/tags"]) if len(used) > 0: metadata["genre"] = join_tags_or_not( hold["major/tags"] + hold["minor/tags"]) elif cfg["lastfm_app_major2minor_tag"] and "major/tags" in hold and "minor/tags" not in hold: used.extend(hold["major/tags"]) if len(used) > 0: metadata["genre"] = join_tags_or_not( hold["major/tags"]) elif "minor/tags" in hold and len(hold["minor/tags"]) > 0: metadata["genre"] = join_tags_or_not( hold["minor/tags"]) used.extend(hold["minor/tags"]) else: if "minor/tags" not in hold and "major/tags" in hold: metadata["genre"] = metadata["grouping"] # replace blank original year with release date if cfg["lastfm_use_year_tag"]: if "year/tags" not in hold and len(metadata["date"]) > 0: metadata["originalyear"] = metadata["date"][:4] if cfg["write_id3v23"]: metadata["~id3:TORY"] = metadata["date"][:4] #album.tagger.log.info('TORY: %r', metadata["~id3:TORY"]) else: metadata["~id3:TDOR"] = metadata["date"][:4] #album.tagger.log.info('TDOR: %r', metadata["~id3:TDOR"]) if metadata["originalyear"] > metadata["date"][:4]: metadata["originalyear"] = metadata["date"][:4] if metadata["~id3:TDOR"] > metadata["date"][:4] and not cfg["write_id3v23"]: metadata["~id3:TDOR"] = metadata["date"][:4] if metadata["~id3:TORY"] > metadata["date"][:4] and cfg["write_id3v23"]: metadata["~id3:TORY"] = metadata["date"][:4] # Replace blank decades if "decade/tags" not in hold and len(metadata["originalyear"])>0 and int(metadata["originalyear"])>1999 and cfg["lastfm_use_decade_tag"]: metadata["comment:Songs-DB_Custom1"] = "20%s0s" % str(metadata["originalyear"])[2] elif "decade/tags" not in hold and len(metadata["originalyear"])>0 and int(metadata["originalyear"])<2000 and int(metadata["originalyear"])>1899 and cfg["lastfm_use_decade_tag"]: metadata["comment:Songs-DB_Custom1"] = "19%s0s" % str(metadata["originalyear"])[2] elif "decade/tags" not in hold and len(metadata["originalyear"])>0 and int(metadata["originalyear"])<1900 and int(metadata["originalyear"])>1799 and cfg["lastfm_use_decade_tag"]: metadata["comment:Songs-DB_Custom1"] = "18%s0s" % str(metadata["originalyear"])[2] def _tags_downloaded(album, metadata, sally, factor, next, current, data, reply, error): try: try: intags = data.toptags[0].tag except AttributeError: intags = [] # Extract just names and counts from response; apply no parsing at this stage tag_to_count = {} for tag in intags: # name of the tag name = tag.name[0].text.strip() # count of the tag try: count = int(tag.count[0].text.strip()) except ValueError: count = 0 tag_to_count[name] = count url = str(reply.url().path()) _cache[url] = tag_to_count tags = apply_translations_and_sally(tag_to_count, sally, factor) _tags_finalize(album, metadata, current + tags, next) # Process any pending requests for the same URL if url in _pending_xmlws_requests: pending = _pending_xmlws_requests[url] del _pending_xmlws_requests[url] for delayed_call in pending: delayed_call() except: album.tagger.log.error("Problem processing downloaded tags in last.fm plus plugin: %s", traceback.format_exc()) raise finally: album._requests -= 1 album._finalize_loading(None) def get_tags(album, metadata, path, sally, factor, next, current): """Get tags from an URL.""" # Ensure config is loaded (or reloaded if has been changed) _lazy_load_filters(album.tagger.config.setting) url = str(QtCore.QUrl.fromPercentEncoding(path)) if url in _cache: tags = apply_translations_and_sally(_cache[url], sally, factor) _tags_finalize(album, metadata, current + tags, next) else: # If we have already sent a request for this URL, delay this call until later if url in _pending_xmlws_requests: _pending_xmlws_requests[url].append(partial(get_tags, album, metadata, path, sally, factor, next, current)) else: _pending_xmlws_requests[url] = [] album._requests += 1 album.tagger.xmlws.get(LASTFM_HOST, LASTFM_PORT, path, partial(_tags_downloaded, album, metadata, sally, factor, next, current), priority=True, important=True) def encode_str(s): # Yes, that's right, Last.fm prefers double URL-encoding s = QtCore.QUrl.toPercentEncoding(s) s = QtCore.QUrl.toPercentEncoding(unicode(s)) return s def get_track_tags(album, metadata, artist, track, next, current): path = "/1.0/track/%s/%s/toptags.xml" % (encode_str(artist), encode_str(track)) sally = 0 factor = 1.0 return get_tags(album, metadata, path, sally, factor, next, current) def get_artist_tags(album, metadata, artist, next, current): path = "/1.0/artist/%s/toptags.xml" % encode_str(artist) sally = 2 if album.tagger.config.setting["lastfm_artist_tag_us_ex"]: sally = 1 factor = album.tagger.config.setting["lastfm_artist_tags_weight"] / 100.0 return get_tags(album, metadata, path, sally, factor, next, current) def process_track(album, metadata, release, track): tagger = album.tagger use_track_tags = tagger.config.setting["lastfm_use_track_tags"] use_artist_tags = tagger.config.setting["lastfm_artist_tag_us_ex"] or tagger.config.setting["lastfm_artist_tag_us_yes"] if use_track_tags or use_artist_tags: artist = metadata["artist"] title = metadata["title"] if artist: if use_artist_tags: get_artist_tags_func = partial(get_artist_tags, album, metadata, artist, None) else: get_artist_tags_func = None if title and use_track_tags: get_track_tags(album, metadata, artist, title, get_artist_tags_func, []) elif get_artist_tags_func: get_artist_tags_func([]) class LastfmOptionsPage(OptionsPage): NAME = "lastfmplus" TITLE = "Last.fm.Plus" PARENT = "plugins" options = [ IntOption("setting", "lastfm_max_minor_tags", 4), IntOption("setting", "lastfm_max_group_tags", 1), IntOption("setting", "lastfm_max_mood_tags", 4), IntOption("setting", "lastfm_max_occasion_tags", 4), IntOption("setting", "lastfm_max_category_tags", 4), BoolOption("setting", "lastfm_use_country_tag", True), BoolOption("setting", "lastfm_use_city_tag", True), BoolOption("setting", "lastfm_use_decade_tag", True), BoolOption("setting", "lastfm_use_year_tag", True), TextOption("setting", "lastfm_join_tags_sign", "; "), BoolOption("setting", "lastfm_app_major2minor_tag", True), BoolOption("setting", "lastfm_use_track_tags", True), IntOption("setting", "lastfm_min_tracktag_weight", 5), IntOption("setting", "lastfm_max_tracktag_drop", 90), BoolOption("setting", "lastfm_artist_tag_us_no", False), BoolOption("setting", "lastfm_artist_tag_us_ex", True), BoolOption("setting", "lastfm_artist_tag_us_yes", False), IntOption("setting", "lastfm_artist_tags_weight", 95), IntOption("setting", "lastfm_min_artisttag_weight", 10), IntOption("setting", "lastfm_max_artisttag_drop", 80), TextOption("setting", "lastfm_genre_major", ",".join(GENRE_FILTER["major"]).lower()), TextOption("setting", "lastfm_genre_minor", ",".join(GENRE_FILTER["minor"]).lower()), TextOption("setting", "lastfm_genre_decade",", ".join(GENRE_FILTER["decade"]).lower()), TextOption("setting", "lastfm_genre_year",", ".join(GENRE_FILTER["year"]).lower()), TextOption("setting", "lastfm_genre_occasion",", ".join(GENRE_FILTER["occasion"]).lower()), TextOption("setting", "lastfm_genre_category",", ".join(GENRE_FILTER["category"]).lower()), TextOption("setting", "lastfm_genre_country",", ".join(GENRE_FILTER["country"]).lower()), TextOption("setting", "lastfm_genre_city",", ".join(GENRE_FILTER["city"]).lower()), TextOption("setting", "lastfm_genre_mood", ",".join(GENRE_FILTER["mood"]).lower()), TextOption("setting", "lastfm_genre_translations", "\n".join(["%s,%s" % (k,v) for k, v in GENRE_FILTER["translate"].items()]).lower()) ] def __init__(self, parent=None): super(LastfmOptionsPage, self).__init__(parent) self.ui = Ui_LastfmOptionsPage() self.ui.setupUi(self) # TODO Not yet implemented properly # self.connect(self.ui.check_translation_list, QtCore.SIGNAL("clicked()"), self.check_translations) self.connect(self.ui.check_word_lists, QtCore.SIGNAL("clicked()"), self.check_words) self.connect(self.ui.load_default_lists, QtCore.SIGNAL("clicked()"), self.load_defaults) self.connect(self.ui.filter_report, QtCore.SIGNAL("clicked()"), self.create_report) # function to check all translations and make sure a corresponding word # exists in word lists, notify in message translations pointing nowhere. def check_translations(self): cfg = self.config.setting translations = (cfg["lastfm_genre_translations"].replace("\n", "|")) tr2 = list(item for item in translations.split('|')) wordlists = (cfg["lastfm_genre_major"] + cfg["lastfm_genre_minor"] + cfg["lastfm_genre_country"] + cfg["lastfm_genre_occasion"] + cfg["lastfm_genre_mood"] + cfg["lastfm_genre_decade"] + cfg["lastfm_genre_year"] + cfg["lastfm_genre_category"]) # TODO need to check to see if translations are in wordlists QtGui.QMessageBox.information( self, self.tr("QMessageBox.showInformation()"), ",".join(tr2)) # function to check that word lists contain no duplicate entries, notify # in message duplicates and which lists they appear in def check_words(self): cfg = self.config.setting # Create a set for each option cfg option word_sets = { "Major": set(str(self.ui.genre_major.text()).split(",")), "Minor": set(str(self.ui.genre_minor.text()).split(",")), "Countries": set(str(self.ui.genre_country.text()).split(",")), "Cities": set(str(self.ui.genre_city.text()).split(",")), "Moods": set(str(self.ui.genre_mood.text()).split(",")), "Occasions": set(str(self.ui.genre_occasion.text()).split(",")), "Decades": set(str(self.ui.genre_decade.text()).split(",")), "Years": set(str(self.ui.genre_year.text()).split(",")), "Categories": set(str(self.ui.genre_category.text()).split(",")) } text = [] duplicates = {} for name, words in word_sets.iteritems(): for word in words: word = word.strip().title() duplicates.setdefault(word, []).append(name) for word, names in duplicates.iteritems(): if len(names) > 1: names = "%s and %s" % (", ".join(names[:-1]), names.pop()) text.append('"%s" in %s lists.' % (word, names)) if not text: text = "No issues found." else: text = "\n\n".join(text) # Display results in information box QtGui.QMessageBox.information(self, self.tr("QMessageBox.showInformation()"), text) # load/reload defaults def load_defaults(self): self.ui.genre_major.setText(", ".join(GENRE_FILTER["major"])) self.ui.genre_minor.setText(", ".join(GENRE_FILTER["minor"])) self.ui.genre_decade.setText(", ".join(GENRE_FILTER["decade"])) self.ui.genre_country.setText(", ".join(GENRE_FILTER["country"])) self.ui.genre_city.setText(", ".join(GENRE_FILTER["city"])) self.ui.genre_year.setText(", ".join(GENRE_FILTER["year"])) self.ui.genre_occasion.setText(", ".join(GENRE_FILTER["occasion"])) self.ui.genre_category.setText(", ".join(GENRE_FILTER["category"])) self.ui.genre_mood.setText(", ".join(GENRE_FILTER["mood"])) self.ui.genre_translations.setText("00s, 2000s\n10s, 1910s\n1920's, 1920s\n1930's, 1930s\n1940's, 1940s\n1950's, 1950s\n1960's, 1960s\n1970's, 1970s\n1980's, 1980s\n1990's, 1990s\n2-tone, 2 tone\n20's, 1920s\n2000's, 2000s\n2000s, 2000s\n20s, 1920s\n20th century classical, classical\n30's, 1930s\n30s, 1930s\n3rd wave ska revival, ska\n40's, 1940s\n40s, 1940s\n50's, 1950s\n50s, 1950s\n60's, 1960s\n60s, 1960s\n70's, 1970s\n70s, 1970s\n80's, 1980s\n80s, 1980s\n90's, 1990s\n90s, 1990s\na capella, a cappella\nabstract-hip-hop, hip-hop\nacapella, a cappella\nacid-rock, acid rock\nafrica, african\naggresive, angry\naggressive, angry\nalone, lonely\nalready-dead, deceased\nalt rock, alternative rock\nalt-country, alternative country\nalternative punk, punk\nalternative dance, dance\nalternative hip-hop, hip-hop\nalternative pop-rock, pop rock\nalternative punk, punk\nalternative rap, rap\nambient-techno, ambient\namericain, american\namericana, american\nanimal-songs, animal songs\nanimals, animal songs\nanti-war, protest\narena rock, rock\natmospheric-drum-and-bass, drum and bass\nau, australian\naussie hip hop, aussie hip-hop\naussie hiphop, aussie hip-hop\naussie rock, australian\naussie, australian\naussie-rock, rock\naustralia, australian\naustralian aboriginal, world\naustralian country, country\naustralian hip hop, aussie hip-hop\naustralian hip-hop, aussie hip-hop\naustralian rap, aussie hip-hop\naustralian rock, rock\naustralian-music, australian\naustralianica, australian\naustralicana, australian\naustria, austrian\navantgarde, avant-garde\nbakersfield-sound, bakersfield\nbaroque pop, baroque\nbeach music, beach\nbeat, beats\nbelgian music, belgian\nbelgian-music, belgian\nbelgium, belgian\nbhangra, indian\nbig beat, beats\nbigbeat, beats\nbittersweet, cynical\nblack metal, doom metal\nblue, sad\nblues guitar, blues\nblues-rock, blues rock\nbluesrock, blues rock\nbollywood, indian\nboogie, boogie woogie\nboogiewoogieflu, boogie woogie\nbrazil, brazilian\nbreakbeats, breakbeat\nbreaks artists, breakbeat\nbrit, british\nbrit-pop, brit pop\nbrit-rock, brit rock\nbritish blues, blues\nbritish punk, punk\nbritish rap, rap\nbritish rock, brit rock\nbritish-folk, folk\nbritpop, brit pop\nbritrock, brit rock\nbroken beat, breakbeat\nbrutal-death-metal, doom metal\nbubblegum, bubblegum pop\nbuddha bar, chillout\ncalming, relaxed\ncanada, canadian\ncha-cha, cha cha\ncha-cha-cha, cha cha\nchicago blues, blues\nchildren, kids\nchildrens music, kids\nchildrens, kids\nchill out, chillout\nchill-out, chillout\nchilled, chill\nchillhouse, chill\nchillin, hanging out\nchristian, gospel\nchina, chinese\nclasica, classical\nclassic blues, blues\nclassic jazz, jazz\nclassic metal, metal\nclassic pop, pop\nclassic punk, punk\nclassic roots reggae, roots reggae\nclassic soul, soul\nclassic-hip-hop, hip-hop\nclassical crossover, classical\nclassical music, classical\nclassics, classic tunes\nclassique, classical\nclub-dance, dance\nclub-house, house\nclub-music, club\ncollegiate acappella, a cappella\ncomedy rock, humour\ncomedy, humour\ncomposer, composers\nconscious reggae, reggae\ncontemporary classical, classical\ncontemporary gospel, gospel\ncontemporary jazz, jazz\ncontemporary reggae, reggae\ncool-covers, covers\ncountry folk, country\ncountry soul, country\ncountry-divas, country\ncountry-female, country\ncountry-legends, country\ncountry-pop, country pop\ncountry-rock, country rock\ncover, covers\ncover-song, covers\ncover-songs, covers\ncowboy, country\ncowhat-fav, country\ncowhat-hero, country\ncuba, cuban\ncyberpunk, punk\nd'n'b, drum and bass\ndance party, party\ndance-punk, punk\ndance-rock, rock\ndancefloor, dance\ndancehall-reggae, dancehall\ndancing, dance\ndark-psy, psytrance\ndark-psytrance, psytrance\ndarkpsy, dark ambient\ndeath metal, doom metal\ndeathcore, thrash metal\ndeep house, house\ndeep-soul, soul\ndeepsoul, soul\ndepressing, depressed\ndepressive, depressed \ndeutsch, german\ndisco-funk, disco\ndisco-house, disco\ndiva, divas\ndj mix, dj\ndnb, drum and bass\ndope, drugs\ndownbeat, downtempo\ndream dance, trance\ndream trance, trance\ndrill 'n' bass, drum and bass\ndrill and bass, drum and bass\ndrill n bass, drum and bass\ndrill-n-bass, drum and bass\ndrillandbass, drum and bass\ndrinking songs, drinking\ndriving-music, driving\ndrum 'n' bass, drum and bass\ndrum n bass, drum and bass\ndrum'n'bass, drum and bass\ndrum, drums\ndrum-n-bass, drum and bass\ndrumandbass, drum and bass\ndub-u, dub\ndub-u-dub, dub\ndub-wise, dub\nduet, duets\nduo, duets\ndutch artists, dutch\ndutch rock, rock\ndutch-bands, dutch\ndutch-sound, dutch\nearly reggae, reggae\neasy, easy listening\negypt, egyptian\neighties, 1980s\nelectro dub, electro\nelectro funk, electro\nelectro house, house\nelectro rock, electro\nelectro-pop, electro\nelectroclash, electro\nelectrofunk, electro\nelectrohouse, house\nelectronic, electronica\nelectronic-rock, rock\nelectronicadance, dance\nelectropop, electro pop\nelectropunk, punk\nelegant, stylish\nelektro, electro\nelevator, elevator music\nemotive, emotional\nenergy, energetic\nengland, british\nenglish, british\nenraged, angry\nepic-trance, trance\nethnic fusion, ethnic\neuro-dance, eurodance\neuro-pop, europop\neuro-trance, trance\neurotrance, trance\neurovision, eurodance\nexperimental-rock, experimental\nfair dinkum australian mate, australian\nfeel good music, feel good\nfeelgood, feel good\nfemale artists, female\nfemale country, country\nfemale fronted, female\nfemale singers, female\nfemale vocalist, female vocalists\nfemale-vocal, female vocalists\nfemale-vocals, female vocalists\nfemale-voices, female vocalists\nfield recording, field recordings\nfilm, film score\nfilm-score, film score\nfingerstyle guitar, fingerstyle\nfinland, finnish\nfinnish-metal, metal\nflamenco rumba, rumba\nfolk-jazz, folk jazz\nfolk-pop, folk pop\nfolk-rock, folk rock\nfolkrock, folk rock\nfrancais, french\nfrance, french\nfreestyle, electronica\nfull on, energetic\nfull-on, energetic\nfull-on-psychedelic-trance, psytrance\nfull-on-trance, trance\nfullon, intense \nfuneral, death\nfunky breaks, breaks\nfunky house, house\nfunny, humorous\ngabber, hardcore\ngeneral pop, pop\ngeneral rock, rock\ngentle, smooth\ngermany, german\ngirl-band, girl group\ngirl-group, girl group\ngirl-groups, girl group\ngirl-power, girl group\ngirls, girl group\nglam metal, glam rock\nglam, glam rock\ngloomy, depressed\ngoa classic, goa trance\ngoa, goa trance\ngoa-psy-trance, psytrance\ngoatrance, trance\ngolden oldies, oldies\ngoth rock, gothic rock\ngoth, gothic\ngothic doom metal, gothic metal\ngreat-lyricists, great lyrics\ngreat-lyrics, great lyrics\ngrime, dubstep\ngregorian chant, gregorian\ngrock 'n' roll, rock and roll\ngroovin, groovy\ngrunge rock, grunge\nguitar god, guitar\nguitar gods, guitar\nguitar hero, guitar\nguitar rock, rock\nguitar-solo, guitar solo\nguitar-virtuoso, guitarist\nhair metal, glam rock\nhanging-out, hanging out\nhappiness, happy\nhappy thoughts, happy\nhard dance, dance\nhard house, house\nhard-trance, trance\nhardcore-techno, techno\nhawaii, hawaiian\nheartbreak, heartache\nheavy rock, hard rock\nhilarious, humorous\nhip hop, hip-hop\nhip-hop and rap, hip-hop\nhip-hoprap, hip-hop\nhiphop, hip-hop\nhippie, stoner rock\nhope, hopeful\nhorrorcore, thrash metal\nhorrorpunk, horror punk\nhumor, humour\nindia, indian\nindie electronic, electronica\nindietronica, electronica\ninspirational, inspiring\ninstrumental pop, instrumental \niran, iranian\nireland, irish\nisrael, israeli\nitaly, italian\njam band, jam\njamaica, jamaican\njamaican ska, ska\njamaician, jamaican\njamaican-artists, jamaican\njammer, jam\njazz blues, jazz\njazz funk, jazz\njazz hop, jazz\njazz piano, jazz\njpop, j-pop\njrock, j-rock\njazz rock, jazz\njazzy, jazz\njump blues, blues\nkiwi, new zealand\nlaid back, easy listening\nlatin rock, latin\nlatino, latin\nle rap france, french rap\nlegend, legends\nlegendary, legends\nlekker ska, ska\nlions-reggae-dancehall, dancehall\nlistless, irritated\nlively, energetic\nlove metal, metal\nlove song, romantic\nlove-songs, lovesongs\nlovely, beautiful\nmade-in-usa, american\nmakes me happy, happy\nmale country, country\nmale groups, male\nmale rock, male\nmale solo artists, male\nmale vocalist, male vocalists\nmale-vocal, male vocalists\nmale-vocals, male vocalists\nmarijuana, drugs\nmelancholic days, melancholy\nmelodic death metal, doom metal\nmelodic hardcore, hardcore\nmelodic metal, metal\nmelodic metalcore, metal\nmelodic punk, punk\nmelodic trance, trance\nmetalcore, thrash metal\nmetro downtempo, downtempo\nmetro reggae, reggae\nmiddle east, middle eastern\nminimal techno, techno\nmood, moody\nmorning, wake up\nmoses reggae, reggae\nmovie, soundtracks\nmovie-score, soundtracks\nmovie-score-composers, composers\nmovie-soundtrack, soundtracks\nmusical, musicals\nmusical-theatre, musicals\nneder rock, rock \nnederland, dutch\nnederlands, dutch\nnederlandse-muziek, dutch\nnederlandstalig, dutch\nnederpop, pop\nnederrock, rock\nnederska, ska\nnedertop, dutch\nneo prog, progressive\nneo progressive rock, progressive rock\nneo progressive, progressive\nneo psychedelia, psychedelic\nneo soul, soul\nnerd rock, rock\nnetherlands, dutch\nneurofunk, funk\nnew rave, rave\nnew school breaks, breaks \nnew school hardcore, hardcore\nnew traditionalist country, traditional country\nnice elevator music, elevator music\nnight, late night\nnight-music, late night\nnoise pop, pop\nnoise rock, rock\nnorway, norwegian\nnostalgic, nostalgia\nnu breaks, breaks\nnu jazz, jazz\nnu skool breaks, breaks \nnu-metal, nu metal\nnumber-songs, number songs\nnumbers, number songs\nnumetal, metal\nnz, new zealand\nold country, country\nold school hardcore, hardcore \nold school hip-hop, hip-hop\nold school reggae, reggae\nold school soul, soul\nold-favorites, oldie\nold-skool, old school\nold-timey, oldie\noldschool, old school\none hit wonder, one hit wonders\noptimistic, positive\noutlaw country, country\noz hip hop, aussie hip-hop\noz rock, rock\noz, australian\nozzie, australian\npancaribbean, caribbean\nparodies, parody\nparty-groovin, party\nparty-music, party\nparty-time, party\npiano rock, piano\npolitical punk, punk\npolitical rap, rap\npool party, party\npop country, country pop\npop music, pop\npop rap, rap\npop-rap, rap\npop-rock, pop rock\npop-soul, pop soul\npoprock, pop rock\nportugal, portuguese\npositive-vibrations, positive\npost grunge, grunge\npost hardcore, hardcore\npost-grunge, grunge\npost-hardcore, hardcore\npost-punk, post punk\npost-rock, post rock\npostrock, post rock\npower ballad, ballad\npower ballads, ballad\npower metal, metal\nprog rock, progressive rock\nprogressive breaks, breaks\nprogressive house, house\nprogressive metal, nu metal\nprogressive psytrance, psytrance \nprogressive trance, psytrance\nproto-punk, punk\npsy, psytrance\npsy-trance, psytrance\npsybient, ambient\npsych folk, psychedelic folk\npsych, psytrance\npsychadelic, psychedelic\npsychedelia, psychedelic\npsychedelic pop, psychedelic\npsychedelic trance, psytrance\npsychill, psytrance\npsycho, insane\npsytrance artists, psytrance\npub rock, rock \npunk blues, punk\npunk caberet, punk\npunk favorites, punk \npunk pop, punk\npunk revival, punk\npunkabilly, punk\npunkrock, punk rock\nqueer, quirky\nquiet, relaxed\nr and b, r&b\nr'n'b, r&b\nr-n-b, r&b\nraggae, reggae\nrap and hip-hop, rap\nrap hip-hop, rap\nrap rock, rap\nrapcore, rap metal\nrasta, rastafarian\nrastafari, rastafarian\nreal hip-hop, hip-hop\nreegae, reggae\nreggae and dub, reggae\nreggae broeder, reggae\nreggae dub ska, reggae\nreggae roots, roots reggae\nreggae-pop, reggae pop\nreggea, reggae\nrelax, relaxed\nrelaxing, relaxed\nrhythm and blues, r&b\nrnb, r&b\nroad-trip, driving\nrock ballad, ballad\nrock ballads, ballad\nrock n roll, rock and roll\nrock pop, pop rock\nrock roll, rock and roll\nrock'n'roll, rock and roll\nrock-n-roll, rock and roll\nrocknroll, rock and roll\nrockpop, pop rock\nromance, romantic\nromantic-tension, romantic\nroots and culture, roots\nroots rock, rock\nrootsreggae, roots reggae \nrussian alternative, russian\nsad-songs, sad\nsample, samples\nsaturday night, party\nsax, saxophone\nscotland, scottish\nseden, swedish\nsensual, passionate\nsing along, sing-alongs\nsing alongs, sing-alongs\nsing-along, sing-alongs\nsinger-songwriters, singer-songwriter\nsingersongwriter, singer-songwriter\nsixties, 1960s\nska revival, ska \nska-punk, ska punk\nskacore, ska\nskate punk, punk\nskinhead reggae, reggae\nsleepy, sleep\nslow jams, slow jam\nsmooth soul, soul\nsoft, smooth\nsolo country acts, country\nsolo instrumental, solo instrumentals\nsoothing, smooth\nsoulful drum and bass, drum and bass\nsoundtrack, soundtracks\nsouth africa, african\nsouth african, african\nsouthern rap, rap\nsouthern soul, soul\nspain, spanish\nspeed metal, metal\nspeed, drugs\nspirituals, spiritual\nspliff, drugs\nstoner, stoner rock\nstreet punk, punk\nsuicide, death\nsuicide, suicidal\nsummertime, summer\nsun-is-shining, sunny\nsunshine pop, pop\nsuper pop, pop\nsurf, surf rock\nswamp blues, swamp rock\nswamp, swamp rock\nsweden, swedish\nswedish metal, metal\nsymphonic power metal, symphonic metal\nsynthpop, synth pop\ntexas blues, blues\ntexas country, country\nthird wave ska revival, ska\nthird wave ska, ska\ntraditional-ska, ska\ntrancytune, trance\ntranquility, peaceful\ntribal house, tribal\ntribal rock, tribal\ntrip hop, trip-hop\ntriphop, trip-hop\ntwo tone, 2 tone\ntwo-tone, 2 tone\nuk hip-hop, hip-hop\nuk, british\nunited kingdom, british\nunited states, american\nuntimely-death, deceased\nuplifting trance, trance\nus, american\nusa, american\nvocal house, house\nvocal jazz, jazz vocal\nvocal pop, pop\nvocal, vocals\nwales, welsh\nweed, drugs\nwest-coast, westcoast\nworld music, world\nxmas, christmas\n") def import_newlist(self): fileName = QtGui.QFileDialog.getOpenFileName(self, self.tr("QFileDialog.getOpenFileName()"), self.ui.fileName.text(), self.tr("All Files (*);;Text Files (*.txt)")) if not fileName.isEmpty(): self.ui.fileName.setText(fileName) columns = [] lists = {} for line in open(fileName): data = line.rstrip('\r\n').split(",") if not columns: # first line columns = tuple(data) for column in columns: lists[column] = [] else: # data lines for column, value in zip(columns, data): if value: lists[column].append(value) self.ui.genre_major.setText(', '.join(lists['Major'])) self.ui.genre_minor.setText(', '.join(lists['Minor'])) self.ui.genre_country.setText(', '.join(lists['Country'])) self.ui.genre_city.setText(', '.join(lists['City'])) self.ui.genre_decade.setText(', '.join(lists['Decade'])) self.ui.genre_mood.setText(', '.join(lists['Mood'])) self.ui.genre_occasion.setText(', '.join(lists['Occasion'])) # Function to create simple report window. Could do a count of values in # each section and the amount of translations. Total tags being scanned # for. def create_report(self): cfg = self.config.setting options = [ ('lastfm_genre_major', 'Major Genre Terms'), ('lastfm_genre_minor', 'Minor Genre Terms'), ('lastfm_genre_country', 'Country Terms'), ('lastfm_genre_city', 'City Terms'), ('lastfm_genre_mood', 'Mood Terms'), ('lastfm_genre_occasion', 'Occasions Terms'), ('lastfm_genre_decade', 'Decade Terms'), ('lastfm_genre_year', 'Year Terms'), ('lastfm_genre_category', 'Category Terms'), ('lastfm_genre_translations', 'Translation Terms'), ] text = [] for name, label in options: nterms = cfg[name].count(',') + 1 if nterms: text.append(" • %d %s" % (nterms, label)) if not text: text = "No terms found" else: text = "You have a total of:
" + "
".join(text) + "" # Display results in information box QtGui.QMessageBox.information(self, self.tr("QMessageBox.showInformation()"), text) def load(self): # general cfg = self.config.setting self.ui.max_minor_tags.setValue(cfg["lastfm_max_minor_tags"]) self.ui.max_group_tags.setValue(cfg["lastfm_max_group_tags"]) self.ui.max_mood_tags.setValue(cfg["lastfm_max_mood_tags"]) self.ui.max_occasion_tags.setValue(cfg["lastfm_max_occasion_tags"]) self.ui.max_category_tags.setValue(cfg["lastfm_max_category_tags"]) self.ui.use_country_tag.setChecked(cfg["lastfm_use_country_tag"]) self.ui.use_city_tag.setChecked(cfg["lastfm_use_city_tag"]) self.ui.use_decade_tag.setChecked(cfg["lastfm_use_decade_tag"]) self.ui.use_year_tag.setChecked(cfg["lastfm_use_year_tag"]) self.ui.join_tags_sign.setText(cfg["lastfm_join_tags_sign"]) self.ui.app_major2minor_tag.setChecked(cfg["lastfm_app_major2minor_tag"]) self.ui.use_track_tags.setChecked(cfg["lastfm_use_track_tags"]) self.ui.min_tracktag_weight.setValue(cfg["lastfm_min_tracktag_weight"]) self.ui.max_tracktag_drop.setValue(cfg["lastfm_max_tracktag_drop"]) self.ui.artist_tag_us_no.setChecked(cfg["lastfm_artist_tag_us_no"]) self.ui.artist_tag_us_ex.setChecked(cfg["lastfm_artist_tag_us_ex"]) self.ui.artist_tag_us_yes.setChecked(cfg["lastfm_artist_tag_us_yes"]) self.ui.artist_tags_weight.setValue(cfg["lastfm_artist_tags_weight"]) self.ui.min_artisttag_weight.setValue(cfg["lastfm_min_artisttag_weight"]) self.ui.max_artisttag_drop.setValue(cfg["lastfm_max_artisttag_drop"]) self.ui.genre_major.setText( cfg["lastfm_genre_major"].replace(",", ", ") ) self.ui.genre_minor.setText( cfg["lastfm_genre_minor"].replace(",", ", ") ) self.ui.genre_decade.setText( cfg["lastfm_genre_decade"].replace(",", ", ") ) self.ui.genre_country.setText(cfg["lastfm_genre_country"].replace(",", ", ") ) self.ui.genre_city.setText(cfg["lastfm_genre_city"].replace(",", ", ") ) self.ui.genre_year.setText( cfg["lastfm_genre_year"].replace(",", ", ") ) self.ui.genre_occasion.setText(cfg["lastfm_genre_occasion"].replace(",", ", ") ) self.ui.genre_category.setText(cfg["lastfm_genre_category"].replace(",", ", ") ) self.ui.genre_year.setText(cfg["lastfm_genre_year"].replace(",", ", ") ) self.ui.genre_mood.setText( cfg["lastfm_genre_mood"].replace(",", ", ") ) self.ui.genre_translations.setText(cfg["lastfm_genre_translations"].replace(",", ", ") ) def save(self): self.config.setting["lastfm_max_minor_tags"] = self.ui.max_minor_tags.value() self.config.setting["lastfm_max_group_tags"] = self.ui.max_group_tags.value() self.config.setting["lastfm_max_mood_tags"] = self.ui.max_mood_tags.value() self.config.setting["lastfm_max_occasion_tags"] = self.ui.max_occasion_tags.value() self.config.setting["lastfm_max_category_tags"] = self.ui.max_category_tags.value() self.config.setting["lastfm_use_country_tag"] = self.ui.use_country_tag.isChecked() self.config.setting["lastfm_use_city_tag"] = self.ui.use_city_tag.isChecked() self.config.setting["lastfm_use_decade_tag"] = self.ui.use_decade_tag.isChecked() self.config.setting["lastfm_use_year_tag"] = self.ui.use_year_tag.isChecked() self.config.setting["lastfm_join_tags_sign"] = self.ui.join_tags_sign.text() self.config.setting["lastfm_app_major2minor_tag"] = self.ui.app_major2minor_tag.isChecked() self.config.setting["lastfm_use_track_tags"] = self.ui.use_track_tags.isChecked() self.config.setting["lastfm_min_tracktag_weight"] = self.ui.min_tracktag_weight.value() self.config.setting["lastfm_max_tracktag_drop"] = self.ui.max_tracktag_drop.value() self.config.setting["lastfm_artist_tag_us_no"] = self.ui.artist_tag_us_no.isChecked() self.config.setting["lastfm_artist_tag_us_ex"] = self.ui.artist_tag_us_ex.isChecked() self.config.setting["lastfm_artist_tag_us_yes"] = self.ui.artist_tag_us_yes.isChecked() self.config.setting["lastfm_artist_tags_weight"] = self.ui.artist_tags_weight.value() self.config.setting["lastfm_min_artisttag_weight"] = self.ui.min_artisttag_weight.value() self.config.setting["lastfm_max_artisttag_drop"] = self.ui.max_artisttag_drop.value() # parse littlebit the text-inputs tmp0 = {} tmp1 = [tmp0.setdefault(i.strip(),i.strip()) for i in unicode(self.ui.genre_major.text()).lower().split(",") if i not in tmp0] tmp1.sort() self.config.setting["lastfm_genre_major"] = ",".join(tmp1) tmp0 = {} tmp1 = [tmp0.setdefault(i.strip(),i.strip()) for i in unicode(self.ui.genre_minor.text()).lower().split(",") if i not in tmp0] tmp1.sort() self.config.setting["lastfm_genre_minor"] = ",".join(tmp1) tmp0 = {} tmp1 = [tmp0.setdefault(i.strip(),i.strip()) for i in unicode(self.ui.genre_decade.text()).lower().split(",") if i not in tmp0] tmp1.sort() self.config.setting["lastfm_genre_decade"] = ",".join(tmp1) tmp0 = {} tmp1 = [tmp0.setdefault(i.strip(),i.strip()) for i in unicode(self.ui.genre_year.text()).lower().split(",") if i not in tmp0] tmp1.sort() self.config.setting["lastfm_genre_year"] = ",".join(tmp1) tmp0 = {} tmp1 = [tmp0.setdefault(i.strip(),i.strip()) for i in unicode(self.ui.genre_country.text()).lower().split(",") if i not in tmp0] tmp1.sort() self.config.setting["lastfm_genre_country"] = ",".join(tmp1) tmp0 = {} tmp1 = [tmp0.setdefault(i.strip(),i.strip()) for i in unicode(self.ui.genre_city.text()).lower().split(",") if i not in tmp0] tmp1.sort() self.config.setting["lastfm_genre_city"] = ",".join(tmp1) tmp0 = {} tmp1 = [tmp0.setdefault(i.strip(),i.strip()) for i in unicode(self.ui.genre_occasion.text()).lower().split(",") if i not in tmp0] tmp1.sort() self.config.setting["lastfm_genre_occasion"] = ",".join(tmp1) tmp0 = {} tmp1 = [tmp0.setdefault(i.strip(),i.strip()) for i in unicode(self.ui.genre_category.text()).lower().split(",") if i not in tmp0] tmp1.sort() self.config.setting["lastfm_genre_category"] = ",".join(tmp1) tmp0 = {} tmp1 = [tmp0.setdefault(i.strip(),i.strip()) for i in unicode(self.ui.genre_mood.text()).lower().split(",") if i not in tmp0] tmp1.sort() self.config.setting["lastfm_genre_mood"] = ",".join(tmp1) trans = {} tmp0=unicode(self.ui.genre_translations.toPlainText()).lower().split("\n") for tmp1 in tmp0: tmp2=tmp1.split(',') if len(tmp2) == 2: tmp2[0]=tmp2[0].strip() tmp2[1]=tmp2[1].strip() if len(tmp2[0]) < 1 or len(tmp2[1]) < 1: continue if tmp2[0] in trans and trans[tmp2[0]] <> tmp2[1]: del trans[tmp2[0]] elif not tmp2[0] in trans: trans[tmp2[0]] = tmp2[1] tmp3 = trans.items() tmp3.sort() self.config.setting["lastfm_genre_translations"] = "\n".join(["%s,%s" % (k,v) for k, v in tmp3]) GENRE_FILTER["_loaded_"] = False register_track_metadata_processor(process_track) register_options_page(LastfmOptionsPage)picard-release-1.3.2/contrib/plugins/lastfmplus/ui_options_lastfm.py000066400000000000000000003044401245305550700260330ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'options_lastfmplus.ui' # # Created: Thu Jul 23 10:55:17 2009 # by: PyQt4 UI code generator 4.4.4 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui class Ui_LastfmOptionsPage(object): def setupUi(self, LastfmOptionsPage): LastfmOptionsPage.setObjectName("LastfmOptionsPage") LastfmOptionsPage.resize(414, 493) self.horizontalLayout = QtGui.QHBoxLayout(LastfmOptionsPage) self.horizontalLayout.setObjectName("horizontalLayout") self.tabWidget = QtGui.QTabWidget(LastfmOptionsPage) self.tabWidget.setMinimumSize(QtCore.QSize(330, 475)) self.tabWidget.setElideMode(QtCore.Qt.ElideNone) self.tabWidget.setUsesScrollButtons(False) self.tabWidget.setObjectName("tabWidget") self.tab_4 = QtGui.QWidget() self.tab_4.setObjectName("tab_4") self.gridLayout_3 = QtGui.QGridLayout(self.tab_4) self.gridLayout_3.setObjectName("gridLayout_3") self.groupBox_5 = QtGui.QGroupBox(self.tab_4) self.groupBox_5.setMinimumSize(QtCore.QSize(0, 0)) self.groupBox_5.setBaseSize(QtCore.QSize(0, 0)) self.groupBox_5.setObjectName("groupBox_5") self.gridLayout_2 = QtGui.QGridLayout(self.groupBox_5) self.gridLayout_2.setObjectName("gridLayout_2") self.label_10 = QtGui.QLabel(self.groupBox_5) self.label_10.setLayoutDirection(QtCore.Qt.RightToLeft) self.label_10.setObjectName("label_10") self.gridLayout_2.addWidget(self.label_10, 0, 0, 1, 1) self.max_group_tags = QtGui.QSpinBox(self.groupBox_5) self.max_group_tags.setObjectName("max_group_tags") self.gridLayout_2.addWidget(self.max_group_tags, 0, 1, 1, 1) spacerItem = QtGui.QSpacerItem(20, 95, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.gridLayout_2.addItem(spacerItem, 0, 2, 4, 1) self.label_12 = QtGui.QLabel(self.groupBox_5) self.label_12.setLayoutDirection(QtCore.Qt.RightToLeft) self.label_12.setObjectName("label_12") self.gridLayout_2.addWidget(self.label_12, 0, 3, 1, 1) self.max_mood_tags = QtGui.QSpinBox(self.groupBox_5) self.max_mood_tags.setObjectName("max_mood_tags") self.gridLayout_2.addWidget(self.max_mood_tags, 0, 4, 1, 1) self.label_11 = QtGui.QLabel(self.groupBox_5) self.label_11.setLayoutDirection(QtCore.Qt.RightToLeft) self.label_11.setObjectName("label_11") self.gridLayout_2.addWidget(self.label_11, 1, 0, 1, 1) self.max_minor_tags = QtGui.QSpinBox(self.groupBox_5) self.max_minor_tags.setObjectName("max_minor_tags") self.gridLayout_2.addWidget(self.max_minor_tags, 1, 1, 1, 1) self.label_14 = QtGui.QLabel(self.groupBox_5) self.label_14.setLayoutDirection(QtCore.Qt.RightToLeft) self.label_14.setObjectName("label_14") self.gridLayout_2.addWidget(self.label_14, 1, 3, 1, 1) self.max_occasion_tags = QtGui.QSpinBox(self.groupBox_5) self.max_occasion_tags.setObjectName("max_occasion_tags") self.gridLayout_2.addWidget(self.max_occasion_tags, 1, 4, 1, 1) self.label_15 = QtGui.QLabel(self.groupBox_5) self.label_15.setLayoutDirection(QtCore.Qt.RightToLeft) self.label_15.setObjectName("label_15") self.gridLayout_2.addWidget(self.label_15, 2, 3, 1, 1) self.max_category_tags = QtGui.QSpinBox(self.groupBox_5) self.max_category_tags.setObjectName("max_category_tags") self.gridLayout_2.addWidget(self.max_category_tags, 2, 4, 1, 1) self.app_major2minor_tag = QtGui.QCheckBox(self.groupBox_5) self.app_major2minor_tag.setObjectName("app_major2minor_tag") self.gridLayout_2.addWidget(self.app_major2minor_tag, 3, 0, 1, 2) self.label_26 = QtGui.QLabel(self.groupBox_5) self.label_26.setLayoutDirection(QtCore.Qt.RightToLeft) self.label_26.setObjectName("label_26") self.gridLayout_2.addWidget(self.label_26, 3, 3, 1, 1) self.join_tags_sign = QtGui.QLineEdit(self.groupBox_5) self.join_tags_sign.setObjectName("join_tags_sign") self.gridLayout_2.addWidget(self.join_tags_sign, 3, 4, 1, 1) self.gridLayout_3.addWidget(self.groupBox_5, 0, 0, 1, 1) self.groupBox_4 = QtGui.QGroupBox(self.tab_4) self.groupBox_4.setObjectName("groupBox_4") self.gridLayout_6 = QtGui.QGridLayout(self.groupBox_4) self.gridLayout_6.setObjectName("gridLayout_6") self.use_country_tag = QtGui.QCheckBox(self.groupBox_4) self.use_country_tag.setObjectName("use_country_tag") self.gridLayout_6.addWidget(self.use_country_tag, 0, 0, 1, 1) self.use_city_tag = QtGui.QCheckBox(self.groupBox_4) self.use_city_tag.setTristate(False) self.use_city_tag.setObjectName("use_city_tag") self.gridLayout_6.addWidget(self.use_city_tag, 1, 0, 1, 1) self.use_year_tag = QtGui.QCheckBox(self.groupBox_4) self.use_year_tag.setObjectName("use_year_tag") self.gridLayout_6.addWidget(self.use_year_tag, 0, 1, 1, 1) self.use_decade_tag = QtGui.QCheckBox(self.groupBox_4) self.use_decade_tag.setObjectName("use_decade_tag") self.gridLayout_6.addWidget(self.use_decade_tag, 1, 1, 1, 1) self.gridLayout_3.addWidget(self.groupBox_4, 1, 0, 1, 1) self.groupBox_9 = QtGui.QGroupBox(self.tab_4) self.groupBox_9.setObjectName("groupBox_9") self.gridLayout_4 = QtGui.QGridLayout(self.groupBox_9) self.gridLayout_4.setObjectName("gridLayout_4") self.use_track_tags = QtGui.QCheckBox(self.groupBox_9) self.use_track_tags.setChecked(False) self.use_track_tags.setObjectName("use_track_tags") self.gridLayout_4.addWidget(self.use_track_tags, 0, 0, 1, 1) self.label_19 = QtGui.QLabel(self.groupBox_9) self.label_19.setLayoutDirection(QtCore.Qt.RightToLeft) self.label_19.setObjectName("label_19") self.gridLayout_4.addWidget(self.label_19, 0, 2, 1, 1) self.min_tracktag_weight = QtGui.QSpinBox(self.groupBox_9) self.min_tracktag_weight.setObjectName("min_tracktag_weight") self.gridLayout_4.addWidget(self.min_tracktag_weight, 0, 3, 1, 1) self.label_20 = QtGui.QLabel(self.groupBox_9) self.label_20.setLayoutDirection(QtCore.Qt.RightToLeft) self.label_20.setObjectName("label_20") self.gridLayout_4.addWidget(self.label_20, 1, 2, 1, 1) self.max_tracktag_drop = QtGui.QSpinBox(self.groupBox_9) self.max_tracktag_drop.setObjectName("max_tracktag_drop") self.gridLayout_4.addWidget(self.max_tracktag_drop, 1, 3, 1, 1) spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.gridLayout_4.addItem(spacerItem1, 0, 1, 2, 1) self.gridLayout_3.addWidget(self.groupBox_9, 2, 0, 1, 1) self.groupBox_10 = QtGui.QGroupBox(self.tab_4) self.groupBox_10.setObjectName("groupBox_10") self.gridLayout_5 = QtGui.QGridLayout(self.groupBox_10) self.gridLayout_5.setObjectName("gridLayout_5") spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.gridLayout_5.addItem(spacerItem2, 0, 1, 3, 1) self.artist_tag_us_no = QtGui.QRadioButton(self.groupBox_10) self.artist_tag_us_no.setObjectName("artist_tag_us_no") self.gridLayout_5.addWidget(self.artist_tag_us_no, 0, 0, 1, 1) self.label_21 = QtGui.QLabel(self.groupBox_10) self.label_21.setLayoutDirection(QtCore.Qt.RightToLeft) self.label_21.setObjectName("label_21") self.gridLayout_5.addWidget(self.label_21, 0, 2, 1, 1) self.artist_tags_weight = QtGui.QSpinBox(self.groupBox_10) self.artist_tags_weight.setObjectName("artist_tags_weight") self.gridLayout_5.addWidget(self.artist_tags_weight, 0, 3, 1, 1) self.artist_tag_us_ex = QtGui.QRadioButton(self.groupBox_10) self.artist_tag_us_ex.setObjectName("artist_tag_us_ex") self.gridLayout_5.addWidget(self.artist_tag_us_ex, 1, 0, 1, 1) self.label_22 = QtGui.QLabel(self.groupBox_10) self.label_22.setLayoutDirection(QtCore.Qt.RightToLeft) self.label_22.setObjectName("label_22") self.gridLayout_5.addWidget(self.label_22, 1, 2, 1, 1) self.min_artisttag_weight = QtGui.QSpinBox(self.groupBox_10) self.min_artisttag_weight.setObjectName("min_artisttag_weight") self.gridLayout_5.addWidget(self.min_artisttag_weight, 1, 3, 1, 1) self.artist_tag_us_yes = QtGui.QRadioButton(self.groupBox_10) self.artist_tag_us_yes.setObjectName("artist_tag_us_yes") self.gridLayout_5.addWidget(self.artist_tag_us_yes, 2, 0, 1, 1) self.label_23 = QtGui.QLabel(self.groupBox_10) self.label_23.setLayoutDirection(QtCore.Qt.RightToLeft) self.label_23.setObjectName("label_23") self.gridLayout_5.addWidget(self.label_23, 2, 2, 1, 1) self.max_artisttag_drop = QtGui.QSpinBox(self.groupBox_10) self.max_artisttag_drop.setObjectName("max_artisttag_drop") self.gridLayout_5.addWidget(self.max_artisttag_drop, 2, 3, 1, 1) self.gridLayout_3.addWidget(self.groupBox_10, 3, 0, 1, 1) self.tabWidget.addTab(self.tab_4, "") self.tab_3 = QtGui.QWidget() self.tab_3.setObjectName("tab_3") self.gridLayout_7 = QtGui.QGridLayout(self.tab_3) self.gridLayout_7.setObjectName("gridLayout_7") self.groupBox_3 = QtGui.QGroupBox(self.tab_3) self.groupBox_3.setObjectName("groupBox_3") self.gridLayout = QtGui.QGridLayout(self.groupBox_3) self.gridLayout.setObjectName("gridLayout") self.label = QtGui.QLabel(self.groupBox_3) self.label.setLayoutDirection(QtCore.Qt.LeftToRight) self.label.setObjectName("label") self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.genre_major = QtGui.QLineEdit(self.groupBox_3) self.genre_major.setObjectName("genre_major") self.gridLayout.addWidget(self.genre_major, 0, 1, 1, 1) self.label_2 = QtGui.QLabel(self.groupBox_3) self.label_2.setLayoutDirection(QtCore.Qt.LeftToRight) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) self.genre_minor = QtGui.QLineEdit(self.groupBox_3) self.genre_minor.setObjectName("genre_minor") self.gridLayout.addWidget(self.genre_minor, 1, 1, 1, 1) self.label_3 = QtGui.QLabel(self.groupBox_3) self.label_3.setLayoutDirection(QtCore.Qt.LeftToRight) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1) self.genre_mood = QtGui.QLineEdit(self.groupBox_3) self.genre_mood.setObjectName("genre_mood") self.gridLayout.addWidget(self.genre_mood, 2, 1, 1, 1) self.label_5 = QtGui.QLabel(self.groupBox_3) self.label_5.setLayoutDirection(QtCore.Qt.LeftToRight) self.label_5.setObjectName("label_5") self.gridLayout.addWidget(self.label_5, 3, 0, 1, 1) self.genre_year = QtGui.QLineEdit(self.groupBox_3) self.genre_year.setObjectName("genre_year") self.gridLayout.addWidget(self.genre_year, 3, 1, 1, 1) self.label_4 = QtGui.QLabel(self.groupBox_3) self.label_4.setLayoutDirection(QtCore.Qt.LeftToRight) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 4, 0, 1, 1) self.genre_occasion = QtGui.QLineEdit(self.groupBox_3) self.genre_occasion.setObjectName("genre_occasion") self.gridLayout.addWidget(self.genre_occasion, 4, 1, 1, 1) self.label_6 = QtGui.QLabel(self.groupBox_3) self.label_6.setLayoutDirection(QtCore.Qt.LeftToRight) self.label_6.setObjectName("label_6") self.gridLayout.addWidget(self.label_6, 5, 0, 1, 1) self.genre_decade = QtGui.QLineEdit(self.groupBox_3) self.genre_decade.setObjectName("genre_decade") self.gridLayout.addWidget(self.genre_decade, 5, 1, 1, 1) self.label_7 = QtGui.QLabel(self.groupBox_3) self.label_7.setLayoutDirection(QtCore.Qt.LeftToRight) self.label_7.setObjectName("label_7") self.gridLayout.addWidget(self.label_7, 6, 0, 1, 1) self.genre_country = QtGui.QLineEdit(self.groupBox_3) self.genre_country.setObjectName("genre_country") self.gridLayout.addWidget(self.genre_country, 6, 1, 1, 1) self.label_9 = QtGui.QLabel(self.groupBox_3) self.label_9.setLayoutDirection(QtCore.Qt.LeftToRight) self.label_9.setObjectName("label_9") self.gridLayout.addWidget(self.label_9, 7, 0, 1, 1) self.genre_city = QtGui.QLineEdit(self.groupBox_3) self.genre_city.setObjectName("genre_city") self.gridLayout.addWidget(self.genre_city, 7, 1, 1, 1) self.label_8 = QtGui.QLabel(self.groupBox_3) self.label_8.setLayoutDirection(QtCore.Qt.LeftToRight) self.label_8.setObjectName("label_8") self.gridLayout.addWidget(self.label_8, 8, 0, 1, 1) self.genre_category = QtGui.QLineEdit(self.groupBox_3) self.genre_category.setObjectName("genre_category") self.gridLayout.addWidget(self.genre_category, 8, 1, 1, 1) self.gridLayout_7.addWidget(self.groupBox_3, 0, 0, 1, 2) self.groupBox_17 = QtGui.QGroupBox(self.tab_3) self.groupBox_17.setObjectName("groupBox_17") self.horizontalLayout_4 = QtGui.QHBoxLayout(self.groupBox_17) self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.genre_translations = QtGui.QTextEdit(self.groupBox_17) self.genre_translations.setObjectName("genre_translations") self.horizontalLayout_4.addWidget(self.genre_translations) self.gridLayout_7.addWidget(self.groupBox_17, 1, 0, 1, 1) self.groupBox_2 = QtGui.QGroupBox(self.tab_3) self.groupBox_2.setObjectName("groupBox_2") self.verticalLayout = QtGui.QVBoxLayout(self.groupBox_2) self.verticalLayout.setObjectName("verticalLayout") self.filter_report = QtGui.QPushButton(self.groupBox_2) self.filter_report.setObjectName("filter_report") self.verticalLayout.addWidget(self.filter_report) self.check_word_lists = QtGui.QPushButton(self.groupBox_2) self.check_word_lists.setObjectName("check_word_lists") self.verticalLayout.addWidget(self.check_word_lists) self.check_translation_list = QtGui.QPushButton(self.groupBox_2) self.check_translation_list.setEnabled(False) self.check_translation_list.setObjectName("check_translation_list") self.verticalLayout.addWidget(self.check_translation_list) spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem3) self.load_default_lists = QtGui.QPushButton(self.groupBox_2) font = QtGui.QFont() font.setWeight(75) font.setBold(True) self.load_default_lists.setFont(font) self.load_default_lists.setObjectName("load_default_lists") self.verticalLayout.addWidget(self.load_default_lists) self.gridLayout_7.addWidget(self.groupBox_2, 1, 1, 1, 1) self.tabWidget.addTab(self.tab_3, "") self.horizontalLayout.addWidget(self.tabWidget) self.retranslateUi(LastfmOptionsPage) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(LastfmOptionsPage) LastfmOptionsPage.setTabOrder(self.max_group_tags, self.max_minor_tags) LastfmOptionsPage.setTabOrder(self.max_minor_tags, self.use_track_tags) LastfmOptionsPage.setTabOrder(self.use_track_tags, self.min_tracktag_weight) LastfmOptionsPage.setTabOrder(self.min_tracktag_weight, self.max_tracktag_drop) LastfmOptionsPage.setTabOrder(self.max_tracktag_drop, self.artist_tag_us_no) LastfmOptionsPage.setTabOrder(self.artist_tag_us_no, self.artist_tag_us_ex) LastfmOptionsPage.setTabOrder(self.artist_tag_us_ex, self.artist_tag_us_yes) LastfmOptionsPage.setTabOrder(self.artist_tag_us_yes, self.artist_tags_weight) LastfmOptionsPage.setTabOrder(self.artist_tags_weight, self.min_artisttag_weight) LastfmOptionsPage.setTabOrder(self.min_artisttag_weight, self.max_artisttag_drop) LastfmOptionsPage.setTabOrder(self.max_artisttag_drop, self.genre_major) LastfmOptionsPage.setTabOrder(self.genre_major, self.genre_minor) LastfmOptionsPage.setTabOrder(self.genre_minor, self.genre_mood) LastfmOptionsPage.setTabOrder(self.genre_mood, self.genre_year) LastfmOptionsPage.setTabOrder(self.genre_year, self.genre_occasion) LastfmOptionsPage.setTabOrder(self.genre_occasion, self.genre_decade) LastfmOptionsPage.setTabOrder(self.genre_decade, self.genre_country) LastfmOptionsPage.setTabOrder(self.genre_country, self.genre_category) LastfmOptionsPage.setTabOrder(self.genre_category, self.genre_translations) LastfmOptionsPage.setTabOrder(self.genre_translations, self.filter_report) LastfmOptionsPage.setTabOrder(self.filter_report, self.check_word_lists) LastfmOptionsPage.setTabOrder(self.check_word_lists, self.check_translation_list) LastfmOptionsPage.setTabOrder(self.check_translation_list, self.load_default_lists) def retranslateUi(self, LastfmOptionsPage): LastfmOptionsPage.setWindowTitle(QtGui.QApplication.translate("LastfmOptionsPage", "Form", None, QtGui.QApplication.UnicodeUTF8)) self.tabWidget.setWindowTitle(QtGui.QApplication.translate("LastfmOptionsPage", "LastfmOptionsPage", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_5.setTitle(QtGui.QApplication.translate("LastfmOptionsPage", "Max Tags Written 0=Disabled 1=One Tag 2+= Multiple Tags", None, QtGui.QApplication.UnicodeUTF8)) self.label_10.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Major Tags - Group", None, QtGui.QApplication.UnicodeUTF8)) self.max_group_tags.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Max Grouping (Major Genres) Tags

\n" "

Tag Name: %GROUPING%

\n" "

Top level genres ex: Classical, Rock, Soundtracks

\n" "

Written to grouping tag. Can also be appended to genre tag if \'Append Major\' box (below) is checked.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.label_12.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Max Mood Tags", None, QtGui.QApplication.UnicodeUTF8)) self.max_mood_tags.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Max Mood Tags ID3v2.4+ Only!

\n" "

Tag: %MOOD%

\n" "

How a track \'feels\'. ex: Happy, Introspective, Drunk

\n" "

Note: The TMOO frame is only standard in ID3v2.4 tags. For all other tags, Moods will be saved as a Comment.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.label_11.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Minor Tags - Genre", None, QtGui.QApplication.UnicodeUTF8)) self.max_minor_tags.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Max Genre Tags

\n" "

Tag: %GENRE%

\n" "

These are specific, detailed genres. ex: Baroque, Classic Rock, Delta Blues

\n" "

Set this to 1 if using this tag for file naming, or if your player does not support multi-value tags. Consider setting this to 3+ if you use Genre for searching in your music library.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.label_14.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Max Occasion Tags", None, QtGui.QApplication.UnicodeUTF8)) self.max_occasion_tags.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Max Occasion Tags Nonstandard!

\n" "

Tag: %Comment:Songs-db_Occasion%

\n" "

Good situations to play a track, ex: Driving, Love, Party

\n" "

Set to 2+ to increase this tag\'s usefulness.

", None, QtGui.QApplication.UnicodeUTF8)) self.label_15.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Max Category Tags", None, QtGui.QApplication.UnicodeUTF8)) self.max_category_tags.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Max Category Tags Nonstandard!

\n" "

Tag: %Comment:Songs-db_Custom2%

\n" "

Another Top-level grouping tag.

\n" "

Contains tags like: Female Vocalists, Singer-Songwriter

", None, QtGui.QApplication.UnicodeUTF8)) self.app_major2minor_tag.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Append Major to Minor Tags

\n" "

This will prepend any Grouping tags onto the Genre tag at tagging time. The effect is that the grouping tag which is also the major genre becomes the first genre in the list of minor genres

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.app_major2minor_tag.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Prepend Major to Minor Tags", None, QtGui.QApplication.UnicodeUTF8)) self.label_26.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Join Tags With", None, QtGui.QApplication.UnicodeUTF8)) self.join_tags_sign.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

The Separator to use for Multi-Value tags.

\n" "

You may want to add a trailing space to help with readability.

\n" "

To use Separate Tags rather than a single multi-value tag leave this field blank ie. no space at all.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.join_tags_sign.setText(QtGui.QApplication.translate("LastfmOptionsPage", ";", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_4.setTitle(QtGui.QApplication.translate("LastfmOptionsPage", "Enable (Selected) or Disable (Not Selected) other Tags", None, QtGui.QApplication.UnicodeUTF8)) self.use_country_tag.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Country Nonstandard!

\n" "

Tag: %Comment:Songs-db_Custom2%

\n" "

The country the artist or track is most associated with. Will retreive results using the country tag list on Tag Filter List Page

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.use_country_tag.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Country", None, QtGui.QApplication.UnicodeUTF8)) self.use_city_tag.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Country Nonstandard!

\n" "

Tag: %Comment:Songs-db_Custom2%

\n" "

The city or region the artist or track is most associated with. If enabled will use the most populartag in the city list on Tag Filter Options page. If country option has been selected as well the city tag will be displayed second in the tag list.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.use_city_tag.setText(QtGui.QApplication.translate("LastfmOptionsPage", "City", None, QtGui.QApplication.UnicodeUTF8)) self.use_year_tag.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Original Year Nonstandard!

\n" "

Tag: %ID3:TDOR% or %ID3:TORY%

\n" "

The year the song was created or most popular in. Quite often this is the correct original release year of the track. The tag written to is determined by the settings you have selected in Picard Tag options. E.g. if ID3v2.3 is selected the original year tag will be ID3:TORY rather than the default of ID3:TDOR.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.use_year_tag.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Original Year", None, QtGui.QApplication.UnicodeUTF8)) self.use_decade_tag.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Decade Nonstandard!

\n" "

Tag: %Comment:Songs-db_Custom1%

\n" "

The decade the song was created, ex: 1970s

\n" "

This is based on the last fm tags first, if none found then the originalyear tag, and then the release date of the album.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.use_decade_tag.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Decade", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_9.setTitle(QtGui.QApplication.translate("LastfmOptionsPage", "Track Based Tags: Tags based on Track Title and Artist", None, QtGui.QApplication.UnicodeUTF8)) self.use_track_tags.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Check this to use track based tags. These are tags relevant to the song

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.use_track_tags.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Use Track Based Tags", None, QtGui.QApplication.UnicodeUTF8)) self.label_19.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Minimum Tag Weight", None, QtGui.QApplication.UnicodeUTF8)) self.min_tracktag_weight.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

The minimum weight track based tag to use, in terms of popularity.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.min_tracktag_weight.setSuffix(QtGui.QApplication.translate("LastfmOptionsPage", " %", None, QtGui.QApplication.UnicodeUTF8)) self.label_20.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Maximum Inter-Tag Drop", None, QtGui.QApplication.UnicodeUTF8)) self.max_tracktag_drop.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

The maximum allowed drop in relevance for the tag to still be a match.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.max_tracktag_drop.setSuffix(QtGui.QApplication.translate("LastfmOptionsPage", " %", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_10.setTitle(QtGui.QApplication.translate("LastfmOptionsPage", "Artist based tags: Based on the artist, not the track title.", None, QtGui.QApplication.UnicodeUTF8)) self.artist_tag_us_no.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Select this to never use artist based tags.

\n" "

Be sure you have Use track based tags checked, though.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.artist_tag_us_no.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Don\'t use Artist Tags", None, QtGui.QApplication.UnicodeUTF8)) self.label_21.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Artist-Tags Weight", None, QtGui.QApplication.UnicodeUTF8)) self.artist_tags_weight.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

How strongly artist based tags are considered for inclusion.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.artist_tags_weight.setSuffix(QtGui.QApplication.translate("LastfmOptionsPage", " %", None, QtGui.QApplication.UnicodeUTF8)) self.artist_tag_us_ex.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Enabling this uses artist based tags only if there are not enough track based tags.

\n" "

Default: Enabled

", None, QtGui.QApplication.UnicodeUTF8)) self.artist_tag_us_ex.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Extend Track-Tags", None, QtGui.QApplication.UnicodeUTF8)) self.label_22.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Minimum Tag Weight", None, QtGui.QApplication.UnicodeUTF8)) self.min_artisttag_weight.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

The minimum weight artist based tag to use, in terms of popularity.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.min_artisttag_weight.setSuffix(QtGui.QApplication.translate("LastfmOptionsPage", " %", None, QtGui.QApplication.UnicodeUTF8)) self.artist_tag_us_yes.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Enable this to always use artist based tags

", None, QtGui.QApplication.UnicodeUTF8)) self.artist_tag_us_yes.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Use Artist-Tags", None, QtGui.QApplication.UnicodeUTF8)) self.label_23.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Maximum Inter-Tag Drop", None, QtGui.QApplication.UnicodeUTF8)) self.max_artisttag_drop.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

The maximum allowed drop in relevance for the tag to still be a match.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.max_artisttag_drop.setSuffix(QtGui.QApplication.translate("LastfmOptionsPage", " %", None, QtGui.QApplication.UnicodeUTF8)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), QtGui.QApplication.translate("LastfmOptionsPage", "General Options", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_3.setTitle(QtGui.QApplication.translate("LastfmOptionsPage", "Tag Lists", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Grouping", None, QtGui.QApplication.UnicodeUTF8)) self.genre_major.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Major Genres

\n" "

Top-level genres ex: Classical, Rock, Soundtracks

\n" "

Written to Grouping tag. Can also be appended to

\n" "

Genre tag if enabled in General Options.

\n" "

\n" "

Tag Name: %GROUPING% ID3 Frame: TIT1

\n" "

Supported: Mp3, Ogg, Flac, Wma, AAC

\n" "

\n" "

Compatibility Tag Mapping

\n" "

______________________________________________________

\n" "

Foobar YES CONTENT GROUP

\n" "

iTunes YES GROUPING

\n" "

MediaMonkey YES GROUPING

\n" "

MP3Tag YES CONTENTGROUP

\n" "

Winamp UNK ---

\n" "

WMP YES MUSIC CATEGORY DESCRIPTION

\n" "

", None, QtGui.QApplication.UnicodeUTF8)) self.label_2.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Genres", None, QtGui.QApplication.UnicodeUTF8)) self.genre_minor.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Minor Genres

\n" "

More specific genres. ex: Baroque, Classic Rock, Delta Blues

\n" "

Written to Genre tag.

\n" "

\n" "

Tag Name: %GENRE% ID3 Frame: TCON

\n" "

Supported: Mp3, Ogg, Flac, Wma, AAC, Ape, Wav

\n" "

\n" "

Compatibility Tag Mapping

\n" "

______________________________________________________

\n" "

Foobar YES GENRE

\n" "

iTunes YES GENRE

\n" "

MediaMonkey YES GENRE

\n" "

MP3Tag YES GENRE

\n" "

Winamp YES GENRE

\n" "

WMP YES GENRE

", None, QtGui.QApplication.UnicodeUTF8)) self.label_3.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Mood", None, QtGui.QApplication.UnicodeUTF8)) self.genre_mood.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Mood ID3v2.4+ Only!

\n" "

How a track \'feels\'. ex: Happy, Introspective, Drunk

\n" "

Note: The TMOO frame is only standard in ID3v2.4 tags.

\n" "

For all other tags, Moods are saved as a Comment.

\n" "

\n" "

Tag Name: %MOOD% ID3 Frame: TMOO

\n" "

Supported: Mp3, Ogg, Flac, Wma, AAC

\n" "

\n" "

Compatibility Tag Mapping

\n" "

______________________________________________________

\n" "

Foobar NO ---

\n" "

iTunes UNK ---

\n" "

MediaMonkey YES MOOD

\n" "

MP3Tag YES MOOD

\n" "

Winamp UNK ---

\n" "

WMP YES WM/MOOD

\n" "

", None, QtGui.QApplication.UnicodeUTF8)) self.label_5.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Years", None, QtGui.QApplication.UnicodeUTF8)) self.genre_year.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Original Year

\n" "

The year the track was first recorded.

\n" "

Note: This tag is often missing or wrong.

\n" "

If Blank, the album release date is used.

\n" "

\n" "

Tag Name: %ORIGINALDATE%

\n" "

ID3 Frame: V2.3: TORY v2.4: TDOR

\n" "

Supported: Mp3, Ogg, Flac, Wma, AAC

\n" "

\n" "

Compatibility Tag Mapping

\n" "

______________________________________________________

\n" "

Foobar YES ORIGINAL RELEASE DATE

\n" "

iTunes UNK ---

\n" "

MediaMonkey YES ORIGINAL DATE

\n" "

MP3Tag YES ORIGYEAR

\n" "

Winamp UNK ---

\n" "

WMP UNK ---

\n" "

", None, QtGui.QApplication.UnicodeUTF8)) self.label_4.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Occasion", None, QtGui.QApplication.UnicodeUTF8)) self.genre_occasion.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Occasions Nonstandard!

\n" "

Good times to play the track, ex: Driving, Love, Party

\n" "

Written to the Comment tag. Has very limited support.

\n" "

\n" "

Tag Name: %Comment:Songs-db_Occasion%

\n" "

ID3 Frame: COMM:Songs-db_Occasion

\n" "

Supported: Mp3, Ogg, Flac

\n" "

\n" "

Compatibility Tag Mapping

\n" "

______________________________________________________

\n" "

Foobar NO ---

\n" "

iTunes NO ---

\n" "

MediaMonkey YES Custom tag

\n" "

MP3Tag YES Comment:Songs-db_Occasion

\n" "

Winamp NO ---

\n" "

WMP UNK ---

", None, QtGui.QApplication.UnicodeUTF8)) self.label_6.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Decades", None, QtGui.QApplication.UnicodeUTF8)) self.genre_decade.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Decade Nonstandard!

\n" "

The decade the song was created. Based on

\n" "

originalyear, so will frequently be wrong.

\n" "

Unless your app can map Comment subvalues

\n" "

this tag will show as part of any existing comment.

\n" "

\n" "

Tag Name: %Comment:Songs-db_Custom1%

\n" "

ID3 Frame: COMM:Songs-db_Custom1

\n" "

Supported: Mp3, Ogg, Flac

\n" "

\n" "

Compatibility Tag Mapping

\n" "

______________________________________________________

\n" "

Foobar NO ---

\n" "

iTunes NO ---

\n" "

MediaMonkey YES Custom tag

\n" "

MP3Tag YES Comment:Songs-db_Custom1

\n" "

Winamp NO ---

\n" "

WMP NO ---

", None, QtGui.QApplication.UnicodeUTF8)) self.label_7.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Country", None, QtGui.QApplication.UnicodeUTF8)) self.genre_country.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Country Nonstandard!

\n" "

Artist country/location info, ex: America, New York, NYC

\n" "

Allowing more tags will usually give more detailed info.

\n" "

Unless your app maps Comment subvalues

\n" "

this tag will show as part of any existing comment.

\n" "

\n" "

Tag Name: %Comment:Songs-db_Custom3%

\n" "

ID3 Frame: COMM:Songs-db_Custom3

\n" "

Supported: Mp3, Ogg, Flac

\n" "

\n" "

Compatibility Tag Mapping

\n" "

______________________________________________________

\n" "

Foobar NO ---

\n" "

iTunes NO ---

\n" "

MediaMonkey YES Custom tag

\n" "

MP3Tag YES Comment:Songs-db_Custom3

\n" "

Winamp NO ---

\n" "

WMP NO ---

", None, QtGui.QApplication.UnicodeUTF8)) self.label_9.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Cities", None, QtGui.QApplication.UnicodeUTF8)) self.genre_city.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Country Nonstandard!

\n" "

Artist country/location info, ex: America, New York, NYC

\n" "

Allowing more tags will usually give more detailed info.

\n" "

Unless your app maps Comment subvalues

\n" "

this tag will show as part of any existing comment.

\n" "

\n" "

Tag Name: %Comment:Songs-db_Custom3%

\n" "

ID3 Frame: COMM:Songs-db_Custom3

\n" "

Supported: Mp3, Ogg, Flac

\n" "

\n" "

Compatibility Tag Mapping

\n" "

______________________________________________________

\n" "

Foobar NO ---

\n" "

iTunes NO ---

\n" "

MediaMonkey YES Custom tag

\n" "

MP3Tag YES Comment:Songs-db_Custom3

\n" "

Winamp NO ---

\n" "

WMP NO ---

", None, QtGui.QApplication.UnicodeUTF8)) self.label_8.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Category", None, QtGui.QApplication.UnicodeUTF8)) self.genre_category.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Category Nonstandard!

\n" "

Another Top-level grouping tag.

\n" "

Returns terms like Female Vocalists, Singer-Songwriter

\n" "

Unless your app can map Comment subvalues

\n" "

this tag will show as part of any existing comment.

\n" "

\n" "

Tag Name: %Comment:Songs-db_Custom2%

\n" "

ID3 Frame: COMM:Songs-db_Custom2

\n" "

Supported: Mp3, Ogg, Flac

\n" "

\n" "

Compatibility Tag Mapping

\n" "

______________________________________________________

\n" "

Foobar NO ---

\n" "

iTunes NO ---

\n" "

MediaMonkey YES Custom tag

\n" "

MP3Tag YES Comment:Songs-db_Custom2

\n" "

Winamp NO ---

\n" "

WMP NO ---

", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_17.setTitle(QtGui.QApplication.translate("LastfmOptionsPage", "Tag Translations", None, QtGui.QApplication.UnicodeUTF8)) self.genre_translations.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Tag Translations

\n" "

This list lets you change how matches from the tag lists are actually written into your tags.

\n" "

\n" "

Typical Uses:

\n" "

- Standardize spellings, ex: rock-n-roll , rock and roll , rock \'n roll --> rock & roll

\n" "

- Clean formatting, ex: lovesongs --> love songs

\n" "

- Condense related tags, ex: heavy metal, hair metal, power metal --> metal

\n" "

\n" "

Usage: Old Name, New Name

\n" "

One Rule per line:

\n" "

\n" "

Death Metal, Metal

\n" "

Sunshine-Pop, Pop

\n" "

Super-awesome-musics, Nice

", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_2.setTitle(QtGui.QApplication.translate("LastfmOptionsPage", "Tools", None, QtGui.QApplication.UnicodeUTF8)) self.filter_report.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Filter Report

\n" "

Tells you how many tags and translations you have in each list.

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.filter_report.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Filter Report", None, QtGui.QApplication.UnicodeUTF8)) self.check_word_lists.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Check Tag Lists

\n" "

Each tag may appear only once across all lists. This scans all the lists for duplicated tags so you can easily remove them.

\n" "

Run this whenever you add tags to a list!

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.check_word_lists.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Check Tag Lists", None, QtGui.QApplication.UnicodeUTF8)) self.check_translation_list.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

Not implemented yet.

", None, QtGui.QApplication.UnicodeUTF8)) self.check_translation_list.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Translations", None, QtGui.QApplication.UnicodeUTF8)) self.load_default_lists.setToolTip(QtGui.QApplication.translate("LastfmOptionsPage", "\n" "\n" "

WARNING!

\n" "

This will overwrite all current tag lists and translations!

\n" "", None, QtGui.QApplication.UnicodeUTF8)) self.load_default_lists.setText(QtGui.QApplication.translate("LastfmOptionsPage", "Load Defaults", None, QtGui.QApplication.UnicodeUTF8)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), QtGui.QApplication.translate("LastfmOptionsPage", "Tag Filter Lists", None, QtGui.QApplication.UnicodeUTF8)) picard-release-1.3.2/contrib/plugins/no_release.py000066400000000000000000000114771245305550700222240ustar00rootroot00000000000000# -*- coding: utf-8 -*- PLUGIN_NAME = u'No release' PLUGIN_AUTHOR = u'Johannes Weißl' PLUGIN_DESCRIPTION = '''Do not store specific release information in releases of unknown origin.''' PLUGIN_VERSION = '0.1' PLUGIN_API_VERSIONS = ['0.15'] from PyQt4 import QtCore, QtGui from picard.album import Album from picard.metadata import register_album_metadata_processor, register_track_metadata_processor from picard.ui.options import register_options_page, OptionsPage from picard.ui.itemviews import BaseAction, register_album_action from picard.config import BoolOption, TextOption class Ui_NoReleaseOptionsPage(object): def setupUi(self, NoReleaseOptionsPage): NoReleaseOptionsPage.setObjectName('NoReleaseOptionsPage') NoReleaseOptionsPage.resize(394, 300) self.verticalLayout = QtGui.QVBoxLayout(NoReleaseOptionsPage) self.verticalLayout.setObjectName('verticalLayout') self.groupBox = QtGui.QGroupBox(NoReleaseOptionsPage) self.groupBox.setObjectName('groupBox') self.vboxlayout = QtGui.QVBoxLayout(self.groupBox) self.vboxlayout.setObjectName('vboxlayout') self.norelease_enable = QtGui.QCheckBox(self.groupBox) self.norelease_enable.setObjectName('norelease_enable') self.vboxlayout.addWidget(self.norelease_enable) self.label = QtGui.QLabel(self.groupBox) self.label.setObjectName('label') self.vboxlayout.addWidget(self.label) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName('horizontalLayout') self.norelease_strip_tags = QtGui.QLineEdit(self.groupBox) self.norelease_strip_tags.setObjectName('norelease_strip_tags') self.horizontalLayout.addWidget(self.norelease_strip_tags) self.vboxlayout.addLayout(self.horizontalLayout) self.verticalLayout.addWidget(self.groupBox) spacerItem = QtGui.QSpacerItem(368, 187, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.retranslateUi(NoReleaseOptionsPage) QtCore.QMetaObject.connectSlotsByName(NoReleaseOptionsPage) def retranslateUi(self, NoReleaseOptionsPage): self.groupBox.setTitle(QtGui.QApplication.translate('NoReleaseOptionsPage', 'No release', None, QtGui.QApplication.UnicodeUTF8)) self.norelease_enable.setText(QtGui.QApplication.translate('NoReleaseOptionsPage', _('Enable plugin for all releases by default'), None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate('NoReleaseOptionsPage', _('Tags to strip (comma-separated)'), None, QtGui.QApplication.UnicodeUTF8)) def strip_release_specific_metadata(tagger, metadata): strip_tags = tagger.config.setting['norelease_strip_tags'] strip_tags = [tag.strip() for tag in strip_tags.split(',')] for tag in strip_tags: if tag in metadata: del metadata[tag] class NoReleaseAction(BaseAction): NAME = _('Remove specific release information...') def callback(self, objs): for album in objs: if isinstance(album, Album): strip_release_specific_metadata(self.tagger, album.metadata) for track in album.tracks: strip_release_specific_metadata(self.tagger, track.metadata) for file in track.linked_files: track.update_file_metadata(file) album.update() class NoReleaseOptionsPage(OptionsPage): NAME = 'norelease' TITLE = 'No release' PARENT = 'plugins' options = [ BoolOption('setting', 'norelease_enable', False), TextOption('setting', 'norelease_strip_tags', 'asin,barcode,catalognumber,date,label,media,releasecountry,releasestatus'), ] def __init__(self, parent=None): super(NoReleaseOptionsPage, self).__init__(parent) self.ui = Ui_NoReleaseOptionsPage() self.ui.setupUi(self) def load(self): self.ui.norelease_strip_tags.setText(self.config.setting['norelease_strip_tags']) self.ui.norelease_enable.setChecked(self.config.setting['norelease_enable']) def save(self): self.config.setting['norelease_strip_tags'] = unicode(self.ui.norelease_strip_tags.text()) self.config.setting['norelease_enable'] = self.ui.norelease_enable.isChecked() def NoReleaseAlbumProcessor(tagger, metadata, release): if tagger.config.setting['norelease_enable']: strip_release_specific_metadata(tagger, metadata) def NoReleaseTrackProcessor(tagger, metadata, track, release): if tagger.config.setting['norelease_enable']: strip_release_specific_metadata(tagger, metadata) register_album_metadata_processor(NoReleaseAlbumProcessor) register_track_metadata_processor(NoReleaseTrackProcessor) register_album_action(NoReleaseAction()) register_options_page(NoReleaseOptionsPage) picard-release-1.3.2/contrib/plugins/release_type.py000066400000000000000000000015621245305550700225630ustar00rootroot00000000000000PLUGIN_NAME = 'Release Type' PLUGIN_AUTHOR = 'Elliot Chance' PLUGIN_DESCRIPTION = 'Appends information to EPs and Singles' PLUGIN_VERSION = '1.2' PLUGIN_API_VERSIONS = ["0.9.0", "0.10", "0.15"] from picard.metadata import register_album_metadata_processor import re #================== # options #================== _SINGLE = " (single)" _EP = " EP" def add_release_type(tagger, metadata, release): # make sure "EP" (or "single", ...) is not already a word in the name words = metadata["album"].lower().split(" ") for word in ["ep", "e.p.", "single", "(single)"]: if word in words: return # check release type if metadata["releasetype"] == "ep": rs = _EP elif metadata["releasetype"] == "single": rs = _SINGLE else: rs = "" # append title metadata["album"] = metadata["album"] + rs register_album_metadata_processor(add_release_type) picard-release-1.3.2/contrib/plugins/replaygain/000077500000000000000000000000001245305550700216575ustar00rootroot00000000000000picard-release-1.3.2/contrib/plugins/replaygain/__init__.py000066400000000000000000000164251245305550700240000ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Changelog: # [2008-03-14] Initial version with support for Ogg Vorbis, FLAC and MP3 PLUGIN_NAME = u"ReplayGain" PLUGIN_AUTHOR = u"Philipp Wolfer" PLUGIN_DESCRIPTION = """Calculate ReplayGain for selected files and albums.""" PLUGIN_VERSION = "0.1" PLUGIN_API_VERSIONS = ["0.10", "0.15", "0.16"] from collections import defaultdict from subprocess import check_call from picard.album import Album, NatAlbum from picard.track import Track from picard.file import File from picard.util import encode_filename, decode_filename, partial, thread from picard.ui.options import register_options_page, OptionsPage from picard.config import TextOption from picard.ui.itemviews import (BaseAction, register_file_action, register_album_action) from picard.plugins.replaygain.ui_options_replaygain import Ui_ReplayGainOptionsPage # Path to various replay gain tools. There must be a tool for every supported # audio file format. REPLAYGAIN_COMMANDS = { "Ogg Vorbis": ("replaygain_vorbisgain_command", "replaygain_vorbisgain_options"), "MPEG-1 Audio": ("replaygain_mp3gain_command", "replaygain_mp3gain_options"), "FLAC": ("replaygain_metaflac_command", "replaygain_metaflac_options"), "WavPack": ("replaygain_wvgain_command", "replaygain_wvgain_options"), } def calculate_replay_gain_for_files(files, format, tagger): """Calculates the replay gain for a list of files in album mode.""" file_list = ['%s' % encode_filename(f.filename) for f in files] if format in REPLAYGAIN_COMMANDS \ and tagger.config.setting[REPLAYGAIN_COMMANDS[format][0]]: command = tagger.config.setting[REPLAYGAIN_COMMANDS[format][0]] options = tagger.config.setting[REPLAYGAIN_COMMANDS[format][1]].split(' ') tagger.log.debug('%s %s %s' % (command, ' '.join(options), decode_filename(' '.join(file_list)))) check_call([command] + options + file_list) else: raise Exception('ReplayGain: Unsupported format %s' % (format)) class ReplayGain(BaseAction): NAME = N_("Calculate replay &gain...") def _add_file_to_queue(self, file): thread.run_task( partial(self._calculate_replaygain, file), partial(self._replaygain_callback, file)) def callback(self, objs): for obj in objs: if isinstance(obj, Track): for file_ in obj.linked_files: self._add_file_to_queue(file_) elif isinstance(obj, File): self._add_file_to_queue(obj) def _calculate_replaygain(self, file): self.tagger.window.set_statusbar_message( N_('Calculating replay gain for "%(filename)s"...'), {'filename': file.filename} ) calculate_replay_gain_for_files([file], file.NAME, self.tagger) def _replaygain_callback(self, file, result=None, error=None): if not error: self.tagger.window.set_statusbar_message( N_('Replay gain for "%(filename)s" successfully calculated.'), {'filename': file.filename} ) else: self.tagger.window.set_statusbar_message( N_('Could not calculate replay gain for "%(filename)s".'), {'filename': file.filename} ) class AlbumGain(BaseAction): NAME = N_("Calculate album &gain...") def callback(self, objs): albums = filter(lambda o: isinstance(o, Album) and not isinstance(o, NatAlbum), objs) nats = filter(lambda o: isinstance(o, NatAlbum), objs) for album in albums: thread.run_task( partial(self._calculate_albumgain, album), partial(self._albumgain_callback, album)) for natalbum in nats: thread.run_task( partial(self._calculate_natgain, natalbum), partial(self._albumgain_callback, natalbum)) def split_files_by_type(self, files): """Split the given files by filetype into separate lists.""" files_by_format = defaultdict(list) for file in files: files_by_format[file.NAME].append(file) return files_by_format def _calculate_albumgain(self, album): self.tagger.window.set_statusbar_message( N_('Calculating album gain for "%(album)s"...'), {'album': album.metadata["album"]} ) filelist = [t.linked_files[0] for t in album.tracks if t.is_linked()] for format, files in self.split_files_by_type(filelist).iteritems(): calculate_replay_gain_for_files(files, format, self.tagger) def _calculate_natgain(self, natalbum): """Calculates the replaygain""" self.tagger.window.set_statusbar_message( N_('Calculating album gain for "%(album)s"...'), {'album': natalbum.metadata["album"]} ) filelist = [t.linked_files[0] for t in natalbum.tracks if t.is_linked()] for file_ in filelist: calculate_replay_gain_for_files([file_], file_.NAME, self.tagger) def _albumgain_callback(self, album, result=None, error=None): if not error: self.tagger.window.set_statusbar_message( N_('Album gain for "%(album)s" successfully calculated.'), {'album': album.metadata["album"]} ) else: self.tagger.window.set_statusbar_message( N_('Could not calculate album gain for "%(album)s".'), {'album': album.metadata["album"]} ) class ReplayGainOptionsPage(OptionsPage): NAME = "replaygain" TITLE = "ReplayGain" PARENT = "plugins" options = [ TextOption("setting", "replaygain_vorbisgain_command", "vorbisgain"), TextOption("setting", "replaygain_vorbisgain_options", "-asf"), TextOption("setting", "replaygain_mp3gain_command", "mp3gain"), TextOption("setting", "replaygain_mp3gain_options", "-a -s i"), TextOption("setting", "replaygain_metaflac_command", "metaflac"), TextOption("setting", "replaygain_metaflac_options", "--add-replay-gain"), TextOption("setting", "replaygain_wvgain_command", "wvgain"), TextOption("setting", "replaygain_wvgain_options", "-a") ] def __init__(self, parent=None): super(ReplayGainOptionsPage, self).__init__(parent) self.ui = Ui_ReplayGainOptionsPage() self.ui.setupUi(self) def load(self): self.ui.vorbisgain_command.setText(self.config.setting["replaygain_vorbisgain_command"]) self.ui.mp3gain_command.setText(self.config.setting["replaygain_mp3gain_command"]) self.ui.metaflac_command.setText(self.config.setting["replaygain_metaflac_command"]) self.ui.wvgain_command.setText(self.config.setting["replaygain_wvgain_command"]) def save(self): self.config.setting["replaygain_vorbisgain_command"] = unicode(self.ui.vorbisgain_command.text()) self.config.setting["replaygain_mp3gain_command"] = unicode(self.ui.mp3gain_command.text()) self.config.setting["replaygain_metaflac_command"] = unicode(self.ui.metaflac_command.text()) self.config.setting["replaygain_wvgain_command"] = unicode(self.ui.wvgain_command.text()) register_file_action(ReplayGain()) register_album_action(AlbumGain()) register_options_page(ReplayGainOptionsPage) picard-release-1.3.2/contrib/plugins/replaygain/options_replaygain.ui000066400000000000000000000042661245305550700261340ustar00rootroot00000000000000 ReplayGainOptionsPage 0 0 305 317 6 9 Replay Gain 2 9 Path to VorbisGain: Path to MP3Gain: Path to metaflac: Path to wvgain: Qt::Vertical 263 21 picard-release-1.3.2/contrib/plugins/replaygain/ui_options_replaygain.py000066400000000000000000000057601245305550700266440ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_ReplayGainOptionsPage(object): def setupUi(self, ReplayGainOptionsPage): ReplayGainOptionsPage.setObjectName(_fromUtf8("ReplayGainOptionsPage")) ReplayGainOptionsPage.resize(305, 317) self.vboxlayout = QtGui.QVBoxLayout(ReplayGainOptionsPage) self.vboxlayout.setSpacing(6) self.vboxlayout.setMargin(9) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.replay_gain = QtGui.QGroupBox(ReplayGainOptionsPage) self.replay_gain.setObjectName(_fromUtf8("replay_gain")) self.vboxlayout1 = QtGui.QVBoxLayout(self.replay_gain) self.vboxlayout1.setSpacing(2) self.vboxlayout1.setMargin(9) self.vboxlayout1.setObjectName(_fromUtf8("vboxlayout1")) self.label = QtGui.QLabel(self.replay_gain) self.label.setObjectName(_fromUtf8("label")) self.vboxlayout1.addWidget(self.label) self.vorbisgain_command = QtGui.QLineEdit(self.replay_gain) self.vorbisgain_command.setObjectName(_fromUtf8("vorbisgain_command")) self.vboxlayout1.addWidget(self.vorbisgain_command) self.label_2 = QtGui.QLabel(self.replay_gain) self.label_2.setObjectName(_fromUtf8("label_2")) self.vboxlayout1.addWidget(self.label_2) self.mp3gain_command = QtGui.QLineEdit(self.replay_gain) self.mp3gain_command.setObjectName(_fromUtf8("mp3gain_command")) self.vboxlayout1.addWidget(self.mp3gain_command) self.label_3 = QtGui.QLabel(self.replay_gain) self.label_3.setObjectName(_fromUtf8("label_3")) self.vboxlayout1.addWidget(self.label_3) self.metaflac_command = QtGui.QLineEdit(self.replay_gain) self.metaflac_command.setObjectName(_fromUtf8("metaflac_command")) self.vboxlayout1.addWidget(self.metaflac_command) self.label_4 = QtGui.QLabel(self.replay_gain) self.label_4.setObjectName(_fromUtf8("label_4")) self.vboxlayout1.addWidget(self.label_4) self.wvgain_command = QtGui.QLineEdit(self.replay_gain) self.wvgain_command.setObjectName(_fromUtf8("wvgain_command")) self.vboxlayout1.addWidget(self.wvgain_command) self.vboxlayout.addWidget(self.replay_gain) spacerItem = QtGui.QSpacerItem(263, 21, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.retranslateUi(ReplayGainOptionsPage) QtCore.QMetaObject.connectSlotsByName(ReplayGainOptionsPage) def retranslateUi(self, ReplayGainOptionsPage): self.replay_gain.setTitle(_("Replay Gain")) self.label.setText(_("Path to VorbisGain:")) self.label_2.setText(_("Path to MP3Gain:")) self.label_3.setText(_("Path to metaflac:")) self.label_4.setText(_("Path to wvgain:")) picard-release-1.3.2/contrib/plugins/sort_multivalue_tags.py000066400000000000000000000023711245305550700243550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This is the Sort Multivalue Tags plugin for MusicBrainz Picard. # Copyright (C) 2013 Sophist # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. PLUGIN_NAME = u"Sort Multi-Value Tags" PLUGIN_AUTHOR = u"Sophist" PLUGIN_DESCRIPTION = u'Sort Multi-Value Tags e.g. Release Type, Lyrics alphabetically.' PLUGIN_VERSION = "0.1" PLUGIN_API_VERSIONS = ["0.15"] from picard.metadata import register_track_metadata_processor # Define and register the Track Metadata function def sort_multivalue_tags(tagger, metadata, track, release): for tag in metadata.keys(): data = metadata.getall(tag) if len(data) > 1: sorted_data = sorted(data) if data != sorted_data: metadata.set(tag, sorted_data) register_track_metadata_processor(sort_multivalue_tags) picard-release-1.3.2/contrib/plugins/standardise_performers.py000066400000000000000000000045701245305550700246510ustar00rootroot00000000000000# -*- coding: utf-8 -*- PLUGIN_NAME = _(u'Standardise Performers') PLUGIN_AUTHOR = u'Sophist' PLUGIN_DESCRIPTION = u'''Splits multi-instrument performer tags into single instruments and combines names so e.g. (from 10cc by 10cc track 1):
Performer [acoustic guitar, bass, dobro, electric guitar and tambourine]: Graham Gouldman
Performer [acoustic guitar, electric guitar, grand piano and synthesizer]: Lol Creme
Performer [electric guitar, moog and slide guitar]: Eric Stewart
becomes:
Performer [acoustic guitar]: Graham Gouldman; Lol Creme
Performer [bass]: Graham Gouldman
Performer [dobro]: Graham Gouldman
Performer [electric guitar]: Eric Stewart; Graham Gouldman; Lol Creme
Performer [grand piano]: Lol Creme
Performer [moog]: Eric Stewart
Performer [slide guitar]: Eric Stewart
Performer [synthesizer]: Lol Creme
Performer [tambourine]: Graham Gouldman
''' PLUGIN_VERSION = '0.2' PLUGIN_API_VERSIONS = ["0.15.0", "0.15.1", "0.16.0", "1.0.0", "1.1.0", "1.2.0", "1.3.0"] import re from picard import log from picard.metadata import register_track_metadata_processor standardise_performers_split = re.compile(r", | and ").split def standardise_performers(album, metadata, *args): for key, values in metadata.rawitems(): if not key.startswith('performer:') \ and not key.startswith('~performersort:'): continue mainkey, subkey = key.split(':', 1) if not subkey: continue instruments = standardise_performers_split(subkey) if len(instruments) == 1: continue log.debug("%s: Splitting Performer [%s] into separate performers", PLUGIN_NAME, subkey, ) for instrument in instruments: newkey = '%s:%s' % (mainkey, instrument) for value in values: metadata.add_unique(newkey, value) del metadata[key] try: from picard.plugin import PluginPriority register_track_metadata_processor(standardise_performers, priority=PluginPriority.HIGH) except ImportError: log.warning( "Running %r plugin on this Picard version may not work as you expect. " "Any other plugins that run before it will get the old performers " "rather than the standardized performers.", PLUGIN_NAME ) register_track_metadata_processor(standardise_performers) picard-release-1.3.2/contrib/plugins/titlecase.py000066400000000000000000000042331245305550700220550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2007 Javier Kohen # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation PLUGIN_NAME = "Title Case" PLUGIN_AUTHOR = u"Javier Kohen" PLUGIN_DESCRIPTION = "Capitalize First Character In Every Word Of A Title" PLUGIN_VERSION = "0.1" PLUGIN_API_VERSIONS = ["0.9", "0.10", "0.11", "0.15"] import unicodedata def iswbound(char): """Returns whether the given character is a word boundary.""" category = unicodedata.category(char) # If it's a space separator or punctuation return 'Zs' == category or 'Sk' == category or 'P' == category[0] def utitle(string): """Title-case a string using a less destructive method than str.title.""" new_string = string[0].capitalize() cap = False for i in xrange(1, len(string)): s = string[i] # Special case apostrophe in the middle of a word. if s in u"’'" and string[i - 1].isalpha(): cap = False elif iswbound(s): cap = True elif cap and s.isalpha(): cap = False s = s.capitalize() else: cap = False new_string += s return new_string def title(string, locale="utf-8"): """Title-case a string using a less destructive method than str.title.""" if not string: return u"" # if the string is all uppercase, lowercase it - Erich/Javier # Lots of Japanese songs use entirely upper-case English titles, # so I don't like this change... - JoeW #if string == string.upper(): string = string.lower() if not isinstance(string, unicode): string = string.decode(locale) return utitle(string) from picard.metadata import ( register_track_metadata_processor, register_album_metadata_processor, ) def title_case(tagger, metadata, release, track=None): for name, value in metadata.rawitems(): if name in ["title", "album", "artist"]: metadata[name] = [title(x) for x in value] register_track_metadata_processor(title_case) register_album_metadata_processor(title_case) picard-release-1.3.2/contrib/plugins/tracks2clipboard.py000066400000000000000000000031521245305550700233300ustar00rootroot00000000000000# -*- coding: utf-8 -*- PLUGIN_NAME = u"Copy Cluster to Clipboard" PLUGIN_AUTHOR = u"Michael Elsdörfer" PLUGIN_DESCRIPTION = "Exports a cluster's tracks to the clipboard, so it can be copied into the tracklist field on MusicBrainz" PLUGIN_VERSION = "0.1" PLUGIN_API_VERSIONS = ["0.9.0", "0.10", "0.15"] from PyQt4 import QtCore, QtGui from picard.cluster import Cluster from picard.util import format_time from picard.ui.itemviews import BaseAction, register_cluster_action class CopyClusterToClipboard(BaseAction): NAME = "Copy Cluster to Clipboard..." def callback(self, objs): if len(objs) != 1 or not isinstance(objs[0], Cluster): return cluster = objs[0] artists = set() for i, file in enumerate(cluster.files): artists.add(file.metadata["artist"]) tracks = [] for i, file in enumerate(cluster.files): try: i = int(file.metadata["tracknumber"]) except: i += 1 if len(artists) > 1: tracks.append((i, "%s. %s - %s (%s)" % ( i, file.metadata["title"], file.metadata["artist"], format_time(file.metadata.length)))) else: tracks.append((i, "%s. %s (%s)" % ( i, file.metadata["title"], format_time(file.metadata.length)))) clipboard = QtGui.QApplication.clipboard() clipboard.setText("\n".join(map(lambda x: x[1], sorted(tracks)))) register_cluster_action(CopyClusterToClipboard()) picard-release-1.3.2/contrib/plugins/viewvariables/000077500000000000000000000000001245305550700223675ustar00rootroot00000000000000picard-release-1.3.2/contrib/plugins/viewvariables/__init__.py000066400000000000000000000100641245305550700245010ustar00rootroot00000000000000# -*- coding: utf-8 -*- PLUGIN_NAME = u'View script variables' PLUGIN_AUTHOR = u'Sophist' PLUGIN_DESCRIPTION = u'''Display a dialog box listing the metadata variables for the track / file.''' PLUGIN_VERSION = '0.5' PLUGIN_API_VERSIONS = ['1.0'] from PyQt4 import QtGui, QtCore try: from picard.util.tags import PRESERVED_TAGS except ImportError: from picard.file import File PRESERVED_TAGS = File._default_preserved_tags from picard.file import File from picard.track import Track from picard.ui.itemviews import BaseAction, register_file_action, register_track_action from picard.plugins.viewvariables.ui_variables_dialog import Ui_VariablesDialog class ViewVariables(BaseAction): NAME = 'View script variables' def callback(self, objs): obj = objs[0] files = self.tagger.get_files_from_objects(objs) if files: obj = files[0] dialog = ViewVariablesDialog(obj) dialog.exec_() class ViewVariablesDialog(QtGui.QDialog): def __init__(self, obj, parent=None): QtGui.QDialog.__init__(self, parent) self.ui = Ui_VariablesDialog() self.ui.setupUi(self) self.ui.buttonBox.accepted.connect(self.accept) self.ui.buttonBox.rejected.connect(self.reject) metadata = obj.metadata if isinstance(obj,File): self.setWindowTitle(_("File: %s") % obj.base_filename) elif isinstance(obj,Track): tn = metadata['tracknumber'] if len(tn) == 1: tn = u"0" + tn self.setWindowTitle(_("Track: %s %s ") % (tn, metadata['title'])) else: self.setWindowTitle(_("Variables")) self._display_metadata(metadata) def _display_metadata(self, metadata): keys = metadata.keys() keys.sort(key=lambda key: '0' + key if key in PRESERVED_TAGS and key.startswith('~') else '1' + key if key.startswith('~') else '2' + key ) media = hidden = album = False table = self.ui.metadata_table key_example, value_example = self.get_table_items(table, 0) self.key_flags = key_example.flags() self.value_flags = value_example.flags() table.setRowCount(len(keys)+3) i = 0 for key in keys: if key in PRESERVED_TAGS and key.startswith('~') : if not media: self.add_separator_row(table, i, _("File variables")) i += 1 media = True elif key.startswith('~'): if not hidden: self.add_separator_row(table, i, _("Hidden variables")) i += 1 hidden = True else: if not album: self.add_separator_row(table, i, _("Tag variables")) i += 1 album = True key_item, value_item = self.get_table_items(table, i) i += 1 key_item.setText(u"_" + key[1:] if key.startswith('~') else key) if key in metadata: value = dict.get(metadata, key) if len(value) == 1 and value[0] != '': value = value[0] else: value = repr(value) value_item.setText(value) def add_separator_row(self, table, i, title): key_item, value_item = self.get_table_items(table, i) font = key_item.font() font.setBold(True) key_item.setFont(font) key_item.setText(title) def get_table_items(self, table, i): key_item = table.item(i, 0) value_item = table.item(i, 1) if not key_item: key_item = QtGui.QTableWidgetItem() key_item.setFlags(self.key_flags) table.setItem(i, 0, key_item) if not value_item: value_item = QtGui.QTableWidgetItem() value_item.setFlags(self.value_flags) table.setItem(i, 1, value_item) return key_item, value_item vv = ViewVariables() register_file_action(vv) register_track_action(vv) picard-release-1.3.2/contrib/plugins/viewvariables/ui_variables_dialog.py000066400000000000000000000065451245305550700267370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui\variables_dialog.ui' # # Created: Wed Mar 26 06:58:04 2014 # by: PyQt4 UI code generator 4.10.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Ui_VariablesDialog(object): def setupUi(self, VariablesDialog): VariablesDialog.setObjectName(_fromUtf8("VariablesDialog")) VariablesDialog.resize(600, 450) self.verticalLayout = QtGui.QVBoxLayout(VariablesDialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.metadata_table = QtGui.QTableWidget(VariablesDialog) self.metadata_table.setAutoFillBackground(False) self.metadata_table.setSelectionMode(QtGui.QAbstractItemView.ContiguousSelection) self.metadata_table.setRowCount(1) self.metadata_table.setColumnCount(2) self.metadata_table.setObjectName(_fromUtf8("metadata_table")) item = QtGui.QTableWidgetItem() font = QtGui.QFont() font.setBold(True) font.setWeight(75) item.setFont(font) self.metadata_table.setHorizontalHeaderItem(0, item) item = QtGui.QTableWidgetItem() font = QtGui.QFont() font.setBold(True) font.setWeight(75) item.setFont(font) self.metadata_table.setHorizontalHeaderItem(1, item) item = QtGui.QTableWidgetItem() item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled) self.metadata_table.setItem(0, 0, item) item = QtGui.QTableWidgetItem() item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled) self.metadata_table.setItem(0, 1, item) self.metadata_table.horizontalHeader().setDefaultSectionSize(150) self.metadata_table.horizontalHeader().setSortIndicatorShown(False) self.metadata_table.horizontalHeader().setStretchLastSection(True) self.metadata_table.verticalHeader().setVisible(False) self.metadata_table.verticalHeader().setDefaultSectionSize(20) self.metadata_table.verticalHeader().setMinimumSectionSize(20) self.verticalLayout.addWidget(self.metadata_table) self.buttonBox = QtGui.QDialogButtonBox(VariablesDialog) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(VariablesDialog) QtCore.QMetaObject.connectSlotsByName(VariablesDialog) def retranslateUi(self, VariablesDialog): item = self.metadata_table.horizontalHeaderItem(0) item.setText(_("Variable")) item = self.metadata_table.horizontalHeaderItem(1) item.setText(_("Value")) __sortingEnabled = self.metadata_table.isSortingEnabled() self.metadata_table.setSortingEnabled(False) self.metadata_table.setSortingEnabled(__sortingEnabled) picard-release-1.3.2/contrib/plugins/viewvariables/variables_dialog.ui000066400000000000000000000047451245305550700262270ustar00rootroot00000000000000 VariablesDialog 0 0 600 450 false QAbstractItemView::ContiguousSelection 1 2 150 false true false 20 20 Variable 75 true Value 75 true ItemIsSelectable|ItemIsEnabled ItemIsSelectable|ItemIsEnabled QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox picard-release-1.3.2/installer/000077500000000000000000000000001245305550700164005ustar00rootroot00000000000000picard-release-1.3.2/installer/images/000077500000000000000000000000001245305550700176455ustar00rootroot00000000000000picard-release-1.3.2/installer/images/hx.bmp000066400000000000000000000623321245305550700207720ustar00rootroot00000000000000BMd6(9dȿþ¼Ŀþxpqj_a^RSUHJN@@J9;F67F34E23D24NGHðpmmBJU3Ml6Ga7Y57@&()  &3 H+-[58b:=a:=`:<_9<]9;[8:Y79W69U58T57;-/vxT57T57W68Y79[8:]9;_:e<>fb;=a:=_9<]8;[8:X79V68:*+gLNV68Y79[8:^9;`:fAl>Bc=BO69èèèèC68*L,.c9=h=@fb;=`:<^9;[8:Y79:')ȾY9;[8:]9;`:Am?BxrV]èèèèèèèzgi7 "_79j>Ai>Ag=@ea:=^9<\8:63D.XE]wZ_ivopö\8;_9Bn?CqADyW`xLRuBFvyé˺̻ɳĪèèèètbd.^59n?Bm?Bk>Ah=@fa:=^9<:B^'''(+{5ikr~Ƹa:=mRX}qkAFy`j}OUyDHzDHοɳèB-.a7:q@Dp@Dn?Cl>Bi=@fa:==C]'''''&)匎ɽiFJyhsk>AtOU}_iuBFwCGyDH{DITZINJNǮqZ]e8Bi=@f?D^*''%!~ wqQlj>Am?Bp@CwCGzDH|EI~FJFK垰ʢw_bi:>xCGvCGtBEqADn?Ck>Bh=@eAg=@CE^2,%qjr~puRIKD@ApijqAEvBFxCG號ڛKP`hܢё[bpt|cfp>AFJ|EIyDHvCFsAEp@Dm?Bi=AEF^6=䭜èèèèèèD??mfhʽvCFzDH~FJdoIMJNKPyMRMSPV̔RXNTwɳɲ~dgs?CGL~FJ{EIxCGuBFrADn?Ck>AHG^:èèèèèèèèLEGyCH~FJGKININJOKQLRepƔOTOUOUљdoV]OUdoNSehw@EHMGK~EJzDHwCGsAEp@Dl?BIG]≯Īèèè~gbcIMGLIMJOϡʕW_clSYQWQWǟ{QWsNTۀgjyBFINHLFK|EIxCGuBFqADm?BKG^@Ȳè§kbcNQINLQW]jvPVaknzSYSYgsV^V\itOUۃhj|CGJOHMGK~FJzDHvCFrAEn@CLH\DĪwlnPVKPalOTPUQWRX]fV]U[[dեW^U[}yrQWڄjm~DHJOINGLFJ{DIwCGsAEo@CMH]GL̻zprVZLQuʙPVQWSYTZU[U\V]Z`ĩW^W]}QWڅjmDIKPINHMFK|EIxCGtBEp@DNH\JFOξzqr[`NSuRXSY}ǩ}Y`en̪۩RXڇloDIKQJOHMGK}EIxCGtBFp@DOH\LHB@ν|rs_dOUZbˡTZU[mx{lx^gcmZbgr[bo{RX؉mpDJLQJOIMGK}EJyDHuBFp@DPI[NKD=6zͽ~tvdjQWRXo}W]X_Y`Za\c\dp|ն\c[cZbY`ܪ_fRXڋnqEILQJOIMGL}EJyDHuBFp@DQH[QMF?8ͼtwjoRXTZakͭakZa[bbk׻^e^fzֺ]e\d[cvW^RXtwDILQJOIMGL}EIyDHtBFp@DRH[ROHAAͼuxotSYU[W]vipt{͈Е̪ϋ̇ŗܿouZa{DILQJOIMGK}EIxCGtBEo@CRHZSPIBO̻xysyU\pv€Ɋ͍ЏӒҤҺؚכоͼΘʕEILQJOHMGK|EIwCGsAEn@CRHYTQJCh˺xzĖƶ˖Бԓוڗնܝֳњ͗ɓ퟈mqfjOTHMFK{DIvCGrAEm?CRHYURKD˹z{êʣжԲݛ׻۬ݢӡЗ̕Ȓ젊pt{hlRUzDHuBFq@Dl?BUIXTRKFʹ{{ÈˎΐғѫԮܛߝݱᠦݣشҰҘΖʓƏ졋nq|z}vysvcgxGJo@Ck>AXJW^RKMʹz|ÒĊ˚ϒӕחښݝߟࡦߠнҗϖ̓ȐÌ}량^asvuyswptmphkzORi=AXJWpUKZʸ|ùͱκ٪ݞѻӗЕ͒ɐō{馑T=?rRU`cillojmficf{WYYMZqiKvȷ~{~ȡњ֙לآԠӖД͒ʏԊx}ÅqtW?AgJLzX[_bbeac]_e[gooVlj~ӫɾҫԖҔϒ̐Ɏƌ‰uyЕYCF]CEnORwVXyY[cXfkkUȉ~×Əǖū̡ҙҖҔГ͑ˏȌŊˆrwצ^JLS;=bFHYP]ghXNJ[ZZ6660--F8:jmʒʑŎ|̑Β͐ˏɍƋĉ}ruڸhUV?9AR]dNjգilNEF?56fiɏÊuzȍȍƋŊÈ~|y~uxĴryCukƏ릂uypsNEEVABċosĉÈ}z~x|vyrvĕƑgefuz{aRTI9;x|qu}{y~w{sxquoskonrʫŔﯬPPP@:;rutx|hUWD67hlz~}|z~w|uzswqtmqkohleibe`bѸƗlcmB==jNPnr~OCDlMPqvinzz~x|vzswqunrlpjngkdgae^b\_WZyTVprɷŚ{yx}QKLnNQx|ko}qv;77ei_cuzvzswqubeZNROLOSRXtY^cf`d]`Z]W[}UWxRTrMPkHKwZ[ĝltsv945zVYmqkpy~pUXH67_ckoquoscfLKLgmryPPQhV^\`Y\VY|SVxPSsNPmILhGIbCD[?A`GHğgu{z~lo<78[^ehmqns1..^a_cmqko[KN^_a胂NJNW[UX{RUvORrLOmIKhFHcBE^?A[=?Y;=V8:V9;v~Ĥhww{w{vzeg?;;\_`cosQABX=?|UXglfjSHJPPPRPQomnIFH}SVyPSuNPpJMlHKgEGaAC]?AZ<>X:O?lè~quswrvquxZ]6..]acfY\0))xQS`dbg`KMVVV"!!ZWWPCDwOQsLOoILjFIfCFa@B\=?Y;>bBDUX^bZ^F=>###0./(((F@AmJLqJMmGJhEGdAD`?AZ;>X:Pq~Ƚп±mqjnjnhlgk_c733pLNY[^IJ>-.rLOY[W[G02,!"(((iFIoIKkEHfBEa@B]=?Y:P̸Ͽ¸^bfiehcgaeeNP4()tNPvPS611gDG~TW}SU3*+,!!!dAChDGdBC`>A[;=W8:U79T57T57T57T57T57T57T57T57AAUе̾󶜝uxqtmohlF@@M8:vTWC>?L59jHOmJP(&&"%$$c?B`=?\;=Y9;U79T57T57T57T57T57T57T57T57T57N9@Nm;::ROP:<= "#!&+(7FIIHH~HzFwFtEpDnCiBeAa?_;e,}_]]POODCCUST---444][[Ӿ蒽gD97421.+(''+ONNrooPNO545狸[7+(''''G}}FEFZXY烵S4)Apicard-release-1.3.2/installer/images/hx.png000066400000000000000000000145631245305550700210030ustar00rootroot00000000000000PNG  IHDR9KsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxyuޞ}{ ;@D QT(J$P0JREUǎTcE'U2cW*r)Rl)Q%cJ\P&BH$}=m Hɲ%C|U]==vowQ"`4Aвt;OÒ}eߐx^\p"˷[֎%ys/o,{6, "ws_[.~}\3Z%٨+'u "8Tu}X9xY"U7W>C wWZ=/\*|cDQJF'/uCmh6KLN7Zw.;Qc'* {W]577qcFQM6F2{9]϶j"n`GryxjwdmWzwwU*jaG}p{w>/͜4S|x_qK vUz~R<ޡA{XP+N޻N5B^| kSD9GB '-Z?“t_Вpv_ƞ(2^\<8kNyR2nf\=6>xLM $mUûq/!sMzxD"Zޔ \.jŴL&WR᥈?}\IㅉLϲi㞌њRL_U&֋!ЦD*Ź J+҉4[Xq"ߖ`5ҷOMCrz)z|l<#%=480mۻ\*ݛ_.Im`Սs$$IIs+\a\ZcgӤ9Dd"!HR$ DIIx1&ozާZY53;m~(uˎk֤&&}~)h)by7yD"ٙH$!d3e;h(W׻LT"1|LF1s%ׁ1Mri.. + JDHMOO^{%չ`7_6[cEQW"?=^hTX.L7wg2AkH=~/dreIn|LL`g]Xj5SU[~ZkhR8rS褔"S?TʺX,#' hhځMoj`9Ȗ!^9s&kd6 (D`jO>k>6|ǟg3 EpD :u ƺ{‘#[ SՌNZkV(+s(QJ-//%_~y`oW}&N(oRC T*h "0We+fddm ɩ\>R$)&MW!oᖓGΧY+_:96! #9 JQj B\ A~dpP"oR ~ h)bYg ?ٰ}tw !Ӗ/pdh|gS{j]|onzlymmDLҌXĄ%`l7{n5zzo&a(R?奆"V`|#lԲCu;(fRaԏv'l(p>-:r0rr_&Ж@: BJŤry{7MwdBt8_jh)beYd18|twnڝ`ffAWbo'mzc=k:WQƹES9U6SJB"[?m]fvIJ:gOO-x>ts};Fέ?|j%L}?=+>OG{T=HT}7tu HF+5+R ej;IN/0;]v8S,wB3W"%c/Ύȇ땉v]3;3J:%m煟/Ο垻 ,LLZ)6xPN{e*PxE2z v\KwO;?M/&J{0 3n-_{vww﯈K7x{󗭵3/c7̎I{k8FZDO 4 b+{w\S{pײi9b3AG)†)~F-3uՕU+WNщŽ9w W>33t<ʋm[vE!Ź :;CkXS1ځH=,}wt|RAm뮽o@+ͷUmn/x”jXL)׈>hnP˶J/=g{40ľs6풉8(,+K>$O|;_|ߞ['Wgh/+R F4e'gSZO9,(*&MXA@X6&8OKc\\Cl\NwF1\L,gTx/wWp ZX|m S&xu'ԝ=;zpdR3`|ZsTZŢ]5IG+pHlE22)0>6˷}~Y|'Ã8D2@⹑Ţjzc?K傖 :kt|jlDfP;O8%A`+6 }])Ë 5LZ Q>^|rkIc6Dy * لVճ/m6Z/Bq:jbi'Yj H2e<:=|q:F:jP ^ o>$]źd➢k#ZF<:D#9\*uDb ZXt')J OP0O%5T+ "3lZatkGtT&N1:@BP7Xv;ChEx+23=C_{uv7HR*0&qyT0Se/x/ x/ނCyɳic m0F L܋i-hMC&'HhP17WY؟t<{VΝ^E/A .Qx9komӖUu!)DMpL&^z\PJ!"I+MXgdd''QLVJVڵ2g3'TަmJ/7T*BmLUظ(5m0ڑKجgj.a݊7yG0Y҃S1>6M(E4̂i(}9w,M*Llf˜>Y3h,hFXWgOO$9=fGl]gyhlhm(ÇϓN785 UMx6mJ/boZu5b sys/8~[gʳ?:Ź'Y=|$Ǔ-_(3;[YXHwHifGxm~d]@f)EKH=2T NkyW| 謖XE&Dh*>t3|FbӚDCCɳx[9D"#\>!;:(Y+''n)rx5"qɝ{?Gj{jO GxQZmq04T*vI[zӫ&/,=?ʲI-H,{K6)Zܴ=bڐS<ɤBn}w#'@#oA9vlvBo!6raw;䲰\0W-#1ދFX n KYEX7dl*.1VJ-(Bh Ú!!?{Hb?n+z:=N 4&=">^W2hAͧxFbxGƧNt%T6B0U(\W e5ރו\ O /(e&Wض)~,lX%tu"d=xZ.P%(`%%vw,Q? `9x2=LcT77'H#$o=ׯZ4C/ M\~Xy ZXj8 iҤSՃ V8#FYj6kЛ+NW$ՒLw Jo$0nE4*s3u2GKZ- :.| g>Nd/2JC#FΆM[1]T\bP3/D%Ք*#f1~?\棕EPb>Ig|XZ5BDTĎX-Fq62ڀҞǞϖ.=ӖȆ(4H['Ce2:EE54)P4!SQ)#I6,brAX_Vꁟ8#j)bՔǁWh u|k8~6B0h=UP$h9lКR2}W;V2>W%dRŪǧ# (&fbD -35T+!9|v5"XY"i@VБִ8/LԴuCyQ"HjHKR)#Μ/b4wJ|҆}i7Fj)WLW"VzQEoǿ$ 8P1eL)6c3ZM!|H$ERڶ:qv?Fvf0* %SlDZU?-kx;'7 : à՛"Rby񜛳|)՘QtGAPbxr?ڲ-.e }pj(2m5hfIԨ5&qe7Wc]$d7,^#NjOOKӤST6Uu#M20wر$_$VGƋ^+_N =Daȹgh4vY"Di+\gRZW׮yj>߆RJ#hOfld_¿;6>#fVk4JEU7>\ u>B)!1H0Ç}CgϴJt8=yT;rC/T@MMD)\]lZy1 N%jSTVr,>7{@֤Йtwu ,h9bAw6mTժQa&Gqdrr<ѹLgYo@&P;6\.Jb*"5a#4J%57WJKL^O0Q#"ox}sxɷ>vxo_}'Eh)>Un4A^Khu*"H*{-"YgwAY9c#xu8猳xuV{ԪV%Cö :~[Zd|&XBRaajpͪv 4EXN+1Zkm8HRXKp+\Y2IENDB`picard-release-1.3.2/installer/images/installer-header.svg000066400000000000000000002720561245305550700236250ustar00rootroot00000000000000 image/svg+xml picard-release-1.3.2/installer/images/installer-wizard.svg000066400000000000000000001034001245305550700236570ustar00rootroot00000000000000 image/svg+xml picard-release-1.3.2/installer/images/tango-install.ico000066400000000000000000001301761245305550700231250ustar00rootroot0000000000000000v h X.00 %u  n h(0`eefijimnnmmqpppwwwssxvvzzzz{~}}}})')(##$$637796 LHZZ\\AANQ`[lcaaefjlssttvvyy{sww{{||{~{ŶøŻŽȻʾͿ¿ÿĿľ¹ſſ¹Ľ300.0172 9|ǯ}I0 2 Kÿƽm2  1: ))))('?3úuqK.㦦@ %{n`vJ6宦!ؼkgov6䮦A9ߧ~tjiljtw6宮"ԕ_fHFGhzy9寮B/ĿeES~|T岮#IʛQ-zO`3岯Dpٻ< QW0岲#̬b+[aV3彲Dɧb\* VX3彽$pƧ^[5\b1ŽRIDz]P>4&3Ž$/ǽxNLP=MTŽůcѽ]NPYZq;Ů$9䲦||}sos3Ųdϣ||:Ů$ %Ų|||Iǽp3}6ǯ33Ǧm7}6I6 Dz33:pǮU6:ǀp;769Kϲ6ǍϽ6ǣѽ7ϣ7 U13TK,1J; 0;9::::::::::::::::::::::7tYtYtYtYtYtYtYtY?tYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtY?tYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtY( @```fffhhhilkmonorqpppvvv}~~ NNaa~~~~wwxx~~ddº¾ǿûޏƽȽȾp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQq"#gxe9#xth`\(UUTthZW?@9]]]] e_XV6D)3NFv|yyyif fyfJ'Drruv~~]:yyyy i[B://4o"z{yyf ]{E:B[]i{&{{{{ iiB[]fi{{{iEyii{{{{"![y##y{**{y{%%"#!!!!!!!!!!!!!!! ??( SWUKM{X[sehgfiljmmlonnqpprrqtsruuuuu~>?egQq/Pp",6@J[1qQq/Pp  =1[Qyq/"P0p=LYgx1Qq&/@PZpt1Qq/&PAp[tϩ1Qq/P"p0>M[iy1Qqұ/Pp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQq673,0'%3//0'?41&3  3***910$/  4++* 50.$* )4+,+#1+'%'+.04,-, 9+%)4---"4$%(*.3..- 9-**+/3...'!29943./. 6666, 3///)6666666637/0/ 6666666636433077777777330-+++++++++PNG  IHDR\rfX_IDATx}ř73v3 @ dAr 8w}g}}l}pgLpl09#B@V0[]]]ݓ'+P[_#FE#F!&11ĈQň F*FL1bT1b@UbĨb#F#&11ĈQň F*FL1bT1b@UbĨb#F#&11ĈQň F*FL1bT1b@UbĨb#F#&1UAЇgr5[K}=1lOR_L9ayl[ƗZbj`?`R_KF#r%&I((;-$0J 42R_K=lYZ$0 $z-h&US,S`Mh]~- K}¨zLDzգlYScc}/3{$F) à7^v%J1oer,OMM̊F6E;w;glH5@SCbIZZp2Ǩx{Źuߠ;v|Q{+&* 1NG|@WSSC -1cz*t}F:MVDwj"~c޼r/J츱dԷ)*r$M6ɔg_`$jھ}dMBF-W,\&֭[iu=V\Dɖ[* }xpMJOa@׿HsBQ=iڴitQGi~O>$S{J} 1*'N;NK怯&CF AQ'O_.spp ޽{K} 1* N8^x MO/=䋲"&_e+Zt'j_ݻwbT(&MH?| |#RG(`"u<͒%K^C=Ĉ@{|I瞣͛7}FrEYUUC. {/gy&hTW9OD[ҦM~ #K}\d y\{4ejnnvi`nWPI-kEgьb>oDz,`$ F~x'>A'W(^ZQGR&t~_ѫɅEr CMy[SSp tsO5j?9Hm 6ˑ|(6=\:Ӹ*X9An@Qꮻ\PiáKM$0;QP$ [oqM@ =WTX[l`quG9,2zQYRǼ0=}BO~h#luod@_ 0:ޭHѧTP]K}٢, ছnTb1Nrh#~Ptp7 ?2&|G~۵N$1FTPP?ALTsիW}tgFb:@ A o:,] "DE!#,&@L!,(E8&AL(uݪU<3̝;ϟcQdr!$E0aH3F@DȖV A$Ŝ@LX@ &?y:OctAG; Ev 8nܸVR!&/ `t"& 4xHb ",aF %ƏQ 3(i.0:@D%=[εmѢEt9Db1D0TowqtWFb1D|\"1Tb޽{ˮ =Xꪫ"|b1J"B L!&hwwb 6y5bQ@㏏@wY0><gڏHF|0I@ڹ׊.AFL! L(@GGy$]wuQ?rJzs ɢgohԩFW3,Lɭ[rB8\x 'D@(JŋiҥQ?Od-0a!6/Ub˖-"[%43<@ȅQ߲ADR ogٳg=4Wϱ"B}``6l@V^a̟?y晘 A0`XQ4qlٲXq;~1 >mr6|F);qpbg,BH@6AĹ۵koY&c[~f@.M7ݤ(0Q􂕌w}~> x+.Dz,:蝱Bf"]LH\B+~@ v1䂨TeV@g_ <^>{IA=X*L)@[AQ/_ , B+ lΝ=?яZJ.Ũ!R;*_ #20%x)mqLgr>&!B\۶m8̖җTiK"**b(v\z1a s>Mx3d@}'m-jF[KVCJ( ^iG?@]FrL=C FB @vO+r}PSUF/f#0O<1s@x^=I'DMMM6`@͗X|5DBp_lMGC;޼y]@8K9~NK?@<4J$̙SvQ>|Bhr|l &ٞlgmڀ| << ]l @7P(!>}zDO+kCTS0 +0 a 3ɠۯ~;imm9^?hW$S yϗ2xM}q jr&`(PѦ\O{.@?7ЈI97Tv5~$"Мfw񩘄̫3 Ƶp]z< V~p>ap AyAeRH:DvPx)(LLQ<Q!VaEw74N(~V$Zwᑀ)I^<B(~ 22=UcQ[@ $ ҺGvi*;^~g;*!?x$5 g{R{lvs~VMzmZ{?DY+C& 4 Ze$K=@` R5wo5So}q4[)g ?2+ # U} U$H SP$0h F (CPuQ<1XڟN}ހ@_Mu.}2K A$ Gd _J*0vEц*Aq=ji$]7]pAԏ Jn!e!~*W{sQɧp5`y:p*91pOݕ5Ǣ@~[>y j 0 j99vT1QLZ`<` :(р`E;ƲᓟT={6/!IFo[ψr~$``6t 0r%yI@'0"ljJ8+H*e?v?;VȳH"sВ~k&UCsڲ:H~U~\wg^HÏЩFF8k ?ǝOJpTgs{ I70Iy&y^3~?񏼂daQM0;:h&;/ lbڷpkzE(KW5~uI{ٻ` %^0U|oƳ`*I|n"85'dױ' !}LbfMGri!h3rŨ#bE0y3=Я! _@L-X?!C rwɁKB)2b{U4װ۝q~)7쥛yvm*(D8AT3|G?&sف '"?e0U@)Lj/}3:ڳi(&yeDNI5Z3y"A0T[ +H'ylr%\e\ 絍i㪼.'O$^G0ah}dg}Q"Nb$Pp8(9=ai蠯~5yQ=?K}vaC@A bU$lGrni9mKN>6Cb\%gÚ}G/5SILm Z*bPGjRvadlEf!Izm $҃1#kBUhaG ̚:Z|Z?bՓm=#d ئ]D!bKRSSFvi  "0a'@V:=b ~,lAA:owT`{/Cuook 'ـ <l'=p '[0mkO[8qcwi/! \2^|Ez͘Sp<#B֨"bG0Æ \ۦӔwsΡcqmxwd@sEF# i{{ L.AW`۶wkf8;NC%У)SVԋQrO}=س{HDb 6]ohD!~;A|fcq fR!m ޾Pg{L%KW%d7:ب ,V֜5#Աc/ňڔ"+ aZ5ipebg}b[X[hv.P(>=7L*n};a(& x)T( ڀۉhX\4.&(mUhH0d;ak>9OGm wVOppNёGr$"|fƍ|@]}' g 3FijbfV3j%b&3fPsi`DFuV23<A`x0L!t=LtY;BbMM.3?s&zim7fLi+A+Cr;ʢ3kۑfL|Lx5 &.aȝ(O<g Ps%x㍞NMdA]{qsa@/Ф?׬1z-W]Mcg0]"Ņ  54sL3:vtvnaZ@v&5!G#nJ;[>$ @'@Ǡ FA #jF ;`J'uTfkN1 iϱǺ͚5OF`Cg@Ӗ{WBDP95ڵos{9$>gh>-g?ƛi_T (fHلvjznoS{?~ݓ^!w S r@z5Ji+>%r #db*]nگV 25clWCiM9Urj0::pUcP+6MkhOJB. LN~zM`L?;fΜa[ta@Pbի0I%`@QHڅ<:Z;u]&TQE")`/̟?ud78ގl!%W/5J#uk0 4G?:e0iΠ!ì2Yӆuws '2р&s,2iX0}aG{0gwY@4f#?)ʸ袋x G|A6V5hoogDA?CSU㟤}ߓ'M=9"S D ԓV* !BhL 9uBM 9>5)_g|Ѩ'(Mk}.8W&a*>ێ^|][_% w?d+TK}tߦZDai֓Τ~9]A>m:,;w7IYBP*_W[g&3@w.yTܖuPL.c հ^;tWWu ۲%?w ;y_>&9=>pݺDamo(%o :?p~]YŸ-V5ߤvvxf:[w>{Uo "4@j.?Loz?g,&a@)"~gAS#@E|uLU=8A۶oI'{3 xz`C\8 `wiE@9D&eb YPgK1~bN99>1jگ*~]-WDŽi惿W_]Xvp8ﳩ@" YC&s N@owxn!wO[?{ 8HD?? ZV0{zQC4wRӺu.v-<%L74Rmça i 23|( |$ od-AEC8-_^z3yFlʖtc %bhoIjJwɓi-xH#p5y҆[#RebprJ/ }#jt?͛#y'2vw@ M Ҭ6m*sޫϘ9 hllvn$ vz0hÇ[iĢwBm!= zzx)45z}( +'UPl_oP~g<ۯz>BM\NWo呃;ā"l؆Z4#47ǭI ̇矏@=8?;hPcƴvmVH9}9ӈӓ$Bw69۲p WVoό򞈢  w<1v-;߅# I[npڵ(q4Mzyr。?iF@>YɡsrBؿ֠$dA^_mBH ?@. 70*SqPN x _ C)<߾n^ɏJ_U> ̪ 3V]ܳg/ lٲ7t7^Lط`u^z1:Ռew;h`D8$D Ĥ'w;M̀,H@4yMv'#}>C(f "~H?YiltmH@00mi u/w7OT;v=Kd`i cX;=rwN0PʂzfB ތ.%h"`B %R!І5tYvrmHp!rL@¾Z tIB YE&`ggzf>!(4-F6~c'>Am(>oTCC4O?{bffgL#4F:bb~Pky$ꌨf!vX!0H +C5ʩx/=Q'[Gi@WHh$ر2(;gDQ%̀mh|)$L7!Z;\c6~>PRblgZޣ2f>w\ƃ6Cdj?ozI[)y@s0#NXDANKaD@|?OWn] Q׿"Q L"[6]}h.}3I)2 97' mvl;/=cd&LG--]מݴ{/m߶{Gyv<0-*= HL#&{xߓշiBS0$ 9@P ln)wa((j2KpaE4^}6ߘwT gݤno7YG ~.y\@ =|Oo/?R5|1V[{0NF;i##t@R0xoTΞM;8Nr\pY fAS`1'OTx[pH`,TE #_`LsK~uV0?U_'hd>w;&ҥKy[ WHGW `X]C 0-L0g!^F􆘫{mB}ݴq| b&5@C>cdC2L3b; tINZ֭zz9Ьg @7$k{ j 7o [@G7#+ i_DbZa?[C $ zc=֥gO xm|8(E_Wf o9Ֆm4Ą>}Z0;ރCT̆Z[hzRA.i8qCv`&sma Қrb|K$f*Uk Ii.Sq*cN91lMRS{シaPP QA:zi}( A~ÁnߛO^)ɧԆ=/FFBlŋsb M԰S2RFҶ*!%ciwu9xy普mp~ӟ*;g7g0b #9hXsî dO0Daꯚ/y%z!3r2ػ@7tC :³i`d9ג!R~^T4{{wG9YfgHf h]5L[j=Àlz+[&2d傊"(I`.CJAFxxmM90XFd ^v :CC۰60sipD< >{ VƜ5756&@ ^tDCu uWc 4651mYd 3# ]X$ v_ϟ 2_Th*[at3MarFpF#V]zO?(?t1ǡ'2凊NoOkSEA,[R  S G]F;So_-xS\6,?94 פs(LY-АL{2q49z@PZ'uwd2|^\M+ܖ;&b^~:BLz=wk۬Y:sEJ߰rR5ܙ&zw'Af_ZD‘+mC ^O> HZv?!ff^̙sc1(-BL{0'jgܿw~XnNe$F {zՄ%hmtJ v5)}˗SǭMٮE1ЎsqmC'>[B#4S1|pa{{P Hi m K HG7>/!g1x/mk'ϚhسE?[!֖1T[WMIwK/'SrL uv޿PQDS>@*q@^EK/Qmy {.-^s~~LlCgȀ f mx!(X# ٱDN9n@z.=4.7k:Pp7 ܐu0zM a$r!*Pj`T׶cup "p >9&g~߰z|YDDom['tw-#UK#p b1`oXfa5H5g&~d'EC!'I6'kh~Nc0T lٲuU@Q(iGw<,[nP;$#i;Rxx.2擕[S(Joklfoܸ e-B]!!Ʉӫ{GeiDvz3x++H@J4F̦Z*O*t&I虨 l=sMbB4=Ĺe u=& j*N/'0y**;g#s# r{9!kp S@8 @ BUZΓ ldc;IJn!H\BO I#B3 MxgHxĄT @xHd>k|a@Նmmtr5| ࠤB GLxU}lT$)"|B Uq+'֭Lc?jHBÛǤcH1m& (BAr-9*-تB 1/E4aL'˖-~V{*&$uu]wG*|`Pl`)`l+^J 1:F%dpahdð7m|ץƓ=eZHaZlj0HcN$SԬ!cYc57'IZ>Ra'3=<\{߭l RFԧġ2P&#>Taa_ ۞ ,ztb1AaCRf  VWV jB[prC}_OiU|!mvy|&$0$X_ L5 x&(zO$E>p5|v (@)yٴc=ۑ$ʅv=&'O!`۩Jd@ g'5(Fs0F<T uڂ!`` {&2́lv%SP7Rۛ0/Qa;e.q># JUW_usPa UZMe]߻kc&TDhR[=jӚ nKQ*~Adp(XBȻL{~H 4c Wv?l}% PM2ӄNϐT}DA?H֫i[p^M X >A~}&z^!Og0$h$׹~`OMF/ݎ ڟ"ꪫ5vP*@nv` @ oYIRiCPLnb $=]{xR4AD@!X;LY,qZC&0í Z: $B @s=V,akL?E;Ta +zCC !R;E/} z_~|8N whB!hB#iå^=x0of8 ^IUVy*KYE~"]D2\> 7j *s2M 8C0aD<#Ч4 A&^vrbP]woohz_s8$O*ܾ ىgB7BPn.ĶmT[hdhӏ?B=)"^>p)T(@9~gzOw\) ݟL ,kY!6q>zV:@ mw+_sNlo~f[V?ƄG7$$K\s_Jrj " NfVG -[ 9@-ИLr<> _|o;Z`%ɽ^HÙM@38.AZ}};::ts9qt& ,53#KfC\NYg*0Zϔ=g_S@&b C%R:#U*)|_x_SM/s$/0xF 8k_ 伖dR.bsssVvPꦎYzP3ᦀZ5@^{־(|:vTĀ gʂ/{}ϓq{O-fz)S&axxs_WEv\4ZMA¯IQkOMfͿ!kh/55թJ/*z}v| \S>ckjhД)c1m O>=# jrI$!Y QOO9hZ|D: epz|wBs"(Hy! 13\kۏ믿)|;CM:K0[bۅ {Їu/)--->77S&Ã'N̎d@~mjqSHs r5a7P~U]Y&0/ڛ~٢>~{7YrL:K8S̙c9?|>hNg^1` ~:l;{zC%ihhxSA$ m9H|ORT(MC|~cn\w=ܸa8z~GBQefC38iӦ}M>)&QbDl֔RX&c۶HlYu+;5> 7]ڰoznАt3 p%1 IH5#"81zg;? wZ/,+WX o}nYz5c-~do3!?sb&PO'O=W4mC8# C0 t$ $ 2dlޟ iZMZig& Y_ #oPZ|0{`kSYf zY_A(h@5k%K]{H4*܈ OϤ[]vl/b0aI i8m(j 1q {%`_h :N _u'}H z׮]KVbgg'~!~ئM(D 8YsܹsRSS3'UUЃkll@uvL=A, K0A#tڂI@١@8QmaU{4|ZM>Gom 09w}A5\&z~y[o#C/]Xì;묳njkk=B{~8 DUf܀GAv' |DvBّ ZDvT6A𛙝G7(߃gJa;8P܂>BzĐIC1® $A{sf̘qkx:7JM Z+a1@tgp ݜb "|Ql7 k#7a#i'}XZD4K5P-[ofIzݺu/~;r\z)0H ~(RT"%1vئ:tY M\|lQCޒXLuB;.Ǐe} /< 8cvƣ2L* aيd^M@t(&g A@|3ٿR|ܾιG6h|MO1X'ޓO>B.}Pٗ_v@);[O(Ewl9m <O{)||{b, 2  ]C v2!=K3 fZPg6Zᇺ;̂oe8Tv(+@rXt=ZPzԩSۯ⊏ G l'I;1F@A6!h^P';}&Ё/;o{=}B|YU-@ˆ w6 ' HO"1ZJOi\9肠@Xx1'?Za#p 0Ma3~sHZ&'_/fIۘ <wֽ|,`¾}>#wXb9?ujh@QF = T;.yŤIZ/˦Mv"eh+p&"#m˴]hiX:;;=ԟvիW|}_xu[d߀s(Q' * }6z{|r{O>y)gfsq`:Cxt!W"m$>/tcMx2 (cm۶񈴨/ЇH= שD 4qADoc@ N3gιLE&~3gΤ6= m TH]]]}>so[!:[MUGC XȧE ?L|6BsYz'r A ̬)aA!&r\Xu?<[/ ܋|??^luNlHz24SR{Ν{#\x{{;o0n8 `2gƋuCQmG{/eګ03ٳgD Dz"> ŒHqlcF:f F${ooʕHdhAC& %h$OT:t TTJˤg"izƌK,9Oe~ ^Xv#?ˌXw~ª)X!2(adߏQ!pgeSvm3rbT>m~f2xoSRy.kL #ydeR(& hLŸI$41G}iӦlEL*6 }+֯_k ^':}Zlɠ(GP/&‘9&7gΜqƎ{r !Lg f7u̎588oSOO[OBmyCZY@ "U}?;]uT= DaLNlsΝpALjaJmmmKMMMXRD"Q}dd t0m6Z 7XT]%f(\2hh12#_=R97)۲ uc TsAg>ˈ% z SeZ|64H!x AL1tE1 Y ΖVِAZ9_#&@Lv6NЃz\5:I+4q|"@BK x?_E>@PbDl O!#~@;1(%T||FbPL1bT5b@UbĨb#F#&11ĈQň F*FL1bT1b@UbĨb#F#&11ĈQNGmvVIENDB`(0`    !)1;###iFFF\\\kkkmmmhhhUUU999S3) !!!!!!!!!!")3=GU;;;rrr藗aaa"""wC1  !1 ? B D D D D D D D D D D IR[dooo槧SSS S5!$$$qgggzzzzzzzzzzzzzzzzzzzzzzzzvvzvvzvvzvvzssxmmqhhkeefſÿkkkQ$ (YYY||||||||{{wwĿooo .'ddd¿eee dddss``Ż_eee$$ȻſeeettZZľý˽¹Sfff Ǿžfffvv##ĽefNQ{ž̿úfff77øŶ96jlʿ fffvvAA~)(οƾ!fffAA{)'Ľ!fffxx7763lcƷfff$$`[LH{sfffyy ļfff\\Vfffzz&& fffccefff{{ffffff!fffvvvfffdddfffdddfffdddfffdddfffdddfffdddfffdddfffdddfffdddcccaaa___Xllliiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhhhhhhhhhhhhhhhhhkkk___X___]kkkhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjiii___W___gmmm{~}lonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonhhh___Y___qmmmggg___Z___w___`````````````````````````````````_______________________________________[tYtY?tYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtY?tYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtY( @   )KKKirrr삂oooDDDu;%!(,,,,,,.=+++e{{{ݚxxx***m5\\\cccggggggggggggggggggggggggggg???maaaLLL/```gggdd```¾ƽ6```gggOOȾ```xxɿûǿ¸```hhh»~}~~```~}~}ȼ```hhhww~~~~޹```NN```hhh6```aa```hhh ~~```6```hhheee`````````hhh````````````iii`````````bbbiiibbbfffрfff`````````````````````````````````````````````iiieeeUUU```Ȃmonilkilkilkilkilkilkilkilkilkilkilkilkilkorq~~bbbUUUfff```偂z{{```fff ccc$````````````````````````````````````````````````___ddd??(  3SWUSWUSWUSWUSWUehgnqpknmSWUjmmruuorqSWUfilprrqtsSWUuuuX[spsrpsrSWU>?SWUuuuegSWU>?SWUuuuKM{SWU>?egSWUuuu~lonlonehgSWUSWUSWUuuuSWUSWUSWUSWU3SWUSWUSWU3SWUSWUSWU3SWUSWUSWUSWUSWUSWUSWUSWUSWUSWUAAAAAAAAAAAAAAAApicard-release-1.3.2/installer/images/wiz.bmp000066400000000000000000004556561245305550700212030ustar00rootroot00000000000000BM[6(:x[ϳϳγγγɳſĿĿĿþ¿¿¿¿¿¿¿¿¿¿Яг״ӳڷӳۺӳݽӳįƳԼ³ԼԼԼԼ³Խ³ԽԽ³ԽԽԽԽ³ԾԾԾÿԾ¾Ծ¾ԾԾüԾƽԾ¾ԾĺԾƽԾԾĸԿżԿÿdzԿdzԿԿԿǷտ¹տ¾տľ¼¼տ½ƿտþ½ƾĿ¾տ½¼Žľ¾տº½տ½ƾ¼ĽտûȿǿĽտ¿ŽǾǿտþƾƾļտºƾƾտĽƾŽžžļžž¿ľĽĽĽ¾ýýýý¾¼¼ÿ¼¼ýĽĿý½¾±±±±±´½¬ó¼ij¯ijij¶ij±©ij±¼ų±¯ų±ųò½ųò¶ſƳ­ľƳƽƳ½ǽƳ¸ȽƳǬҳĭӳijӳijټӳijٺԳijپԳij­ԳijƭԳ½ʭճͰճԷճֳֳ̱շֳŷǰֳųֽೳųϵᳳųůᳳųðᳳųŲᳳȳᳳͼɸĵʿź¼ŴճŴڳŴڳŴڳŴڳſڳڳڳڳڳڳƽڳƵڳǵڳǵڳǵڳǵڳǾڳڳڳڳ۳۳ǿ۳ǵ½ɽ۳ǵĨ۳ȵ¿۳ȵ}}}|||κ۳ȵ¼xxxaaa````````````````````````````````````````````````````````````````````````___\\\ZZZXXXUUUSSSQQQOOOkkkĽ»Ǯ۳ȼž```eeeĶ۳¼vvvddd栠ݠݠݠݠݠݠݠݠݠݠ۠ڠءÿ۳```۾ddddddddddddddddddddddddddÖŘ۳```Ĕ<<Ľ¼ٻÿƏ۳¼```Ź%%ǿżĺøڼć۳ſ```Ũ```mmwppǻŸĵô۽ùξ۳ø«```Ƶ~~99ǼƷŵűï۽ĺȼХ۳ȶȰ```ƘwwĸƴƱŭíܾ»Ƽʼü͆۳ȶζ```ǼDDêüǼ˼ο԰۳ȶԻ```Ǫ```nnw{{нƽɽ̽ԋ۳ȶ```ȵ}}''žýǾʾϿ¹Žذ۳ȶ```ȜOOȸǵƿɿ̾Ļ̀۳Ȼ```ɿuuÿըǾ˿¹ƾ܌۳```ɫ```ooxжԺğɿĻݫ۳```ʴ}}}||<<ǻ¹ǿddGG@AZ]|Ѹúƾǀ۳```ʟIIĹö³ȿƾzv%%egЮľùƽԀ۳```ïVVŻ·ĵƷ{st¬Ļ݀سȵ```˭```ppxdd¹ƸQN)(ɰȾĻㅅdz˿```˳www{{qqƹ{--|ɷǹƾ吐{{{uuuuuu}}}```̢zzĸx~z¾Ƹ晙uuuuuuuuuuuu~~~Ӿ```Ǹooü}43 yûʾ珏|||uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqq```ͮ```qqyaaĻa\75zŻĽ郃uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqq```ʹpppzzTTǺ{10zzʻ̾ uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuwwwuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqq```ͦFFȺ|B@**w~Ȼ܀uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuyyyuuuuuuuuuuuuuuuuuuvwwvwwvwwvwwvwwvwwvwwvwwvwwvwwvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwrrr```88¾|~fa]Y}v{ĹŽ̀}}}wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwuuuuuuuuuuuuuuuuuuwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwsts```ϯ```rry÷뭭{|{wxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxw~~~zzzuuuuuuuuuwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwsts```ϲjjjxxooꉉyzywxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxw```ϪHHր```ɨ 쵵```а```rrytt䆆```Ѳcccuu|66쳳```Ѯnn¿```ү++򩩩```Ҳ```sszff̀```Ӳ```ssz{{üރ```ϰ))荍```⮮¸Ꚛ```Եfff𧧧˼␐```Գ```ﱱՆ```Ăހ```ՉÀ```ֹnnn簰̐fff}}}```ֵ```ᦦƢ```}~~```٩```}}}```ճ```xxx```ؽvvvɾ```ppp```ض``````ppp```к```ppp``````ppp``````ppp```ڷ``````yyy```ϴ````````````Ŋ``````ܹ`````````ϭ````````````ɒ``````޺`````````Ϧ`````````tttbbb{{{``````dddwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvwwwttt```eeeyyy```eeeggg````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````aaasss```eee```ffflnngiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiihjjstt```lll```gggmpoilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkjmlsss```lll```hhhlonilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkjmlrrr```kkk|||```ijijmlilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkjmlqqq```lllzzz```kkkppp```kkkxxx```kkkooo```kkkttt```dddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffddd```kkkuuu````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````nnnpicard-release-1.3.2/installer/picard-setup.nsi.in000066400000000000000000000176011245305550700221250ustar00rootroot00000000000000; Modified to conform to Modern UI 2.0 !define PROJECT_PATH ".." !define PRODUCT_NAME "%(name)s" !define PRODUCT_VERSION "%(version)s" !define PRODUCT_PUBLISHER "MusicBrainz" !define PRODUCT_DESCRIPTION "%(description)s" !define PRODUCT_URL "%(url)s" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" SetCompressor /FINAL /SOLID LZMA Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "picard-setup-${PRODUCT_VERSION}.exe" ShowInstDetails show ShowUnInstDetails show BrandingText " " ; We need this so Windows 7/Vista lets us install what we need to RequestExecutionLevel admin ; The default installation directory InstallDir "$PROGRAMFILES\${PRODUCT_NAME}" ; The default installation directory InstallDirRegKey HKLM "Software\MusicBrainz\${PRODUCT_NAME}" "InstallDir" !include "MUI2.nsh" !include "InstallOptions.nsh" ; MUI Settings ; Make installer pretty !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_RIGHT !define MUI_HEADERIMAGE_BITMAP "${PROJECT_PATH}\installer\images\hx.bmp" ; !define MUI_WELCOMEFINISHPAGE_BITMAP "${PROJECT_PATH}\installer\images\wiz.bmp" !define MUI_ICON "${PROJECT_PATH}\installer\images\tango-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\classic-uninstall.ico" ; Abort Warning !define MUI_ABORTWARNING ; Welcome page !define MUI_WELCOMEPAGE_TITLE_3LINES !insertmacro MUI_PAGE_WELCOME ; License page !insertmacro MUI_PAGE_LICENSE "${PROJECT_PATH}\COPYING.txt" ; Directory page !insertmacro MUI_PAGE_DIRECTORY ; Components page !insertmacro MUI_PAGE_COMPONENTS ; Instfiles page !insertmacro MUI_PAGE_INSTFILES ; Finish page !insertmacro MUI_PAGE_FINISH ; Uninstaller pages !insertmacro MUI_UNPAGE_CONFIRM UninstPage custom un.RemoveSettingsPage !insertmacro MUI_UNPAGE_INSTFILES !define MUI_UNPAGE_FINISH_TITLE_3LINES !insertmacro MUI_UNPAGE_FINISH ; Reserve files ReserveFile "removeSettings.ini" ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll" ; Language files !insertmacro MUI_LANGUAGE "English" ; Adds info to installer VIProductVersion "0.12.0.0" VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "${PRODUCT_NAME}" VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "${PRODUCT_DESCRIPTION}" VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "${PRODUCT_PUBLISHER}" VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" " ${PRODUCT_PUBLISHER} under the GNU GPLv2." VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Installation for ${PRODUCT_NAME}" VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "%(version)s" ; Install Section !Required req SectionIn RO SetOutPath "$INSTDIR" SetOverwrite on ; Files File "${PROJECT_PATH}\dist\" RMDir "$INSTDIR\imageformats" CreateDirectory "$INSTDIR\imageformats" SetOutPath "$INSTDIR\imageformats" File /r "${PROJECT_PATH}\dist\imageformats\" ; Write the installation path into the registry WriteRegStr HKLM "Software\MusicBrainz\${PRODUCT_NAME}" "InstallDir" "$INSTDIR" ; Create uninstaller WriteUninstaller "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\picard.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallSource" "$INSTDIR\" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Comments" "${PRODUCT_DESCRIPTION}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_URL}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" SectionEnd Section "" imgs SectionIn RO RMDir "$INSTDIR\imageformats" CreateDirectory "$INSTDIR\imageformats" SetOutPath "$INSTDIR\imageformats" File /r "${PROJECT_PATH}\dist\imageformats\" SectionEnd ;Section "Phonon" phonon ; RMDir "$INSTDIR\phonon_backend" ; CreateDirectory "$INSTDIR\phonon_backend" ; SetOutPath "$INSTDIR\phonon_backend" ; File /r "${PROJECT_PATH}\dist\phonon_backend\" ;SectionEnd Section "Languages" lang RMDir "$INSTDIR\locale" CreateDirectory "$INSTDIR\locale" SetOutPath "$INSTDIR\locale" File /r "${PROJECT_PATH}\dist\locale\" SectionEnd SubSection "Shortcuts" shortcuts Section "Startmenu" startmenu SetShellVarContext all SetOutPath "$INSTDIR" CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}.lnk" "$INSTDIR\picard.exe" \ "" "" "" SW_SHOWNORMAL "" "${PRODUCT_DESCRIPTION}" SectionEnd Section "Desktop" desktop SetShellVarContext all SetOutPath "$INSTDIR" CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\picard.exe" \ "" "" "" SW_SHOWNORMAL "" "${PRODUCT_DESCRIPTION}" SectionEnd Section "Quick Launch" quicklaunch SetShellVarContext all SetOutPath "$INSTDIR" CreateShortCut "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\picard.exe" \ "" "" "" SW_SHOWNORMAL "" "${PRODUCT_DESCRIPTION}" SectionEnd SubSectionEnd Section "Plugins" plugins CreateDirectory "$INSTDIR\plugins" SetOutPath "$INSTDIR\plugins" File /r "${PROJECT_PATH}\dist\plugins\" SectionEnd ; Uninstall Function un.RemoveSettingsPage !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_TOP "" !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_LOCATION "" !insertmacro INSTALLOPTIONS_DISPLAY "removeSettings.ini" FunctionEnd Section Uninstall ;!insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP RMDir /r "$INSTDIR" SetShellVarContext all Delete "$DESKTOP\${PRODUCT_NAME}.lnk" SetShellVarContext all Delete "$SMPROGRAMS\${PRODUCT_NAME}.lnk" SetShellVarContext all Delete "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" DeleteRegKey HKLM "Software\MusicBrainz\${PRODUCT_NAME}" !insertmacro INSTALLOPTIONS_READ $R0 "removeSettings.ini" "Field 1" "State" StrCmp $R0 "1" 0 +2 ; Even more attempts DeleteRegKey HKCU "Software\MusicBrainz\Picard\persist" DeleteRegKey HKCU "Software\MusicBrainz\Picard\setting" DeleteRegKey HKCU "Software\MusicBrainz\Picard" ;RMDir "$APPDATA\MusicBrainz\Picard\plugins" SectionEnd ; Checks whether program is running. !define WNDCLASS "QWidget" !define WNDTITLE "${PRODUCT_NAME}" Function un.onInit !insertmacro INSTALLOPTIONS_EXTRACT "removeSettings.ini" FindWindow $0 "${WNDCLASS}" "${WNDTITLE}" StrCmp $0 0 continueInstall MessageBox MB_ICONSTOP|MB_OK "The application you are trying to remove is running. Close it and try again." Abort continueInstall: FunctionEnd Function .onInit FindWindow $0 "${WNDCLASS}" "${WNDTITLE}" StrCmp $0 0 continueInstall MessageBox MB_ICONSTOP|MB_OK "The application you are trying to install is running. Close it and try again." Abort continueInstall: !insertmacro UnselectSection ${plugins} !insertmacro UnselectSection ${desktop} !insertmacro UnselectSection ${quicklaunch} FunctionEnd !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${req} "Installs ${PRODUCT_NAME} along with the necessary files for it run." ; !insertmacro MUI_DESCRIPTION_TEXT ${phonon} "Installs support for limited music playback in ${PRODUCT_NAME}." !insertmacro MUI_DESCRIPTION_TEXT ${lang} "Installs translations of ${PRODUCT_NAME} in different languages." !insertmacro MUI_DESCRIPTION_TEXT ${plugins} "Installs all of the plugins that are bundled with this release." !insertmacro MUI_DESCRIPTION_TEXT ${desktop} "Installs a shortcut on the desktop." !insertmacro MUI_DESCRIPTION_TEXT ${startmenu} "Installs a shortcut in the Start Menu." !insertmacro MUI_DESCRIPTION_TEXT ${quicklaunch} "Installs a shortcut in the quicklaunch bar." !insertmacro MUI_FUNCTION_DESCRIPTION_END picard-release-1.3.2/installer/removeSettings.ini000066400000000000000000000002121245305550700221120ustar00rootroot00000000000000[Settings] NumFields=1 [Field 1] Type=checkbox Text=Remove settings and personal data Left=0 Right=-1 Top=0 Bottom=40 State=0 picard-release-1.3.2/picard.desktop000066400000000000000000000006621245305550700172440ustar00rootroot00000000000000[Desktop Entry] Name=MusicBrainz Picard Comment=Tag your music with the next generation MusicBrainz tagger Exec=picard %F Terminal=false Type=Application StartupNotify=true Icon=picard Categories=AudioVideo;Audio;AudioVideoEditing; MimeType=audio/x-mp3;audio/ogg;audio/mpeg;application/ogg;audio/x-flac;audio/x-flac+ogg;audio/x-vorbis+ogg;audio/x-speex+ogg;audio/x-oggflac;audio/x-musepack;audio/x-tta;audio/x-ms-wma;audio/x-wavpack; picard-release-1.3.2/picard.icns000066400000000000000000002500261245305550700165300ustar00rootroot00000000000000icnsPic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \@@HHPHHPHHPHHPHHP S ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPz0 o?-sRPDQ:bQ4P>Z|$!s7.Aq?FBoBz( ؜3{% ot*ܐyt6GnFtyrUt4mT;^oz8 :IbzBsl_@A7u>_˃=x@s#It]TEz8 /)1]ތ42h"Vo?{'iቲ0&祥|S^2_/pA*и1zߒ="ތ8_vuJ[ã6*>#W@ D%.lUc:Op ;B5"=R?'k#ܹ[;,Gڎ<)x x& m RUV@['a;$&TQQŁ'/8 ޛ+Xm>ucqf̡]fMXWx5'SmgܵUi25ߒ,УD8iBuGaQA 4>-%jiH[ h {s_@O'a@6w|+j 4=dܼ&C}Jx;S n7 -D:V$8 [> 6-LI !)xe:!徰~R5v3z7A*M?ߒ$C8kIK`U+^ ♗u!K<򭤛W`37rKǨs¯_MH,E<2q&aڋ?TZ̭$oDNz/R0ɀ?D^88 lZrm7=xUiUAg)lHL`_(sJ/r]-%-fߑc98DH8jhK=$Q<'Udm/g_hWXiQNռ:yAdW{ $A2(Б9C&0Z[ޗϾ}}Jl.#7ٞXQt#r(N9@0?NΗ#©a[x9ΓaӍlp +P3ncG^dOYVpL+* @)fiڷ bvau^)'dewr+#|]A1YjPk+u/OA(`\#Db Z^urA7-xd|EH^W[qv $1L7ǂ:1rcoϒh'\Y}ϲ'uņQ eZc -t9 /F. yt'}B +2:d`_خa?,dNCQ]5-+E4KA,+sA? 70Ԫ0*W_#5Pu4 Wr6w#:s|kR4}Ql/Q_Ӏ ƄE!5lΓ[f6 F6 \.0~4[s0 {Ӿa`T|<(mKZ6Ƌxh-G7r#Q.c1w·>n 0ה^[ϕQK2V]Ƹy1E9?"UHµ V;[OM}} - 0TvV4c S?=hJ;)B9ZVjM$- =C#^7~S\(CS@t=wJw bkMʏBpX°L[ ]2SVrM$Jп`(<NS~y?q9b8[Zݱ*%=kxh"Tybt@_O\ l-pw0OApԂ{"],mggB6Gwm13Y 1P&ҀHD?t_XC oɁw" *)8۝[a(~6aLΐ\kUolaķ: vr1`} ˧qTx*֙DTY]m\0A uhϾ֟}}`U/ vP|5QQZn>_&ɉOǼ8 *iV@:j2 W({ٞO<w&t-k7"9olxUQq4i!;J+tK}`5!0*#0_˺sڟ+vO$N%6 ɳzW3J DJL#WR'n3VV2&ll3s\m,:D668Yi>UH޶'>;bf 0?8-,ޏwdA-R)s,G̦'גE4C[캌< 3Wt\- 2ߵP5ImSNq 찴OaM])+Rl$xn: U-)39FqP<ώgSoTi_ H όpy{+4~H2rJ\PoHVM1HdT: A\ʍ);,^v$vUzrS3pk6 Ӭ#r`\I`8Ɍ}>•?: *,X؜(~rW2}RPb^nT!#DCz&NW҂$3q$Cj\-, LiB/7Jɿ@VVtTyƈзLpq' i2}mRp;75U?FB6_Qv!?|ͽ;L9![Q@d\#gC ԓ67rysUﲎU'dby7LZ,v;þzȭQ&, @IiB0MSI[E q$cgڭqM{<(HW>qtܚn.AzT7#!*T׳M;H:.۔IBɕ;'6=!5:Ji+%U >2Y!~'-r( e.w6&'ŷ]'23}jTÄJSO!#x}gғG|&qviKHoLC-{\/L c2Y Kc):G4r_lPYSkߡp0͍ + k&v,wbZ\d"L7$Ё< o@s\_d[F/%i ]⍾7gȟBلso^`,1‚Z}؃E tcJ #x΢#~zDPLQ}qN&ewF\>hyeݼΌpMmS΀Ff~.D3御=_daܲKT ǘñ=`hc3]ԠM{g}x:d3Rs|8^aR}:e_w!(_'v5IR,p͏&`<<0ǥ:'$/T{` X4PZ5K;cl#BcpʹFRExxo9g"aҖ A7'_SAInii^oEȈԴƏ 8`{deH=FWw|$RNn_O5 }\O<_WLS\+7|(2jM<_Es6/" KI ʼDZ,fv%"+Wpߎ$ɧik<b~G-xS勤>:fft-xpe9VOٓ1v 蜤Z\LK.` ( k7O}^1W 8RRw6ib4Gyb=1kW2=_ ΅yVrhݓD}rXd-0y0m1<?>?SY L>i5ܟBt7:$^ *[[k8IdYQz_RJZID] ӮHbo$~.]1j:.]LO7Ww~NZ*BeZ2ˡ?> Wry~~ t,EuE)BGE V]"I8jWF r:?kVi @hᓏ"A~{nv鑊{Ӫd$I`mLw_rp6_0~Z 䢾AT"ҌQ.9/똓!mr>B5;ƙ.uǺdJhB[V~Q2%ѕ1ΕyeZ~X @ ۸0 Z(fǑSh014_7{9P#_糹R˴:iѣt8*xGZ fu*k\j/%oAZ ؘW$ OiC50!:Jy;8&2t bXtwwns橣(tV3@uM/kuvXc mYy?bim2L%7>\5T;?y a:sdz%cMV `"ZOﶄ* w,WԷ 9:NQTKwOdrZ"4E›إI|R]+tp8u3=1;啑 ,7zuw_>y19_ W0I% >5jו*5Rq^7-4w.7ڏ*̹ØVmlI9dDdX)|秔 nԅ rK1sV?FRiӯnbR;dG[ |جf%OE{]r˪(( ͗! M1B^˃3>&۷,55@9(g(3s7=I}val?+[>"G؁v n)+(YQ?AW4Ru9U'j̞wa"Au ̟ A oN $;L=SD"T3tZ ݠT;.YL9O| 3FԷ^hbB9~c;uP>VOӽ}_*>}0e L (J$aڙnUɥh2xEmKL\ {v?AmqܪÈuW-Az(rV}1~mg6X XKj6Q[]?vb$ >\ncmsNߩ ;mFϐPm1݆uˏִiX|Uu {qAedo22Uzm+P1Do%) 914 ;bV l&=޲wv{66Nleo%h[p14K%97RISF7AMCaϳ? wjXv!DLMi E >P惨L*O\q̉ ]/^?KE;=6j!pZP; ?͓ʨ{b"Y WLMTAF`",ٞ6K؋w83#ék?Fe/v|_1Ts60/1PAĜ_̅OP5u3CYQgR8,n{Wjrɤ$֬G`j)0J+eL u@`,\|&𥂡l[:W%ɬ/ePOĕXB8!sfB^wfYDŽ+i1d+nVd{l|B=gG@g fRwiDip*X.dʚ$C ^'Yp:4[賹sK@!wFOWT8TyiջAםώ3T>̒9 ?*ň.ź:5UG~o_3 44ަ"3^?kQ fV320ٝ; uYln}q9)>0ѷpX4RW.B"kUJVv_ru'[XCrλu#f ~ 4$x:Vɞgir=J_‰v}?ˎ2n#9PO/>Ņtd>)?@ڔq)'$к'SBmƃeM0P4ybhK$DL]2 B00;HUcW%o/`^Hr!io%X35n ݒrQhF݉jlX%KJEyEMh *@BD,f :E*Q@Um||!# >K'cӘGC!•wnwAr#~d3o[BFDŭgȐF.8ש/:ϻN2~sfP B ~G`f)jvcB*de ZF(ÏyYAuHDCL%Ӆ <}m\Ef{RcXe{15 XXl?X '!'<\ 514÷aǹ UDX+$dU&S<^xN4@O \@w薳z yԽ݊ۇ/ln8zZ! t18xW< H3]HͪY+j]iS`\Fָ\Wإ;>d<^Zoԇ4jl*ED BA :>z0;!.nv/BƉK8 ;ePZՐ^ {PxN|֗|@i^ )]̽bDw,Qy%Tcl3?aҁ8_Eg)@<2"8w13_ !D8zk{"kkY&Bu^j'g;"bR!Yoiܻȝ".޻8iIq.ro1ՄnB0bU{CpOrp6MZON_!SbM[BV}öوkak)=zpTl]mq qc L'lhQ;fr.M߅G.wq ܽdsis*U> [)[˰CTk-C^EȮ^BM9"˔c͌&{,gl!){}!̌C\ET<hǹ6tFݏ5BLȚ=jtBc]Bh!*)cN?e;D4z4ƕ)YH-^g.c!ҔggyɓOOL2,J;+IgTKN럻[;oujCFz0EOүruS8Dڂ#IA L}S&a|1MpT q?:^)@,~D]ݦM*c臝A}4=Je%pΎI3I?]y(-qev~)?)e)Sx2)!Gc~ 뫦>=9MzLCIJm#:&j2iGt3V+֠ ,yIK _ب>;`OfXְv]c?8?Tn4ttPoҘ+j9(q2u3 >msyn \;(iLKi#|?Ӆӣ.-yqW ]>Be§ERbyʈg'"sh[GP{B9$8!9ψNwY}'v'rUzr"8~辁tVwG&-5/8#A Ϳu~C([ց ?fȉZvu/ԓ֨^sTH(i,5MqT`?9:c'-}@6F ?8|=G:/"l w9*~Mb%S`|Gd4̦"8̫0F.P.b§8l11d79c6\g!ljyV"/Fw|^5w%:8[MCm7strJ?ojQƠ2}Cnc"~^ev>[xL[rz.5Kr*cP7~7ΙQOfPjr#x4.f| ڡqdYTDb]Bn?-mu1pMdGiwARqmuݖJ 7 tB1ڇa碯~vx]cZvѺo˶qhmu:nA>(,t"rb-;2gW᧴ ~N*4ZfX>%cFb4u[l:#/}^`$K1ք;zV,Cr;4G{Fuش"M%u3@21;zSs-P?{NĐ}\OKJy640 mh!O"5x_``jTg~r] z@Q2op?x[^(\?ɷ%T6숂.7\3: SɌAyY3fuj~+_7ҙ1~f|"aK)&v5S\h_s?|@c1c%^K`C *.#P&7XIkK wW誙,Ajn!.*`%/@|t#ٛ fpWUS}.Rix'_*2 7 "/#^1Uzst~Nu@Y P͈z#+0?O8Di9{M&6Xt"rmuM(@mVQ@Ӈ`¯*5dz,%°uwpN/m¬w Y=-!o&c6﷡K,nYɛ5 /DC ]ݻGr5T)ig6Me>+e6Bp>B{cEek#cWIhSUqgT-NFE 7ӫ&yN61@XoOA F/hy!b[ϐb8&[1% \n ?tUm=RB3Է9g=|*/rG?F*2{%u;4{oeROPibۢrO aK8BzJ.p@WzA0ΠZ^P}G&pE?))mܣ|ABq2?\/!)?{kܗ[2w}tv1>zlpd%wYJ$ZŖrJVJ veW @@vA,%0"θS#Lž(2ix?ܣ6$DV}Yp3i1ka`F(֢O k1k1m 8 +uEV ׳w6Aį2; J]TU9ʹP`hnk*c ɩ5n9;xoh—0J:6X$[ b[. h| 3AmN)|GrtbR>`f,O_i^jBrs#z7Kxt=}]/4ɈQʠNSQ4+jqT4+'JXgZoPyc!JUN=׭m +'[<.6[ra')  /q!~ *d6ji2i( z ]^{{aTPS7E٨R$ WzyÏķʼ*S/޲"YĒR3.Y d'X PlhhձEAbh;<'@MǓSD/a 7=w gU!9 +F gܿNdC9"EWek2P*xq }hfT| J; $?[Ux\)SZ̏Qƫp!P-Je_t+1gx&C@!FM1{洯M-Nl'Al"E~R *\ cv?@4ѤgWnO`} mUʂ+x/-З`4l% uoMj,ll3j2-&bSp!cn E{wzScC!dY.RmQҨt9\n>ԽjWNN)~`, dL,<^dvJ1jU}W֗ݳ]fQ kP+3_:~߳fP5ɐ{Hf&:nO" b ^"BCYh.‚猍0fFo=2q_hϭH[@۠ػ+A [(b'EV$)S!],u8+ C}ԠGW#HD{#/b3i7; f ŨgTc2<7Absx PG g'_i40#qn Kwy %͓ ^VZ1NZiޕF:s1>7.p%C"394z< А.C_\F` =>L^|( zmG/iLe5>FЎ zbX=҅%l(1x1F{x鱐eCbλ ,? ,?egCސ*F,lT\J}>rH?qZ>6-(`=3"oKq|4r^w?ѡ ҿX&SW9j5i Y>XeՐUͿϳѤ|ЫQc/o;G) 5:Dx}9S<)r>R &:b1%J:nF2? 2ARjJ>[ߤ_k8~G\xLa2eaeE,Ǒa- Άт@7oSvՊRûZLzL :Lo7:x,Tbw",'L:3*tN_!m$sJS=+PdV@D߻B>#e\軓U=BNzTT:_J1SFx)O~8xρO\QHBNu"µ c\r^T4=֨q2 :%*(/}Zļl Jg'ryL`juk)#5ВgaR0`~ZQہ_Kj: x"{g_H8 b@7RX醄K0U.o5P8$ϝ=T'ʄ}e88.Je 0VA|qYEr!Eu$^j$paQ~A'=ص{PXw^eKm'#X!UX6ћ;Lx+lL^ JǡC (Z !<$SwgC*^.1*s`|wnOz+"B{˄X:.z5/ؠ\ą *<tS Zd `Ux vRz 2-љ/G7xɎ3o`f7e՚\M$fT[@ǁ\~d1Ƈ'{1Z|w+Pq m:FyGqKVɘVDnVTu >S7Ԏsa[ )j1ZHu PӏWH,),ހ+MK;T!]An>,2q}sd0̨v71mMwzzD=<VhNve*WWFJ4 tp8KEwm :mlFjd*B-naZ2@.}9oa&SSֻɓt3}ӇwKG˄ICI, $_ "(Ri%%mABV%vö ]?x ݼ5qzȕ^ރiݝѳ6iO1P' D7"zVgxʟyO]m|ϓXBC0ZGIB+!2aԁJ딵B߯e.v@-HF7icZB3є;x!/|VCO6 h[0?WsLn FDJj)jovqoHK A׀ ^5/4aRTb,l*eڑɆUw`)FL_o28SnKqV8izҦФX47 (R:9YyI-V>Dc짺y 1;cp%x[T{2ؘ-H}Wи-1➒$0U$Jkvit"`]TDAK 763&Yb|%aZjHY,-eiDmH\Ԏ$0&z tv:. #ڋ *0~+gF5"~&Xk֔vhHqGĩW?3aT%@l&ẃ3o=&A< KQ*rԄ)Mg$to fW/xjhtP{pR!W2z!_NkὫ q-pQ$O1O~DRjqg(-}w9KoՊg~%*6 GFk^3 Q:e|/>;BtbB,3pÃH?aFw_zoeˍY2[4^ ;Z:ף6`}^d3{=MP_7S*#X:@|)Yk')349;m.d4`Wu,%qP&[b( Gae DZ.`Ĉ_bm0= #2U31PntPYsvǴ- :$}>ʀ(̽c}In_$/Y+.U/|FgŊ&M. Ԭ?GsSZ=CXKs 18uzPG=*[~﫤f<(}BnPRܚmk6cd>Q6j}r gy.H39W)£XEDX2@\Ǻ?xtÄ=|"ڂ9(FavtOoD&$Je,2,AcAp hLk)ќ엓?MjW Ր~ã'ַ yY=Su='oբͼ$k2ͩtv.5=H놯Q =y Ҷw.β!Z-@@(*b9+0Pz4}kUACyiECt?zٰ^2!tYI1؊`2 3ـ䥾m (\]l=y@ˁDC$$7&g5vlsno$Nz{23ӹ:IUP=Wgu3`ϫ ~]D.g 4oKݐj]ݜ M%@[$/a*JZ[!3luG>tj Jo}-,elo ^'ژ ֳ3ubtC]ġ:n5!FȨO" Up`ܨȞԁf~3fP5ɐHǨ{GbxYN2׮Rke.t+'PI(<{2$0vrي % žE2!S~muڰS Qj08p z#lp%nOv*^;Bɷ&{QA+r6={vq4hZ^ѣ SA'd4.wW3ԪQSq؏J!NSvB7Bͤ.plt9*P}$tuO>r51C Nu~HMʨG璾/+2;Lh`RE{9QU?&#W0 }  jo"/(yμ `59fPd*|K XC&u]AN..ບX/v.ZQ73`Un)0yvhqǁsӢ*Ea{gII5J(ӋM'F3Q 巣nYŷGXa!,7{]$%ϒҒrTfRd"O[InX2e_o; k~V[AW\!Gu+Sq!*8c0bRMqo8i!8m <^bcq By_+n,<ג^ƀ!r3!hk!B? 5E=9)( !V(-e(sqbN/T0oai鸊 SB6GA]}IeK/^^gG]zw?Å=aH ;^Pe:l{vSC+_ўF9(yp[D:g l* 2xFe/?]Vz[U~)(`mY9T R<4?л*R+;4@fPGXԦZC{JݸքS}m-Ze.&0nGI+qĜaIupQ_ PIL~0]GB[[ GA;6pa^<k}c>}) 7t-驲)PH9k !A>7/nD$$f:7OYYq:RKMk e{/zzU3IFAZ]'%ތ]&3"PsUz3mlDc[%i9Wv"3i$m;j)XAi6.)^)^RRYjO,zQGHnAS ߓgwL@jgx hqYRKOk3-d62vZAD1_Z6󆳺ų~ڧc^*Qً\iA@Z NS5 F'q[3 #1n4ny@!l:Q;w`W2PaaQˠ6?'菁xc:f?uTYnY/}IiK{᩼wLQ8c'alziv`~*2ͮŹmω~xmAAIVzM2Rq IU2uLp"Y b:f! FΕjo<\LB){T~d`'e/rC.@MT!@{K"ZhB!fh]H,X5ra^?0y{eܱJqTMClƳڑcǣ@[{H/PJr<|rZp* oTqzW,\jpYe CDMS]RYC;=FX/P(&(G7@}ȊPzj2s>J yYo#r@$uZ6Qú/Uϻ%NOU%l $/U+e'FW1'P=YbVt-Cq,P^Kc'I=VYV#lhz,*u7aO`/\R %/|\ Ռ.?ínu-]RNwTaӍMZpBQd#FeBzbWW0(b۸(Z$ZjAMwF=cͼOk>$V?g|Z an=Xmg/quᇨl2- jI;A灪\lFH,GDѭO|#M} k͝F9eAK-K"VT^Re;طk)10&kϚv~ޗ/-5G5,v1'p˶?68gEF9 ґ,n4QBjP}O{yhQg@$?%[ D& ,>"˛w 1D_^%!x$x{ښˆZ ".ǻ՘_ _"GP)˰5VSJǖ J洗 C-!I ?Uo#j=!Xjb"K.>{b3$U%őo2PClA,43|g b( <ǭ.{%w˦?83s/kq!ƉA똶_3cKIJ܌t31 mY F/[qΔWiO6Dp[E^e]A큼iKF"Fh놂gPKF=:&x?#IT)PZ<2@<ׄ;]ZJ@[QBmp@:8ϱ19 < >w.O8g@l~ˢeky,)H3i8 jM dZfyeP'\@hI[`tkU@MThJ+]D ⠪"9ۅNJIyo~9X$ɬ/d+M c+VOE&Fq}?Y)h9sLPJp?>X艱 ͙FV飧Y0nC{=ghD o’b<&zDKovjNr)_4/ f7цi7ȑ?; $- wAeaW)&%q :2yEY󄑟P.ilӤإ݂Bp=v >Kk1j|)d4iKnv1ksU  Pq𖡘ǐc~!J3%+ [XM%/iG8gqIEy3gr`OBC3ؘA4#*.%$"Q=or: ^@&: seaMBE6A3L*&%7\aS1$J7`N4ltrw㢺}#D2@N3,{H")ޡzi+L 1 Z,I#3Nڟ<6XD-A+T}%.~c1wޏ?ǫRvgeKĹaHj2y֑i<ӮQwB=)dD ZkJEdpo.CdK^>BYРi^>y#MA< ZMxPSΑd&:; ꠑc cH6.+^yBpb0@ȩ634 N^tTFxrcU-4/5)O5uݫ & E+2I-f7b 7K1+wrE{@rWߚקKΧG)-?`b`k6pZôm=]G $)̅G|1+O+gG̜-u񳧠p&Yx=2p2; b R $g&~{34X/[-1Rph +l.^0 JFnmA\.Yilj|gG-en D1Yo~P%7 9VmYǤ|4tʦ_PF dw8qIRڑ7_nƢxo<IzͲD2㱷B̊M5“l)!{$8ehhByZ{h CY ɗ`PULU"G?>s(a$-3F5qQha5Atn;tKnxo. P?H^TN!>ZՀOĠzg(RG%VY@m*ꕣ5 iDYK<8b\;\겧x*q.:ӱ I> xc-/WF,b}j~_4}Ce* d-oɳTZ1p|GhwK>S[!m\Ts[xot%)䯇2@9tIfk<@l.E/#~S;My>)|9h]@i˦֥`qD[_Aڛv3ԍ^y` 0p]9yhtqB'!gϿ;ژxs\C a3 ׁ3rKf‚}}X#+_ wx C lSz5 ~TELE(lB[BGbܯ =$gOOwYAe\31 \N›hhjsF!쁌k^RLjbW7scw>wW{v f)y}fD;AF̛7p4{ +EkӀސ(B99c_¦~dSW{WPVabv/B~?(s.-8 啹B6zyg^LIuuDվ䯷z{j*}_tzr'>g >ޏ@çAqt$Rҩ8+F5U7ٙX^;;I"u֜-Ԗ o*f>X"JhQga 3|Z97soX\ji5Ig_.={53'p:">93C~[isj҂ 10scW*V ;"ӎAGeW;H$d/{Kv"0|Nm.܎ÙFc<),ld}UN2vz@` K>$3 .$b=&(^г|=', $9qCoces0Hu')e6kNYA,?`5X9%anH}_p 96aHVOD=#VK}>$qk{+v+;)Eܲ.|FAad_@[FY#Eėk9MxS):* 9Ya͝#Gﻴ[buHAbF[YK| ,gtNKqy]ۀ`-j 3px>U,ƶc3K9,U Y=RA5x#V>PƆ#6n:bxN_\ _Kꁧ\LfeٖϿ 5^wa0aKb$=^}pp߲u|Հ=ƹot?X~//-goC0]K>۴f.M~I 4flٛgI1?HzR+ phgO: vt5X&Y`S4a~ E6Am[v⨓w*wPJGr;_- o i#EisqoS]m:u74I MWd&NtDyOe>šE\}aGec6S}'Z映-8yp[߲!ISt'ee7<1׊n趕ipan$HvLAkCETmEN -}p9\w`xv gl$1YYKHmMb-GК}p})!tis υ0\?BdHgX@Mg&fPllh,+bo)([Q޼:m(|WșN@ܳQF<"=*/sW|HB #}\y Pop>9oS>>y\"`m{T =[E nr䙴ٔ15'!8 u;S4z%'-Sōyx3!YZ tq['*>Xݜ|<9_<Цv nu=:iɵ} {M>s{Hw嘰3㥥g|Eث4.3L(iskR%Eo%ڸ:d{;_Wf;̩9k6(X7:W jwe>3aʰC3NGF;G.G4A١r*G?}F@x vK+]mrkpo0ʧ%3Egg{uAϗi?q۝r8c7Us*&=\jPNH#< =[qc)Ej{tLvXސZn|xiA cKETdym 9s^C$m77t?{WO1:lЂ<@l@Y'K'.= (TAJjB p6A,̱6rnq eRK%ՠ : -UI60H WyK-$(vb*JV-8 %;/"~ f b_bOe{E/U)l.{(!t\pI |^3.,й~O:Q% AÊIR1q9rV/[2wP'-иmZ8@Cf+';̠T'hЎQ=|K .BEqW!$f28$ႬߦPn"(]DiyrRU!,bL\BJ~8cɹ@Nw?4IMN6:TO8oQySf)a A^C4lo*^cW@bWĪ啲Wb`d#JdFA4"o 2]pUn<. ){#$⌜_-PǬyҬpy~0F9j~ qw5kiXr{&H>&TVrMCTw* J$SwBTXcP#WHo[\q|%ki؍p6cd#j<0KJH7*1(BF iY-9/eAT,Ica0jW7Nj݂:x 9~x/ ;2xDܕϋ `%x) v `<e-) zXPP O5,)N51C6L =୧YHRo ?!hL@8nZ|ه֚F]7Ը ؓ16K,:@7W9(:v'EDp94|CIFVTVRd[n jAzkmZ4~RK0zYyڸN|aT5CpFb'v.CCN[2sͰMxlfi$[EsPRU8i 37KSq!zP (ݬG))ڵ0aڽ@Ibݴ)NFT^MU [abjuvGRqy8xI3dG֛LNycb=,gϠDJ*!yV$/E?ZbX0(]Ǔnck:g^q73t,qv[3d뤑| TН*^IG?>\7 M퉤b~W)~800Tg]t,:ĤU O9(ڰgs_+D/]wi'kʘ1Ʉoy8!ỹWbӼ$_Kv]5g<%MFCF8akXR0&&pǖOCC~W^vf~ܼL3Nc'uYnGU,Э˟fyLX&  cLo#k++KThE͑LS1%8S>Ht"4- P{ %&7IK>2BOEz䳦ňuz j(0Y?qEfliKOwM< e!S43%bi(FW@ Z?\?8"Ʊ^MNO104gFIyrIMR@B`YSK3KUh7XTBj@4~  X#SXwӿ+/.M8" RQF fu \WY?V1Dꢑ/2yi2kƟQ9;$UMqZ^}&+dTz ~WtQz;7ܪ}8'Լ> \Gq[tE9ڄ$kRw8_*4_vKK?e)MQttRgɥbFLgM5aG=J Ŏ]^Mʾq4 ,RI0de~]M8Z`Wd.P?]grN[wb+m65XsHM".(T0T^(  l@[x{Ppc%34y|@L(5f1ó0L -zd 4STFC%6}k% /#ϰ$)bx95d<Ѻ EzMOOuކش=`P^ޣٱˆ>ϴ$.9"w_`W+̭B1sdDȟN[ڜuZVT HYRM[o":&ÁT!֪ͫ3=GT=YϰZekr3$Vv~_)|?1x$3gt›x) e:$?^2a5ĀQT71)gïd?5mUpjKyi3ʅIj pd!P`}V2>rJXTP5N89oZ}wHHe m ax=pLW3+3)hl3'z7"*G:jlg~,UN/hi.⪘j\ooOS4^GmBTmI31h Ŀ]apE a}u԰2fh|Y@/4P4{]Qx3JIa\Ro'-~O&*$]76KCŋcb 69cE?fuRKek&'M)+ Fe!zԱ3j4:oǨ+>PuW> ,Z8?~ UM3pJIPҲk9(9h1IWŒ&)+P~ʶO^52tSn ;ebC$?ŗ +DB?DCgְ:ߨ ѫ: 1U@31:;̫esOhBרH۰wچ/ZŽ…z90_2?wAFIpQ { tP̳6fwVG"=PMAn !|[Yy({*Q+wC&B996˰ TgߺԱ {6u"].>1>]n"\@c,(T^W`Egjh@p}_ϲ#wZ*o/]L)K85}̥f7GJM#~=Tf\\ǖVo\rϺ3A/]Z儘eTJC{mU0U_ $HnG-Ŋ'[Q6vQw@@x2 +}+lg dg< aެj/_1nq.Dƞrޓ @‰eT3q/' %]R9)AWē;]Oɍ_\XA;x٥W ګϳeW:ҜsNπn lOd ݎ*1t<fFXIp# ֭|f80nF,Fն>T˯[$Y5TRY(f-\G 4`3Fɷ$1LT_`No=7.P`;j%;뿆|A6,jr7e:ߔx[ aoSZ6ţ?&X|+hPTy%oUۥ * -JJpmX]v-I '0KnNvU(yZUk[\ʏbsdt2Q.P5e޹'g6 S|,睯8G)m[zD%SC"NovRV.Y䬪cرQMb 9D H4$@v}M hߎWNGA}jʥ=J Vc^ ܎Tۍ״c'A642H;<8J–񅫷N6oUURl[{b8 T[cҐul;2Ϳ\||qSe-(k+:!D t0?X#sǨ;M&& 9b[mۑ '˳ "`)drc-΅dMJϧA ?*Q:O+Ye2κ2Q>jXG0 v) p  &|M=A 3}Bi\Xc5}mrctk.DVs$HCUХQѠ,7RN5J ^ڤ/N^3mxR7IXWU%'sl§O7[vn?_X;_FC.42Jč|ms\oK$4߂J#)su+z8e{CgYȽZ4c2\8q3 z{s{ %Tz ӗE A6[=I*JB2OCy۠>ƌ̇mOwj; :WZK u|Uһ4^UqT!Ix 6?aoSqgXye!/OiT]ro^Cxщ} Qힴƫ+ր+ D˓?^E((qU^Zts+j.á=_@5@x)GKwMKHwdfw&eE3%4+ڨ|I\\ QŪN,Ρwg,J#(P#z,ZY]dP7֢,z^o;,8ZnIf_` JqrW%~ 1ud-`GEَ)VM[D G4K-t߃)W1#x5gCoL_Wgʞ4X(&hjl[P8h(*̭ ٧9х鶜ٺ͸)SVxԦ(@"WҖ,0YYtNC$q}Uhf4'$:U Ha0VYH2AXgt֦#&Eg,K`t7!=:!D2k5Kt%ue4#XF}.Ѫl<\Y;uwxf/Gst4ja:]CCz4[񻪎iy~V -^^\QCMh.r5Jae-~{l\ C5 \{zgc,8D#nmahc3?\?huq_nLC J'X_tay;1y` 8V-&.ƖKոq.2m'crL B{Ib*S:<)H*&BB ̞x>0<;Ȥu݁]vffhd9Z&Q"WL4UB꯷{#P02s9^tZ/ A.!2y`~o8H>˛n2mj';S (sxDa;F-tCxTޅi3Oï1B|1L!/`VsPl)Gs2#6)^p{ew s|l΋@rE2D3$9c<"4OZQ+/ E1vǗV2W9Yšs]j,)&ǣq&M%<\! &8_|3;%}P9w|UdQ\Wt ALmB@ Hؒǯ O G vq<@KI^Q?5sr쳏:Ki t<|SIu3=8j4&پnR,-kd,N7zs>/Hϫ/ 2nv>>,SpD^mz"hvEjIM̱qT[𾹋 ؽBB FQ8~B)D 1Y2t{Z^B懹g Q"hN۩S4mz qzd;(t|XV(3Y򞞹qkhO"u"0$ r sY#O I{$S/WPD&+YP`#Ff_03:!$8곥Q%97 4k]ZGc ^T5u=[q6} Կo:Td *#` _]ю/:6*yV`7=[ָ,,쭝} L$ࡌqěN \XJlּCΦR  78œzEUS: kxCqf[DR(uDd8TH9g[o;i)EBo3&}q4Ճ`C'@:u$iQe6@wU t#]x~lj >t03fFQ#JԱ*ULc'0F7#4@Ee5MIRޱ. aMsn{ Zon%"X(,y\a("&a?DR9V -U+)t_Q0TB`>Uߍ+A{Qy!HnmAř= nڅKo]g.L՝yMN3ωZcZor !W..rZ=(&g3dC!¬CNO?AHXi(D4G[o( sqWĪd rݛ=jѭ\̏P{|#A-Cȓhs2}hSO}Uja͹{hY@(-;~F>G! ㋇nWDE@u%oSYܷOZ/V\Ѭno4uG qk!j5I0[Am3ǫ2Ϣ>!N$1dܔ[*-0-l'9|j'FQ"(Y}GA,~Y6*VU (tYEaQ0itb ] Ir@?I wMudաq#X, Ԝ]YVt}MV-y4,d(%db﫾Vc= }xSt\6X"宼t~l)?ni@bh7%"8XRK6fBsyz MMw=#vR-8+h6x73Ú˰_KWeZ8*&i2H}Ri4wg/)B.UD?-[I#p7hْ&xMCpwYx` q&[K HЍ/ Z3 HP*%.˅btE!ƅH/@Cnj1l* ki.Kՙ?%X"6l6zvgUڌ;J(G 7JeaR@:Z $Y^J/GCCh G3_>h])-'YO.pHZNpbfBRgh'lDjش̙J*$:#ӽs֯0H w+计T6phQ!QkVD]fYb<"jOSW`OVd7. YFv}^$ZπЦa& .4L=-v`W,3f^Е_srgs vD 7 _Nƶ+JJT`:` /]m>sx^ˠV*&ͬllwKeXk2lt3UG`]>$YnWXb ԫ$tB G-LgTRǣ-07urHIpXOLLܟ棌ayH6_VFL! L/:dLwPC|0t(AeF9rwjC+sؙt?͚ ` Bb^Zw-^.>@8"!X{Z N Wd_!+ӝ nHVj4jNX^I:O)fCiyסQ"u[_V'ʔf9mU%Z^Q@mG3Ed_ʡ'dݷ7jNF\b/SG;hُexbSD8|O=EYD( مi: *-Kl]L^aZ>k=\3?30iH#J86_cF8ak$%:owɟ{n0< ʺq|ƨ<yPQ1G`+88VM-ʆӻ INCɕEl{ JB zu"=dO5큥 gQD4h6 Fi|XW7Pf\ !ՀNSO(7AK}$34>e%D/( O,H%ӽ1_;>[L꥾Ǵ*5OHTczh)&'G-υ~ h v@^5۽NR'TɌdx G~*/I:Xӊ,nb\i=DGS+*)n5<;MoVݎF[h鼑Zh+{UjPx}!~.P4Π޾e2Oc׻ x.Id86uJQSO[jɌ>%@JM?zI *z$aM|hS\olC`QW\K pcIH:[YV ̾^{K}Ϸ}:gvijϷçAU2_ЧoqyC X<q\W`]>1BTq3GwDHʳ!Mzy?_<\io!(ܭ%Kqť]A=jA Qa` PphOm$y>w؟2+7X0 ]5dEziBݴjn-bmG DS F>.zI~oY+Loh:PD ,y0ϙM2qd2H=3~c]8+$+Ez!5\zlzq_FpB"kKnQlT6 .q? / )g/K4-]Haੂ.7Ӫ6EW>hf}6Q_ iN^ *ݵlrҫ&,V2Vs'B#π dS4B ^EAKY`638Fѩ kӓw]@o(mDT.,S?e@7ʀ^[rusU nAf㾽&\a6 X0t[p/e-\f`6R-Pܽ2Y pg8saN{ݕA6ܰ1_$~zQyIQO.w~;ū5k.Or\M$?EH exC1>]vD{ÅONf*qq9:~(WJg ҡσr-ixe K OOV,imS f Ĭ^+$ J_BͽҧL+ĝ8#!a9l's{W:#Lv(~ꦝ!VlUt(r$ᓾ, DQ / RJ, A Q7O$L|kҔeC#+7e,Uq)?fyVy!t.CE$V"F\thH;=W/'}D}\ifmF0 w)CiyQ(+cD]N؞_>鶋?y9Q} n&q;G ҫoX&syS1Uʭ|=P Z£2܏iΒ~&i-9 ̵>"wuq-?RXh"C?)8g%wM' qQc1B[)y*^atl:@?$2JV,޶T!$1beʿ#EMJŞ۫\O 3zk{6FMwnaM[gVZЖ?ԁ*顯Ç#+ g=ri? f}'{]v0rxf9[% Ȗe@P~i%g/![VrHwKɧ6{ҘYG1"_`ݬB{2ğ\eFgG@kr~HY/?S}q)J/-%C;Ʊ[aI|""є7 ~#*KC1E}z3Gbq9THP݆?uf׻#6)ѳyBtct>[ ^?uw>f;V2bNX"nBeeecۂꘆ,#Y!Q.n`Nx/=NSɮ徉Vئ]wYwbѲHy4m% ʒrLgsy!!M%B4g巨lFi=QDMtخa37#or!G&^xt;u[Q7+WgQ"WnN=C?ٸY`7Pm*H)K^̞QLC :}(E6\#FX黸il]q.W_GdzQIO@B _H=1ׯpBsx . E*4Q`mrM%GjJ.=fbG=Q,5SnV)IAuw$}3zߨ$t$5iĀgb&7 Ǚ h\h\|0 iUOKz8<~UL3MfeI"3R&µFpȓЦRD䩏x 9WTv%Bp;QZ(:b{*e.jaCS[s:ZdH :`3,Ɇ&R'ԡ5.KXǪ 7,l_XVF{KA79܆q"_BoRܾ4-F-@E-;Dۧ#(2kն!ʜTqpߎ(YXFécw} jk} SEAfHL nW!dz/Z{27s/qILxM+ھNpඁr68_"_96>5jٓ3W8bqJ]TOؙ̻E8pmmj `iw@QHع,IGbZ, L4{h]R֨8Q XGBjB@M6)qz+{k^d!}.}Kz65g^& Qb#oѤ<~dHTX!vpQ|%PCY68DwXҚ|B3~|&ʼn&秊aV]AEA$CZ8g:Eh`}z3`%%^EHu `l8tUzRε#/><)jB|(uer!q@"3VՕOuކش=`P^ޣ 8՝{X3r6~ߣ 6[\$ lgx&ZV u.zQc45$Q¥x)0C@8k֘^%TU}:/?<}ςVw5i Pd&szFx|A,̻͆ L G-~[s.!%' Wư20QF2ٮ`CG^UMo4$_Sv;tdW~?]r覗@ >a#Gesy,=zpĽ $'xϾc]?ғȠ5ζanwy ? v_SW8q{-\8 'ʷ5D#8՝)biV:vk:`)Y矰aOez̞NSgԱpY>DE= vnڈ{$rnoU`Pe*|ODUʢ/ZQhS- nuJ"vLՓ_IgAvPI b(5M? [EJs =4Wɔw@cS =[m4V^V!j%g{&pD)`o*p |DS=8qlyJ9*kTы}jZ@!qyBQZuz꿅𲟿Z8n(<YȘȚhfF[ч?Ś*tģecmMcj9[@#hcgvҬ#;Y ;=^c ޖ/؟A@ysWoZ?p۹;tB%ګI`gO̳P`YG4o͗׍; ofտ|c 8/[|=_v^dcXo:/Bj1?8uMYhC잮uhJO[Y[3=%E_HChC@C27SG!Ffo+  M.tD '*em~fG;;-g%|td>wKj\V0Ol%v04#qJo #zK=Z[Xn' 7`?%S+s 9Qx *ZuK0#1V`7|xmy@ (+hHdƒPqysBZɒݲRӣV~"7\2esib+i4:"2h=&Iר)v-0}XUB<7T`O֞*V[g_*t?B'|ccX%td_-=kvPoCU%`?#9`S^1#ͪOd {ll?I4Q;qzIwG S3ҾP}T<~?@V&#4!J,HɶƂP Uf(ɳzE!}%{f2S d.p^JT=Pd"rYzcuQ*%]J9+7Q#Hozb49xN6G w939\\hgmYGҳ$s*XjDV%is(-zX>;NS$~ګ?m:>(RQވ9+&W{8$ ,%{P_#mL HGfj ;nh-/lԛDҝaޗۘx;c{RTKؓǛ3( &÷;)LJ}6nagpQ49n)NvTƓ]I`kSi[JVnh_lp.ɩR|YL\+sѹᛗ/.L*^祻 yb 2+Zif!`3t Q'C;1/ BT懅 ~Y)R4?h*)rܩ 0yyf /ɠeοBT-?v\w X5(ǨŸq|lF2'?\Ȗ7dbYbA;|gТo|"=Dc=h.Pd4?+m7#ڃ+gU6; a9[;]"ԁ( +z0 $ne;7N5D{* aLx# i/J \Nn' eOB^BL$=bo[ [3A 1C  qt:#f/3^V2{)bp)Xu(6M;} mVn?GuPR&/ߨs^MݓGoǟM9J~A.{0穋zm^e ܙceF>f3􄩔CK9&%4Y оgDW ~QL8"u/]򩇟ڭ#|A@%*,sS=E"??eI>z"ưx:ŗ,W:BW o/+F;"Z  }v9jK+o=R @Bt4޼!*c"̍ i__< S1@6"k!gkO,8's ^#(Yԝo\?MZ.)m}~jq?6}Q߬ I[fB\Z-8q74lw>0H8 Kp}^Ó cƈ'WM0.I{spNɑ+AI5+-ͅ3K8aJ`XvOtcwPSρKo$5g΅ϡQ=HL 62 mhuq_Uh9QiMnLVM Dl 󘣟Opu%}GhS:j+dɎQ]wdH1~g O]M KUF/Θ;6CG͌j2T_~ؕApl[ت0Y2K2 U4$Kbҹ;zpר3%9@4Z]="BRmo~Í \SBlu.Qar @ en;%.]hFf;^%Dk`ɄMҧs3M9WLZ6SW= =8l.³L>,; @[ olvɂEbC'HE-5[t/04kw XR?I<[;2ZNбF֩-kxbvvꍿ}{Dh/e B0:9}%q׮W`pןCpnT 2NSln#< k+w{׵< X!ycwnOyc.baJˈi17렖Pl)Gs2#6)^p{ennNmۤBV^E_“Rbc=nqRgp8q4#/r`FmFBwc<]˨\Pl(O|P"uΣՁ۲St(b_1cS/ )!tYh֝zZ)Uocmn2:r8g iZzFBy4nfvylXsB#~ӓ 9ͯ$FK'@i# {Uҕ&!n)&@NjBrmV\!VXaJi@E!X@)PF7,0s|tIS_yڼHn6…Lzl`3-OWڳZo+&PG|5UMD/cRDiYol58H$a&bE]Y}cO˳\DT16whN>2N' WU#qhj&pxH*c3%U_ @㦱 lkdD%݄A$Ι.96Oq3PfJԭxbk^^]SU7R!dU#kE.qnnK\q+wFJs3?C I)6ƂUll"mݔ@x}pgG܀Z/cI)z8FqZA60ܑZ0{ucW=xH KfGCxqVF>eX}{9XD؅L1)n蕔P>&D}BBʟGN*y3B q5d+IÈG^'NW1G[7VjG4r*7"Ǯs^OPI/0 O76=i^ֈsW;\%C@~WID PsM# {N?DDfwˉ=);OhRAEَ̤|vN/0mZ;j+®jIK.+tTmv.e1ik+`F'}(Mx &:gefsU@JĮX-t6^9fE* lˍQΆ.BWܺ~7qDSEړ kSlAGŲ/F0 RDc8yOBe]dgP[M!&C³Χ4)0ܔ9jJhV5FoU#|p]碲vr  oD"5-B%*N~^cn\O=ƥG@2U K3N6W}|A:4ՒUBQ ")j#l4!ֈД倕o\vb^ # '%O+dtՃ-sCּ*l Do7Y;MrOH6X;ZX-#Q` [5Fzz伩ùl\WJ0vȵz*}GhEb_mNN,vCjrmfe* beա8q=il6> ˴ɎDXZeb_0WU[(iXNrl|70) %j1Q޸qfxOF-..IcG]p@~h6J!u49Ei:|/'0,Qpќýp>t3}@^X@oo{8_7DcGco#Q]&BKkc^$ <B8ִjb(' |̶ Y΄P,m 5r,gSNg2˭'^hW$v.HǠ+0o6(& sW݃8'^'ࣽ}MURXZWV}eDvho4A\q3;Úg]ըm^+\9s|xww .b$ j$R!5U~r|/( vdwL滕dNNZFvGAmvmMRi|H=!fKwmSص8S[w.;L.>A@Hsel"hq$~MKYE'S =,&!fa܍܄V/ՈM C[P΃fp9L ;d:Zv3aS,Wk6uJ4B0뎏{| .)6fGZXm K!V1t}n HXFVQptdmmBL cGy5gQpciC..]LY {z: mHe>?u%Fw3ٸ{'F&x[ f¬LL:'rȆ#-V5XG̵sE^\MV, pБ |ֿ9nO֍ A\bSUyy4OްYBk*}%m4?dIxsdOߢDY,NJҦ"ܯ7<l.P/r1r3kpZ%TK/\Ʒ(^]S"RafH B| DO>U<%.!?  Y$y}-tۜã$'wL0Z1g]U)}A֍M}1|R) s l%:õ*('sN2GЉXr-ƹ;@@+Mի27=Cb']kݏ Ӡ k ݭ!]kh8OPg9<†3| T Eb൰ѽ7A2Fm^"؈ h K#jaZHDv#϶/GT#SlR.WL @A? %#={] '/oi\VsaP6҂­Z ' .Xn`F: 36sEbϬsAs[?aQTZ jkG@{pUO?l&ӹ\^ E Z٪Ok.蚠|$Im4JwA/&{^"}Ϸ]>٤zçAU2_h࠯xIk ^ctM@$!|X 7b~4oM*Gy~(mmN3FuI\wA̕2ኋ:Ԃ%mn(aal:fɿ*fAp䚝ʝ9~h] L/D+_kUE#ǽ^#Y-mH}Yx^֞yv:+S MJ;/Z@?n7oD5@\唐R) 3S:zsQ9cr|U$=KVU-!y+'F4۠p?ѐ]%>*&gPXG"hBZ) 3*k71wr 3e9>wdu@/,]B%}^7٩/x".{>ń߯-!!:Ɣ2ZEBwGŴxNJ5oS2DZ'$`{!hr'".fFQE]9ME=s>daIYi,-=Mj FؗPAd#kf{{7.l"=} 3,Io^KFwnmMH p ן|GhvM(Z` i (ۛpv.{a0C(-ޙeV3A^&3Cұ]ڀpW}=קe38EW؃m`'3Cdz1֎ OYb&E{"Mz~؄XH) p 0 OjEwthQt$ OHk!f<)Α#%&"!PL!td-;x%76kһ}i[?ƈSPr.ݬ*&0&9N)23HY=kbP);f6|[̰"ct~R;UQ̰s I<G=K}C#{&hQ셽֟wvOA&'u6kl|ֽEO'Dؙy \e% \݀ Þ sM%3y}!3`6rO yݬ8A 'A !nr4 Y}du_7]@ͳo45G[[ h,Ki~Y0R{swdخOq[:j㼙w,;|Qx*oV~sdM3;#T*x ҂`H&l,Dy<0|R/.|A(xKQ%i=@Q{IE/؝2}r9b{q.~ lHAAUII+nl-.x[+ pʩNCtϸ"p 7WF& wƤK^zܚ}:7wYߕ`3yIjRU=%@c*8wClgb,cy@ߘ~v@:"R*i/o").Lx("Že&,8yatlғ )z]Lzǒ" Q"uؼQ!$W= /c$!b|z),wzERslL]8𮃱akf }WP|qc'd7$xS*mRScv*$ Q@Qoȼ}adpgHHA2AcϫM]] oN~?!ZҺkk Q>?,k$9{)h+kMg# (hj缷j <9{r~`ڌ~h:{:`phɁֿD,1xR'3Zz+غ⦞t$0A<UO!j-t[ߊ _JaaO^񳻻iT<>N R0/JG0}<[؄w31- tpYxi!cS62{c7.xf{čѺ-(9xW%W EUm9YcژgsreٹQbֲ"hKu48˓=v M1 鮄Տ)Q2`Ar+t/Ew{I;ęML#Z*ĝa:.RMY4\z[|>3p(ơ 4t4OnwqdB= u.^lPD@,8/3ᇪghYad ׿|^&.9"XƆA^ŝ~U๭ۦШ8j4a :ATIdL˴Ʀz:Z(D 66su0@k%~f?tQTm U:E>t+HE0A| ITR! @:U Q/?=0P3<`hdSzctjgш:h Z }9.ܚMv:0?_.!;ak. #OEzARoէ!.ITIP'nNsɊz'iRf{Vw ”i4Maۜ` f@H4.RENpt}{ualBln x#)n $]m?):4`yQ),dL#WgäDVţ1iU][7fVX'Y5<7[e֔G2y8̇P!ؤF 6<-? fc#e?(>N 﫧+uG9+_mmD*([sF';Twq#.+Q;~B49le@]U4rhl`(>Q\hfUY_Wf9gK; ϛ ?Ouކش=`P]cV)0s|.ɇ#eƣ6sKh%q ,8 fYm7B>Qcs^.hbӑB~Nt.Oܵ uq9_'+P \ [/&su#YViDZɩ(:bYdGM̭B ii =ygaP:|x`MD-)s/ L0{ m./Y30GNt^w yl(CIrw2`(]?!flF>|}voJ&+jUT1WgT$Gg+W믣wrej[JPS96o:ȤluNF0-ĊYgo[jJ|&I-)2yd<>`٦fJ"vW`j9@']zҹ?mfX*?qqbD=" q$Ƨ!f\(oYWV^36 aU%%cֿ!VPbZBׅBc.6K:δDy-Z~s_*+r+{?`w =k{tp&=3^(,P 9{TF$" Ca?GtAy5rzl(:.3 ^KIsԋa@[nW^{q}5UCO1&Ch6f"!(HWd8e}#%::K bse.,}IռGZ 7;5[PǮug-mtHb4+):\P ,"B«M\AVW; s.1 BڝnBvq7x+ALo-h%3~ɑiT)4R==Am5JϝRIj 1+tkڠ@P'ɐH/%̠?6s6JGf*>_rݯK߀hWsᚭF5vow3|M3Q{kqhUMÁ6g|e/Rxܛ!SGVݨ LTa1mQ{{pGX/K+l "nj0fciૢ I&HGRh^8+J}|Lh< $&~mk9YOljX O*9=wvg$o-F2/ 6gDy-Cg*3)p4"Б/X~P4|2{H™gw{w{ ?t)t7d*XM0/F0ŋ |1C5N*Wk jI@,#Lmpځ6O+r %QK/4OnŤ+'m(ɩl P;Wz0š4ݯ!H ܏Oa\o:qjy* P4ބRRQEybN-G:يH.i & @lI8az~lNwM㯙JcPQ}idcE?OQȔ'K^; r4 {]?a[mvv!"drj.GgW'qFVvTXR=ӓ ]\}'RAةIfd)__Oz)@᝽LgPxDV;͐Donf3[tּ7zǂ>»KwBߛ#3C@ھKpzocHAr=i36"ERg 8wK&UL`pؿ EݵS}]FPXm`j.]^ZDAа*%/*![Dʈg9f!jCzPs:API΁XK^f@]݋e6^4bffGTcN]e"1aoe5=9'h"_|=5AaHyƒpthaQʙz vD0e!Nl,CW'H,4՘V5j0.=KMo@83DE|bɼ߉,$G,WLջݬ8S3j ~FVsaצL%ks"u-mCf_ݘ7.17Θ!TLP$@h%7ۺ`UfaQGΈҨ 0#j _ױ<3$K|#1fܞ].>RVn*DX) Gsԥ'Sp{w Ou;83)_p\- Zkm[gzync9+ĠȁI2Aà(iCSf؆ )ɗkyb믡Ӹf=Iֶ .F?-qfhrf\Vy~} =ZpMHM%:hG=zF{yyh )ZR K>GIy:%IR԰'wq!j(JWlH]+b@/u;ن&:ͯɢr]D;#Hl6b'Wx<6 ϣeџ) iĺ+b͐%"%Vfj2?Fl6A$5#PZX>(Wic EeE`@wZ#ZQAѾH<9M[u^aFŊ"%Yjl*&;NXYr<~9e h1Eq*xV=[hyC, ?1YGvxiHGTkQ\%ػG= #Dw. J(ž YSt!Y憗 TBB ky 3߈%@DEtihݚ9I>!f+Ts=Yˮ!qk:V{͋d&-LhĦPkP(XIc*\ crXkBg53Mg;#$DC!"Vt ˃DogVMEZr?&05dⰏ'GPV"vUlz:_lO}i"z{r'iDJN>0peike$눝th0UPoi`(% 37WhdNW]\W݋gbkܩnckȞKA&fZUQ#9qC 3_˷scZviL2}GNNbr@ԅ&Aൾ~|:|T})$}VEAO dF8vB 07 [PDJfȩ=FU6pm{n=|hr/g/a/ƬHe4D+b箔{~:,f̭OTeIUFUD ֲed) mɎ$g !3(,=ט \@Sܑk )xcP{(%dLU :;#=˃,- gBc#9ͳ.0wi:7 @4< TkqGd:^)ZP}2|+="鴷XE?KaqJy;|R e'BM06W݉('U2+Ac$i50As|C qS/cVރNo YY;yҦݾ _]aCnK;03-XAc\\ .J;#|4Vj%~d6HD*\G&-rT)}iJ4m*N؝}7 h`ea(ƹehn1g36F-ߵg!"^| .! cSX'ZA,wo2M%/" 8\ـVy=s+Y) nNLļ;3=2?=rA7VW *>Tdh!{H_V0D>Qj:j*^GU&7soOGѸo^/#K}H+׆meZj) c"zGZc4yi,ǺXħUMw֋kNT|tmaΕ%U wkh >G_b8ӆ4p.*.E @\O +q=-ாѕYTم5׵o3>]aw۫wbnav?ՠTC*ɤ}ß]xB⎏ C#'N{Al&kOs0OSl m{=B9,q$^'u~WkIt5$ڠDIK%]!5LM aHicgJW 5A?_ډ#y+,#8tQ&C?.BQ[*=`w>D`PRsrdPԽ|æE>Aؗi"Et7'sb@'yrtJLw{Ks%:T tCޛՖ! , oBƤK>f̢M+>VqpR\ ""rXٝ`r;$+3! ]VC) B őTmC< ]3"gbFo~!;dhɆE\Rv֭xyّ곩Ȧ1̀R/[^RSզǰ;r_da| b^N-\<#aov֑" '}2UV!Ēl$ x /=\X-]c EߧblY˘D4RKĝeEJ5z&DNz7oho^~tC?7 rydZKC0lޛ$HSDb Ç"&v~a`/g=$Tv ]??p\m&EGFA!t>ՉL]C8l~Ӈ3хr|R_.G,Zy9R:JE8 \@48S1mdo$F3Dq4*)xb+w]WZcc4)fSO\2~ɲ+g.KqUaT83[s(=rykG]~tbmuz#G-ϹC&Juo**$jո&<A19ׂE_kT 4 {2(y~$.K}֧%K2OlW[IP 6J:gM;<^1 mH `L9lL`˸C \V)p.Hr4 9ցK)XsQçvD0q6QyPEI7(mVUuF%E}M<̙P,ܬB?Yp`ҙdʗg7ܹ_׀i`P@dRX "qͶd*SŦ&A;~TM\{ g*siTE<<XJ=/UY͡/+ltlFGd7QܰD;7eQ}KqEXm\#HE`Y5]5P>^PZkS]9i)$+/y1Uo%z#1&/\.eCTcC J(#/Fg ٭@2.IW&c%1S_3{j\"ߏob2`_snyO)9yo,{*O?4LWj,ՈjTUQ=CGg2 {tq}iYWHJMͩ;0/0?p z4HKwQo:p9"U.AA7 Spǁ훿Wi1R?Gu͍N䭷`E{܊@P|}^3 V) ކϗtj4+&ah#oz5]' ^S$&Dj/뎶yû2YYteR[&OKE4(72JߌW/GYeF4xTѨa}\U$|R+F5Zx_nQ6y{HZo6 f87Xг'"Zq8 # ejD网|czBOlQ]ыoVW 0<7&G*k@B5|Eu4ȅ?&ִt04vaj)~4(gElXYf}0V@٦Q:mpdPY68@\`hR{ċ*/@|@44;]g|%*}Z>a~85ޫ=VwLs ϧ[z2)Q`?%S *́ _#jwjV,SyF Y-N& ^sNrozu1;(rvU8d:XBden>: ӽ K̨B?€ ϟCI!517sOVosHDYY©G@lN9xB`);uoS oȧy "k܍QQ9d5=u}q>?xJtկޜ0"&Ϊ>#QRubh 8NwPRd 9ҟktUEVN#'=Ra੪TF9In6UQtЈR.KeeſhƊOuǸ*vJ31Q? ୦Ӛ pD?^䪁0J&3ˑ-n;ϐ B 3`ϯ 5Sa vYzԏX&߶ϳ- bı_mcKw|BF(|0G;^5E:|{B~X#⼹cmv<&ٲ92b^<e"wJ?7jB?%%E\A{ :f˗9u)m8(0m,dӌXJx\<%ѐ1$Vj{-x(M-.OSvk6RI1DoZ7(,?Ui]6C׍I 3 kl~528! ^\gbXtʻFx9b8gĪJq Rih32>;Ԩ735, 8 0+').b͕B"( B8')Dztqlhddzl3#,8877/29+BA*)<:976> #Qaa`^K9ZB8TS. .FEA?;9874(fn.gfddW+__7SXWI)IIED@=:9873\;swHOjjif;QeS0_^\?"LJJHDA>;:97 5QTx%]nnmN:iiAHcbXQMCNKIEC@<;9875\a`y"_rqS1nne1hgfSXXERPMIGDA=<:95h҄y ^uZ1psrR=nljhJs~_IWTQMJHEB=>fن{_^b3pwwp9hrpnl^KRUM[[XUROLHMu݈{N4o{|{CIwutrpnleddb_\YVQ[#|.;69zR3|{zxvuromkhec`[g#֥q}F. dR3|~|zxvtqolidu Еj7}flF?~|zwtrpqɍa~ QB6j~{xvtt{ ~<)-%6m|zwrnGap#m}zrݣfHJKt偁#oѹ~s֓_LSXXQu恁#}ե߶tXS^ba^[Quǁz$#{խ՟ubelkhdaQ6휅 '=58 &:Hi@AKvDD~r(7ABA?>=<4˻O#89;W>?@dQc +=A@?>=<:3 278:;<=>>?@@:*`a^R(+9>?>=<;:90 "#%(-258;=>=7)'3:=<;::97(^eTB0# #&,1578::9875  >;z735,8 0+').GB" (-0mfaZTNJHDC@?JN%0110.-4(::))8765453*j M^]\[J7V@6QO, -CB?<9765*`(fn&cba`V+[Z7OUTH)FFBA>;87650?;rv4Cffeb;N`Q0[YX;"KGGEB?<9875 37Tw%sJjjiM8ed@D_^UPK@KHFC@>;97653>F`v"iMnlQ0jjb1dcbNXW@PLJGDA?;:875[҄x lOqW0lomP;ihfdGjtr]BTPNKHFB@;=eنyDR_2lsrl8dmljhZGQOEXXUQOLJEKt݈z I3kwwvBFsppnljgb_`^[YURNY z.;64uzP1wvtsqpnjigdb_\We դq{F.[}O2xzzywvsqomjheas ϕj7| ^hE=~}}{ywtspmlmdž_} MA5f}{xvsqorx|| }<)-%4i|zwurpmEHQ~#f}zxupܡdEGHTs#h~{xqՒ]JQVUNV#t̩|rWOY^_\XMWy$s—~r`ahgda]M9V1x$mȏsgnmjg_H?7Wax$mËtgppeTEB@8T|y$iĬѮufbSHFDB@8Rx$NўϚvWJJIGECA8Ry+OZ^Ygwyl`cTKKIGECA8SI{+PSTZZ]pk\\WaTKKIGECA8Umz+OQpZWYw[\[ZrV`SIKIGECA9U|+NOTnucZvbj\\_RIJIGECA8V|+LN^RèXkp^PIJHGECA8V|+ KLnPRSTTWfV}]OHIHFDCA7W}+IJNOQ{VST}\MGIGFDBA7Vz+ GHkZTQ{fWyYKFHGECB@7VϹv+!EGH_[OOnqOgYJEGFDCA@6W̾U"!CEdHIJMMZHDFECBA?5Vm# AC~nRU{hECEDBA@>5V}e(!@AZdtDADCA@?=4Upqvoc0'!>?hCDDEL=?BA@?><3V|ncX o]?vABCJxh|е4>A@?>=;2Tl !:d`NCUƽc,>@?>=<:1U( 8Bu]=>FhAA|q'5>>=<;:90Q|si8678Np;<=YN~b ):==<;:98/ .56789:;<<==7(\_]P'(7;<;::987,  #(.248;4'%18:;:998765# @E:.$!'-0357653  >; 735,%'%8 0+').!'1420.+'D#@)8&$%BFEEDCCBAA??: 3NW`\3UT1ac3 -^[YUTS? P}YPUQ|A#'0jfb^YVUTH(itZy3=|o!)kmid`[WUUTR(;x~cCyv=I# Mjnkfb]WWUTS0T% h`OPhQSSupmgb^YWVUTS5 e" oi?6vWVJ|wrmhd_YXWTP[Յ tu>cޅ+Tn|wsgAJCf߇+Uk{wrg?Gm߇+Tj~zvrf=NՄ+Tg|xtpe;<=<"%=@?@A,]QLGB@:bLrss Sl67A4FXSNF}OyydJ5t\85>^]Y鷁;RF@9Mzxunjlܓ*1鹁6X#i&g{x|F麁;Yy~g2H\K껁:[DN[dNflh_G`AП<[(qSop_H?`=;Ӡ97)EǟS_RKF?as4ԣy+xܝ~\ܜ *‹ngޗ8JKGC=su6_thgߕ6HIEA===E@=;3CNݵ<`bb?& V=,GGC?=;;76N촁p@i'B `404=OJE@>9_rAopp Qi67;4CUPKD{]EvvaH3pZ75<\ZW؃鶁'I|}D>8Kwuqjgj߁ۓ*/鷁(M"f%d~{xuvK F鹁1Nv~{e/4l0H꺁1QCLX;BDCIF뻁/Qe5OEOWXPG`Bߦ.R_/=bLdje]BGq>О2S&jQmn]F9Eu!8ҟ01!7Q\PHD9Ew>4ӡj'n}:JLHD9EQ.ա+fysdnݙ9JLHC9D\"ע0;^vnoblۘ8IKGC9Eڣ/<@xffݖ7HJFB8Bۚ (~{hdޔ5GHD@7eսs0[sjrbxfߓ4EFB?6Y:/>vigߑ2CD@=6?zz)0>WYXb߄1AB>;6Ct]NF />PTiS|ϻH0??<;6C~|tg0=LPlxOeu-/=<;;6A~~zu09HIJbpKHcsrP')1;6=std2/0=ACFGC2'()19;4&*0,-.01 -.26789:8/XXR@/!$(*,.+  aegef":=^cbbcddb`3eg*snr}l6Wྂlf?Q,{~}}tGTn=j5/4Rwq~0:774c}#s(nO<5I݃뾁Oud\Spߛ07^x16ـOb{{OATc~_lr_ptT/OÁeJjk}X= N᱁cCUĨr|W3Jҫd8ǩyvS3CիeRG3VɨxvO3<֭- -MbãkvO1 5خT\`?WNkvO. (ڮdt(_QtުjvM*xܰeu4Q.M}HhtHި/HoqefDgsnΆ _LzvLndrcñCcz7T]V[brA{0czh3]a}r@  e{1rc_~}r= e{I~vO`}~}}r8 drvjLTf|}q; cf|dORTdy}m6d\\_bcbbdd]`hruvxzwb#*6>BFLRW[_Z?is32Ȅ@6%@@ ;&!1t,"0 1؛M/׀k 12U: 1,R$ 1-%5@= 1-@@?4 1-I/9 1-H!5T-B')?(5ra`A!XfRw1(*:bchO2 ejllf(+U5ߑk=3#== 9$!.V*!0 /j:/׀k /1U: /*R# /+$2=: /+i==<2 /,oF-9 /,qD 2zE+r?'<<"3r{]`A SFO_/')8]]EL)`efga!(S2r]G]_N2__ X4'F:88>DFBK>(0!F76EPL:&0׀k!F6DUR/V;!F0q}aB'$M]klA/4S J RA52%Q/8B55?5($,<=5icl8 ;;;; ^;::::::5::VUV꫆:VU󀬬+y\UU[UVUVy\VVV:VUUU[U\+;:UUUUUUz[V4:VU[U[UUyU_UUUUUU+;V+UUUUUU+: U+ ^ 2UUUU[+;:V+V2 3UUy\;Uી]34V3-\V:V+X3[33V+3WV\V UUWW33 V3\VW3V++1U\ 3333+VVU\343\;;eV4]\+*;^UU;:]:_ _dUics83^+3+ 3 W 3] W 3]]4]VV34^^^4icl4}]W|M} WP] \ P_} } ] P \ \]}|\]]\\\]}]] \]\\\} \\\]]-_W}\]]},u},.,+\˱,,!ʬ-,,+,!,/¼,,»!,¿˼+˻,!+R,ics4!,+,,,- _˰!^^,ʠ/ .ICN#jU޵[XހbS s)sT%# mTv׫TyC{G*nuS@{UUp~|??ics#Hos'\[ [k z³f½n?h8mk O '~ #nFu^B)khL:<fs   4!# R$H⻵nw&q/' {* `*?,X.LhKA.32._/A1 83>4E6Q8\];f>qAzD-FyKPTZ`lqP2r*'>ڞ;iA0!g$  #Kjh  6DA72/.3;AK\q% l8mk  ) A\m #d +;?ZZ $[ Z 匂Z,[\R]Q^&)Q_,8R`3dWa :^b#led&iye)Og+Vj-j-X llA tB|qI pv6O-!O#@ s8mk[Կxoz Wcoz~Du4ɽFpicard-release-1.3.2/picard.ico000066400000000000000000002473341245305550700163560ustar00rootroot00000000000000 (n h>  ~00 %$  9 htJ( @g38,7Mi9C0AmhKVX[^pwpzKͻtBfcaffkflakj4Ӌfow֋ϡaf4koaå˪of!ofӠofTh+ofʯffT+ʯfa ̬ƪfT`lf5֠ʯUfdզ 3U֦ ʪ֪ț֪PjӪ``&fj`bffja0b !fljaa&2\ff166311yyۙ#####( K24&:M_=@'EcYSY]b1enre7Utz%zE+E f&`.1P1.31.1P@33333( @   "/)2" 0=$6+!),)+3#$?&':&(0)*6&77/1/02655B&F!)M&*K*,S(*I/1T)1\,5_.8L45C:;I<>R17_04^1=R;=_;<`.1b/9c13d1;j49k:<r6<v8=|;=7E0\*/L7;A>s;=cD5K\>@A?]c5As;B|=C@pK6Cn:BlXAGHB\THUcCFjCEn@LcHJmJLtEIjOQzLTjPSzRWNDb@CjVF`cYg{egnes~l~>@BDCFFHFIHJHKJMOQOSTXPSRUUXY[\^W[Y]_a^bcecfbnehcfadfijllojqlxixiunpsuruv|uxr{~eiilhndhlrornvswx{ FIK N QRX \_ ] ` ei j\ynxvpvx{z g ij q uw itz}szv{~y~3(rIL_ohqzvx}`t1?3,.4.7L]e[UTNbIVÇǍ̑Ҙéǯȱû˼ľν>4   *&,,,,,%-/00110*,=WYZ\\\W++11111/<\]]l][j{yM+1111/7=aaU_k{+V11V/A=bbub}H%VV11/A=fggm+WWV1/P=vp+WXWV/:ե*i|~Ėk+[ZXV/R槧Ƨp-\\XW0Tx< Bʷکp.\]ZX0C*, )2/12/25000035:99B-/A/1F.1K24L25S8:X9;Z:=\5<6<5=LRkB]_FDJNADNPQU[cdhiq{1Qq/&PAp[tϩ1Qq/P"p0>M[iy1Qqұ/Pp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQqK<*;LPOOI />\O),xi_\(-xsUS4 !88J6ntC85kj+ 7]VD'tB& v$^epHtA1ow ZdpHt@2vYcgGt?&&$tXafFu &#tN_cEul.tM\`Rhqum0vMO\_Q=%hrMMMMMWT3 hr&&&" :&&&&PNG  IHDR\rfIDATx}umݽrNH"HB"19r9`cl9G ` 6HH ("u|qz3=s{B' FݝzUu/xq?>w<ۣ'v*x/: 'N6۪-C/rZ3|pϜ9s?Ν;7~!=y+& 63G OC)ó?16'}Oy;mv/8bG -[lh"d;f2mzsIIɢm۶(wo)=}v{u{0cH=%LO(HHKzӛ-ܸӋv߼&/ =?iD"@NNA BM:;;_顶falϔ2xagXb^^[6N <#"XU3qextz#Sc w[yu5o|>6~~}7 y(<SWW5=P* 0 Z[[}`0wI{F?fPI`壆Uǔc"F7lkJNx7^wt9뭷6.]e6bxw1{qaxdj/ܿ?ʫ 6F`skPay>$)_`{|4}ɍѱe9#OEtOnM~#}hgp7x>/_& 8 Z Wbfgee剠wc>nx}w=?n്W?9 JKK , !h֭ Ǻ X*5|䚆\l'(UTH1;>QĆGC{6.fj鑍}jx^5cs8 LYRRQ|۷o F*|*#@:^lKeeeB;͛sXp=ﻍ~Ou8ڬICǗD}Ss)OQ/"4 0؀@oGF=,cK .POxJ6OO >dh:˃yc i^Jl澗?eW@{t8@2[\%lB6m5Z 7P\wD"2/a8^ ]!?'X^^.fR >|<x;zo<`%I Sg$BxaHx”t_z/}{+~ѥ7fV/{@rƏ 8@ ; \9_kIn3/80?oeO;~o dλ3wMcÇG`aHA@F @lǾ555"eo>|}>>^kggn]mlwIu GBtI (%&.wчA֗kǔ }^Lmk/޽s)I-$:}<@Kcwy!A=zƎdcuSS9PÊxh?XJh*%FP[[KFa#ìkV.c}0B !' pZ嘒M 0.Exn68grh]]=<8 #&)8nz`60Lf^d >HB @! |U s}g !#*o*nCzYflYFm׸7DO.Zz=s㗫xEu`;ٛ?8itOޟb  T Gې"&Lj66|?3 M&9 EB8p-3l0B@q;yTٰypԛ@VPo(o@e  p?/Q/poK{t 8~y@SOAogX͆g*x'(<҄#čаJJJBlbO? bСCqC#^<>t:O%LGh񺲄⩇~O b9is~oHWWo|omt3}oz补lUo06]"G} 7dΝz .HP0z-09Bp8!BC dx @[P^;X4>}3{·JՋl>6=[2-~N4Vx'=qlKyv>L<%{=^ ETK8Q]WSSby_I'OF,t[nkl\ElG*vuuWE9E IUae/7w!G/lӀAC@Ϟ}z`6Oh|?OIKSixN1گa{[qSʰ}|1O m~`^ ؐj lhG *:!.<汈:Q>?% d7-}ٴџ+7xp6E쉑?f.,ޟ#@Su#bsT {>/_y.}x71bOk~|_~=}4>2lxFHz|%N`%JSNeSOgH3 ZzL]JÓFЍ+ P1ݡ|8P^T_;n&QǛ}@=@͍7o{kGCߵkwzOc}@`sX.H0v^K(45k>ŊI<p'@Bƌ:rrbo*VO<,B`{{ ppt zLkۛv~d={yp[[TK4]SO͂,cOAsTs#ޅ`X_"{XcAA[A m;F?+ Fٱy 7ؠ3(h9P둏SJNwH# XIxR{&fM`SAE a`IeX je@Nʊ!b?*76;|"==:!F@ؑbEE(DCq_KPvG%QyEWUI@Ebg޹g1UU爘1+hȠTTX#gO~@>}2j>ZSccD8&R^68)cߺ55ՉB(q ˣ3T ͐r=ߓ1Ə'_d.Tƻ}&lW~k%o162>/S^_ ͯ/^eLqkaji 0/}ͫ{H󇐆6~g̸IaL!~?-\2tHAoiiӦ$cbtc{Ab/;y, IncƱܼjQ@/ȯ&`iB1f믿賓Qf9xFyt0AAl%ri2r<2 Kq蒻]0sIܒ [\CXU&Eezl`)77c>_/`O#/P0 He.F['=L'؃oxsrzGbeůeϜ=O2/SM_PM[b k`}&xk^`w cZ {xB`VQ`.±2C)!tIҔSlEj 2 ?7cH1ZV`"A,MlnVdnPQۄ:, _lT"Qi=&"rB@ 7q!dw8 1O -3n3nRix"@#D=/-^Wjh,{۶mg&hH(k/Y<{/oF-o FHB\ 2G .]b0@4ZFD ۰'qaAL @}l6`{aXuuM`xI6Ƭ=ҋWXc\ފ]ZUX`>o;L;>iϚ`0Ήy*{p۰ն,7~Zo:7Ȼ7ԏΧd*!c\]/<_xpRHK KC w?w ÄWd@Izt*{3;hרi@8S~~U @!ĉ?@yy%> }.-DvME;h=p :,Ãa$c׶N4_k身:sgEy8@2wEJ,W@(LlP_ FK( ϋzyD77ozjX+r]ww?g61_) }#¡ ѠA9l d|)\zlP4 `ASii1Q=>ҩcDx؈3Rii00Hs 8?)ʳ=H!y}s_( CUM=CW.bz,` #@a1l#bvZ[@Pj3avbnLh1@SI'ay{u466|5X@e=whJ $w>w7~?wǓWI S <3ϼڦI|_UQAa: Zrߟڵ{Տ; &0@o+:l #ƦrklW߫b7C&T"eLx8 U  +_ӈڵ?X%aH@DT 8M P3sHXLCZë3+py}OQ0&;JC6 ӌ+dBTP|jͲ߿繭0o#qm"'ݳesT|ߋ;8y%%Cq*~uΎ o+͛1u=(H0}_[R\(+/0Qk/9Sv77?/nK*zƌAHVOZqx}HEr+r_O u2c@a'ҘQg0" ;XIML:hW[E1>0t~„ iQ fg̘a0-ܜdASS⩺~nq0ca6(h`&cY}@@%Eq)l>Ά2ɁA(KȦ+{{<>v˧f=!#g×{Y:MHi9bp¹=0$r,ҝG1^W'߳j{7 7 hH~RfUAk{uK=N^0x~Pp Q_Wra[-eL$G˭cΤd".!|~s0fh,G3(ߺs86V|8,^8a@F  C=}Uyyydvy$CGUP,ẃ=9Z[=ugN0@ڡ .,iT_O~kϟZO.(R_{u|S*..;Ia\Ϣ@KKs-.i@1Dn5/jzuQ hFFzeݵw5m8WꪵwsOS(M9{sğh0v֌ sÂ_pǨ )#=1Xq%[Vӎ]˄93o޼6>O!#@?Л$ *x-&F9~q=cE)s(جN>}v/p}G;,P#`@e^,`*@qtcѼ蝳>wްFvTF|,v0@ͷ_@nDE WmʚГFҐMf3SW9&s~~P{iђ?1*9s0V6CPI3G^̒_E?~ _yT?#ű&ة}q8T/` EخVm;QkA(Xrewi7( |ߡ Q@YX7Qch[V:>4/fk9_XM.a?m7zV8(26ZO{~oѼ]Ciذ&љ}w]Z g>Pn3$P G?(KcU|ggSREE_#`G ]PҠm%}bN9CMx]#:v :DgyT T'^HuoQMZj`H$Rv_rtDpmVAh={~wa-,, @: e(*3f?glDE l&{03SƏ;‚"ߣb=~wX`hhtP" ƨjn>aMgTs}e"g1@t(PhJȸҶFC~q?^CcG.|`+pм?8PQKӓ./dy1Oh~Ub?VZ1w\Ofi2oLq$"v~Dt.-$Xjb~z5Cc7dRNBmLV#~Ƣ *ϡhQNJon_I2h.b8wpРW#D|go>zL,&t0pyGtQD cT_~%xKLK5ȑZJ/^QeMZIA_2D:; ?)?V_bOd q*Kx0sH'CO(Y l#UUv2]{_V2~<.]K/?`8 z 'w . 2UNsq9/-6wznȝc lpt6]z}y)Pe!) ӿ{K{ěG;.mxGE(}g,:tvw^5XpD` $:C'}bb%/NWѨL=ᲅ:hTVV,0e˖Q>뮼G"tBO7-8P' h#tN?chW^{]|`K/Ii؁V`zj~?^b>jctʠ믹WtM徲'):{}g7 ֿ2޷X(֌3OY?CAHf:р`_ ںmQuZc@ Z56j?w ^)IUz PEIb2b-:ݞ[U3 g⣮,?A~/ǗThGhx ߴCp"_X-^vR"߿VD@6Xy2?ESFMþ5-~?Shsk7([8 f.^7I cQ& pEOrXfIDC>P}CH'mDEeehd[4꿬@05=znu::ʡLO/~l&f RmIߌ߼Ι3}G463O9Q )fT/e"/xi}tP+>ќ!(ݓ9꿃s?g?E!P*6 vk0Mk|aN:G} @ۄc5POx9Jy9/SAQ.E"~a?xOT" jTkvum(Ny蔪B 9vsѸ`L#*//t  Fņ\v?n*P9RO˞i'`hݝ[ozP< 0aAeo-2)'TzI0Bf6UR1cƐ';42`<*TNshOgwxjt5w{Xzig5sav*/@?is>if|^!lP! :OJc]7R[I#F֛>D7Mќy`JE9nᚯRE@R˯ay+kIyjfhC. V4ޮPCJaQR|Z;qDŽea? `jQ+=MYQO6(\sڸu@k4@6g6?na0zƃ07zt肏[B's$ˡцl7o8(T[W$?@fʕ4}Uts '@[_s48o.EvbOP{Ǿ^Ưȴlo#fȶ}l=0$0&YaycJޚYAV0d\л;d Xh# AϢ@*J_q tpT@Zz?~մp}0Ce(ϝ[~FkEW_EQăb_¬K꯼U (khENkWgf=ǭ_j@0G019@ Ps'aZ٦L^U5OZT: -p`yYzX^exs4 qx>볲9$IbSW?-? l㩾^00X^XWR] I?tt`]QP)u o{.3 otdU( C/[.P_S=nF(M?6뵊~ ⃟}4jxb:mu4qhO*Tr(qPӚŸ.RJ hnYO[.t+y վ27nr|?ax!A^~,_+gWR*|Yn֗yw}x@ .lۓy/u0JxTU7э}#Ǻ ?Q{I/g sj,]4ulf ʤ}t׬̹$BU4p iVsP%}Z_JI8l,?&Yƞq>w!7K* 왊mP:*F+=FIcFԂ2]p @^r 8cR`P}>9 (#wqx2E=3lN႒㹨04hb_1/}/KVϼ::ќy?:QS}u9w5Gߤi9g1Tɯ!>{i;ym|JJ|rOJUjLWT@g X,eXB&0GPh89uidS!Qo/0|S})<}+iӯ3ON*7 ~f׸D9+;}ŁTgDOGUW"40`E?P >%]߼A l@-EBaAF1znV`z[ t-{^ &dMu?C55Syy(Dž=qوvP{[5 P7\wsMA1d(!x@ cǏK-otc^;{ztE&$2iZ_ISWUyjF^52z,v^O ^ ҋFJ3fj@4@M]HB1/,x-tCնщA%NF6|̳T3 2gJOs9/?=r 3nPЌ9{G9]ˠ9z|U,:{JA4WQbFQy߅=\J=֖.b{iPqxpm<&9-nO*))a0=äq7:5b*]rG戙AĤlJ TXXB^<[7-%\/TIw}*-Yjcv)6J~gz@;ـ%9 4vyn hu껪O U,=c *I[5EEy4dpVp~pKtcN1Zږ.兎3ϸ#[f]Ö d1,ӧx =aÆs1s/T~>왗~vBv?jnޫ@i`C̝;o~tݺus}GiiJQЃF?D7xA'$ɢ Dd?(#97~!ƙ"gz~ՌCˣ|zhҧhZjL9R:;UUhz\~r^8] G D:+5\8Aͤ]_K"߸ <,{|c&[YB {]IZ4Pg^}<=GLSf0G?r3T* Y/ɾ}10p ĉ_qۅldCjtB:ku4y9d  [4J~Q/^Lov8P%񛇲{/^Ԁ"A0oZxY_0%Ri9ٍ>۶l꿞Zs=f,l@N X+lpz@{=6>Ajjjf>y}/% G Kc'g^yu(W@$O;fsPggx}G.=;q|57 DI}һ_x9Z5טU c)wE5x{㦀u rV蜙+W~foڌ%# ʜV1"CO] ŌAp.ΉfTTJ,&)0; 9|j֟c0uyܻPqFvQc$ wQc pׯ0* Č}GY=![{(KOOw^ӣ?v $ _љ]]BG~Febmhy/=d!~uV}݀ |W|ǎ-:(IxLϏ|~]wη#j #OI~+ Q^s&OʪG*,ʵ_ C3K{Ϙ%bx/p4\Lmvx=_iڲET%Bua0KnUW GZd()D'aU4 $ x< @H g u絏-Gcw몶lښRjzL_LaIH&gom|Oۊ[7>?ۓXX 1AZ.О?9k 3:<اm֑s`u?>kŊ1<7hpxx ^{UU<+F5j`^)"bpf'2;EP=VڇW?Uqqǭ0!a,s$!U~X"g ]P#ﱷV݀nggه34BY6'`/Ơ*V;;8J;;,Xx/?v.X|?#疕V>ZPX!sl݈yu+;ɋ-ˈw-T;x}ź)HrK5fP  I70,7hm[kMG_12(//J5Ьc]0;qZ˙BTgpk n6mϖiXO{{x+fsHR]])φf _nn@ւ#Շ\{*mvMY)2}+Ϗ[#oVznΏ@l#Qx<~?iU3 39&PCID-;ËC;]j/ϕpfv_=&rJ4K(%5 6>(w.`ո3"E__#żfE\bnq黽Ug} n9rSTZZ" ƆQb,Vw1w`&UbDaU;p/~_QvnJOvl #˂L٫i a,e=QpTq>Rxjٹk۶9s_2x*ߗf1@qQ_>~Ɔ`: %Ƶs5.Q!@t)\aAu4q)d(Ƹ>G(3Jw L{*Ne%ڏK6YN)1hqˬGm06Eq iG}8%~MJ3q9ӏG ?dM#f-D@}A~FF`O hj,R[[/=0"haH幩;+?o'? @G_?Zl%9@@7|t罱HԋQl.W CңukTS[-j 0bT~@~^ tx8&$?aR>6OМOMfvmC=G1Jbp[U1F(y( 4i~2#h7}HWcO/ؾb7I+OO*N+/v#|}ՒdT!S0WUN9ESǎm,>~k_~ׇCҏUP"Is~DAWEۯ1 On= { A}=#5(B{)+RSS150Jce8ث~dBÅ#<*-}c3_E?}En{jMdOWM7:C<2uTUm _cZr o :W^kL@818qy>Uj͋>ϞO룴^嶀?orvO~uu-OB09E#DB"Gfց!h X]|=Oև77%rcXSs:x˅7Y2RQ4#veY8|0|&fłS7D7Ρ`Er|%)4hu_y7Ծ٭P}֯Dv ;ʏ|xdWz%`@ys+W3|X|„I24?=iSM: t(7^f(k1 :{|FKO2b~]G!DL @H:weJ}f U)C{}fu-0(0 X.%nhe57^6KOW+XpKaAd e!c7?Or H_|ϧ?Sהۏ,ek/.4!zP]kDQ4-pJ}F[tBQÇxNq%4|O?tOjy~so2!} 'TB~ˊ]Fo{_ZNzɮۋDI yaH3aQ0X sl1Nwr4qK,'lI^>y 2?a 3 ZLY\Y]pz@%w{~NqٴC}i)T8hذmYK0 #2~VVGg;-xzyKh!{[~ 4b Ali>?1l<=V\vsK3C-4h-:`'4 k `:|?Rv/{WǮl ձf()**"ǂb{6uePq tr^(аBf1* P(e'P1Xx-Mvf Z`H޻dm~%rxy0B̾Cf#WWW Vq;VxnoWdy8V𑥚gk/4~H&Apȯ# i=?c)=ӏ_yC}JoT~}hJn&,Ff nPE2t{jT0ߨnXv9^Id`ό'we!FK'_vahi&H¡6:^OE{  VAW6/K_]D f6w'fe~ax]=CnOͼe+r" #.Zo߾#`1EOtES%u99ICs Wfrz/"9 ".v>áMfW{Efnx/]n^zy#7l1Bn Œ$%2(DHOzx zڃN!pM{k'ٛ:oܴ7|:W>T0|]+#U/;L e@I>xٔ飭 K+/wN?fa}~_>!.3fe 9(3#uZt0 |y%/5hP.o:@Q)'tX#M Gt|onoŸm$n4V5 nf7 T &@atBCJб얜^ ;[[ӬMou*ٳSSi<6A M"q!|m00e2 $A 3Ta8j/}xS҄ Umu]xsrBaQY/~TxX۲:OI8 ^{̎"9:v]X<5s㧪ZY(2P+ qʏO?hD'}H;&#V YG3ePt@x @Ffh7OH!VKmV7rxwleg;A 1=6qMQ=/SJ(\6GTA>.hgۧr`(("[(~';;oF5|faSޤlS***YjAOn+@7#>B Ci߭>C']odX nB,ꉢˡ,eD@  P! Rn{ ㅂa犾k׭Ukߪ Ҹ>{Li!y@ȩRY4W J3iG줳|Q}LBzoBVfη@jeg{oY<f Z(dOl... #\ T•i ud - F:v'>: 0`xKV` r-oTg"@@;r*&c\a2PsDO2ݿg oR455ŠK`æ5~X(*: .~;Y)F|J(Tl< ;}k#,&(jgge.- ET).<,@5vָ GU)%i;j|V`UkB3nW<Aq5@-E7"6Ŀu?"4 $X{pX6O1ݞQnbFП98k7G _jpt݀3b@LDN&{l]P~c}xQ/2m;`Un6E:,lG>/AHR5 uk߿lf]c;&a} vF6^y&F652xǾւ58e @4~HtvQTJUU(*e$?b@ !:{Cj k&RvuNJ rg6'!gV|np@p_{lrף:7BC}T6>e7-J!  ž#`n~5T]ۨQ]ȓ f$ bdl4_הtV/Gt x<#7A+P*;S^hPCQM!Pd(*>`΋/ZՇD @n,UPRUEa/zPXyXh1;Twة#P÷1чƼ륱5v@cB!/@T,I&$*DԻ#!>ЁC%#xՒhNG1bdd&ӚME&:a: RIO_C n(aX[hjnR[_TcWVT/R}50K3U6V:arae(A N}>Xg10{S̸M!Pg~쬼eG(C 3^~r _/ChAQ?_7rYiY;7?^vƉ2p*3₪+zw4xjvJ{5' D vc.hm7_b?[:x B`t42kj4qhdr u-PSLZ[[ѯ[|~&9^B]-FzrDQ4ç׀~d&L@aIXds0$LBm=᳿< <LMGs;333ge t/ԒϾx]_? ' ٹ^A k 9)!ƆhpVtxګ.vjSucOaDDC!Pd9Ia&F ՋzBZMwAew~/}#ڛ%b9??tQQSCp`=C@w `ޏžQW}"OTUaީw.(ªqDՒU%Ys-ku((wC6jj6@hU-0! u=32sV ꌥ~a5Zw4CyIp1Q*+-LJR35i\RjAQilv?58H5~l  Ч0 Ah{C) ܺ{a^gǜ pLd gI?'e B HX+؂"ӣ3^aQ߳w'X:ѻxI6No>Sm3 aMz gD Ql0Q\* LfmꕊKX5t 5qYY1 PL j< Ш+s^ɧEK!;ŲҢsq~ L*DZHO8q7vmcyxMq*Dfh"PzE9[P7.6Fvrn: Eq5 n̽"$*sB< 5x_Jpk{sƨæ`uu=v]q|uw̺_gkAJCAf`eº@-]o :&=鱭{*a92 }F~ >  D@T9srs*//NJOOP P`x2ҁQBzmvBC!r3Ԟ^7|6 qEkB]۲@U[@P 1ͭ@apS }' MaоLBwDmȺ*V3=X3^-noi꠆`ezJv=[uN vm8XGgd4:(2€À4 \Ww>|^"4xfdd ޫ[V#}}C'qyO[香4Xm~AꀺfsߧDM-ܡ||P&"G7~!iAJXBs[z֡$p5V v٨M a"@}7V]: @~cƏIG[P;'UppӮi[n;55V_r3k1:<9,g+7^Qԓ +u iF;j5^ YQ h&ڮc.bȎ8aݑc23b 0`eE=ߨm{+?\2V03~yqFZٓxS xOMn9 ,@]]6f:=MccǹS;f"lkOoIR op[kTt{b ROm&X DJscF L47LSl!PNs@&IG{K ۿG㱞δb=S~[Ki3?[n*B HP{բ@\&^ƼoEv_v߷3;@,YY`$ 76t#m7=_&8? f |ΟJI)xr2oJZũ!ǕHOa׫PPes.elVÚ۠E6 V`4~uME<}Ipag.>D hPSO Qd Ъzo3#a? xRx|kQ>cPYY ylNE<۹Wc⓿r7L=Ι s)Dcg. kh騯N IfsɴɷlMy`+ݑXY9c>No͟^[ 5^.:%&f<1xp7%?E{.HNRoUʫa`Yr3Ğ/AJ4W`'s*d ?;9A`#bs2|t~v64n@: GSu&-\C1cDW<^DPRgFSȆBd3 }#PgcvÕ^_Zul=Ş;,V6]~O>Qqz5 F HF4w8Ƕ=bQY@{#!H b))ÕWD j_ 0< n8|^Zh4ءA-VE5joqCҴɍHyuNX ]~m Y@Bn[z"P2XgQI6ikn$pn߷SxK `<4WSů}+bv,h?2|[{1FuB-&cWZ1yn0h"PrgoƏ |(Ȭ  Dn~o221 z},reOt&>2tX$K뉑O MbC&@ž{Pd ;# 61Ԉ(?sm^:Xq/e0i\s71)n\-Y ʑQCˉ Fd)t`<222 `ݦNؽ i5ggtklLMpA,tp׏W[MMAA3Nߪ=G hC:@pJ.N{vG#{he.<]sԳBWa6'Asw)h`K#/;aHM>k  C"_K;{p"3sIEP5H/oCj"P @x hj$[ S񣿯fÏ]àc軛y{|=Tw 8QK~O=4">j3\= 6qR(?__W/̆LŒ@Q{#!H  ֧ #X  kͼ3bDqa;=~χmx&7(L'Xɥk S=e0 59LS8хpǪB/hRf)㛈;Զ6Ch[}@PߌZGw軛o_t ' %ӻ`РL @ Q`g<^o:} p@ (,pWNdAXs`hu@Ue>t h#5?-Tw9Zνcb=, A12Pgf3,';osYTHLr}io Hmxk8ޛ@xNs稑}.C3ZEkd .>'8unEDDQ&  sT':A4nPHIqX*NV&at5 #A`&kEDذD+  C\s-Eh03 pg@rra8` MvB&7@8g&:,,"KjDƪP@!?FA >| l`o@je` m_P w89\N`\&8Lc _tA0l#ČŜ-(0 (@{Vtd@@xAţ˂RBwa P^Q-|c  ۍþRʱ E@X=G rinqq= ))tU:\A㷴Auu#d= C FPPZ;qylIǷ`B蝑q 0 3f>p$iԘ>yii yؒho SK=ܯh0#)h$J@Tw 8{d[{-oC=cFO hnS`mp$SdIԯ5. gԔ,Q C6^yY4_d;aEVNIrc|~'tpB8 \529 |M` lesOꍑ̚1HnN~n?t6}<3fp}ب. NӫB k+hC2tj6Egӛ]-Č@2+`k 0,bkˑJ ``k _ R01AM@ |^L$#\.Hb*_-t²룅Y݈FhhhaBĨY&@qN "~Ph/aoTZ G/zp팪^" OUW6ss qh`~=zy[^{}RsN7xU?3PIGd_rR_3tʫLB_bVXcta@%"3\>1Jڰ5:m{@ w3z& y48aH$,Vg KL@2qTU s&"I|5UU ,6|n(.[\I @V:*A |{MGYmzdϡjZ*\g~g`vVtN˝@`O>\8m˙x1ݕ{k>mr3vt[ҮA\A&?!hi:Nˠ 0SCunq# a U]s?{Ѝ&`@ ;A +45X>N // aH!@;vM?E0j"1@G٥;A4v.F`t'eA\Xy8 }+`B`o rk켝bjbO?g+k8-.+iڨQHF:qL`5gDaF@6/Z J^^1ˁAsZ0@4 TO`/@* dE@[v1PyM KD+ !<~=ID (BkI4[oYB E99DK hHn{镧0Ra1oWnw%ׇ0$k ִlQP;~\Wqúh:0ނVT8.`:W3 UnZ/}F r0f{N ,DC,t>9:OId\m*LЯ}ABW!݇nC@eJaa6|5 @@1]jG9(3!NR,Uxsן">Q%EA&۴:87 JJ{#;;ۺu]x2X&@ CxXU걐(/؍G47@<[+WO  ;IP1!oU?&#OV`0}^߼½6m$MYsGWv)) 3Qmg5G„ns*.[C؊rCOӂ!p_oxalJF+f,A@`ڤ҃@OfR!(0/+dHINW+UQr/)0+ @qI"aMaXB VطPNxMȃphii h=/Z}kg~T@f8,ڭY[ǧy[:`{qd m3'?hgK}]>0@0fJM(/Wʹ,`Aja;=bbx$[ ShѐFuħIn>\y~zTipk_7!}hf;8Si : ,6{On"7 N3'~QrLи ~Xu捷ހ4! IHf5h& 'bZ[;D#4wX[Al ,6UBQF"(M% sS$\3 4@:4#,Zg{pz4}&m8kDD hb[aA;.}vipV`Fᨿ0d!<}UPAШ(⠠v(/?Mq >.)A7L1=Z;H '<`ZVBYPSYC@A  !ބ4LFʢXk3{ t,!6|~6<.C`ZT/g^ݡ4M;ȅ@aOE27 #$eayvxg{f~p0xzi3j232ʳNhf 0o~:]Ynf^/aNm. Tࠏ2E(T0V'l N:9(~F:@%U/]OۨV).,F.2@*d7qNƗm{Xٮ ܰxY2\ms6Z+!0!{~D x@>gɎ AE@wLw]'n{IlpdA0fbF跓 #sY_sl|b+$esحٯ.F@' ۼa||t|òv~u(" B8iPEFxj ۃh>D<@b_,a~:sޖ'@x⍢Kwi+W-:Swq82hex<+MRengX8sMrBb

XMF]'@"ЦNIP={ ~!$0 '/->~#gwvDة -scs ʎ[mFXfɡǞ>@KU=CP%AqNE`^8vp.z/"| A$8aހjڔXl@/\iS<4G?O Y?AXft/kRa~\J:]` QP[WO? jnW"L% KB GgPI ')Djθw \B'D[_R8{l}8/fÏ>t9 (& '; Ų{ݴfM-d@@K" 3x:k4b>m `+6'E1`>7lۯ D-TF&C~v(f`!;leh^m~hoG:;`0(JQ 9p[kUCMm-̚R P mb.% $+ @F+y%}+s`׶Zm}eGy Eu~,)aF?^4vJ/byiO!w] a1NZ: cC.8rI)~Jb P$L^*q~hl@3pl$EbbMv8xi^"=G?l1?;YPvp8`CSCLgxX (N5@Ya/)0!{ܓD'-//RoK0 ˏ>_@@04nWJFS`<{DJ@Kw,_Q"Pk{~HtBnv~GM$lrž5a0,jkp03Eh@ӽOJfAD}F:ON)1D@159ɃA}O*jxٗ J#>j 8 @X==e@: b@=HOxsK @&>FNaAɉriᚘ=@`7<#aB4z#  .u9SD Wcb@v:qa8sDTMl/&V!~A0*JZ?z:`f׫=͚D:m@yA8ȣ綳J?j?IMq֫aAjbD`~8wL4jP3p\' Ji#`)ɅAC$, QUUU^ =K6ZM 'T @ub\ \_wރgu>2 AL||nvQaY܎miV6nZu쁇 g"}p奏MB39=!dg Z?_^IOΏ~.uɵ0 y#0~_C@55AZ4RkY5Z..jk[!}9Omn-1HSpք<@[U8R'NTU Nt"dЋ(VdtL=3nB]u][oA'3g mO>ZVqqyEعF[ߴy5.҇'ưI@1@z\n!Lz;?AsD1%`.Rx6׼i>k}_䷊sk*% ld_z@|yOKX۫Oa! v62ez 8v*++asj RE(ٍE Y € Н ࢙|3%}k`A Î--k*{"piBEb0] =07_az 6w [ =)pųN꾘 #}pՔi6|i[F/u C%D#@<+ mGBUeTTTsϿ@@jpѩ?ɄNH#pQ*(JaHtSnNW 1oz -#A8wy l`u~pCW(cM1񁀼ks |.<]g퐛'v:i7w״2y2r[zl3 맻Xgleݳ98c|6?(ll3,.ضtv8@G X'@l" \Uɲ{/Ca>2dd m>RFyYZt3/6u{S4hUٜ/I)fޜ-IH4k3z>F?p `pi ;̚dGc OYV(9#8kd:ٍ[[LDCR Dpܙ0t $UG%ǎ9s҅<U;?HwUÅ$<4c ^dK[f򄠞!? } 3;Ek0Ns-"u|LJmM!+V?Kᶵ䒾®tl(30m{3^h2&+bpM-H~sow#,{ @F~fB,!, <V 1Ɯ`.(Xl8 ݻ;鶣Gœ_Wh@8q, l;E;>(*2zFk}'jz22Z\T b+ؾcc#Q5T {n$ )#-]r_ b9^@(" zh.LΓ պ.8w_ş.s.. ]\pV.sw(Cb#3.84tZ2B;謹n.G@ A@ U"c6Ю_tqR!?c0P`>~2bܥđ+r o#@:z!&fj]!`㏪  pT7^0#PQ1lH1e|.;W.5 ғy=2ke7`.a,\5ɘƏKrbmJ6?vXADc3a<4 r\uӈD8|݄~G]U5"(@,COϭj[w 8 =KR54 6s/.!nwR}=7j(Kns=p` '(𷟺^Q},-W?˯ 쫭|'kI9]![~S*',\Ҏn2|vc?_g<-c7WbX?2`Hâ&Çŗޠ?"]@Nt D@ .瀰P`m=)iFTuFvZ]zLv{+  ~} S Sy)HK}'f-Yr -~e0uNw *Uc%m{S7-n᫛uY-?݀wF`Fu_#,I`T. w0.vp FI}08{0.@f[n=;nnD xB={T`0(@$/{X:YWb?XA(1*gL  jy]`2 %[(OثVO[ ]47_9wAXO;qAN ȕϡ&wW-438x [ À䠴 z]`_,"da 8[dy:@OF҆& 0_&a[ػw{wFtW}nOPL_ x#diH2t^3  Q8+7v}K5j`Pt]Plj0G& -^_"Eg(ՏQ p0lDq & WH@"Xl`2 : @EOᵸ7砏 ĉ&HPҸ1X>ujYw?o]8 pѽOOv,{ݸ87 pJ/ۧw?h1|: ߩcQ,Kq%MY,S:wD{X,Cb3ڦ7|6Kpa73`<62/nYq ,Pdv/Cy=l RN  RQ2cǼ-Ko5ud%(M]̬W_5^orc1@?O$>! ,B '}9 }Mx-'8.Eօ 5V_ȍV0dX:|A%`߾}kH, `4 na@ T=1aӉ  `$Ιeng YMCШ w0ApOa^Gy}~%S`qn` wmG` `=0w2` >;Q@-fnӍ!z* 0 `ha ! !r=;F!wծiBS<|XIkNǪNG˻jO~((L9i8tx_íQp\.gfdC/ c rs@;WLт'켦B5yЬG[ ?:D̷pό3/!V -f_|}z@k(<`p[#ɣ'a]۫4{nxw +N ӍA$Vq穀k0l#Fu@ff{!}r[m>F8|d_o`^xNMtC鷥SM7 Z~\Xϴ5SqnfZsKPS+4GnqSCc\ضqC#Tr Xe A!?kA J1GQ(};&s[-.ˮ]7ߡ`'] tMqك[0zah7`;!/c1-%@^~ M5ߧj[i]MOY} Z'k;tettP7@or@alѢnfPa~Lؖ 1X)rF )RTD` Y`AhP@ڠ& a`̸sFw6%}gӹ*zgx돾= \p3aRB! з26Ҙæit pmO+bǩLBqlI{|Щc-o}y/A|q`4!0RE=vl!`j@,|U!7߭VLBOe٪SG`s rNⳖg_N͏3"8r_~`6kӑ0f]K~vy68Rcf7 5? `˞ZSPM@ƿ|A0Ka0!|i֯"(KXt { M柼(yl5}g¸Jcv <785aNNTFk, bH\`@ 0Ys@@~ܰu=44ELnB=2 ~ $+ 96ɰ[zC,X6A %˷UahqH~쀾~?)e!֧o "8la۷TP.[m?$j@885໡} I Q Qu(u*#heANn2(:^OE8qXӑE0˙X(vz Ytg=M(dK46wo}5+qu+8%%GO@%%Qseq F9ah_?]f4jM@)P5m+4زu h%{;^rn $ - Gb>nW`WХ$CYL(*X"PUU[3.SQr&e! JNF9aV=[÷2n@SV$0;F.PLC5F[D>E uۧwj1MìAಲdOYłXO;uSt3ؼe3G rcbl`)J0!I lo5*|@0uߤ֑mՕm>(6;@n o|NOߏ}8& u{Md, < WLy!X\( oƨ1? )*Js-gӹ kQ7o8Nsqٰqt P6VH 2Lu=:uO@3 %cpnqd@CѰy$y0jlo0r/ e t !3D4eZ5:odz.1@u Yi6k 1?mZRMb$mz"7tz9`󮐉1`__WObT Ic>0clpoXxXPQd7@)aD\ :Iu39RRe˸[mCH{x& +ۅI69Fhsw B_W:Wߓ }Lڽ0֟ὯdXgJ$˹cKtZ~"b!_n?4jIi7[G>]d&}Fc:[>3Hj Tu7̠Z}tJ)%.).K`:8fN2 nMӴ>usk T\~Hn~˕"xD@_fӄ q}($E~{L@SpyXZZ!|P0Y:c'7N*" {.7F N]Gz8OVx.XDTIc4/G~&]֭?e F*Oga O'P= l!`(Sr: 1{gk_t}&!W?Epz8VS>`2 L</ PXEꄩg1ct=o7aH֫L|`D00\ SƳAK7O:  ANN"LF-h7=._Z ,LԢt4`6HLc Lx ڡL("M a}ls^Lqofh9ԠejZ~~]Ss <N{0OLHj}@V.A.x ?#1fC0 |Б~Feݯ|j?@q,yȁvM?TG^~sMr¥2G_3;Slg: |>Zk|L` SH}?_DXj|B DT`y8pOzc01m6|@ d+ŖiTpK_YnT3Axa[JNV jz"7Y: @a҉I8P-ze't1kB|?&CF!;cF44A] a{،?[鈚b{,g|W|.Ā/h4.@V.h]I.h1` +ǟ|4!ةF{G0LcR 9Nm,@ٽI.v>zC}-Z}x'pR=S&q lKdlV @W%y. 89h^ _P? 7^Y?mM;Uv/PfGO9~"1$NlOCS/8 Nc-/`2S^z_75(#]<.$;c 9 )D Sh]q?B߅/0L@ @TPEW:">0X -Z8ˊT=9-e#pb/t91'%t¯AST`˞.HJC1}\j|*8f{~ߤk ^1@?~ XΑV8Ze|$HTvf!K z``9>?.X/q77a>(# _2@!Z׭:L($e˗-?u,4Wo'M0XP9)Nm8ahຆ?3 Fht8,w˖m7мI7O)NoMj=c~9dfj:0&E/"z# %c~=yv6'rD9 6€ ls9s3À9&PBI$Ud3 3Q===}{^e,h1,U,>_VHBlIFy>QJ Ɍ~H-ehTU fM[\zިde`@HuhSY:.M[R LB(Z,l|{ϧgt飍g} `ik%n'>6-Fi>/ఱX. ?[F2 Ai.r ^Z' ?c=܋qe%5[ækgg`KяozvF}Wj8$ԎPZ-PQP8%L%Vm'@Ka+[b%EfOXB|]E6Ɨ3rl($u+ag~掄 dq@^FrtGZdBUM|dgS#F.w5>OW7Hϝ N+ 䝘#ESiW4&@t9 ]W^d4Z:Og9ޝH!3`$,~+N)DzzCAV֚Jf?@ ~H鸌 r?̻tkVYE ^̥ހW^]U~k"¤Q+`V`tՀhhM`WXɃ{~>LW5'.V' ;:hG.8[ui?{utiK>5 ?㆓ϣ*O&k!Cd[ƯOz~0Zik 4!(6<8 k7qAvpt?\w151ۂ, ,'/( 8t "P }_m-J// - H\r h">pѥ=wux %?=&?O?Zyl-0K%^(! "}9KTvfDsmepC9m3) s]nd$ Vf^[#Jm\Wxl~|7fR\v _dž A8ꅕDQi$-J$dXh êu%P]$/m~SQ9k͂Z[ F%GWOfM ?8XxzYH`@Ld`#xqT֮[_߶|.B/4]?`S49vq:~PJ 1.xgK/8 $3J%=^0{-IaxaI=/ꍹo>_L)h+a +GzZ'Ls ,&9V-ag} Au¢Eo@ Ȃ;p) LKb&uS %!j4hYA))Uw6oNhFQ ?`nAo IB x 5pU pV/CO#n?_D`,O;%~9/n:' ZE`S@ʡ'C\;"Ih>YzyeFȤͽ:!%o𗳚$ МuJ W+FD4`PMӚuAy(ߦG#`0$X1 'n6'\\{gL)ozob{ADѷ50IHeP yx UMxiY/QA:|x%y0|յ%PK>Z|}?cWh[#Xd)o  x5 :Iczi}d&W $0+Z .@{f2q[ݿuOWw6x2_7KZ|"X}F[FmMXf4<**0Pe~o(ck,s,d9˰䍥z2(a#Z[ յZ˵1J.@6$qwb qφ*,]J˦t L|c՟ |E$ &ک:O?e%2G׏6?U֜ iC#2n cP)F/z܁*![]>mQ0el -- cPpӗkѣ9`g>JTW偫/)㍪o-ἏR<*?cZK V*K'q) iZl:Lb 92YZOC16$+T?=mݶA,к#G #Y 1ct 9$݁3|:t|{ׅe턶N^@bfępǫrY.n0˕u{`ӎ>%vRA'՟!u>%5zޝ?+ӈen4@8"zc(&NLs挀!e+u5KkRB,%\FZ#؛G+sL.U~+5jDM6|&3 hMpBs?v)h >!`?L#3'L$S ' ηޕ{cҦ!RPNUBt ~p397mרj44 -;%u 0k5*O他L_|xF f|Hx?_\3Wr}I=0 ԌEQǩ!&$m/Bb;_~D'~$ #1'/@݃?7ͯWL2BaZr`Sr?br䷌nn#Ӱ#J8{V)y ^"tdS|Kaؑ0rL%TUUϺLV|vB7/\4F:_?n. +A& T 77 $4St 韅!φbֲgξ7.h[.$0E U~ r/RѾg^Srs쁺|jx:$&HfF!낛Z)4'@3{ ϟCàЉNXE 6}7 m L[r@v!wžѢ 00f׷X4R6re$Ձq%+ГH ;RP7\9MdPzaέ;6nBh3d-?]@_?!T< ;k{%3\ |es<Θark:5SO!>Wu}q ۡ7 `QP|ۢ0UZ5-P[ud@ 矆V(ʍ }eomxT#V[ dVcuzbi$@yoZ"Hd* #BiyBD%*$T `> %G>~ZXs2>< /,?[X.0/G(_ .!#&A@+ PXh0|me`R=fO,2kdaxvadjB{j?ߍT6nӳ*כ+躕})xsj𗱡hK@=wkU_n|~?O # qfT]3nh+ $@; ~T :z f!std)Lf&7Jo >-h-6Ju _A,""-ͻ>aE@%oB^oh f H]w϶6shӵy ˎ^3' cz"䡤LBk;:SqG/F_SR/wGB}G>ᗃ:}9s$ ˯Ϻ.]9;vE*xpTv  x$lJ!y!p4}ijۑ"p c)FĚS u-8ǀз۞+r:EK4|DlzE)gQj`p]u[{5Z[ڀ-+솘eT5b,ŝ’Nol潗~zm?ijg:Ŷ@sayc"xgPЫyTէoqq ; `,1|f @#6M4(`)T8G, `*;T 'FRG;x0;1i-bPr/'o3O $u[ep+3p Ftt'Óo]Mv ݋Ysɬ$H: ~/.d,T&x44TByF:!d}׷:;X5k߂'|| brC#?( ܝfVYu,8a!RM]D,%n|1!+@R+IdesjvEqnŗ1/$P)ADb)#ӾVi4]lG5?^ђoMIcV5e_Ej~U jE5*aX`{>}Э7hS_mx޺ Κ@[n3B0j$lsgdӽ0\fIh{yl R $2L8@;?SϬr+-#) r3E*g[VIa_;)/_j;[n64y>ErLw`#u  bGk4u1ЏUU5A=A |;ZpяaǎmПH}D4#_#oUӆ K,fֶ:/LCMdL: 1Ї~4a*.܀PA@1q_& ;2<BN">oy@@[^|uy}n{ n~yG"X ~|H5I2Y =92JB"ֱ`NݍmjŸb2xx;2J>1:pQ KTU+:W;{^N,05T]f@&kXD<'~,)Y@PBd+Mݩl 2 R48}g~_O 8u* Hx|~,X~ظ~nߖ JKpc/6$jiOϭhDBH4nØSg|8.9|( v(zf e6.]r,/~L̖zN$   tRp=a~s {ϷJV c=+Mrc~_sprܫ2Ӗ?Mx0Muw/`" aZ?N`?G܆ ]9'\v8y4 {L9`1/ QN?|Q0m ;,w=S @L[s_v!G>;n%JBu"@Ģtz/-e֞B}xc+ w#׫ˀY|1w*rT_my!G'e za;DrEn+|fc"6=[1j`VIG( yhR$g}Lz7o.-jKLmN$U|-:6]QkpowH7;?Wkހ*;_ 0j̨!P# kV_QN:홬SR돼սb狭\ El88~[ 8t]/䯨ryYض>AAiƎvcP޷@-OIx[Il)4?/O:C A@$UT(ߍ#B"{8c0%L6BK ~<ۦB?=j55v4'2?G2^{'lgZ=Y?L=?y菿7O~)p)]Pc~v:9d W 0p5/g\"_E[Ȅ#&awuF#Jܙ tww ZՀovWs?©az-# X9KfSgzߓ= 4X,M.).(q[ <>aLbup ah8{,~^_{E_+*0tDt5^'N߭O,{aT3 @Gg~+ϱT+jDP=> ʾdϷ<ͽc~?/~J`."_ Y[O5u¯ D.;xDEᥠ9@Viyg!OX<Nn`5'*܇z~H9[fS,P*fYn<{ۆ?U݀`YRBݷ~e G`1&ÑTDbۖDFGX LߍA-l!Z}hrn_E{ϙRqTbU\N}Cdx!ʠ3W^( xhP͗D,A5RrLiC[ἶF׎L `ֈ~aVmcCYg´B}dtDϚ}]ѮMv1R/p-?J}1XH"wZRL`1rGL_>6NUjXŽ;yRaj0dW.|.!pم <ּߥ~l,2(3.47n| FuܟwQ`{> PJ!Kn(MO~_lqecp:!G@xCݩxc[25ѷpox{{S(E-k6C$DЋA:}ĝGƑB%ºj@;㯫`j<Ǘˮ=?n^>PUA鯓*0czz|w ݑL@di<>s:D/<XXAX @H} P3.Mr_ߐ꫶&B(R磓$T|6''@_2r{9i |9q#Rx}ĝXQC.Fn-W[UUlphRdpWhuteEȤ!NyØ1Ģ'ZA'  ZCO jh3?iF`llМv6'mu001uCfG*XdC{KerC`@քr>90b)`VRxC-eSkύJ#@vWȟi~23n`E <~e E I\ˡN7eF9r֟ 6%QϬ?E(|۬sqS2hs;7u#t%EMd֑[A.]w8Juc&E)Z@4~qY܀ " On FC['G 0\r^|rϿc H& WS^yeà۷~_@{{Q_+)$fOֹ|>;\A:`܎@uRƷ]EM!qj :^r}TI& kc~@;\=@Ru6jgjFXex/1G Ȁ /S7t?ю^F0>~~$qL}Rǧ ЖX?LWVǬ?Bsi\v/ol«VHq$(!?vei.Z7XװoMqL~"B؜q-0W[N*T&8\wjrǪ6w|s,<kQ+8^Z;" #_JέUո]'"?oN.Z"ϯ|t#Rl9$ `B~Vɉt`_ ?y8V\Y)&KfK[#uku\~"@wu47[ZcUTـԪ@, %L'/|h ġ+cFd o;A@iYal'yz{^LN'eG{,@ұNVf۬W7Hи{M!XOx*ѝםo~0Ǹ&KvjP((و@>^ #c]iN6w[oQ}i`(+]nB'PyO~;Bc3|ss,]:,YQ$ ~k$?g}~l.UV?䗶jBKXA->{2ɣ @ڙ"w 0}. 3'"lKHd0gr5Ty) ]Y-@:uU.ӄ, @@`>~ .&w R${-Xuض}ӯa<n":gܢG?sY}/7 @h%b;$$D>Er;:dfϜWB,R\n3P"B?:J7AGj%,m J'$` @" Jc·Sf!/<`$箭}Xn5DzWJ&~_qfop r_ҩDvg[Emra ]輅@ r)fhZ#nr27> m|{4_ si`3IpSXxz PEG͇Kv`̘0wl:dJ+ JB*aP>!p$ m-k6m/WWqGÈ?)@O#4[~#\rl)-d[CC~g;VD , Z )H_pKQιb8$XQ^)S+@M|eh/`:YG]l:$^ 5%nnNP,ڮϴ^VwxW_^vK-?hO/Oepdr_>OmGM?-[8ׅ}EN$($RiS7`?N; D ]/o>@k|fogb9 )Jq{Uxޠ?˱x?(4k_ަ/o%!/Te׾v A#ZD69?`Ķ3]M=d9D6 O"3ަ *|KZ"?P)L kx= rr-InLu_4qsK߫_3׌-9-v%@c5 dsZ*-$୪R9bشyϑk*yV"[M^FyU;; z^B0E$G3"whQ ft.A*l5ǭ[~n{\^-~z0WT|'*˥}O5cAABV/GPJyjh]󉵙H|1^_pe G h2YޤSK5<\cm]8DZr j 32 $tJ`  HJ@ k& LO^X@Aέ<i|)/>_Ao[A!kO^Phܼ k#X4B$1Fp攒.=^D~B"Muq)jyɋ%/DM,-W#ޚK_,O¡fݪz|h-$@k(9 @'䐷:k|hnSNqp{8%o>7HXbʶ{u[oL͋> n{  tb`Pk*@&L-[|*1`瓗8e%/H%^B~F^o0PVW`W! r!O/0__9Eo@?'I&,.0+7V"C`ߏy zy.)ÏKDfT UMҔM,pOB " t)B$Z047! ^"=Gd,pQN`B U.Q: eFT7֞ ) np{k6Q[G9)ʱ sPYp78[|a# ueB"P_G xp9уJ2 8= 8ͱn!9u1z0A(%!z ƅRJQX OFD 0*ŬG|ݷe>~/0ˏ p?KkT@QM2QjG erѪ]" j`-;}Yn*U#H@g%?`u:^o5+h- ]A2!;>7ns*A%Ap[jXA] &$&@W G G o:mhQދT`Wg:j!.<qUadBn ULrz'bLT@. "߷ b;XeගʱK]Ei9:!"UԮɄ4.7LV3AvrR4#-Z#6ѯQދaZ }*o<hnuO-4UndՎ\Edni]eUjikrV!+T]&TG &t? [ 'DcX4fϏx|Ę||!JO'M9Q&*y@{HȿjYUKcM<{>*A.(thLs U*f8r @wy\>c>߉TNdw)KiX|*4ǯU:IDATVi%BGH!Ǻ \W͝9@]vb|Ű\b>E+8)(%P}B`XJ,*0Օ{;^^H\ĉ UHԇ5ȉEoqĐ_b/yhc>V>`~jTɺ[s[Ƚg@9rIȑ,(x<,b;=X47@')1.2?%'R13_8:c:=b;=a:=_9<^9;\8:Z7:W69U57H#( H gQ.2T57W68Z7:\8;^9d<>feb:=_:<]9;[8:X79P,0$ I#V68Y79\8;cNWmpd;>fa:=^9<\8:U/3iA0!L&[8:_BHpu{m]ii=@k>AlFKshvwrADkAD|~èèèèèè§|qr8'(\57k>Ak>Bi=Aga:=_9Ao@Cm?Bj>Ag=@e<>a:=Y15*U'''&(8>P (goj]hk?CvvsAEuBFwCGxJO|xzhu|ʵN47n>BsAEp@Dm?Bj>Ag=@d;>[26,T''''&#lQ!)j>Am?BthuvCGxDI{DH}EI}LRV=?q?CvBFsAEp@Dm?Bj>Ag<@]370V*'%!|nc X'Q!)o@CrAE~Zedptzɻ\DEuAEyDHvCFsAEp@Dm?Bi=A`482U/(Lpkqxv~qowacg200r*S )sAEwCG~n}RYU]{hlļɼ_EHyCH|EIyDHvBFrAEo@Ck>Ba594V2l}èèèèkef2T!)xCG|EIdrHMINJOMRMSZcʽcHJ|DIFJ|EIxCGuBFqADm?Bb5:7VVèèèèèètmnT!)}EIGKHM_i[cOTOUn}qOUguY\˾dJLEJGL~FJzDHwCGsAEo@Cd6:9WmоƭèèZUVPT (GLHMkyZbT[QW{fsW_yY]̿gKNFKHMGK|EIxCGtBFp@De7;>c򒊋ǙѰ|~TU&OUQWp~Z`W^Y`w[c\c[bZarV]`d˿qSVIOKPINGL}EIxCGsAEh9=CUOH@8|}PV'PVSYT[ZbZb]ep|kv\d\eW^aerTVKOKPINGL}EIxCGsAEh8=EU~QIB2myz{KU'OUZc^hY`gmwyls`gcftTXKOKPINGK|EIwCGsAEh8=DSzSKC%Ie-{|FT&zNUȀ˃΅ƗĞύ§ƇvwtWYJOJOIMGK|EIwCGrADg8P$\msDŽ̆Љ˓؎ۑٖǰ̏ˉLJÄsv~ginrmqjngj_bxHLn?Cd7;RWuXN6 a]xy;L#Qs{ɢʠʗ͉ȇĄ~ruu`baehlgkdhad]axMQd9ho«̐ω͈Ʌс~{x~qsl]_hJLuQS{VXzUXsNQSVupb4 E8fm‚čɌ͊Έ͈̇ˆȄā}zx}uzprpdf_EHgGJiHKQTtlSs3<<<)))---(%%M46imÃŅDžɆɆʆɄȄƂÀ|zw|uzrwprwmnYEGDHad=QpA~1 )_kMQLABF56fjăŃŃŃā€}{x~v{sxqvotrtƽ}x{]|%|}~/- 3^fhlREFT=?~}}{y~w|tzswptmrlpmqd_a2}~.FFFL...h K[d}}}eORC23x|zzy~w|vzsxqvotmqjohleiadsuojj777A|}....X;;;666G49uzzzzlPRA13w|v{tzsxqvpunrjoimgkdhbe_c\`W[|egwqq͒{}. ?[IN;34kow{w|v{RBCkFIswpuptnrlpjnglbe_d`d^b[_Y\UY~RVwNQpY[z|, D_`yR^_b;23lpswrwlp?89dhmrlpjnhlZ^QGKRQRNOUVEMX[X[UX~QUyORuLOoJLhEHcKMtuz{* ltO^quuWZ<01lposmrlPRU;=inhlfjdhOGJWjsIt{Ur~Y]_]BITW|PTxNQtKMoHJiFHdBE_@BY;=V=>qefy{* iqoM_nrlqiQS?01jnjnbe611dhcgbfvNSWXX/VWXJ@E|PRwLPrJMmGIhDGdAD_?AY;=X:@Y;\ Fane``wvy&4HcCOfjfjeibfC;;yNQ`evQS=00[_Y^X\I;?#"" MKLjGJnGJkEHfBDb?A]<>W9;W8:U79T57T57T57S3507Q# TTTR½wx$Z&.cgbfad`dyVW3++[_Z_=77|OSUXTWoHI!)))kFImFIiBEdAD`>@[;=W8:U79U68T57T57T57T57R03(?\  ;;;4xrs~vw!P#s}MQ^a]a\`[^YJKP79VZU@BQ68QT|OSA,.# '0-.jCFfBEb?A^j DBBh#""@ )(( L8-B:&08$&'#)%5DBmFfEaEZDTCNzCJtBHqADlACh?@d??d:Jz Nl<888 ^000B+++''')))...Gb)kڰ!'1420.+'''777#333n555,,,Fuڳ%'''%>>>;;;O '~ڷԺ z  `@@@`  ?( @  X#XR@p*/L6+>$B&F!)L$-R(0W*3[,5_.7Z+4?%@d0:O\,6\-6_.8b0};=};=r6<8Am~~z uI e/<|{>EPS1TWixrSV|ͻcHJ_02?A?A~<>};=r6<=Cl~|t g+qc0;tz>Fh3W[Y]]X\bfa13ACBD>@};=r6<@Cj t ] N F Bc/;lz>Fv7T]V[iugjb24CEDF@C=?r6HB\j-d0:Ot;D^b(_vntoxQtbgloj8;ILKNGJCEv9?MEe*xſg+iT+1fj\y"`?WNs~dinpk9s<44^b#d2<3S[8&(jqĎ֛Ԛї̓ǎyQSmonp]_FHv9?SE`3u!=dC8;Wa c.:,R[_aC/0͑U=>bdӘЖ͒ɎĊrLNdfjleh]_|BGWG`3q8J>AR`e/<&Q[ehJ56͓ːȍʼnjOQkEF}OQWYX[PUXG`= `)NBEQ_c1:~Q[ˆ_CDlLNȌƊćǾrX[_;@S89pKMwzuxqujngjjl0**7/1Z#]sEOvyvyad(nHJO35ptZ\<78555I<>\^Z]WYZr$qALorpsps ~QS0il:667777;A444cCFUXPSKN}DF{}[ pn@Likilik='(jBD `c544/02444R=>OQJLEG@B>@w9:_bĽZ l@EG@C=?};=};=};=};=l3:6Cn+WNN;?a,>e1;g2"(035qrr}{]aa``BAA' !SXN_Rz6ET*+-}r_?B)''\oDzFBKVt>*,(!"000! F/1_=@_=@_=@X9;4$&'!!F.1_=@[_=@_=@_=@_=@_=@xN36o2#%z_=@ ?A?A AAAAAAAAAAAAAApicard-release-1.3.2/picard/000077500000000000000000000000001245305550700156455ustar00rootroot00000000000000picard-release-1.3.2/picard/__init__.py000066400000000000000000000056771245305550700177750ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re PICARD_APP_NAME = "Picard" PICARD_ORG_NAME = "MusicBrainz" PICARD_VERSION = (1, 3, 2, 'final', 0) # optional build version # it should be in the form '_' # ie. win32_20140415091256 PICARD_BUILD_VERSION_STR = "" class VersionError(Exception): pass def version_to_string(version, short=False): if len(version) != 5: raise VersionError("Length != 5") if version[3] not in ('final', 'dev'): raise VersionError("Should be either 'final' or 'dev'") _version = [] for p in version: try: n = int(p) except ValueError: n = p pass _version.append(n) version = tuple(_version) if short and version[3] == 'final': if version[2] == 0: version_str = '%d.%d' % version[:2] else: version_str = '%d.%d.%d' % version[:3] else: version_str = '%d.%d.%d%s%d' % version return version_str _version_re = re.compile("(\d+)[._](\d+)(?:[._](\d+)[._]?(?:(dev|final)[._]?(\d+))?)?$") def version_from_string(version_str): m = _version_re.search(version_str) if m: g = m.groups() if g[2] is None: return (int(g[0]), int(g[1]), 0, 'final', 0) if g[3] is None: return (int(g[0]), int(g[1]), int(g[2]), 'final', 0) return (int(g[0]), int(g[1]), int(g[2]), g[3], int(g[4])) raise VersionError("String '%s' do not match regex '%s'" % (version_str, _version_re.pattern)) PICARD_VERSION_STR = version_to_string(PICARD_VERSION) PICARD_VERSION_STR_SHORT = version_to_string(PICARD_VERSION, short=True) if PICARD_BUILD_VERSION_STR: __version__ = "%s_%s" % (PICARD_VERSION_STR, PICARD_BUILD_VERSION_STR) PICARD_FANCY_VERSION_STR = "%s (%s)" % (PICARD_VERSION_STR_SHORT, PICARD_BUILD_VERSION_STR) else: __version__ = PICARD_VERSION_STR_SHORT PICARD_FANCY_VERSION_STR = PICARD_VERSION_STR_SHORT # Keep those ordered api_versions = [ "0.15.0", "0.15.1", "0.16.0", "1.0.0", "1.1.0", "1.2.0", "1.3.0", ] picard-release-1.3.2/picard/acoustid.py000066400000000000000000000257231245305550700200430ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2011 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import deque from functools import partial from PyQt4 import QtCore from picard import config, log from picard.const import FPCALC_NAMES from picard.util import find_executable from picard.webservice import XmlNode class AcoustIDClient(QtCore.QObject): def __init__(self): QtCore.QObject.__init__(self) self._queue = deque() self._running = 0 self._max_processes = 2 if not config.setting["acoustid_fpcalc"]: fpcalc_path = find_executable(*FPCALC_NAMES) if fpcalc_path: config.setting["acoustid_fpcalc"] = fpcalc_path def init(self): pass def done(self): pass def _on_lookup_finished(self, next, file, document, http, error): def make_artist_credit_node(parent, artists): artist_credit_el = parent.append_child('artist_credit') for i, artist in enumerate(artists): name_credit_el = artist_credit_el.append_child('name_credit') artist_el = name_credit_el.append_child('artist') artist_el.append_child('id').text = artist.id[0].text artist_el.append_child('name').text = artist.name[0].text artist_el.append_child('sort_name').text = artist.name[0].text if i > 0: name_credit_el.attribs['joinphrase'] = '; ' return artist_credit_el def parse_recording(recording): if 'title' not in recording.children: # we have no metadata for this recording return recording_id = recording.id[0].text recording_el = recording_list_el.append_child('recording') recording_el.attribs['id'] = recording_id recording_el.append_child('title').text = recording.title[0].text if 'duration' in recording.children: recording_el.append_child('length').text = str(int(recording.duration[0].text) * 1000) make_artist_credit_node(recording_el, recording.artists[0].artist) release_list_el = recording_el.append_child('release_list') for release_group in recording.releasegroups[0].releasegroup: for release in release_group.releases[0].release: release_el = release_list_el.append_child('release') release_el.attribs['id'] = release.id[0].text release_group_el = release_el.append_child('release_group') release_group_el.attribs['id'] = release_group.id[0].text if 'title' in release.children: release_el.append_child('title').text = release.title[0].text else: release_el.append_child('title').text = release_group.title[0].text if 'country' in release.children: release_el.append_child('country').text = release.country[0].text medium_list_el = release_el.append_child('medium_list') medium_list_el.attribs['count'] = release.medium_count[0].text for medium in release.mediums[0].medium: medium_el = medium_list_el.append_child('medium') if 'format' in medium.children: medium_el.append_child('format').text = medium.format[0].text track_list_el = medium_el.append_child('track_list') track_list_el.attribs['count'] = medium.track_count[0].text for track in medium.tracks[0].track: track_el = track_list_el.append_child('track') track_el.append_child('position').text = track.position[0].text doc = XmlNode() metadata_el = doc.append_child('metadata') acoustid_el = metadata_el.append_child('acoustid') recording_list_el = acoustid_el.append_child('recording_list') if error: mparms = { 'error': unicode(http.errorString()), 'filename': file.filename, } log.error( "AcoustID: Lookup network error for '%(filename)s': %(error)r" % mparms) self.tagger.window.set_statusbar_message( N_("AcoustID lookup network error for '%(filename)s'!"), mparms, echo=None ) else: status = document.response[0].status[0].text if status == 'ok': results = document.response[0].results[0].children.get('result') if results: result = results[0] file.metadata['acoustid_id'] = result.id[0].text if 'recordings' in result.children: for recording in result.recordings[0].recording: parse_recording(recording) log.debug("AcoustID: Lookup successful for '%s'", file.filename) else: mparms = { 'error': document.response[0].error[0].message[0].text, 'filename': file.filename } log.error( "AcoustID: Lookup error for '%(filename)s': %(error)r" % mparms) self.tagger.window.set_statusbar_message( N_("AcoustID lookup failed for '%(filename)s'!"), mparms, echo=None ) next(doc, http, error) def _lookup_fingerprint(self, next, filename, result=None, error=None): try: file = self.tagger.files[filename] except KeyError: # The file has been removed. do nothing return mparms = { 'filename': file.filename } if not result: log.debug( "AcoustID: lookup returned no result for file '%(filename)s'" % mparms ) self.tagger.window.set_statusbar_message( N_("AcoustID lookup returned no result for file '%(filename)s'"), mparms, echo=None ) file.clear_pending() return log.debug( "AcoustID: looking up the fingerprint for file '%(filename)s'" % mparms ) self.tagger.window.set_statusbar_message( N_("Looking up the fingerprint for file '%(filename)s' ..."), mparms, echo=None ) params = dict(meta='recordings releasegroups releases tracks compress') if result[0] == 'fingerprint': type, fingerprint, length = result file.acoustid_fingerprint = fingerprint file.acoustid_length = length self.tagger.acoustidmanager.add(file, None) params['fingerprint'] = fingerprint params['duration'] = str(length) else: type, recordingid = result params['recordingid'] = recordingid self.tagger.xmlws.query_acoustid(partial(self._on_lookup_finished, next, file), **params) def _on_fpcalc_finished(self, next, file, exit_code, exit_status): process = self.sender() finished = process.property('picard_finished') if finished: return process.setProperty('picard_finished', True) result = None try: self._running -= 1 self._run_next_task() process = self.sender() if exit_code == 0 and exit_status == 0: output = str(process.readAllStandardOutput()) duration = None fingerprint = None for line in output.splitlines(): parts = line.split('=', 1) if len(parts) != 2: continue if parts[0] == 'DURATION': duration = int(parts[1]) elif parts[0] == 'FINGERPRINT': fingerprint = parts[1] if fingerprint and duration: result = 'fingerprint', fingerprint, duration else: log.error( "Fingerprint calculator failed exit code = %r, exit status = %r, error = %s", exit_code, exit_status, unicode(process.errorString())) finally: next(result) def _on_fpcalc_error(self, next, filename, error): process = self.sender() finished = process.property('picard_finished') if finished: return process.setProperty('picard_finished', True) try: self._running -= 1 self._run_next_task() log.error("Fingerprint calculator failed error = %s (%r)", unicode(process.errorString()), error) finally: next(None) def _run_next_task(self): try: file, next = self._queue.popleft() except IndexError: return fpcalc = config.setting["acoustid_fpcalc"] or "fpcalc" self._running += 1 process = QtCore.QProcess(self) process.setProperty('picard_finished', False) process.finished.connect(partial(self._on_fpcalc_finished, next, file)) process.error.connect(partial(self._on_fpcalc_error, next, file)) process.start(fpcalc, ["-length", "120", file.filename]) log.debug("Starting fingerprint calculator %r %r", fpcalc, file.filename) def analyze(self, file, next): fpcalc_next = partial(self._lookup_fingerprint, next, file.filename) # use cached fingerprint fingerprints = file.metadata.getall('acoustid_fingerprint') if fingerprints: fpcalc_next(result=('fingerprint', fingerprints[0], 0)) return # calculate the fingerprint task = (file, fpcalc_next) self._queue.append(task) if self._running < self._max_processes: self._run_next_task() def stop_analyze(self, file): new_queue = deque() for task in self._queue: if task[0] != file: new_queue.appendleft(task) self._queue = new_queue picard-release-1.3.2/picard/acoustidmanager.py000066400000000000000000000075161245305550700213760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2011 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from PyQt4 import QtCore from picard import log class Submission(object): def __init__(self, fingerprint, duration, orig_recordingid=None, recordingid=None, puid=None): self.fingerprint = fingerprint self.duration = duration self.puid = puid self.orig_recordingid = orig_recordingid self.recordingid = recordingid class AcoustIDManager(QtCore.QObject): def __init__(self): QtCore.QObject.__init__(self) self._fingerprints = {} def add(self, file, recordingid): if not hasattr(file, 'acoustid_fingerprint'): return if not hasattr(file, 'acoustid_length'): return puid = file.metadata['musicip_puid'] self._fingerprints[file] = Submission(file.acoustid_fingerprint, file.acoustid_length, recordingid, recordingid, puid) self._check_unsubmitted() def update(self, file, recordingid): submission = self._fingerprints.get(file) if submission is None: return submission.recordingid = recordingid self._check_unsubmitted() def remove(self, file): if file in self._fingerprints: del self._fingerprints[file] self._check_unsubmitted() def _unsubmitted(self): for submission in self._fingerprints.itervalues(): if submission.recordingid and submission.orig_recordingid != submission.recordingid: yield submission def _check_unsubmitted(self): enabled = False for submission in self._unsubmitted(): enabled = True break self.tagger.window.enable_submit(enabled) def submit(self): fingerprints = list(self._unsubmitted()) if not fingerprints: self._check_unsubmitted() return log.debug("AcoustID: submitting ...") self.tagger.window.set_statusbar_message( N_('Submitting AcoustIDs ...'), echo=None ) self.tagger.xmlws.submit_acoustid_fingerprints(fingerprints, partial(self.__fingerprint_submission_finished, fingerprints)) def __fingerprint_submission_finished(self, fingerprints, document, http, error): if error: mparms = { 'error': unicode(http.errorString()) } log.error( "AcoustID: submission failed with error '%(error)s'" % mparms) self.tagger.window.set_statusbar_message( N_("AcoustID submission failed with error '%(error)s'"), mparms, echo=None, timeout=3000 ) else: log.debug('AcoustID: successfully submitted') self.tagger.window.set_statusbar_message( N_('AcoustIDs successfully submitted.'), echo=None, timeout=3000 ) for submission in fingerprints: submission.orig_recordingid = submission.recordingid self._check_unsubmitted() picard-release-1.3.2/picard/album.py000066400000000000000000000501011245305550700173140ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006-2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import traceback from PyQt4 import QtCore, QtNetwork from picard import config, log from picard.coverart import coverart from picard.metadata import (Metadata, register_album_metadata_processor, run_album_metadata_processors, run_track_metadata_processors) from picard.dataobj import DataObject from picard.file import File from picard.track import Track from picard.script import ScriptParser from picard.ui.item import Item from picard.util import format_time, mbid_validate from picard.util.textencoding import asciipunct from picard.cluster import Cluster from picard.collection import Collection, user_collections from picard.mbxml import ( release_group_to_metadata, release_to_metadata, medium_to_metadata, track_to_metadata, ) from picard.const import VARIOUS_ARTISTS_ID register_album_metadata_processor(coverart) class Album(DataObject, Item): release_group_loaded = QtCore.pyqtSignal() def __init__(self, id, discid=None): DataObject.__init__(self, id) self.metadata = Metadata() self.tracks = [] self.loaded = False self.load_task = None self.release_group = None self._files = 0 self._requests = 0 self._tracks_loaded = False self._discid = discid self._after_load_callbacks = [] self.unmatched_files = Cluster(_("Unmatched Files"), special=True, related_album=self, hide_if_empty=True) self.errors = [] self.status = None def __repr__(self): return '' % (self.id, self.metadata[u"album"]) def iterfiles(self, save=False): for track in self.tracks: for file in track.iterfiles(): yield file if not save: for file in self.unmatched_files.iterfiles(): yield file def _parse_release(self, document): log.debug("Loading release %r ...", self.id) self._tracks_loaded = False release_node = document.metadata[0].release[0] if release_node.id != self.id: self.tagger.mbid_redirects[self.id] = release_node.id album = self.tagger.albums.get(release_node.id) if album: log.debug("Release %r already loaded", release_node.id) album.match_files(self.unmatched_files.files) album.update() self.tagger.remove_album(self) return False else: del self.tagger.albums[self.id] self.tagger.albums[release_node.id] = self self.id = release_node.id # Get release metadata m = self._new_metadata m.length = 0 rg_node = release_node.release_group[0] rg = self.release_group = self.tagger.get_release_group_by_id(rg_node.id) rg.loaded_albums.add(self.id) rg.refcount += 1 release_group_to_metadata(rg_node, rg.metadata, rg) m.copy(rg.metadata) release_to_metadata(release_node, m, album=self) if self._discid: m['musicbrainz_discid'] = self._discid # Custom VA name if m['musicbrainz_albumartistid'] == VARIOUS_ARTISTS_ID: m['albumartistsort'] = m['albumartist'] = config.setting['va_name'] # Convert Unicode punctuation if config.setting['convert_punctuation']: m.apply_func(asciipunct) m['totaldiscs'] = release_node.medium_list[0].count # Add album to collections if "collection_list" in release_node.children: for node in release_node.collection_list[0].collection: if node.editor[0].text.lower() == config.setting["username"].lower(): if node.id not in user_collections: user_collections[node.id] = \ Collection(node.id, node.name[0].text, node.release_list[0].count) user_collections[node.id].releases.add(self.id) # Run album metadata plugins try: run_album_metadata_processors(self, m, release_node) except: self.error_append(traceback.format_exc()) self._release_node = release_node return True def _release_request_finished(self, document, http, error): if self.load_task is None: return self.load_task = None parsed = False try: if error: self.error_append(unicode(http.errorString())) # Fix for broken NAT releases if error == QtNetwork.QNetworkReply.ContentNotFoundError: nats = False nat_name = config.setting["nat_name"] files = list(self.unmatched_files.files) for file in files: recordingid = file.metadata["musicbrainz_recordingid"] if mbid_validate(recordingid) and file.metadata["album"] == nat_name: nats = True self.tagger.move_file_to_nat(file, recordingid) self.tagger.nats.update() if nats and not self.get_num_unmatched_files(): self.tagger.remove_album(self) error = False else: try: parsed = self._parse_release(document) except: error = True self.error_append(traceback.format_exc()) finally: self._requests -= 1 if parsed or error: self._finalize_loading(error) # does http need to be set to None to free the memory used by the network response? # http://pyqt.sourceforge.net/Docs/PyQt4/qnetworkaccessmanager.html says: # After the request has finished, it is the responsibility of the user # to delete the QNetworkReply object at an appropriate time. # Do not directly delete it inside the slot connected to finished(). # You can use the deleteLater() function. def error_append(self, msg): log.error(msg) self.errors.append(msg) def _finalize_loading(self, error): if error: self.metadata.clear() self.status = _("[could not load album %s]") % self.id del self._new_metadata del self._new_tracks self.update() return if self._requests > 0: return if not self._tracks_loaded: artists = set() totalalbumtracks = 0 absolutetracknumber = 0 va = self._new_metadata['musicbrainz_albumartistid'] == VARIOUS_ARTISTS_ID djmix_ars = {} if hasattr(self._new_metadata, "_djmix_ars"): djmix_ars = self._new_metadata._djmix_ars for medium_node in self._release_node.medium_list[0].medium: mm = Metadata() mm.copy(self._new_metadata) medium_to_metadata(medium_node, mm) totalalbumtracks += int(mm["totaltracks"]) for dj in djmix_ars.get(mm["discnumber"], []): mm.add("djmixer", dj) if "pregap" in medium_node.children: track = self._finalize_loading_track(medium_node.pregap[0], mm, artists, va, absolutetracknumber) track.metadata['~pregap'] = "1" for track_node in medium_node.track_list[0].track: absolutetracknumber += 1 track = self._finalize_loading_track(track_node, mm, artists, va, absolutetracknumber) if "data_track_list" in medium_node.children: for track_node in medium_node.data_track_list[0].track: absolutetracknumber += 1 track = self._finalize_loading_track(track_node, mm, artists, va, absolutetracknumber) track.metadata['~datatrack'] = "1" totalalbumtracks = str(totalalbumtracks) for track in self._new_tracks: track.metadata["~totalalbumtracks"] = totalalbumtracks if len(artists) > 1: track.metadata["~multiartist"] = "1" del self._release_node self._tracks_loaded = True if not self._requests: # Prepare parser for user's script if config.setting["enable_tagger_script"]: script = config.setting["tagger_script"] if script: parser = ScriptParser() for track in self._new_tracks: # Run tagger script for each track try: parser.eval(script, track.metadata) except: self.error_append(traceback.format_exc()) # Strip leading/trailing whitespace track.metadata.strip_whitespace() # Run tagger script for the album itself try: parser.eval(script, self._new_metadata) except: self.error_append(traceback.format_exc()) self._new_metadata.strip_whitespace() for track in self.tracks: for file in list(track.linked_files): file.move(self.unmatched_files) self.metadata = self._new_metadata self.tracks = self._new_tracks del self._new_metadata del self._new_tracks self.loaded = True self.status = None self.match_files(self.unmatched_files.files) self.update() self.tagger.window.set_statusbar_message( N_('Album %(id)s loaded: %(artist)s - %(album)s'), { 'id': self.id, 'artist': self.metadata['albumartist'], 'album': self.metadata['album'] }, timeout=3000 ) for func in self._after_load_callbacks: func() self._after_load_callbacks = [] def _finalize_loading_track(self, track_node, metadata, artists, va, absolutetracknumber): track = Track(track_node.recording[0].id, self) self._new_tracks.append(track) # Get track metadata tm = track.metadata tm.copy(metadata) track_to_metadata(track_node, track) track.metadata["~absolutetracknumber"] = absolutetracknumber track._customize_metadata() self._new_metadata.length += tm.length artists.add(tm["artist"]) if va: tm["compilation"] = "1" # Run track metadata plugins try: run_track_metadata_processors(self, tm, self._release_node, track_node) except: self.error_append(traceback.format_exc()) return track def load(self, priority=False, refresh=False): if self._requests: log.info("Not reloading, some requests are still active.") return self.tagger.window.set_statusbar_message( N_('Loading album %(id)s ...'), {'id': self.id} ) self.loaded = False self.status = _("[loading album information]") if self.release_group: self.release_group.loaded = False self.release_group.folksonomy_tags.clear() self.metadata.clear() self.folksonomy_tags.clear() self.update() self._new_metadata = Metadata() self._new_tracks = [] self._requests = 1 self.errors = [] require_authentication = False inc = ['release-groups', 'media', 'recordings', 'artist-credits', 'artists', 'aliases', 'labels', 'isrcs', 'collections'] if config.setting['release_ars'] or config.setting['track_ars']: inc += ['artist-rels', 'release-rels', 'url-rels', 'recording-rels', 'work-rels'] if config.setting['track_ars']: inc += ['recording-level-rels', 'work-level-rels'] if config.setting['folksonomy_tags']: if config.setting['only_my_tags']: require_authentication = True inc += ['user-tags'] else: inc += ['tags'] if config.setting['enable_ratings']: require_authentication = True inc += ['user-ratings'] self.load_task = self.tagger.xmlws.get_release_by_id( self.id, self._release_request_finished, inc=inc, mblogin=require_authentication, priority=priority, refresh=refresh) def run_when_loaded(self, func): if self.loaded: func() else: self._after_load_callbacks.append(func) def stop_loading(self): if self.load_task: self.tagger.xmlws.remove_task(self.load_task) self.load_task = None def update(self, update_tracks=True): if self.item: self.item.update(update_tracks) def _add_file(self, track, file): self._files += 1 self.update(update_tracks=False) def _remove_file(self, track, file): self._files -= 1 self.update(update_tracks=False) def match_files(self, files, use_recordingid=True): """Match files to tracks on this album, based on metadata similarity or recordingid.""" for file in list(files): if file.state == File.REMOVED: continue matches = [] recordingid = file.metadata['musicbrainz_recordingid'] if use_recordingid and mbid_validate(recordingid): matches = self._get_recordingid_matches(file, recordingid) if not matches: for track in self.tracks: sim = track.metadata.compare(file.orig_metadata) if sim >= config.setting['track_matching_threshold']: matches.append((sim, track)) if matches: matches.sort(reverse=True) file.move(matches[0][1]) else: file.move(self.unmatched_files) def match_file(self, file, recordingid=None): """Match the file on a track on this album, based on recordingid or metadata similarity.""" if file.state == File.REMOVED: return if recordingid is not None: matches = self._get_recordingid_matches(file, recordingid) if matches: matches.sort(reverse=True) file.move(matches[0][1]) return self.match_files([file], use_recordingid=False) def _get_recordingid_matches(self, file, recordingid): matches = [] tracknumber = file.metadata['tracknumber'] discnumber = file.metadata['discnumber'] for track in self.tracks: tm = track.metadata if recordingid == tm['musicbrainz_recordingid']: if tracknumber == tm['tracknumber']: if discnumber == tm['discnumber']: matches.append((4.0, track)) break else: matches.append((3.0, track)) else: matches.append((2.0, track)) return matches def can_save(self): return self._files > 0 def can_remove(self): return True def can_edit_tags(self): return True def can_analyze(self): return False def can_autotag(self): return False def can_refresh(self): return True def can_view_info(self): return (self.loaded and self.metadata and self.metadata.images) or self.errors def is_album_like(self): return True def get_num_matched_tracks(self): num = 0 for track in self.tracks: if track.is_linked(): num += 1 return num def get_num_unmatched_files(self): return len(self.unmatched_files.files) def get_num_total_files(self): return self._files + len(self.unmatched_files.files) def is_complete(self): if not self.tracks: return False for track in self.tracks: if track.num_linked_files != 1: return False else: return True def is_modified(self): if self.tracks: for track in self.tracks: for file in track.linked_files: if not file.is_saved(): return True return False def get_num_unsaved_files(self): count = 0 for track in self.tracks: for file in track.linked_files: if not file.is_saved(): count += 1 return count def column(self, column): if column == 'title': if self.status is not None: title = self.status else: title = self.metadata['album'] if self.tracks: linked_tracks = 0 for track in self.tracks: if track.is_linked(): linked_tracks += 1 text = u'%s\u200E (%d/%d' % (title, linked_tracks, len(self.tracks)) unmatched = self.get_num_unmatched_files() if unmatched: text += '; %d?' % (unmatched,) unsaved = self.get_num_unsaved_files() if unsaved: text += '; %d*' % (unsaved,) text += ungettext("; %i image", "; %i images", len(self.metadata.images)) % len(self.metadata.images) return text + ')' else: return title elif column == '~length': length = self.metadata.length if length: return format_time(length) else: return '' elif column == 'artist': return self.metadata['albumartist'] else: return '' def switch_release_version(self, mbid): if mbid == self.id: return for file in list(self.iterfiles(True)): file.move(self.unmatched_files) album = self.tagger.albums.get(mbid) if album: album.match_files(self.unmatched_files.files) album.update() self.tagger.remove_album(self) else: del self.tagger.albums[self.id] self.release_group.loaded_albums.discard(self.id) self.id = mbid self.tagger.albums[mbid] = self self.load(priority=True, refresh=True) class NatAlbum(Album): def __init__(self): Album.__init__(self, id="NATS") self.loaded = True self.update() def update(self, update_tracks=True): self.metadata["album"] = config.setting["nat_name"] for track in self.tracks: track.metadata["album"] = self.metadata["album"] for file in track.linked_files: track.update_file_metadata(file) Album.update(self, update_tracks) def _finalize_loading(self, error): self.update() def can_refresh(self): return False def can_browser_lookup(self): return False picard-release-1.3.2/picard/browser/000077500000000000000000000000001245305550700173305ustar00rootroot00000000000000picard-release-1.3.2/picard/browser/__init__.py000066400000000000000000000000001245305550700214270ustar00rootroot00000000000000picard-release-1.3.2/picard/browser/browser.py000066400000000000000000000061151245305550700213700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtNetwork from picard import log, config class BrowserIntegration(QtNetwork.QTcpServer): """Simple HTTP server for web browser integration.""" def __init__(self, parent=None): QtNetwork.QTcpServer.__init__(self, parent) self.newConnection.connect(self._accept_connection) self.port = 0 self.host_address = None def start(self): if self.port: self.stop() if config.setting["browser_integration_localhost_only"]: self.host_address = QtNetwork.QHostAddress(QtNetwork.QHostAddress.LocalHost) else: self.host_address = QtNetwork.QHostAddress(QtNetwork.QHostAddress.Any) for port in range(config.setting["browser_integration_port"], 65535): if self.listen(self.host_address, port): log.debug("Starting the browser integration (%s:%d)", self.host_address.toString(), port) self.port = port self.tagger.listen_port_changed.emit(self.port) break def stop(self): if self.port > 0: log.debug("Stopping the browser integration") self.port = 0 self.tagger.listen_port_changed.emit(self.port) self.close() else: log.debug("Browser integration inactive, no need to stop") def _process_request(self): conn = self.sender() line = str(conn.readLine()) conn.write("HTTP/1.1 200 OK\r\nCache-Control: max-age=0\r\n\r\nNothing to see here.") conn.disconnectFromHost() line = line.split() log.debug("Browser integration request: %r", line) if line[0] == "GET" and "?" in line[1]: action, args = line[1].split("?") args = [a.split("=", 1) for a in args.split("&")] args = dict((a, unicode(QtCore.QUrl.fromPercentEncoding(b))) for (a, b) in args) if action == "/openalbum": self.tagger.load_album(args["id"]) elif action == "/opennat": self.tagger.load_nat(args["id"]) else: log.error("Unknown browser integration request: %r", action) def _accept_connection(self): conn = self.nextPendingConnection() conn.readyRead.connect(self._process_request) picard-release-1.3.2/picard/browser/filelookup.py000066400000000000000000000102711245305550700220540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (c) 2004 Robert Kaye # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore import os.path import re from picard import log from picard.util import webbrowser2 class FileLookup(object): def __init__(self, parent, server, port, localPort): self.server = server self.localPort = int(localPort) self.port = port def _url(self, path, params={}, scheme='http'): url = QtCore.QUrl() url.setScheme(scheme) url.setHost(self.server) url.setPort(self.port if scheme != 'https' else 443) url.setPath(path) if self.localPort: params['tport'] = self.localPort for k, v in params.iteritems(): url.addQueryItem(k, unicode(v)) return url.toEncoded() def _build_launch(self, path, params={}, scheme='http'): return self.launch(self._url(path, params, scheme)) def launch(self, url): log.debug("webbrowser2: %s" % url) webbrowser2.open(url) return True def discLookup(self, url): if self.localPort: url = "%s&tport=%d" % (url, self.localPort) return self.launch(url) def _lookup(self, type_, id_): return self._build_launch("/%s/%s" % (type_, id_)) def recordingLookup(self, recording_id): return self._lookup('recording', recording_id) def albumLookup(self, album_id): return self._lookup('release', album_id) def artistLookup(self, artist_id): return self._lookup('artist', artist_id) def mbidLookup(self, string, type_): """Parses string for known entity type and mbid, open browser for it If entity type is 'release', it will load corresponding release if possible. """ uuid = '[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}' entity_type = '(?:release-group|release|recording|work|artist|label|url|area|track)' regex = r"\b(%s)?\W*(%s)" % (entity_type, uuid) m = re.search(regex, string, re.IGNORECASE) if m is None: return False if m.group(1) is None: entity = type_ else: entity = m.group(1).lower() mbid = m.group(2).lower() if entity == 'release': QtCore.QObject.tagger.load_album(mbid) return True return self._lookup(entity, mbid) def _search(self, type_, query, adv=False): if self.mbidLookup(query, type_): return True params = { 'limit': 25, 'type': type_, 'query': query, } if adv: params['adv'] = 'on' return self._build_launch('/search/textsearch', params) def artistSearch(self, query, adv=False): return self._search('artist', query, adv) def albumSearch(self, query, adv=False): return self._search('release', query, adv) def trackSearch(self, query, adv=False): return self._search('recording', query, adv) def tagLookup(self, artist, release, track, trackNum, duration, filename): params = { 'artist': artist, 'release': release, 'track': track, 'tracknum': trackNum, 'duration': duration, 'filename': os.path.basename(filename), } return self._build_launch('/taglookup', params) def collectionLookup(self, userid): return self._build_launch('/user/%s/collections' % userid, scheme='https') picard-release-1.3.2/picard/cluster.py000066400000000000000000000364421245305550700177110ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re import os import ntpath import sys from operator import itemgetter from heapq import heappush, heappop from PyQt4 import QtCore from picard import config from picard.metadata import Metadata from picard.similarity import similarity from picard.ui.item import Item from picard.util import format_time, album_artist_from_path class Cluster(QtCore.QObject, Item): # Weights for different elements when comparing a cluster to a release comparison_weights = { 'album': 17, 'albumartist': 6, 'totaltracks': 5, 'releasecountry': 2, 'format': 2, } def __init__(self, name, artist="", special=False, related_album=None, hide_if_empty=False): QtCore.QObject.__init__(self) self.item = None self.metadata = Metadata() self.metadata['album'] = name self.metadata['albumartist'] = artist self.metadata['totaltracks'] = 0 self.special = special self.hide_if_empty = hide_if_empty self.related_album = related_album self.files = [] self.lookup_task = None def __repr__(self): return '' % self.metadata['album'] def __len__(self): return len(self.files) def add_files(self, files): for file in files: self.metadata.length += file.metadata.length file._move(self) file.update(signal=False) self.files.extend(files) self.metadata['totaltracks'] = len(self.files) self.item.add_files(files) def add_file(self, file): self.metadata.length += file.metadata.length self.files.append(file) self.metadata['totaltracks'] = len(self.files) file._move(self) file.update(signal=False) self.item.add_file(file) def remove_file(self, file): self.metadata.length -= file.metadata.length self.files.remove(file) self.metadata['totaltracks'] = len(self.files) self.item.remove_file(file) if not self.special and self.get_num_files() == 0: self.tagger.remove_cluster(self) def update(self): if self.item: self.item.update() def get_num_files(self): return len(self.files) def iterfiles(self, save=False): for file in self.files: yield file def can_save(self): """Return if this object can be saved.""" if self.files: return True else: return False def can_remove(self): """Return if this object can be removed.""" return not self.special def can_edit_tags(self): """Return if this object supports tag editing.""" return True def can_analyze(self): """Return if this object can be fingerprinted.""" return any([_file.can_analyze() for _file in self.files]) def can_autotag(self): return True def can_refresh(self): return False def can_browser_lookup(self): return not self.special def is_album_like(self): return True def column(self, column): if column == 'title': return '%s (%d)' % (self.metadata['album'], len(self.files)) elif (column == '~length' and self.special) or column == 'album': return '' elif column == '~length': return format_time(self.metadata.length) elif column == 'artist': return self.metadata['albumartist'] return self.metadata[column] def _lookup_finished(self, document, http, error): self.lookup_task = None try: releases = document.metadata[0].release_list[0].release except (AttributeError, IndexError): releases = None mparms = { 'album': self.metadata['album'] } # no matches if not releases: self.tagger.window.set_statusbar_message( N_("No matching releases for cluster %(album)s"), mparms, timeout=3000 ) return # multiple matches -- calculate similarities to each of them match = sorted((self.metadata.compare_to_release( release, Cluster.comparison_weights) for release in releases), reverse=True, key=itemgetter(0))[0] if match[0] < config.setting['cluster_lookup_threshold']: self.tagger.window.set_statusbar_message( N_("No matching releases for cluster %(album)s"), mparms, timeout=3000 ) return self.tagger.window.set_statusbar_message( N_("Cluster %(album)s identified!"), mparms, timeout=3000 ) self.tagger.move_files_to_album(self.files, match[1].id) def lookup_metadata(self): """Try to identify the cluster using the existing metadata.""" if self.lookup_task: return self.tagger.window.set_statusbar_message( N_("Looking up the metadata for cluster %(album)s..."), {'album': self.metadata['album']} ) self.lookup_task = self.tagger.xmlws.find_releases(self._lookup_finished, artist=self.metadata['albumartist'], release=self.metadata['album'], tracks=str(len(self.files)), limit=25) def clear_lookup_task(self): if self.lookup_task: self.tagger.xmlws.remove_task(self.lookup_task) self.lookup_task = None @staticmethod def cluster(files, threshold): artistDict = ClusterDict() albumDict = ClusterDict() tracks = [] for file in files: artist = file.metadata["albumartist"] or file.metadata["artist"] album = file.metadata["album"] # Improve clustering from directory structure if no existing tags # Only used for grouping and to provide cluster title / artist - not added to file tags. filename = file.filename if config.setting["windows_compatibility"] or sys.platform == "win32": filename = ntpath.splitdrive(filename)[1] album, artist = album_artist_from_path(filename, album, artist) # For each track, record the index of the artist and album within the clusters tracks.append((artistDict.add(artist), albumDict.add(album))) artist_cluster_engine = ClusterEngine(artistDict) artist_cluster_engine.cluster(threshold) album_cluster_engine = ClusterEngine(albumDict) album_cluster_engine.cluster(threshold) # Arrange tracks into albums albums = {} for i in xrange(len(tracks)): cluster = album_cluster_engine.getClusterFromId(tracks[i][1]) if cluster is not None: albums.setdefault(cluster, []).append(i) # Now determine the most prominent names in the cluster and build the # final cluster list for album_id, album in albums.items(): album_name = album_cluster_engine.getClusterTitle(album_id) artist_max = 0 artist_id = None artist_hist = {} for track_id in album: cluster = artist_cluster_engine.getClusterFromId( tracks[track_id][0]) if cluster is not None: cnt = artist_hist.get(cluster, 0) + 1 if cnt > artist_max: artist_max = cnt artist_id = cluster artist_hist[cluster] = cnt if artist_id is None: artist_name = u"Various Artists" else: artist_name = artist_cluster_engine.getClusterTitle(artist_id) yield album_name, artist_name, (files[i] for i in album) class UnmatchedFiles(Cluster): """Special cluster for 'Unmatched Files' which have no PUID and have not been clustered.""" def __init__(self): super(UnmatchedFiles, self).__init__(_(u"Unmatched Files"), special=True) def add_files(self, files): Cluster.add_files(self, files) self.tagger.window.enable_cluster(self.get_num_files() > 0) def add_file(self, file): Cluster.add_file(self, file) self.tagger.window.enable_cluster(self.get_num_files() > 0) def remove_file(self, file): Cluster.remove_file(self, file) self.tagger.window.enable_cluster(self.get_num_files() > 0) def lookup_metadata(self): self.tagger.autotag(self.files) def can_edit_tags(self): return False def can_autotag(self): return len(self.files) > 0 class ClusterList(list, Item): """A list of clusters.""" def __init__(self): super(ClusterList, self).__init__() def __hash__(self): return id(self) def iterfiles(self, save=False): for cluster in self: for file in cluster.iterfiles(save): yield file def can_save(self): return len(self) > 0 def can_analyze(self): return any([cluster.can_analyze() for cluster in self]) def can_autotag(self): return len(self) > 0 def can_browser_lookup(self): return False def lookup_metadata(self): for cluster in self: cluster.lookup_metadata() class ClusterDict(object): def __init__(self): # word -> id index self.words = {} # id -> word, token index self.ids = {} # counter for new id generation self.id = 0 self.regexp = re.compile(ur'\W', re.UNICODE) self.spaces = re.compile(ur'\s', re.UNICODE) def getSize(self): return self.id def tokenize(self, word): token = self.regexp.sub(u'', word.lower()) return token if token else self.spaces.sub(u'', word.lower()) def add(self, word): """ Add a new entry to the cluster if it does not exist. If it does exist, increment the count. Return the index of the word in the dictionary or -1 is the word is empty. """ if word == u'': return -1 token = self.tokenize(word) if token == u'': return -1 try: index, count = self.words[word] self.words[word] = (index, count + 1) except KeyError: index = self.id self.words[word] = (self.id, 1) self.ids[index] = (word, token) self.id = self.id + 1 return index def getWord(self, index): word = None try: word, token = self.ids[index] except KeyError: pass return word def getToken(self, index): token = None try: word, token = self.ids[index] except KeyError: pass return token def getWordAndCount(self, index): word = None count = 0 try: word, token = self.ids[index] index, count = self.words[word] except KeyError: pass return word, count class ClusterEngine(object): def __init__(self, clusterDict): # the cluster dictionary we're using self.clusterDict = clusterDict # keeps track of unique cluster index self.clusterCount = 0 # Keeps track of the clusters we've created self.clusterBins = {} # Index the word ids -> clusters self.idClusterIndex = {} def getClusterFromId(self, id): return self.idClusterIndex.get(id) def printCluster(self, cluster): if cluster < 0: print "[no such cluster]" return bin = self.clusterBins[cluster] print cluster, " -> ", ", ".join([("'" + self.clusterDict.getWord(i) + "'") for i in bin]) def getClusterTitle(self, cluster): if cluster < 0: return "" max = 0 maxWord = u'' for id in self.clusterBins[cluster]: word, count = self.clusterDict.getWordAndCount(id) if count >= max: maxWord = word max = count return maxWord def cluster(self, threshold): # Keep the matches sorted in a heap heap = [] for y in xrange(self.clusterDict.getSize()): for x in xrange(y): if x != y: c = similarity(self.clusterDict.getToken(x).lower(), self.clusterDict.getToken(y).lower()) if c >= threshold: heappush(heap, ((1.0 - c), [x, y])) QtCore.QCoreApplication.processEvents() for i in xrange(self.clusterDict.getSize()): word, count = self.clusterDict.getWordAndCount(i) if word and count > 1: self.clusterBins[self.clusterCount] = [i] self.idClusterIndex[i] = self.clusterCount self.clusterCount = self.clusterCount + 1 for i in xrange(len(heap)): c, pair = heappop(heap) c = 1.0 - c try: match0 = self.idClusterIndex[pair[0]] except: match0 = -1 try: match1 = self.idClusterIndex[pair[1]] except: match1 = -1 # if neither item is in a cluster, make a new cluster if match0 == -1 and match1 == -1: self.clusterBins[self.clusterCount] = [pair[0], pair[1]] self.idClusterIndex[pair[0]] = self.clusterCount self.idClusterIndex[pair[1]] = self.clusterCount self.clusterCount = self.clusterCount + 1 continue # If cluster0 is in a bin, stick the other match into that bin if match0 >= 0 and match1 < 0: self.clusterBins[match0].append(pair[1]) self.idClusterIndex[pair[1]] = match0 continue # If cluster1 is in a bin, stick the other match into that bin if match1 >= 0 and match0 < 0: self.clusterBins[match1].append(pair[0]) self.idClusterIndex[pair[0]] = match1 continue # If both matches are already in two different clusters, merge the clusters if match1 != match0: self.clusterBins[match0].extend(self.clusterBins[match1]) for match in self.clusterBins[match1]: self.idClusterIndex[match] = match0 del self.clusterBins[match1] def can_refresh(self): return False picard-release-1.3.2/picard/collection.py000066400000000000000000000111471245305550700203560ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2013 Michael Wiencek # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from PyQt4 import QtCore from picard import config, log user_collections = {} class Collection(QtCore.QObject): def __init__(self, id, name, size): self.id = id self.name = name self.pending = set() self.size = int(size) self.releases = set() def add_releases(self, ids, callback): ids = ids - self.pending if ids: self.pending.update(ids) self.tagger.xmlws.put_to_collection(self.id, list(ids), partial(self._add_finished, ids, callback)) def remove_releases(self, ids, callback): ids = ids - self.pending if ids: self.pending.update(ids) self.tagger.xmlws.delete_from_collection(self.id, list(ids), partial(self._remove_finished, ids, callback)) def _add_finished(self, ids, callback, document, reply, error): self.pending.difference_update(ids) if not error: count = len(ids) self.releases.update(ids) self.size += count callback() mparms = { 'count': count, 'name': self.name } log.debug('Added %(count)i releases to collection "%(name)s"' % mparms) self.tagger.window.set_statusbar_message( ungettext('Added %(count)i release to collection "%(name)s"', 'Added %(count)i releases to collection "%(name)s"', count), mparms, translate=None, echo=None ) def _remove_finished(self, ids, callback, document, reply, error): self.pending.difference_update(ids) if not error: count = len(ids) self.releases.difference_update(ids) self.size -= count callback() mparms = { 'count': count, 'name': self.name } log.debug('Removed %(count)i releases from collection "%(name)s"' % mparms) self.tagger.window.set_statusbar_message( ungettext('Removed %(count)i release from collection "%(name)s"', 'Removed %(count)i releases from collection "%(name)s"', count), mparms, translate=None, echo=None ) def load_user_collections(callback=None): tagger = QtCore.QObject.tagger def request_finished(document, reply, error): if error: tagger.window.set_statusbar_message( N_("Error loading collections: %(error)s"), {'error': unicode(reply.errorString())}, echo=log.error ) return collection_list = document.metadata[0].collection_list[0] if "collection" in collection_list.children: new_collections = set() for node in collection_list.collection: if node.attribs.get(u"entity_type") != u"release": continue new_collections.add(node.id) collection = user_collections.get(node.id) if collection is None: user_collections[node.id] = Collection(node.id, node.name[0].text, node.release_list[0].count) else: collection.name = node.name[0].text collection.size = int(node.release_list[0].count) for id in set(user_collections.iterkeys()) - new_collections: del user_collections[id] if callback: callback() if config.setting["username"] and config.setting["password"]: tagger.xmlws.get_collection_list(partial(request_finished)) else: user_collections.clear() picard-release-1.3.2/picard/config.py000066400000000000000000000202041245305550700174620ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re import sys from operator import itemgetter from PyQt4 import QtCore from picard import (PICARD_APP_NAME, PICARD_ORG_NAME, PICARD_VERSION, version_to_string, version_from_string) from picard.util import LockableObject, rot13 class ConfigUpgradeError(Exception): pass class ConfigSection(LockableObject): """Configuration section.""" def __init__(self, config, name): LockableObject.__init__(self) self.__config = config self.__name = name def __getitem__(self, name): opt = Option.get(self.__name, name) if opt is None: return None return self.value(name, opt, opt.default) def __setitem__(self, name, value): self.lock_for_write() try: self.__config.setValue("%s/%s" % (self.__name, name), value) finally: self.unlock() def __contains__(self, key): key = "%s/%s" % (self.__name, key) return self.__config.contains(key) def remove(self, key): key = "%s/%s" % (self.__name, key) if self.__config.contains(key): self.__config.remove(key) def raw_value(self, key): """Return an option value without any type conversion.""" value = self.__config.value("%s/%s" % (self.__name, key)) # XXX QPyNullVariant does not exist in all PyQt versions, and was # removed entirely in PyQt5. See: # http://pyqt.sourceforge.net/Docs/PyQt5/pyqt_qvariant.html if str(type(value)) == "": return "" return value def value(self, name, type, default=None): """Return an option value converted to the given Option type.""" key = "%s/%s" % (self.__name, name) self.lock_for_read() try: if self.__config.contains(key): return type.convert(self.raw_value(name)) return default except: return default finally: self.unlock() class Config(QtCore.QSettings): """Configuration.""" def __init__(self): """Initializes the configuration.""" QtCore.QSettings.__init__(self, PICARD_ORG_NAME, PICARD_APP_NAME) self.application = ConfigSection(self, "application") self.setting = ConfigSection(self, "setting") self.persist = ConfigSection(self, "persist") self.profile = ConfigSection(self, "profile/default") self.current_preset = "default" TextOption("application", "version", '0.0.0dev0') self._version = version_from_string(self.application["version"]) self._upgrade_hooks = dict() def switchProfile(self, profilename): """Sets the current profile.""" key = u"profile/%s" % (profilename,) if self.contains(key): self.profile.name = key else: raise KeyError("Unknown profile '%s'" % (profilename,)) def register_upgrade_hook(self, func, *args): """Register a function to upgrade from one config version to another""" to_version = version_from_string(func.__name__) assert to_version <= PICARD_VERSION, "%r > %r !!!" % (to_version, PICARD_VERSION) self._upgrade_hooks[to_version] = { 'func': func, 'args': args, 'done': False } def run_upgrade_hooks(self, outputfunc=None): """Executes registered functions to upgrade config version to the latest""" if not self._upgrade_hooks: return if self._version >= PICARD_VERSION: if self._version > PICARD_VERSION: print("Warning: config file %s was created by a more recent " "version of Picard (current is %s)" % ( version_to_string(self._version), version_to_string(PICARD_VERSION) )) return for version in sorted(self._upgrade_hooks): hook = self._upgrade_hooks[version] if self._version < version: try: if outputfunc and hook['func'].__doc__: outputfunc("Config upgrade %s -> %s: %s" % ( version_to_string(self._version), version_to_string(version), hook['func'].__doc__.strip())) hook['func'](*hook['args']) except: import traceback raise ConfigUpgradeError( "Error during config upgrade from version %s to %s " "using %s():\n%s" % ( version_to_string(self._version), version_to_string(version), hook['func'].__name__, traceback.format_exc() )) else: hook['done'] = True self._version = version self._write_version() else: # hook is not applicable, mark as done hook['done'] = True if all(map(itemgetter("done"), self._upgrade_hooks.values())): # all hooks were executed, ensure config is marked with latest version self._version = PICARD_VERSION self._write_version() def _write_version(self): self.application["version"] = version_to_string(self._version) self.sync() class Option(QtCore.QObject): """Generic option.""" registry = {} def __init__(self, section, name, default): self.section = section self.name = name self.default = default if not hasattr(self, "convert"): self.convert = type(default) self.registry[(self.section, self.name)] = self @classmethod def get(cls, section, name): return cls.registry.get((section, name)) class PasswordOption(Option): """Super l33t h3ckery!""" convert = staticmethod(rot13) class TextOption(Option): convert = unicode class BoolOption(Option): @staticmethod def convert(value): # The QSettings IniFormat saves boolean values as the strings "true" # and "false". Thus, explicit boolean and string comparisons are used # to determine the value. NOTE: In PyQt >= 4.8.3, QSettings.value has # an optional "type" parameter that avoids this. But we still support # PyQt >= 4.5, so that is not used. return value is True or value == "true" class IntOption(Option): convert = int class FloatOption(Option): convert = float class ListOption(Option): convert = list class IntListOption(Option): @staticmethod def convert(value): return map(int, value) _config = Config() setting = _config.setting persist = _config.persist # http://pyqt.sourceforge.net/Docs/PyQt4/qsettings.html#fileName # QString QSettings.fileName (self) # # Returns the path where settings written using this QSettings object are stored. # # On Windows, if the format is QSettings.NativeFormat, the return value is a system registry path, not a file path. FILE_PATH = 0 REGISTRY_PATH = 1 storage = _config.fileName() if _config.format() == QtCore.QSettings.NativeFormat and sys.platform == "win32": storage_type = REGISTRY_PATH else: storage_type = FILE_PATH picard-release-1.3.2/picard/config_upgrade.py000066400000000000000000000124341245305550700211770ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2013-2014 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtGui import re from picard import (log, config) # TO ADD AN UPGRADE HOOK: # ---------------------- # add a function here, named after the version you want upgrade to # ie. upgrade_to_v1_0_0_dev_1() for 1.0.0dev1 # register it in upgrade_config() # and modify PICARD_VERSION to match it # _s = config.setting def upgrade_to_v1_0_0_final_0(): """In version 1.0, the file naming formats for single and various artist releases were merged. """ def remove_va_file_naming_format(merge=True): if merge: _s["file_naming_format"] = ( "$if($eq(%%compilation%%,1),\n$noop(Various Artist " "albums)\n%s,\n$noop(Single Artist Albums)\n%s)" % ( _s.value("va_file_naming_format", config.TextOption), _s["file_naming_format"] )) _s.remove("va_file_naming_format") _s.remove("use_va_format") if ("va_file_naming_format" in _s and "use_va_format" in _s): msgbox = QtGui.QMessageBox() if _s.value("use_va_format", config.BoolOption): remove_va_file_naming_format() msgbox.information(msgbox, _("Various Artists file naming scheme removal"), _("The separate file naming scheme for various artists " "albums has been removed in this version of Picard.\n" "Your file naming scheme has automatically been " "merged with that of single artist albums."), QtGui.QMessageBox.Ok) elif (_s.value("va_file_naming_format", config.TextOption) != r"$if2(%albumartist%,%artist%)/%album%/$if($gt(%totaldis" "cs%,1),%discnumber%-,)$num(%tracknumber%,2) %artist% - " "%title%"): answer = msgbox.question(msgbox, _("Various Artists file naming scheme removal"), _("The separate file naming scheme for various artists " "albums has been removed in this version of Picard.\n" "You currently do not use this option, but have a " "separate file naming scheme defined.\n" "Do you want to remove it or merge it with your file " "naming scheme for single artist albums?"), _("Merge"), _("Remove")) if answer: remove_va_file_naming_format(merge=False) else: remove_va_file_naming_format() else: # default format, disabled remove_va_file_naming_format(merge=False) def upgrade_to_v1_3_0_dev_1(): """Option "windows_compatible_filenames" was renamed "windows_compatibility" (PICARD-110). """ old_opt = "windows_compatible_filenames" new_opt = "windows_compatibility" if old_opt in _s: _s[new_opt] = _s.value(old_opt, config.BoolOption, True) _s.remove(old_opt) def upgrade_to_v1_3_0_dev_2(): """Option "preserved_tags" is now using comma instead of spaces as tag separator (PICARD-536) """ opt = "preserved_tags" if opt in _s: _s[opt] = re.sub(r"\s+", ",", _s[opt].strip()) def upgrade_to_v1_3_0_dev_3(): """Options were made to support lists (solving PICARD-144 and others) """ option_separators = { "preferred_release_countries": " ", "preferred_release_formats": " ", "enabled_plugins": None, "caa_image_types": None, "metadata_box_sizes": None, } for (opt, sep) in option_separators.iteritems(): if opt in _s: _s[opt] = _s.raw_value(opt).split(sep) def upgrade_to_v1_3_0_dev_4(): """Option "release_type_scores" is now a list of tuples """ def load_release_type_scores(setting): scores = [] values = setting.split() for i in range(0, len(values), 2): try: score = float(values[i + 1]) except IndexError: score = 0.0 scores.append((values[i], score)) return scores opt = "release_type_scores" if opt in _s: _s[opt] = load_release_type_scores(_s.raw_value(opt)) def upgrade_config(): cfg = config._config cfg.register_upgrade_hook(upgrade_to_v1_0_0_final_0) cfg.register_upgrade_hook(upgrade_to_v1_3_0_dev_1) cfg.register_upgrade_hook(upgrade_to_v1_3_0_dev_2) cfg.register_upgrade_hook(upgrade_to_v1_3_0_dev_3) cfg.register_upgrade_hook(upgrade_to_v1_3_0_dev_4) cfg.run_upgrade_hooks(log.debug) picard-release-1.3.2/picard/const/000077500000000000000000000000001245305550700167735ustar00rootroot00000000000000picard-release-1.3.2/picard/const/__init__.py000066400000000000000000000061671245305550700211160ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os import sys # Install gettext "noop" function in case const.py gets imported directly. import __builtin__ __builtin__.__dict__['N_'] = lambda a: a # Config directory if sys.platform == "win32": USER_DIR = os.environ.get("APPDATA", "~\\Application Data") else: USER_DIR = os.environ.get("XDG_CONFIG_HOME", "~/.config") USER_DIR = os.path.join( os.path.expanduser(USER_DIR), "MusicBrainz", "Picard" ) USER_PLUGIN_DIR = os.path.join(USER_DIR, "plugins") # AcoustID client API key ACOUSTID_KEY = 'tPrbdkhM' ACOUSTID_HOST = 'api.acoustid.org' ACOUSTID_PORT = 80 FPCALC_NAMES = ['fpcalc', 'pyfpcalc'] # Cover art archive URL and port CAA_HOST = "coverartarchive.org" CAA_PORT = 80 # URLs PICARD_URLS = { 'documentation': "http://picard.musicbrainz.org/docs/", 'troubleshooting': "http://picard.musicbrainz.org/docs/troubleshooting/", 'home': "http://picard.musicbrainz.org/", 'doc_options': "http://picard.musicbrainz.org/docs/options/", 'plugins': "http://picard.musicbrainz.org/plugins/", 'forum': "http://forums.musicbrainz.org/viewforum.php?id=2", 'donate': "http://metabrainz.org/donate", 'chromaprint': "http://acoustid.org/chromaprint#download", 'acoustid_apikey': "http://acoustid.org/api-key", 'doc_cover_art_types': "http://musicbrainz.org/doc/Cover_Art/Types", } # Various Artists MBID VARIOUS_ARTISTS_ID = '89ad4ac3-39f7-470e-963a-56509c546377' # Release formats from picard.const.attributes import MB_ATTRIBUTES RELEASE_FORMATS = {} RELEASE_PRIMARY_GROUPS = {} RELEASE_SECONDARY_GROUPS = {} for k, v in MB_ATTRIBUTES.iteritems(): if k.startswith(u'DB:medium_format/name:'): RELEASE_FORMATS[v] = v elif k.startswith(u'DB:release_group_primary_type/name:'): RELEASE_PRIMARY_GROUPS[v] = v elif k.startswith(u'DB:release_group_secondary_type/name:'): RELEASE_SECONDARY_GROUPS[v] = v # Release countries from picard.const.countries import RELEASE_COUNTRIES # List of available user interface languages from picard.const.languages import UI_LANGUAGES # List of alias locales from picard.const.locales import ALIAS_LOCALES # List of official musicbrainz servers - must support SSL for mblogin requests (such as collections). MUSICBRAINZ_SERVERS = [ 'musicbrainz.org', 'beta.musicbrainz.org', ] picard-release-1.3.2/picard/const/attributes.py000066400000000000000000000077561245305550700215520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py update_constants` to update it. MB_ATTRIBUTES = { u'DB:cover_art_archive.art_type/name:001': u'Front', u'DB:cover_art_archive.art_type/name:002': u'Back', u'DB:cover_art_archive.art_type/name:003': u'Booklet', u'DB:cover_art_archive.art_type/name:004': u'Medium', u'DB:cover_art_archive.art_type/name:005': u'Obi', u'DB:cover_art_archive.art_type/name:006': u'Spine', u'DB:cover_art_archive.art_type/name:007': u'Track', u'DB:cover_art_archive.art_type/name:008': u'Other', u'DB:cover_art_archive.art_type/name:009': u'Tray', u'DB:cover_art_archive.art_type/name:010': u'Sticker', u'DB:cover_art_archive.art_type/name:011': u'Poster', u'DB:cover_art_archive.art_type/name:012': u'Liner', u'DB:cover_art_archive.art_type/name:013': u'Watermark', u'DB:medium_format/name:001': u'CD', u'DB:medium_format/name:002': u'DVD', u'DB:medium_format/name:003': u'SACD', u'DB:medium_format/name:004': u'DualDisc', u'DB:medium_format/name:005': u'LaserDisc', u'DB:medium_format/name:006': u'MiniDisc', u'DB:medium_format/name:007': u'Vinyl', u'DB:medium_format/name:008': u'Cassette', u'DB:medium_format/name:009': u'Cartridge', u'DB:medium_format/name:010': u'Reel-to-reel', u'DB:medium_format/name:011': u'DAT', u'DB:medium_format/name:012': u'Digital Media', u'DB:medium_format/name:013': u'Other', u'DB:medium_format/name:014': u'Wax Cylinder', u'DB:medium_format/name:015': u'Piano Roll', u'DB:medium_format/name:016': u'DCC', u'DB:medium_format/name:017': u'HD-DVD', u'DB:medium_format/name:018': u'DVD-Audio', u'DB:medium_format/name:019': u'DVD-Video', u'DB:medium_format/name:020': u'Blu-ray', u'DB:medium_format/name:021': u'VHS', u'DB:medium_format/name:022': u'VCD', u'DB:medium_format/name:023': u'SVCD', u'DB:medium_format/name:024': u'Betamax', u'DB:medium_format/name:025': u'HDCD', u'DB:medium_format/name:026': u'USB Flash Drive', u'DB:medium_format/name:027': u'slotMusic', u'DB:medium_format/name:028': u'UMD', u'DB:medium_format/name:029': u'7" Vinyl', u'DB:medium_format/name:030': u'10" Vinyl', u'DB:medium_format/name:031': u'12" Vinyl', u'DB:medium_format/name:033': u'CD-R', u'DB:medium_format/name:034': u'8cm CD', u'DB:medium_format/name:035': u'Blu-spec CD', u'DB:medium_format/name:036': u'SHM-CD', u'DB:medium_format/name:037': u'HQCD', u'DB:medium_format/name:038': u'Hybrid SACD', u'DB:medium_format/name:039': u'CD+G', u'DB:medium_format/name:040': u'8cm CD+G', u'DB:medium_format/name:041': u'CDV', u'DB:medium_format/name:042': u'Enhanced CD', u'DB:medium_format/name:043': u'Data CD', u'DB:medium_format/name:044': u'DTS CD', u'DB:medium_format/name:045': u'Playbutton', u'DB:medium_format/name:046': u'Music Card', u'DB:medium_format/name:047': u'DVDplus', u'DB:medium_format/name:048': u'VinylDisc', u'DB:medium_format/name:049': u'3.5" Floppy Disk', u'DB:medium_format/name:050': u'Edison Diamond Disc', u'DB:release_group_primary_type/name:001': u'Album', u'DB:release_group_primary_type/name:002': u'Single', u'DB:release_group_primary_type/name:003': u'EP', u'DB:release_group_primary_type/name:011': u'Other', u'DB:release_group_primary_type/name:012': u'Broadcast', u'DB:release_group_secondary_type/name:001': u'Compilation', u'DB:release_group_secondary_type/name:002': u'Soundtrack', u'DB:release_group_secondary_type/name:003': u'Spokenword', u'DB:release_group_secondary_type/name:004': u'Interview', u'DB:release_group_secondary_type/name:005': u'Audiobook', u'DB:release_group_secondary_type/name:006': u'Live', u'DB:release_group_secondary_type/name:007': u'Remix', u'DB:release_group_secondary_type/name:008': u'DJ-mix', u'DB:release_group_secondary_type/name:009': u'Mixtape/Street', u'DB:release_group_secondary_type/name:010': u'Demo', } picard-release-1.3.2/picard/const/countries.py000066400000000000000000000154421245305550700213660ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py update_constants` to update it. RELEASE_COUNTRIES = { u'AD': u'Andorra', u'AE': u'United Arab Emirates', u'AF': u'Afghanistan', u'AG': u'Antigua and Barbuda', u'AI': u'Anguilla', u'AL': u'Albania', u'AM': u'Armenia', u'AN': u'Netherlands Antilles', u'AO': u'Angola', u'AQ': u'Antarctica', u'AR': u'Argentina', u'AS': u'American Samoa', u'AT': u'Austria', u'AU': u'Australia', u'AW': u'Aruba', u'AX': u'Åland Islands', u'AZ': u'Azerbaijan', u'BA': u'Bosnia and Herzegovina', u'BB': u'Barbados', u'BD': u'Bangladesh', u'BE': u'Belgium', u'BF': u'Burkina Faso', u'BG': u'Bulgaria', u'BH': u'Bahrain', u'BI': u'Burundi', u'BJ': u'Benin', u'BL': u'Saint Barthélemy', u'BM': u'Bermuda', u'BN': u'Brunei', u'BO': u'Bolivia', u'BQ': u'Bonaire, Sint Eustatius and Saba', u'BR': u'Brazil', u'BS': u'Bahamas', u'BT': u'Bhutan', u'BV': u'Bouvet Island', u'BW': u'Botswana', u'BY': u'Belarus', u'BZ': u'Belize', u'CA': u'Canada', u'CC': u'Cocos (Keeling) Islands', u'CD': u'Democratic Republic of the Congo', u'CF': u'Central African Republic', u'CG': u'Congo', u'CH': u'Switzerland', u'CI': u'Côte d\'Ivoire', u'CK': u'Cook Islands', u'CL': u'Chile', u'CM': u'Cameroon', u'CN': u'China', u'CO': u'Colombia', u'CR': u'Costa Rica', u'CS': u'Serbia and Montenegro', u'CU': u'Cuba', u'CV': u'Cape Verde', u'CW': u'Curaçao', u'CX': u'Christmas Island', u'CY': u'Cyprus', u'CZ': u'Czech Republic', u'DE': u'Germany', u'DJ': u'Djibouti', u'DK': u'Denmark', u'DM': u'Dominica', u'DO': u'Dominican Republic', u'DZ': u'Algeria', u'EC': u'Ecuador', u'EE': u'Estonia', u'EG': u'Egypt', u'EH': u'Western Sahara', u'ER': u'Eritrea', u'ES': u'Spain', u'ET': u'Ethiopia', u'FI': u'Finland', u'FJ': u'Fiji', u'FK': u'Falkland Islands', u'FM': u'Micronesia, Federated States of', u'FO': u'Faroe Islands', u'FR': u'France', u'GA': u'Gabon', u'GB': u'United Kingdom', u'GD': u'Grenada', u'GE': u'Georgia', u'GF': u'French Guiana', u'GG': u'Guernsey', u'GH': u'Ghana', u'GI': u'Gibraltar', u'GL': u'Greenland', u'GM': u'Gambia', u'GN': u'Guinea', u'GP': u'Guadeloupe', u'GQ': u'Equatorial Guinea', u'GR': u'Greece', u'GS': u'South Georgia and the South Sandwich Islands', u'GT': u'Guatemala', u'GU': u'Guam', u'GW': u'Guinea-Bissau', u'GY': u'Guyana', u'HK': u'Hong Kong', u'HM': u'Heard Island and McDonald Islands', u'HN': u'Honduras', u'HR': u'Croatia', u'HT': u'Haiti', u'HU': u'Hungary', u'ID': u'Indonesia', u'IE': u'Ireland', u'IL': u'Israel', u'IM': u'Isle of Man', u'IN': u'India', u'IO': u'British Indian Ocean Territory', u'IQ': u'Iraq', u'IR': u'Iran', u'IS': u'Iceland', u'IT': u'Italy', u'JE': u'Jersey', u'JM': u'Jamaica', u'JO': u'Jordan', u'JP': u'Japan', u'KE': u'Kenya', u'KG': u'Kyrgyzstan', u'KH': u'Cambodia', u'KI': u'Kiribati', u'KM': u'Comoros', u'KN': u'Saint Kitts and Nevis', u'KP': u'North Korea', u'KR': u'South Korea', u'KW': u'Kuwait', u'KY': u'Cayman Islands', u'KZ': u'Kazakhstan', u'LA': u'Laos', u'LB': u'Lebanon', u'LC': u'Saint Lucia', u'LI': u'Liechtenstein', u'LK': u'Sri Lanka', u'LR': u'Liberia', u'LS': u'Lesotho', u'LT': u'Lithuania', u'LU': u'Luxembourg', u'LV': u'Latvia', u'LY': u'Libya', u'MA': u'Morocco', u'MC': u'Monaco', u'MD': u'Moldova', u'ME': u'Montenegro', u'MF': u'Saint Martin (French part)', u'MG': u'Madagascar', u'MH': u'Marshall Islands', u'MK': u'Macedonia', u'ML': u'Mali', u'MM': u'Myanmar', u'MN': u'Mongolia', u'MO': u'Macao', u'MP': u'Northern Mariana Islands', u'MQ': u'Martinique', u'MR': u'Mauritania', u'MS': u'Montserrat', u'MT': u'Malta', u'MU': u'Mauritius', u'MV': u'Maldives', u'MW': u'Malawi', u'MX': u'Mexico', u'MY': u'Malaysia', u'MZ': u'Mozambique', u'NA': u'Namibia', u'NC': u'New Caledonia', u'NE': u'Niger', u'NF': u'Norfolk Island', u'NG': u'Nigeria', u'NI': u'Nicaragua', u'NL': u'Netherlands', u'NO': u'Norway', u'NP': u'Nepal', u'NR': u'Nauru', u'NU': u'Niue', u'NZ': u'New Zealand', u'OM': u'Oman', u'PA': u'Panama', u'PE': u'Peru', u'PF': u'French Polynesia', u'PG': u'Papua New Guinea', u'PH': u'Philippines', u'PK': u'Pakistan', u'PL': u'Poland', u'PM': u'Saint Pierre and Miquelon', u'PN': u'Pitcairn', u'PR': u'Puerto Rico', u'PS': u'Palestine', u'PT': u'Portugal', u'PW': u'Palau', u'PY': u'Paraguay', u'QA': u'Qatar', u'RE': u'Réunion', u'RO': u'Romania', u'RS': u'Serbia', u'RU': u'Russian Federation', u'RW': u'Rwanda', u'SA': u'Saudi Arabia', u'SB': u'Solomon Islands', u'SC': u'Seychelles', u'SD': u'Sudan', u'SE': u'Sweden', u'SG': u'Singapore', u'SH': u'Saint Helena, Ascension and Tristan da Cunha', u'SI': u'Slovenia', u'SJ': u'Svalbard and Jan Mayen', u'SK': u'Slovakia', u'SL': u'Sierra Leone', u'SM': u'San Marino', u'SN': u'Senegal', u'SO': u'Somalia', u'SR': u'Suriname', u'SS': u'South Sudan', u'ST': u'Sao Tome and Principe', u'SU': u'Soviet Union', u'SV': u'El Salvador', u'SX': u'Sint Maarten (Dutch part)', u'SY': u'Syria', u'SZ': u'Swaziland', u'TC': u'Turks and Caicos Islands', u'TD': u'Chad', u'TF': u'French Southern Territories', u'TG': u'Togo', u'TH': u'Thailand', u'TJ': u'Tajikistan', u'TK': u'Tokelau', u'TL': u'Timor-Leste', u'TM': u'Turkmenistan', u'TN': u'Tunisia', u'TO': u'Tonga', u'TR': u'Turkey', u'TT': u'Trinidad and Tobago', u'TV': u'Tuvalu', u'TW': u'Taiwan', u'TZ': u'Tanzania', u'UA': u'Ukraine', u'UG': u'Uganda', u'UM': u'United States Minor Outlying Islands', u'US': u'United States', u'UY': u'Uruguay', u'UZ': u'Uzbekistan', u'VA': u'Vatican City State (Holy See)', u'VC': u'Saint Vincent and The Grenadines', u'VE': u'Venezuela', u'VG': u'British Virgin Islands', u'VI': u'U.S. Virgin Islands', u'VN': u'Vietnam', u'VU': u'Vanuatu', u'WF': u'Wallis and Futuna', u'WS': u'Samoa', u'XC': u'Czechoslovakia', u'XE': u'Europe', u'XG': u'East Germany', u'XK': u'Kosovo', u'XW': u'[Worldwide]', u'YE': u'Yemen', u'YT': u'Mayotte', u'YU': u'Yugoslavia', u'ZA': u'South Africa', u'ZM': u'Zambia', u'ZW': u'Zimbabwe', } picard-release-1.3.2/picard/const/languages.py000066400000000000000000000063131245305550700213160ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # List of available user interface languages UI_LANGUAGES = [ #(u'af', u'Afrikaans', N_(u'Afrikaans')), #(u'ar', u'العربية', N_(u'Arabic')), #(u'ast', u'Asturianu', N_(u'Asturian')), #(u'bg', u'Български', N_(u'Bulgarian')), #(u'ca', u'Català', N_(u'Catalan')), #(u'cs', u'Čeština', N_(u'Czech')), #(u'cy', u'Cymraeg', N_(u'Welsh')), (u'da', u'Dansk', N_(u'Danish')), (u'de', u'Deutsch', N_(u'German')), #(u'el', u'ελληνικά', N_(u'Greek')), (u'en', u'English', N_(u'English')), (u'en_CA', u'English (Canada)', N_(u'English (Canada)')), (u'en_GB', u'English (UK)', N_(u'English (UK)')), #(u'eo', u'Esperanto', N_(u'Esperanto')), (u'es', u'Español', N_(u'Spanish')), (u'et', u'Eesti keel', N_(u'Estonian')), #(u'fa', u'فارسی', N_(u'Persian')), (u'fi', u'Suomi', N_(u'Finnish')), #(u'fo', u'Føroyskt', N_(u'Faroese')), (u'fr', u'Français', N_(u'French')), #(u'fr_CA', u'Français canadien', N_(u'French (Canada)')), #(u'fy', u'Frysk', N_(u'Frisian')), #(u'gl', u'Galego', N_(u'Galician')), #(u'he', u'עברית', N_(u'Hebrew')), #(u'hi', u'हिन्दी', N_(u'Hindi')), #(u'hu', u'Magyar', N_(u'Hungarian')), #(u'id', u'Bahasa Indonesia', N_(u'Indonesian')), #(u'is', u'Íslenska', N_(u'Islandic')), (u'it', u'Italiano', N_(u'Italian')), #(u'ja', u'日本語', N_(u'Japanese')), #(u'kn', u'ಕನ್ನಡ', N_(u'Kannada')), #(u'ko', u'한국어', N_(u'Korean')), #(u'lt', u'Lietuvių', N_(u'Lithuanian')), #(u'nb', u'Norsk bokmål', N_(u'Norwegian Bokmal')), #(u'nds', u'Plattdüütsch', N_(u'Low German')), (u'nl', u'Nederlands', N_(u'Dutch')), #(u'oc', u'Occitan', N_(u'Occitan')), (u'pl', u'Polski', N_(u'Polish')), #(u'pt', u'Português', N_(u'Portuguese')), (u'pt_BR', u'Português do Brasil', N_(u'Brazilian Portuguese')), #(u'ro', u'Română', N_(u'Romanian')), #(u'ru', u'Pyccĸий', N_(u'Russian')), #(u'sco', u'Scots leid', N_(u'Scots')), #(u'sk', u'Slovenčina', N_(u'Slovak')), #(u'sl', u'Slovenščina', N_(u'Slovenian')), #(u'sr', u'Србин', N_(u'Serbian')), (u'sv', u'Svenska', N_(u'Swedish')), #(u'ta', u'தமிழ்', N_(u'Tamil')), #(u'tr', u'Türkçe', N_(u'Turkish')), #(u'uk', u'Украї́нська мо́ва', N_(u'Ukrainian')), #(u'zh_CN', u'中文', N_(u'Chinese')), ] picard-release-1.3.2/picard/const/locales.py000066400000000000000000000401231245305550700207670ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # List of alias locales ALIAS_LOCALES = { u'aa': 'Afar', u'aa_DJ': 'Afar (Djibouti)', u'aa_ER': 'Afar (Eritrea)', u'aa_ER_SAAHO': 'Afar (Eritrea) (Saho)', u'aa_ET': 'Afar (Ethiopia)', u'af': 'Afrikaans', u'af_NA': 'Afrikaans (Namibia)', u'af_ZA': 'Afrikaans (South Africa)', u'ak': 'Akan', u'ak_GH': 'Akan (Ghana)', u'sq': 'Albanian', u'sq_AL': 'Albanian (Albania)', u'am': 'Amharic', u'am_ET': 'Amharic (Ethiopia)', u'ar': 'Arabic', u'ar_DZ': 'Arabic (Algeria)', u'ar_BH': 'Arabic (Bahrain)', u'ar_EG': 'Arabic (Egypt)', u'ar_IQ': 'Arabic (Iraq)', u'ar_JO': 'Arabic (Jordan)', u'ar_KW': 'Arabic (Kuwait)', u'ar_LB': 'Arabic (Lebanon)', u'ar_LY': 'Arabic (Libya)', u'ar_MA': 'Arabic (Morocco)', u'ar_OM': 'Arabic (Oman)', u'ar_QA': 'Arabic (Qatar)', u'ar_SA': 'Arabic (Saudi Arabia)', u'ar_SD': 'Arabic (Sudan)', u'ar_SY': 'Arabic (Syria)', u'ar_TN': 'Arabic (Tunisia)', u'ar_AE': 'Arabic (United Arab Emirates)', u'ar_YE': 'Arabic (Yemen)', u'hy': 'Armenian', u'hy_AM': 'Armenian (Armenia)', u'hy_AM_REVISED': 'Armenian (Armenia) (Revised Orthography)', u'as': 'Assamese', u'as_IN': 'Assamese (India)', u'cch': 'Atsam', u'cch_NG': 'Atsam (Nigeria)', u'az': 'Azerbaijani', u'az_AZ': 'Azerbaijani (Azerbaijan)', u'az_Cyrl': 'Azerbaijani (Cyrillic)', u'az_Cyrl_AZ': 'Azerbaijani (Cyrillic) (Azerbaijan)', u'az_Latn': 'Azerbaijani (Latin)', u'az_Latn_AZ': 'Azerbaijani (Latin) (Azerbaijan)', u'eu': 'Basque', u'eu_ES': 'Basque (Spain)', u'be': 'Belarusian', u'be_BY': 'Belarusian (Belarus)', u'bn': 'Bengali', u'bn_BD': 'Bengali (Bangladesh)', u'bn_IN': 'Bengali (India)', u'byn': 'Blin', u'byn_ER': 'Blin (Eritrea)', u'bs': 'Bosnian', u'bs_BA': 'Bosnian (Bosnia and Herzegovina)', u'bg': 'Bulgarian', u'bg_BG': 'Bulgarian (Bulgaria)', u'my': 'Burmese', u'my_MM': 'Burmese (Myanmar [Burma])', u'ca': 'Catalan', u'ca_ES': 'Catalan (Spain)', u'zh': 'Chinese', u'zh_CN': 'Chinese (China)', u'zh_HK': 'Chinese (Hong Kong SAR China)', u'zh_MO': 'Chinese (Macau SAR China)', u'zh_Hans': 'Chinese (Simplified Han)', u'zh_Hans_CN': 'Chinese (Simplified Han) (China)', u'zh_Hans_HK': 'Chinese (Simplified Han) (Hong Kong SAR China)', u'zh_Hans_MO': 'Chinese (Simplified Han) (Macau SAR China)', u'zh_Hans_SG': 'Chinese (Simplified Han) (Singapore)', u'zh_SG': 'Chinese (Singapore)', u'zh_TW': 'Chinese (Taiwan)', u'zh_Hant': 'Chinese (Traditional Han)', u'zh_Hant_HK': 'Chinese (Traditional Han) (Hong Kong SAR China)', u'zh_Hant_MO': 'Chinese (Traditional Han) (Macau SAR China)', u'zh_Hant_TW': 'Chinese (Traditional Han) (Taiwan)', u'cop': 'Coptic', u'kw': 'Cornish', u'kw_GB': 'Cornish (United Kingdom)', u'hr': 'Croatian', u'hr_HR': 'Croatian (Croatia)', u'cs': 'Czech', u'cs_CZ': 'Czech (Czech Republic)', u'da': 'Danish', u'da_DK': 'Danish (Denmark)', u'dv': 'Divehi', u'dv_MV': 'Divehi (Maldives)', u'nl': 'Dutch', u'nl_BE': 'Dutch (Belgium)', u'nl_NL': 'Dutch (Netherlands)', u'dz': 'Dzongkha', u'dz_BT': 'Dzongkha (Bhutan)', u'en': 'English', u'en_AS': 'English (American Samoa)', u'en_AU': 'English (Australia)', u'en_BE': 'English (Belgium)', u'en_BZ': 'English (Belize)', u'en_BW': 'English (Botswana)', u'en_CA': 'English (Canada)', u'en_Dsrt': 'English (Deseret)', u'en_Dsrt_US': 'English (Deseret) (United States)', u'en_GU': 'English (Guam)', u'en_HK': 'English (Hong Kong SAR China)', u'en_IN': 'English (India)', u'en_IE': 'English (Ireland)', u'en_JM': 'English (Jamaica)', u'en_MT': 'English (Malta)', u'en_MH': 'English (Marshall Islands)', u'en_NA': 'English (Namibia)', u'en_NZ': 'English (New Zealand)', u'en_MP': 'English (Northern Mariana Islands)', u'en_PK': 'English (Pakistan)', u'en_PH': 'English (Philippines)', u'en_Shaw': 'English (Shavian)', u'en_SG': 'English (Singapore)', u'en_ZA': 'English (South Africa)', u'en_TT': 'English (Trinidad and Tobago)', u'en_UM': 'English (U.S. Minor Outlying Islands)', u'en_VI': 'English (U.S. Virgin Islands)', u'en_GB': 'English (United Kingdom)', u'en_US': 'English (United States)', u'en_US_POSIX': 'English (United States) (Computer)', u'en_ZW': 'English (Zimbabwe)', u'eo': 'Esperanto', u'et': 'Estonian', u'et_EE': 'Estonian (Estonia)', u'ee': 'Ewe', u'ee_GH': 'Ewe (Ghana)', u'ee_TG': 'Ewe (Togo)', u'fo': 'Faroese', u'fo_FO': 'Faroese (Faroe Islands)', u'fil': 'Filipino', u'fil_PH': 'Filipino (Philippines)', u'fi': 'Finnish', u'fi_FI': 'Finnish (Finland)', u'fr': 'French', u'fr_BE': 'French (Belgium)', u'fr_CA': 'French (Canada)', u'fr_FR': 'French (France)', u'fr_LU': 'French (Luxembourg)', u'fr_MC': 'French (Monaco)', u'fr_SN': 'French (Senegal)', u'fr_CH': 'French (Switzerland)', u'fur': 'Friulian', u'fur_IT': 'Friulian (Italy)', u'gaa': 'Ga', u'gaa_GH': 'Ga (Ghana)', u'gl': 'Galician', u'gl_ES': 'Galician (Spain)', u'gez': 'Geez', u'gez_ER': 'Geez (Eritrea)', u'gez_ET': 'Geez (Ethiopia)', u'ka': 'Georgian', u'ka_GE': 'Georgian (Georgia)', u'de': 'German', u'de_AT': 'German (Austria)', u'de_BE': 'German (Belgium)', u'de_DE': 'German (Germany)', u'de_LI': 'German (Liechtenstein)', u'de_LU': 'German (Luxembourg)', u'de_CH': 'German (Switzerland)', u'el_POLYTON': 'Greek', u'el': 'Greek', u'el_CY': 'Greek (Cyprus)', u'el_GR': 'Greek (Greece)', u'gu': 'Gujarati', u'gu_IN': 'Gujarati (India)', u'ha': 'Hausa', u'ha_Arab': 'Hausa (Arabic)', u'ha_Arab_NG': 'Hausa (Arabic) (Nigeria)', u'ha_Arab_SD': 'Hausa (Arabic) (Sudan)', u'ha_GH': 'Hausa (Ghana)', u'ha_Latn': 'Hausa (Latin)', u'ha_Latn_GH': 'Hausa (Latin) (Ghana)', u'ha_Latn_NE': 'Hausa (Latin) (Niger)', u'ha_Latn_NG': 'Hausa (Latin) (Nigeria)', u'ha_NE': 'Hausa (Niger)', u'ha_NG': 'Hausa (Nigeria)', u'ha_SD': 'Hausa (Sudan)', u'haw': 'Hawaiian', u'haw_US': 'Hawaiian (United States)', u'he': 'Hebrew', u'he_IL': 'Hebrew (Israel)', u'hi': 'Hindi', u'hi_IN': 'Hindi (India)', u'hu': 'Hungarian', u'hu_HU': 'Hungarian (Hungary)', u'is': 'Icelandic', u'is_IS': 'Icelandic (Iceland)', u'ig': 'Igbo', u'ig_NG': 'Igbo (Nigeria)', u'id': 'Indonesian', u'id_ID': 'Indonesian (Indonesia)', u'ia': 'Interlingua', u'iu': 'Inuktitut', u'ga': 'Irish', u'ga_IE': 'Irish (Ireland)', u'it': 'Italian', u'it_IT': 'Italian (Italy)', u'it_CH': 'Italian (Switzerland)', u'ja': 'Japanese', u'ja_JP': 'Japanese (Japan)', u'kaj': 'Jju', u'kaj_NG': 'Jju Nigeria', u'kl': 'Kalaallisut', u'kl_GL': 'Kalaallisut (Greenland)', u'kam': 'Kamba', u'kam_KE': 'Kamba (Kenya)', u'kn': 'Kannada', u'kn_IN': 'Kannada (India)', u'kk': 'Kazakh', u'kk_Cyrl': 'Kazakh (Cyrillic)', u'kk_Cyrl_KZ': 'Kazakh (Cyrillic) (Kazakhstan)', u'kk_KZ': 'Kazakh (Kazakhstan)', u'km': 'Khmer', u'km_KH': 'Khmer (Cambodia)', u'rw': 'Kinyarwanda', u'rw_RW': 'Kinyarwanda (Rwanda)', u'ky': 'Kirghiz', u'ky_KG': 'Kirghiz (Kyrgyzstan)', u'kok': 'Konkani', u'kok_IN': 'Konkani (India)', u'ko': 'Korean', u'ko_KR': 'Korean (South Korea)', u'kfo': 'Koro', u'kfo_CI': u'Koro (Côte d’Ivoire)', u'kpe': 'Kpelle', u'kpe_GN': 'Kpelle (Guinea)', u'kpe_LR': 'Kpelle (Liberia)', u'ku': 'Kurdish', u'ku_Arab': 'Kurdish (Arabic)', u'ku_Arab_IR': 'Kurdish (Arabic) (Iran)', u'ku_Arab_IQ': 'Kurdish (Arabic) (Iraq)', u'ku_Arab_SY': 'Kurdish (Arabic) (Syria)', u'ku_IR': 'Kurdish (Iran)', u'ku_IQ': 'Kurdish (Iraq)', u'ku_Latn': 'Kurdish (Latin)', u'ku_Latn_TR': 'Kurdish (Latin) (Turkey)', u'ku_SY': 'Kurdish (Syria)', u'ku_TR': 'Kurdish (Turkey)', u'lo': 'Lao', u'lo_LA': 'Lao (Laos)', u'lv': 'Latvian', u'lv_LV': 'Latvian (Latvia)', u'ln': 'Lingala', u'ln_CG': 'Lingala (Congo - Brazzaville)', u'ln_CD': 'Lingala (Congo - Kinshasa)', u'lt': 'Lithuanian', u'lt_LT': 'Lithuanian (Lithuania)', u'nds': 'Low German', u'nds_DE': 'Low German (Germany)', u'mk': 'Macedonian', u'mk_MK': 'Macedonian (Macedonia)', u'ms': 'Malay', u'ms_BN': 'Malay (Brunei)', u'ms_MY': 'Malay (Malaysia)', u'ml': 'Malayalam', u'ml_IN': 'Malayalam (India)', u'mt': 'Maltese', u'mt_MT': 'Maltese (Malta)', u'gv': 'Manx', u'gv_GB': 'Manx (United Kingdom)', u'mr': 'Marathi', u'mr_IN': 'Marathi (India)', u'mo': 'Moldavian', u'mn': 'Mongolian', u'mn_CN': 'Mongolian (China)', u'mn_Cyrl': 'Mongolian (Cyrillic)', u'mn_Cyrl_MN': 'Mongolian (Cyrillic) (Mongolia)', u'mn_MN': 'Mongolian (Mongolia)', u'mn_Mong': 'Mongolian (Mongolian)', u'mn_Mong_CN': 'Mongolian (Mongolian) (China)', u'ne': 'Nepali', u'ne_IN': 'Nepali (India)', u'ne_NP': 'Nepali (Nepal)', u'se': 'Northern Sami', u'se_FI': 'Northern (Sami Finland)', u'se_NO': 'Northern (Sami Norway)', u'nso': 'Northern Sotho', u'nso_ZA': 'Northern Sotho (South Africa)', u'no': 'Norwegian', u'nb': u'Norwegian Bokmål', u'nb_NO': u'Norwegian Bokmål (Norway)', u'nn': 'Norwegian Nynorsk', u'nn_NO': 'Norwegian Nynorsk (Norway)', u'ny': 'Nyanja', u'ny_MW': 'Nyanja (Malawi)', u'oc': 'Occitan', u'oc_FR': 'Occitan (France)', u'or': 'Oriya', u'or_IN': 'Oriya (India)', u'om': 'Oromo', u'om_ET': 'Oromo (Ethiopia)', u'om_KE': 'Oromo (Kenya)', u'ps': 'Pashto', u'ps_AF': 'Pashto (Afghanistan)', u'fa': 'Persian', u'fa_AF': 'Persian (Afghanistan)', u'fa_IR': 'Persian (Iran)', u'pl': 'Polish', u'pl_PL': 'Polish (Poland)', u'pt': 'Portuguese', u'pt_BR': 'Portuguese (Brazil)', u'pt_PT': 'Portuguese (Portugal)', u'pa': 'Punjabi', u'pa_Arab': 'Punjabi (Arabic)', u'pa_Arab_PK': 'Punjabi (Arabic) (Pakistan)', u'pa_Guru': 'Punjabi (Gurmukhi)', u'pa_Guru_IN': 'Punjabi (Gurmukhi) (India)', u'pa_IN': 'Punjabi (India)', u'pa_PK': 'Punjabi (Pakistan)', u'ro': 'Romanian', u'ro_MD': 'Romanian (Moldova)', u'ro_RO': 'Romanian (Romania)', u'ru': 'Russian', u'ru_RU': 'Russian (Russia)', u'ru_UA': 'Russian (Ukraine)', u'sa': 'Sanskrit', u'sa_IN': 'Sanskrit (India)', u'sr_YU': 'Serbian', u'sr': 'Serbian', u'sr_BA': 'Serbian (Bosnia and Herzegovina)', u'sr_Cyrl': 'Serbian (Cyrillic)', u'sr_Cyrl_YU': 'Serbian (Cyrillic)', u'sr_Cyrl_BA': 'Serbian (Cyrillic) (Bosnia and Herzegovina)', u'sr_Cyrl_ME': 'Serbian (Cyrillic) (Montenegro)', u'sr_Cyrl_RS': 'Serbian (Cyrillic) (Serbia)', u'sr_Cyrl_CS': 'Serbian (Cyrillic) (Serbia and Montenegro)', u'sr_Latn': 'Serbian (Latin)', u'sr_Latn_YU': 'Serbian (Latin)', u'sr_Latn_BA': 'Serbian (Latin) (Bosnia and Herzegovina)', u'sr_Latn_ME': 'Serbian (Latin) (Montenegro)', u'sr_Latn_RS': 'Serbian (Latin) (Serbia)', u'sr_Latn_CS': 'Serbian (Latin) (Serbia and Montenegro)', u'sr_ME': 'Serbian (Montenegro)', u'sr_RS': 'Serbian (Serbia)', u'sr_CS': 'Serbian (Serbia and Montenegro)', u'sh': 'Serbo-Croatian', u'sh_YU': 'Serbo-Croatian', u'sh_BA': 'Serbo-Croatian (Bosnia and Herzegovina)', u'sh_CS': 'Serbo-Croatian (Serbia and Montenegro)', u'ii': 'Sichuan Yi', u'ii_CN': 'Sichuan (Yi China)', u'sid': 'Sidamo', u'sid_ET': 'Sidamo (Ethiopia)', u'si': 'Sinhala', u'si_LK': 'Sinhala (Sri Lanka)', u'sk': 'Slovak', u'sk_SK': 'Slovak (Slovakia)', u'sl': 'Slovenian', u'sl_SI': 'Slovenian (Slovenia)', u'so': 'Somali', u'so_DJ': 'Somali (Djibouti)', u'so_ET': 'Somali (Ethiopia)', u'so_KE': 'Somali (Kenya)', u'so_SO': 'Somali (Somalia)', u'nr': 'South Ndebele', u'nr_ZA': 'South Ndebele (South Africa)', u'st': 'Southern Sotho', u'st_LS': 'Southern Sotho (Lesotho)', u'st_ZA': 'Southern Sotho (South Africa)', u'es': 'Spanish', u'es_AR': 'Spanish (Argentina)', u'es_BO': 'Spanish (Bolivia)', u'es_CL': 'Spanish (Chile)', u'es_CO': 'Spanish (Colombia)', u'es_CR': 'Spanish (Costa Rica)', u'es_DO': 'Spanish (Dominican Republic)', u'es_EC': 'Spanish (Ecuador)', u'es_SV': 'Spanish (El Salvador)', u'es_GT': 'Spanish (Guatemala)', u'es_HN': 'Spanish (Honduras)', u'es_MX': 'Spanish (Mexico)', u'es_NI': 'Spanish (Nicaragua)', u'es_PA': 'Spanish (Panama)', u'es_PY': 'Spanish (Paraguay)', u'es_PE': 'Spanish (Peru)', u'es_PR': 'Spanish (Puerto Rico)', u'es_ES': 'Spanish (Spain)', u'es_US': 'Spanish (United States)', u'es_UY': 'Spanish (Uruguay)', u'es_VE': 'Spanish (Venezuela)', u'sw': 'Swahili', u'sw_KE': 'Swahili (Kenya)', u'sw_TZ': 'Swahili (Tanzania)', u'ss': 'Swati', u'ss_ZA': 'Swati (South Africa)', u'ss_SZ': 'Swati (Swaziland)', u'sv': 'Swedish', u'sv_FI': 'Swedish (Finland)', u'sv_SE': 'Swedish (Sweden)', u'gsw': 'Swiss German', u'gsw_CH': 'Swiss German (Switzerland)', u'syr': 'Syriac', u'syr_SY': 'Syriac (Syria)', u'tl': 'Tagalog', u'tg': 'Tajik', u'tg_Cyrl': 'Tajik (Cyrillic)', u'tg_Cyrl_TJ': 'Tajik (Cyrillic) (Tajikistan)', u'tg_TJ': 'Tajik (Tajikistan)', u'ta': 'Tamil', u'ta_IN': 'Tamil (India)', u'trv': 'Taroko', u'trv_TW': 'Taroko (Taiwan)', u'tt': 'Tatar', u'tt_RU': 'Tatar (Russia)', u'te': 'Telugu', u'te_IN': 'Telugu (India)', u'th': 'Thai', u'th_TH': 'Thai (Thailand)', u'bo': 'Tibetan', u'bo_CN': 'Tibetan (China)', u'bo_IN': 'Tibetan (India)', u'tig': 'Tigre', u'tig_ER': 'Tigre (Eritrea)', u'ti': 'Tigrinya', u'ti_ER': 'Tigrinya (Eritrea)', u'ti_ET': 'Tigrinya (Ethiopia)', u'to': 'Tonga', u'to_TO': 'Tonga (Tonga)', u'ts': 'Tsonga', u'ts_ZA': 'Tsonga (South Africa)', u'tn': 'Tswana', u'tn_ZA': 'Tswana (South Africa)', u'tr': 'Turkish', u'tr_TR': 'Turkish (Turkey)', u'kcg': 'Tyap', u'kcg_NG': 'Tyap (Nigeria)', u'ug': 'Uighur', u'ug_Arab': 'Uighur (Arabic)', u'ug_Arab_CN': 'Uighur (Arabic) (China)', u'ug_CN': 'Uighur (China)', u'uk': 'Ukrainian', u'uk_UA': 'Ukrainian (Ukraine)', u'ur': 'Urdu', u'ur_IN': 'Urdu (India)', u'ur_PK': 'Urdu (Pakistan)', u'uz': 'Uzbek', u'uz_AF': 'Uzbek (Afghanistan)', u'uz_Arab': 'Uzbek (Arabic)', u'uz_Arab_AF': 'Uzbek (Arabic) (Afghanistan)', u'uz_Cyrl': 'Uzbek (Cyrillic)', u'uz_Cyrl_UZ': 'Uzbek (Cyrillic) (Uzbekistan)', u'uz_Latn': 'Uzbek (Latin)', u'uz_Latn_UZ': 'Uzbek (Latin) (Uzbekistan)', u'uz_UZ': 'Uzbek (Uzbekistan)', u've': 'Venda', u've_ZA': 'Venda (South Africa)', u'vi': 'Vietnamese', u'vi_VN': 'Vietnamese (Vietnam)', u'wal': 'Walamo', u'wal_ET': 'Walamo (Ethiopia)', u'cy': 'Welsh', u'cy_GB': 'Welsh (United Kingdom)', u'wo': 'Wolof', u'wo_Latn': 'Wolof (Latin)', u'wo_Latn_SN': 'Wolof (Latin) (Senegal)', u'wo_SN': 'Wolof (Senegal)', u'xh': 'Xhosa', u'xh_ZA': 'Xhosa (South Africa)', u'yo': 'Yoruba', u'yo_NG': 'Yoruba (Nigeria)', u'zu': 'Zulu', u'zu_ZA': 'Zulu (South Africa)', } picard-release-1.3.2/picard/coverart/000077500000000000000000000000001245305550700174725ustar00rootroot00000000000000picard-release-1.3.2/picard/coverart/__init__.py000066400000000000000000000171701245305550700216110ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Oliver Charles # Copyright (C) 2007-2011 Philipp Wolfer # Copyright (C) 2007, 2010, 2011 Lukáš Lalinský # Copyright (C) 2011 Michael Wiencek # Copyright (C) 2011-2012 Wieland Hoffmann # Copyright (C) 2013-2014 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import traceback from picard.coverart.providers import cover_art_providers, CoverArtProvider from functools import partial from picard import config, log from picard.coverart.image import (CoverArtImageIOError, CoverArtImageIdentificationError) from PyQt4.QtCore import QObject class CoverArt: def __init__(self, album, metadata, release): self._queue_new() self.album = album self.metadata = metadata self.release = release self.front_image_found = False def __repr__(self): return "CoverArt for %r" % (self.album) def retrieve(self): """Retrieve available cover art images for the release""" if (not config.setting["save_images_to_tags"] and not config.setting["save_images_to_files"]): log.debug("Cover art disabled by user options.") return self.providers = cover_art_providers() self.download_next_in_queue() def _coverart_downloaded(self, coverartimage, data, http, error): """Handle finished download, save it to metadata""" self.album._requests -= 1 if error: self.album.error_append(u'Coverart error: %s' % (unicode(http.errorString()))) elif len(data) < 1000: log.warning("Not enough data, skipping %s" % coverartimage) else: self._message( N_("Cover art of type '%(type)s' downloaded for %(albumid)s from %(host)s"), { 'type': coverartimage.types_as_string(), 'albumid': self.album.id, 'host': coverartimage.host }, echo=None ) try: coverartimage.set_data(data) if coverartimage.can_be_saved_to_metadata: log.debug("Cover art image downloaded: %r [%s]" % ( coverartimage, coverartimage.imageinfo_as_string()) ) self.metadata.append_image(coverartimage) for track in self.album._new_tracks: track.metadata.append_image(coverartimage) # If the image already was a front image, # there might still be some other non-CAA front # images in the queue - ignore them. if not self.front_image_found: self.front_image_found = coverartimage.is_front_image() else: log.debug("Thumbnail for cover art image downloaded: %r [%s]" % ( coverartimage, coverartimage.imageinfo_as_string()) ) except CoverArtImageIOError as e: self.album.error_append(unicode(e)) self.album._finalize_loading(error=True) # It doesn't make sense to store/download more images if we can't # save them in the temporary folder, abort. return except CoverArtImageIdentificationError as e: self.album.error_append(unicode(e)) self.download_next_in_queue() def download_next_in_queue(self): """Downloads next item in queue. If there are none left, loading of album will be finalized. """ if self.album.id not in self.album.tagger.albums: # album removed return if (self.front_image_found and config.setting["save_images_to_tags"] and not config.setting["save_images_to_files"] and config.setting["save_only_front_images_to_tags"]): # no need to continue self.album._finalize_loading(None) return if self._queue_empty(): if self.providers: # requeue from next provider provider, name = self.providers.pop(0) ret = CoverArtProvider._STARTED try: p = provider(self) if p.enabled(): log.debug("Trying cover art provider %s ..." % name) ret = p.queue_downloads() else: log.debug("Skipping cover art provider %s ..." % name) except: log.error(traceback.format_exc()) raise finally: if ret != CoverArtProvider.WAIT: self.download_next_in_queue() return else: # nothing more to do self.album._finalize_loading(None) return # We still have some items to try! coverartimage = self._queue_get() if not coverartimage.support_types and self.front_image_found: # we already have one front image, no need to try other type-less # sources log.debug("Skipping %r, one front image is already available", coverartimage) self.download_next_in_queue() return self._message( N_("Downloading cover art of type '%(type)s' for %(albumid)s from %(host)s ..."), { 'type': coverartimage.types_as_string(), 'albumid': self.album.id, 'host': coverartimage.host }, echo=None ) log.debug("Downloading %r" % coverartimage) self.album.tagger.xmlws.download( coverartimage.host, coverartimage.port, coverartimage.path, partial(self._coverart_downloaded, coverartimage), priority=True, important=False ) self.album._requests += 1 def queue_put(self, coverartimage): "Add an image to queue" log.debug("Queing %r for download", coverartimage) self.__queue.append(coverartimage) def _queue_get(self): "Get next image and remove it from queue" return self.__queue.pop(0) def _queue_empty(self): "Returns True if the queue is empty" return not self.__queue def _queue_new(self): "Initialize the queue" self.__queue = [] def _message(self, *args, **kwargs): """Display message to status bar""" QObject.tagger.window.set_statusbar_message(*args, **kwargs) def coverart(album, metadata, release): """Gets all cover art URLs from the metadata and then attempts to download the album art. """ coverart = CoverArt(album, metadata, release) log.debug("New %r", coverart) coverart.retrieve() picard-release-1.3.2/picard/coverart/image.py000066400000000000000000000330471245305550700211350ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Oliver Charles # Copyright (C) 2007-2011 Philipp Wolfer # Copyright (C) 2007, 2010, 2011 Lukáš Lalinský # Copyright (C) 2011 Michael Wiencek # Copyright (C) 2011-2012 Wieland Hoffmann # Copyright (C) 2013-2014 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os import shutil import sys import tempfile from hashlib import md5 from PyQt4.QtCore import QUrl, QObject, QMutex from picard import config, log from picard.coverart.utils import translate_caa_type from picard.script import ScriptParser from picard.util import ( encode_filename, replace_win32_incompat, imageinfo ) from picard.util.textencoding import ( replace_non_ascii, unaccent, ) _datafiles = dict() _datafile_mutex = QMutex(QMutex.Recursive) class DataHash: def __init__(self, data, prefix='picard', suffix=''): self._filename = None _datafile_mutex.lock() try: m = md5() m.update(data) self._hash = m.hexdigest() if self._hash not in _datafiles: (fd, self._filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix) QObject.tagger.register_cleanup(self.delete_file) with os.fdopen(fd, "wb") as imagefile: imagefile.write(data) _datafiles[self._hash] = self._filename log.debug("Saving image data %s to %r" % (self._hash, self._filename)) else: self._filename = _datafiles[self._hash] finally: _datafile_mutex.unlock() def delete_file(self): if self._filename: try: os.unlink(self._filename) except: pass else: _datafile_mutex.lock() try: self._filename = None del _datafiles[self._hash] self._hash = None finally: _datafile_mutex.unlock() @property def data(self): if self._filename: with open(self._filename, "rb") as imagefile: return imagefile.read() return None @property def filename(self): return self._filename class CoverArtImageError(Exception): pass class CoverArtImageIOError(CoverArtImageError): pass class CoverArtImageIdentificationError(CoverArtImageError): pass class CoverArtImage: # Indicate if types are provided by the source, ie. CAA or certain file # formats may have types associated with cover art, but some other sources # don't provide such information support_types = False # `is_front` has to be explicitely set, it is used to handle CAA is_front # indicator is_front = None sourceprefix = "URL" def __init__(self, url=None, types=[], comment='', data=None): if url is not None: self.parse_url(url) else: self.url = None self.types = types self.comment = comment self.datahash = None # thumbnail is used to link to another CoverArtImage, ie. for PDFs self.thumbnail = None self.can_be_saved_to_tags = True self.can_be_saved_to_disk = True self.can_be_saved_to_metadata = True if data is not None: self.set_data(data) def parse_url(self, url): self.url = QUrl(url) self.host = str(self.url.host()) self.port = self.url.port(80) self.path = str(self.url.encodedPath()) if self.url.hasQuery(): self.path += '?' + str(self.url.encodedQuery()) @property def source(self): if self.url is not None: return u"%s: %s" % (self.sourceprefix, self.url.toString()) else: return u"%s" % self.sourceprefix def is_front_image(self): """Indicates if image is considered as a 'front' image. It depends on few things: - if `is_front` was set, it is used over anything else - if `types` was set, search for 'front' in it - if `support_types` is False, default to True for any image - if `support_types` is True, default to False for any image """ if not self.can_be_saved_to_metadata: # ignore thumbnails return False if self.is_front is not None: return self.is_front if u'front' in self.types: return True return (self.support_types is False) def imageinfo_as_string(self): if self.datahash is None: return "" return "w=%d h=%d mime=%s ext=%s datalen=%d file=%s" % (self.width, self.height, self.mimetype, self.extension, self.datalength, self.tempfile_filename) def __repr__(self): p = [] if self.url is not None: p.append("url=%r" % self.url.toString()) if self.types: p.append("types=%r" % self.types) if self.is_front is not None: p.append("is_front=%r" % self.is_front) if self.comment: p.append("comment=%r" % self.comment) return "%s(%s)" % (self.__class__.__name__, ", ".join(p)) def __unicode__(self): p = [u'Image'] if self.url is not None: p.append(u"from %s" % self.url.toString()) if self.types: p.append(u"of type %s" % u','.join(self.types)) if self.comment: p.append(u"and comment '%s'" % self.comment) return u' '.join(p) def __str__(self): return unicode(self).encode('utf-8') def set_data(self, data): """Store image data in a file, if data already exists in such file it will be re-used and no file write occurs """ if self.datahash: self.datahash.delete_file() self.datahash = None try: (self.width, self.height, self.mimetype, self.extension, self.datalength) = imageinfo.identify(data) except imageinfo.IdentificationError as e: raise CoverArtImageIdentificationError(e) try: self.datahash = DataHash(data, suffix=self.extension) except (OSError, IOError) as e: raise CoverArtImageIOError(e) @property def maintype(self): """Returns one type only, even for images having more than one type set. This is mostly used when saving cover art to tags because most formats don't support multiple types for one image. Images coming from CAA can have multiple types (ie. 'front, booklet'). """ if self.is_front_image() or not self.types or u'front' in self.types: return u'front' # TODO: do something better than randomly using the first in the list return self.types[0] def _make_image_filename(self, filename, dirname, metadata): filename = ScriptParser().eval(filename, metadata) if config.setting["ascii_filenames"]: if isinstance(filename, unicode): filename = unaccent(filename) filename = replace_non_ascii(filename) if not filename: filename = "cover" if not os.path.isabs(filename): filename = os.path.join(dirname, filename) # replace incompatible characters if config.setting["windows_compatibility"] or sys.platform == "win32": filename = replace_win32_incompat(filename) # remove null characters filename = filename.replace("\x00", "") return encode_filename(filename) def save(self, dirname, metadata, counters): """Saves this image. :dirname: The name of the directory that contains the audio file :metadata: A metadata object :counters: A dictionary mapping filenames to the amount of how many images with that filename were already saved in `dirname`. """ if not self.can_be_saved_to_disk: return if config.setting["caa_image_type_as_filename"]: filename = self.maintype log.debug("Make cover filename from types: %r -> %r", self.types, filename) else: filename = config.setting["cover_image_filename"] log.debug("Using default cover image filename %r", filename) filename = self._make_image_filename(filename, dirname, metadata) overwrite = config.setting["save_images_overwrite"] ext = self.extension image_filename = self._next_filename(filename, counters) while os.path.exists(image_filename + ext) and not overwrite: if not self._is_write_needed(image_filename + ext): break image_filename = self._next_filename(filename, counters) else: new_filename = image_filename + ext # Even if overwrite is enabled we don't need to write the same # image multiple times if not self._is_write_needed(new_filename): return log.debug("Saving cover image to %r", new_filename) try: new_dirname = os.path.dirname(new_filename) if not os.path.isdir(new_dirname): os.makedirs(new_dirname) shutil.copyfile(self.tempfile_filename, new_filename) except (OSError, IOError) as e: raise CoverArtImageIOError(e) def _next_filename(self, filename, counters): if counters[filename]: new_filename = "%s (%d)" % (filename, counters[filename]) else: new_filename = filename counters[filename] += 1 return new_filename def _is_write_needed(self, filename): if (os.path.exists(filename) and os.path.getsize(filename) == self.datalength): log.debug("Identical file size, not saving %r", filename) return False return True @property def data(self): """Reads the data from the temporary file created for this image. May raise CoverArtImageIOError """ try: return self.datahash.data except (OSError, IOError) as e: raise CoverArtImageIOError(e) @property def tempfile_filename(self): return self.datahash.filename def types_as_string(self, translate=True, separator=', '): if self.types: types = self.types elif self.is_front_image(): types = [u'front'] else: types = [u'-'] if translate: types = [translate_caa_type(type) for type in types] return separator.join(types) class CaaCoverArtImage(CoverArtImage): """Image from Cover Art Archive""" support_types = True sourceprefix = u"CAA" def __init__(self, url, types=[], is_front=False, comment='', data=None): CoverArtImage.__init__(self, url=url, types=types, comment=comment, data=data) self.is_front = is_front class CaaThumbnailCoverArtImage(CaaCoverArtImage): """Used for thumbnails of CaaCoverArtImage objects, together with thumbnail property""" def __init__(self, url, types=[], is_front=False, comment='', data=None): CaaCoverArtImage.__init__(self, url=url, types=types, comment=comment, data=data) self.is_front = False self.can_be_saved_to_disk = False self.can_be_saved_to_tags = False self.can_be_saved_to_metadata = False class TagCoverArtImage(CoverArtImage): """Image from file tags""" def __init__(self, file, tag=None, types=[], is_front=None, support_types=False, comment='', data=None): CoverArtImage.__init__(self, url=None, types=types, comment=comment, data=data) self.sourcefile = file self.tag = tag self.support_types = support_types if is_front is not None: self.is_front = is_front @property def source(self): if self.tag: return u'Tag %s from %s' % (self.tag, self.sourcefile) else: return u'File %s' % (self.sourcefile) def __repr__(self): p = [] p.append('%r' % self.sourcefile) if self.tag is not None: p.append("tag=%r" % self.tag) if self.types: p.append("types=%r" % self.types) if self.is_front is not None: p.append("is_front=%r" % self.is_front) p.append('support_types=%r' % self.support_types) if self.comment: p.append("comment=%r" % self.comment) return "%s(%s)" % (self.__class__.__name__, ", ".join(p)) picard-release-1.3.2/picard/coverart/providers/000077500000000000000000000000001245305550700215075ustar00rootroot00000000000000picard-release-1.3.2/picard/coverart/providers/__init__.py000066400000000000000000000075621245305550700236320ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2014 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard.plugin import ExtensionPoint _cover_art_providers = ExtensionPoint() def register_cover_art_provider(provider): _cover_art_providers.register(provider.__module__, provider) def cover_art_providers(): providers = [] for p in _cover_art_providers: providers.append((p, p.NAME)) return providers class CoverArtProvider: """Subclasses of this class need to reimplement at least `queue_downloads()`. `__init__()` does not have to do anything. `queue_downloads()` will be called if `enabled()` returns `True`. `queue_downloads()` must return `FINISHED` when it finished to queue potential cover art downloads (using `queue_put(). If `queue_downloads()` delegates the job of queuing downloads to another method (asynchronous) it should return `WAIT` and the other method has to explicitely call `next_in_queue()`. If `FINISHED` is returned, `next_in_queue()` will be automatically called by CoverArt object. """ # default state, internal use _STARTED = 0 # returned by queue_downloads(): # next_in_queue() will be automatically called FINISHED = 1 # returned by queue_downloads(): # next_in_queue() has to be called explicitely by provider WAIT = 2 def __init__(self, coverart): self.coverart = coverart self.release = coverart.release self.metadata = coverart.metadata self.album = coverart.album def enabled(self): return True def queue_downloads(self): # this method has to return CoverArtProvider.FINISHED or # CoverArtProvider.WAIT raise NotImplementedError def error(self, msg): self.coverart.album.error_append(msg) def queue_put(self, what): self.coverart.queue_put(what) def next_in_queue(self): # must be called by provider if queue_downloads() returns WAIT self.coverart.download_next_in_queue() def match_url_relations(self, relation_types, func): """Execute `func` for each relation url matching type in `relation_types` """ try: if 'relation_list' in self.release.children: for relation_list in self.release.relation_list: if relation_list.target_type == 'url': for relation in relation_list.relation: if relation.type in relation_types: func(relation.target[0].text) except AttributeError: self.error(traceback.format_exc()) from picard.coverart.providers.caa import CoverArtProviderCaa from picard.coverart.providers.amazon import CoverArtProviderAmazon from picard.coverart.providers.whitelist import CoverArtProviderWhitelist from picard.coverart.providers.caa_release_group import CoverArtProviderCaaReleaseGroup register_cover_art_provider(CoverArtProviderCaa) register_cover_art_provider(CoverArtProviderAmazon) register_cover_art_provider(CoverArtProviderWhitelist) register_cover_art_provider(CoverArtProviderCaaReleaseGroup) picard-release-1.3.2/picard/coverart/providers/amazon.py000066400000000000000000000101631245305550700233470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Oliver Charles # Copyright (C) 2007-2011 Philipp Wolfer # Copyright (C) 2007, 2010, 2011 Lukáš Lalinský # Copyright (C) 2011 Michael Wiencek # Copyright (C) 2011-2012 Wieland Hoffmann # Copyright (C) 2013-2014 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import traceback from picard import config, log from picard.util import parse_amazon_url from picard.coverart.providers import CoverArtProvider from picard.coverart.image import CoverArtImage # amazon image file names are unique on all servers and constructed like # ..[SML]ZZZZZZZ.jpg # A release sold on amazon.de has always = 03, for example. # Releases not sold on amazon.com, don't have a "01"-version of the image, # so we need to make sure we grab an existing image. AMAZON_SERVER = { "amazon.jp": { "server": "ec1.images-amazon.com", "id": "09", }, "amazon.co.jp": { "server": "ec1.images-amazon.com", "id": "09", }, "amazon.co.uk": { "server": "ec1.images-amazon.com", "id": "02", }, "amazon.de": { "server": "ec2.images-amazon.com", "id": "03", }, "amazon.com": { "server": "ec1.images-amazon.com", "id": "01", }, "amazon.ca": { "server": "ec1.images-amazon.com", "id": "01", # .com and .ca are identical }, "amazon.fr": { "server": "ec1.images-amazon.com", "id": "08" }, } AMAZON_IMAGE_PATH = '/images/P/%(asin)s.%(serverid)s.%(size)s.jpg' # First item in the list will be tried first AMAZON_SIZES = ( # huge size option is only available for items # that have a ZOOMing picture on its amazon web page # and it doesn't work for all of the domain names #'_SCRM_', # huge size 'LZZZZZZZ', # large size, option format 1 #'_SCLZZZZZZZ_', # large size, option format 3 'MZZZZZZZ', # default image size, format 1 #'_SCMZZZZZZZ_', # medium size, option format 3 #'TZZZZZZZ', # medium image size, option format 1 #'_SCTZZZZZZZ_', # small size, option format 3 #'THUMBZZZ', # small size, option format 1 ) class CoverArtProviderAmazon(CoverArtProvider): """Use Amazon ASIN Musicbrainz relationships to get cover art""" NAME = "Amazon" def enabled(self): if not config.setting['ca_provider_use_amazon']: log.debug("Cover art from Amazon disabled by user") return False return not self.coverart.front_image_found def queue_downloads(self): self.match_url_relations(('amazon asin', 'has_Amazon_ASIN'), self._queue_from_asin_relation) return CoverArtProvider.FINISHED def _queue_from_asin_relation(self, url): """Queue cover art images from Amazon""" amz = parse_amazon_url(url) if amz is None: return log.debug("Found ASIN relation : %s %s", amz['host'], amz['asin']) if amz['host'] in AMAZON_SERVER: serverInfo = AMAZON_SERVER[amz['host']] else: serverInfo = AMAZON_SERVER['amazon.com'] host = serverInfo['server'] for size in AMAZON_SIZES: path = AMAZON_IMAGE_PATH % { 'asin': amz['asin'], 'serverid': serverInfo['id'], 'size': size } self.queue_put(CoverArtImage("http://%s:%s" % (host, path))) picard-release-1.3.2/picard/coverart/providers/caa.py000066400000000000000000000203401245305550700226040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Oliver Charles # Copyright (C) 2007-2011 Philipp Wolfer # Copyright (C) 2007, 2010, 2011 Lukáš Lalinský # Copyright (C) 2011 Michael Wiencek # Copyright (C) 2011-2012 Wieland Hoffmann # Copyright (C) 2013-2014 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import json import traceback from PyQt4.QtNetwork import QNetworkReply from picard import config, log from picard.const import CAA_HOST, CAA_PORT from picard.coverart.providers import CoverArtProvider from picard.coverart.image import CaaCoverArtImage, CaaThumbnailCoverArtImage _CAA_THUMBNAIL_SIZE_MAP = { 0: "small", 1: "large", } class CoverArtProviderCaa(CoverArtProvider): """Get cover art from Cover Art Archive using release mbid""" NAME = "Cover Art Archive" ignore_json_not_found_error = False coverartimage_class = CaaCoverArtImage coverartimage_thumbnail_class = CaaThumbnailCoverArtImage def __init__(self, coverart): CoverArtProvider.__init__(self, coverart) self.caa_types = map(unicode.lower, config.setting["caa_image_types"]) self.len_caa_types = len(self.caa_types) self.restrict_types = config.setting["caa_restrict_image_types"] @property def _has_suitable_artwork(self): # MB web service indicates if CAA has artwork # http://tickets.musicbrainz.org/browse/MBS-4536 if 'cover_art_archive' not in self.release.children: log.debug("No Cover Art Archive information for %s" % self.release.id) return False caa_node = self.release.children['cover_art_archive'][0] caa_has_suitable_artwork = caa_node.artwork[0].text == 'true' if not caa_has_suitable_artwork: log.debug("There are no images in the Cover Art Archive for %s" % self.release.id) return False if self.restrict_types: want_front = 'front' in self.caa_types want_back = 'back' in self.caa_types caa_has_front = caa_node.front[0].text == 'true' caa_has_back = caa_node.back[0].text == 'true' if self.len_caa_types == 2 and (want_front or want_back): # The OR cases are there to still download and process the CAA # JSON file if front or back is enabled but not in the CAA and # another type (that's neither front nor back) is enabled. # For example, if both front and booklet are enabled and the # CAA only has booklet images, the front element in the XML # from the webservice will be false (thus front_in_caa is False # as well) but it's still necessary to download the booklet # images by using the fact that back is enabled but there are # no back images in the CAA. front_in_caa = caa_has_front or not want_front back_in_caa = caa_has_back or not want_back caa_has_suitable_artwork = front_in_caa or back_in_caa elif self.len_caa_types == 1 and (want_front or want_back): front_in_caa = caa_has_front and want_front back_in_caa = caa_has_back and want_back caa_has_suitable_artwork = front_in_caa or back_in_caa if not caa_has_suitable_artwork: log.debug("There are no suitable images in the Cover Art Archive for %s" % self.release.id) else: log.debug("There are suitable images in the Cover Art Archive for %s" % self.release.id) return caa_has_suitable_artwork def enabled(self): """Check if CAA artwork has to be downloaded""" if not config.setting['ca_provider_use_caa']: log.debug("Cover Art Archive disabled by user") return False if self.restrict_types and not self.len_caa_types: log.debug("User disabled all Cover Art Archive types") return False return self._has_suitable_artwork @property def _caa_path(self): return "/release/%s/" % self.metadata["musicbrainz_albumid"] def queue_downloads(self): self.album.tagger.xmlws.download( CAA_HOST, CAA_PORT, self._caa_path, self._caa_json_downloaded, priority=True, important=False ) self.album._requests += 1 # we will call next_in_queue() after json parsing return CoverArtProvider.WAIT def _caa_json_downloaded(self, data, http, error): """Parse CAA JSON file and queue CAA cover art images for download""" self.album._requests -= 1 if error: if not (error == QNetworkReply.ContentNotFoundError and self.ignore_json_not_found_error): self.error(u'CAA JSON error: %s' % (unicode(http.errorString()))) else: try: caa_data = json.loads(data) except ValueError: self.error("Invalid JSON: %s", http.url().toString()) else: imagesize = config.setting["caa_image_size"] thumbsize = _CAA_THUMBNAIL_SIZE_MAP.get(imagesize, None) for image in caa_data["images"]: if config.setting["caa_approved_only"] and not image["approved"]: continue is_pdf = image["image"].endswith('.pdf') if is_pdf and not config.setting["save_images_to_files"]: log.debug("Skipping pdf cover art : %s" % image["image"]) continue # if image has no type set, we still want it to match # pseudo type 'unknown' if not image["types"]: image["types"] = [u"unknown"] else: image["types"] = map(unicode.lower, image["types"]) if self.restrict_types: # only keep enabled caa types types = set(image["types"]).intersection( set(self.caa_types)) else: types = True if types: if thumbsize is None or is_pdf: url = image["image"] else: url = image["thumbnails"][thumbsize] coverartimage = self.coverartimage_class( url, types=image["types"], is_front=image['front'], comment=image["comment"], ) if is_pdf: # thumbnail will be used to "display" PDF in info # dialog thumbnail = self.coverartimage_thumbnail_class( url=image["thumbnails"]['small'], types=image["types"], is_front=image['front'], comment=image["comment"], ) self.queue_put(thumbnail) coverartimage.thumbnail = thumbnail # PDFs cannot be saved to tags (as 2014/05/29) coverartimage.can_be_saved_to_tags = False self.queue_put(coverartimage) self.next_in_queue() picard-release-1.3.2/picard/coverart/providers/caa_release_group.py000066400000000000000000000035331245305550700255250ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2014 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import traceback from picard import config, log from picard.coverart.providers import CoverArtProvider from picard.coverart.providers.caa import CoverArtProviderCaa from picard.coverart.image import CaaCoverArtImage, CaaThumbnailCoverArtImage class CaaCoverArtImageRg(CaaCoverArtImage): pass class CaaThumbnailCoverArtImageRg(CaaThumbnailCoverArtImage): pass class CoverArtProviderCaaReleaseGroup(CoverArtProviderCaa): """Use cover art from album release group""" NAME = "CaaReleaseGroup" ignore_json_not_found_error = True coverartimage_class = CaaCoverArtImageRg coverartimage_thumbnail_class = CaaThumbnailCoverArtImageRg @property def _has_suitable_artwork(self): if not config.setting['ca_provider_use_caa_release_group_fallback']: log.debug("Release group cover art fallback disabled by user") return False return not self.coverart.front_image_found @property def _caa_path(self): return "/release-group/%s/" % self.metadata["musicbrainz_releasegroupid"] picard-release-1.3.2/picard/coverart/providers/whitelist.py000066400000000000000000000036161245305550700241030ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Oliver Charles # Copyright (C) 2007-2011 Philipp Wolfer # Copyright (C) 2007, 2010, 2011 Lukáš Lalinský # Copyright (C) 2011 Michael Wiencek # Copyright (C) 2011-2012 Wieland Hoffmann # Copyright (C) 2013-2014 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import traceback from picard import config, log from picard.coverart.providers import CoverArtProvider from picard.coverart.image import CoverArtImage class CoverArtProviderWhitelist(CoverArtProvider): """Use cover art link and has_cover_art_at MusicBrainz relationships to get cover art""" NAME = "Whitelist" def enabled(self): if not config.setting['ca_provider_use_whitelist']: log.debug("Cover art from white list disabled by user") return False return not self.coverart.front_image_found def queue_downloads(self): self.match_url_relations(('cover art link', 'has_cover_art_at'), self._queue_from_whitelist) return CoverArtProvider.FINISHED def _queue_from_whitelist(self, url): log.debug("Found cover art link in whitelist") self.queue_put(CoverArtImage(url)) picard-release-1.3.2/picard/coverart/utils.py000066400000000000000000000030421245305550700212030ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2013 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard.const import MB_ATTRIBUTES from picard.i18n import ugettext_attr # list of types from http://musicbrainz.org/doc/Cover_Art/Types # order of declaration is preserved in selection box CAA_TYPES = [] for k, v in sorted(MB_ATTRIBUTES.items(), key=lambda (k, v): k): if k.startswith(u'DB:cover_art_archive.art_type/name:'): CAA_TYPES.append({'name': v.lower(), 'title': v}) # pseudo type, used for the no type case CAA_TYPES.append({'name': "unknown", 'title': N_(u"Unknown")}) CAA_TYPES_TR = {} for t in CAA_TYPES: CAA_TYPES_TR[t['name']] = t['title'] def translate_caa_type(name): if name == 'unknown': return _(CAA_TYPES_TR[name]) else: return ugettext_attr(CAA_TYPES_TR[name], u"cover_art_type") picard-release-1.3.2/picard/dataobj.py000066400000000000000000000024531245305550700176270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2004 Robert Kaye # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard.util import LockableObject class DataObject(LockableObject): def __init__(self, id): LockableObject.__init__(self) self.id = id self.folksonomy_tags = {} self.item = None def add_folksonomy_tag(self, name, count): self.folksonomy_tags[name] = self.folksonomy_tags.get(name, 0) + count @staticmethod def merge_folksonomy_tags(this, that): for name, count in that.iteritems(): this[name] = this.get(name, 0) + count picard-release-1.3.2/picard/disc.py000066400000000000000000000047251245305550700171510ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2006 Matthias Friedrich # Copyright (C) 2013 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. try: # use python-libdiscid (http://pythonhosted.org/python-libdiscid/) from libdiscid.compat import discid except ImportError: try: # use python-discid (http://python-discid.readthedocs.org/en/latest/) import discid except ImportError: discid = None import traceback from PyQt4 import QtCore from picard import log from picard.ui.cdlookup import CDLookupDialog class Disc(QtCore.QObject): def __init__(self): QtCore.QObject.__init__(self) self.id = None self.submission_url = None def read(self, device=None): if device is None: device = discid.get_default_device() log.debug(u"Reading CD using device: %r", device) disc = discid.read(device) self.id = disc.id self.submission_url = disc.submission_url def lookup(self): self.tagger.xmlws.lookup_discid(self.id, self._lookup_finished) def _lookup_finished(self, document, http, error): self.tagger.restore_cursor() releases = [] if error: log.error("%r", unicode(http.errorString())) else: try: releases = document.metadata[0].disc[0].release_list[0].release except (AttributeError, IndexError): log.error(traceback.format_exc()) dialog = CDLookupDialog(releases, self, parent=self.tagger.window) dialog.exec_() if discid is not None: discid_version = "discid %s, %s" % (discid.__version__, discid.LIBDISCID_VERSION_STRING) else: discid_version = None picard-release-1.3.2/picard/file.py000066400000000000000000000541271245305550700171470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import glob import os.path import shutil import sys import re import unicodedata from functools import partial from operator import itemgetter from collections import defaultdict from PyQt4 import QtCore from picard import config, log from picard.metadata import Metadata from picard.ui.item import Item from picard.script import ScriptParser from picard.util import ( decode_filename, encode_filename, format_time, pathcmp, replace_win32_incompat, sanitize_filename, thread, tracknum_from_filename, ) from picard.util.textencoding import ( replace_non_ascii, unaccent, ) from picard.util.filenaming import make_short_filename from picard.util.tags import PRESERVED_TAGS class File(QtCore.QObject, Item): UNDEFINED = -1 PENDING = 0 NORMAL = 1 CHANGED = 2 ERROR = 3 REMOVED = 4 comparison_weights = { "title": 13, "artist": 4, "album": 5, "length": 10, "totaltracks": 4, "releasetype": 20, "releasecountry": 2, "format": 2, } def __init__(self, filename): super(File, self).__init__() self.filename = filename self.base_filename = os.path.basename(filename) self._state = File.UNDEFINED self.state = File.PENDING self.error = None self.orig_metadata = Metadata() self.metadata = Metadata() self.similarity = 1.0 self.parent = None self.lookup_task = None self.item = None def __repr__(self): return '' % self.base_filename @property def new_metadata(self): return self.metadata def load(self, callback): thread.run_task( partial(self._load, self.filename), partial(self._loading_finished, callback), priority=1) def _loading_finished(self, callback, result=None, error=None): if self.state != self.PENDING: return if error is not None: self.error = str(error) self.state = self.ERROR else: self.error = None self.state = self.NORMAL self._copy_loaded_metadata(result) self.update() callback(self) def _copy_loaded_metadata(self, metadata): filename, _ = os.path.splitext(self.base_filename) metadata['~length'] = format_time(metadata.length) if 'title' not in metadata: metadata['title'] = filename if 'tracknumber' not in metadata: tracknumber = tracknum_from_filename(self.base_filename) if tracknumber != -1: tracknumber = str(tracknumber) metadata['tracknumber'] = tracknumber if metadata['title'] == filename: stripped_filename = filename.lstrip('0') tnlen = len(tracknumber) if stripped_filename[:tnlen] == tracknumber: metadata['title'] = stripped_filename[tnlen:].lstrip() self.orig_metadata = metadata self.metadata.copy(metadata) def copy_metadata(self, metadata): acoustid = self.metadata["acoustid_id"] preserve = config.setting["preserved_tags"].strip() saved_metadata = {} for tag in re.split(r"\s*,\s*", preserve) + PRESERVED_TAGS: values = self.orig_metadata.getall(tag) if values: saved_metadata[tag] = values self.metadata.copy(metadata) for tag, values in saved_metadata.iteritems(): self.metadata.set(tag, values) self.metadata["acoustid_id"] = acoustid def has_error(self): return self.state == File.ERROR def _load(self, filename): """Load metadata from the file.""" raise NotImplementedError def save(self): self.set_pending() metadata = Metadata() metadata.copy(self.metadata) thread.run_task( partial(self._save_and_rename, self.filename, metadata), self._saving_finished, priority=2, thread_pool=self.tagger.save_thread_pool) def _save_and_rename(self, old_filename, metadata): """Save the metadata.""" new_filename = old_filename if not config.setting["dont_write_tags"]: encoded_old_filename = encode_filename(old_filename) info = os.stat(encoded_old_filename) self._save(old_filename, metadata) if config.setting["preserve_timestamps"]: try: os.utime(encoded_old_filename, (info.st_atime, info.st_mtime)) except OSError: log.warning("Couldn't preserve timestamp for %r", old_filename) # Rename files if config.setting["rename_files"] or config.setting["move_files"]: new_filename = self._rename(old_filename, metadata) # Move extra files (images, playlists, etc.) if config.setting["move_files"] and config.setting["move_additional_files"]: self._move_additional_files(old_filename, new_filename) # Delete empty directories if config.setting["delete_empty_dirs"]: dirname = encode_filename(os.path.dirname(old_filename)) try: self._rmdir(dirname) head, tail = os.path.split(dirname) if not tail: head, tail = os.path.split(head) while head and tail: try: self._rmdir(head) except: break head, tail = os.path.split(head) except EnvironmentError: pass # Save cover art images if config.setting["save_images_to_files"]: self._save_images(os.path.dirname(new_filename), metadata) return new_filename @staticmethod def _rmdir(dir): junk_files = (".DS_Store", "desktop.ini", "Desktop.ini", "Thumbs.db") if not set(os.listdir(dir)) - set(junk_files): shutil.rmtree(dir, False) else: raise OSError def _saving_finished(self, result=None, error=None): old_filename = new_filename = self.filename if error is not None: self.error = str(error) self.set_state(File.ERROR, update=True) else: self.filename = new_filename = result self.base_filename = os.path.basename(new_filename) length = self.orig_metadata.length temp_info = {} for info in ('~bitrate', '~sample_rate', '~channels', '~bits_per_sample', '~format'): temp_info[info] = self.orig_metadata[info] # Data is copied from New to Original because New may be a subclass to handle id3v23 if config.setting["clear_existing_tags"]: self.orig_metadata.copy(self.new_metadata) else: self.orig_metadata.update(self.new_metadata) self.orig_metadata.length = length self.orig_metadata['~length'] = format_time(length) for k, v in temp_info.items(): self.orig_metadata[k] = v self.error = None self.clear_pending() self._add_path_to_metadata(self.orig_metadata) del self.tagger.files[old_filename] self.tagger.files[new_filename] = self def _save(self, filename, metadata): """Save the metadata.""" raise NotImplementedError def _script_to_filename(self, format, file_metadata, settings=config.setting): metadata = Metadata() if config.setting["clear_existing_tags"]: metadata.copy(file_metadata) else: metadata.copy(self.orig_metadata) metadata.update(file_metadata) # make sure every metadata can safely be used in a path name for name in metadata.keys(): if isinstance(metadata[name], basestring): metadata[name] = sanitize_filename(metadata[name]) format = format.replace("\t", "").replace("\n", "") filename = ScriptParser().eval(format, metadata, self) if settings["ascii_filenames"]: if isinstance(filename, unicode): filename = unaccent(filename) filename = replace_non_ascii(filename) # replace incompatible characters if settings["windows_compatibility"] or sys.platform == "win32": filename = replace_win32_incompat(filename) # remove null characters filename = filename.replace("\x00", "") return filename def _make_filename(self, filename, metadata, settings=config.setting): """Constructs file name based on metadata and file naming formats.""" if settings["move_files"]: new_dirname = settings["move_files_to"] if not os.path.isabs(new_dirname): new_dirname = os.path.normpath(os.path.join(os.path.dirname(filename), new_dirname)) else: new_dirname = os.path.dirname(filename) new_filename = os.path.basename(filename) if settings["rename_files"]: new_filename, ext = os.path.splitext(new_filename) ext = ext.lower() new_filename = new_filename + ext # expand the naming format format = settings['file_naming_format'] if len(format) > 0: new_filename = self._script_to_filename(format, metadata, settings) # NOTE: the _script_to_filename strips the extension away new_filename = new_filename + ext if not settings['move_files']: new_filename = os.path.basename(new_filename) new_filename = make_short_filename(new_dirname, new_filename, config.setting['windows_compatibility'], config.setting['windows_compatibility_drive_root']) # TODO: move following logic under util.filenaming # (and reconsider its necessity) # win32 compatibility fixes if settings['windows_compatibility'] or sys.platform == 'win32': new_filename = new_filename.replace('./', '_/').replace('.\\', '_\\') # replace . at the beginning of file and directory names new_filename = new_filename.replace('/.', '/_').replace('\\.', '\\_') if new_filename and new_filename[0] == '.': new_filename = '_' + new_filename[1:] # Fix for precomposed characters on OSX if sys.platform == "darwin": new_filename = unicodedata.normalize("NFD", unicode(new_filename)) return os.path.realpath(os.path.join(new_dirname, new_filename)) def _rename(self, old_filename, metadata): new_filename, ext = os.path.splitext( self._make_filename(old_filename, metadata)) if old_filename == new_filename + ext: return old_filename new_dirname = os.path.dirname(new_filename) if not os.path.isdir(encode_filename(new_dirname)): os.makedirs(new_dirname) tmp_filename = new_filename i = 1 while (not pathcmp(old_filename, new_filename + ext) and os.path.exists(encode_filename(new_filename + ext))): new_filename = "%s (%d)" % (tmp_filename, i) i += 1 new_filename = new_filename + ext log.debug("Moving file %r => %r", old_filename, new_filename) shutil.move(encode_filename(old_filename), encode_filename(new_filename)) return new_filename def _save_images(self, dirname, metadata): """Save the cover images to disk.""" if not metadata.images: return counters = defaultdict(lambda: 0) for image in metadata.images: image.save(dirname, metadata, counters) def _move_additional_files(self, old_filename, new_filename): """Move extra files, like playlists...""" old_path = encode_filename(os.path.dirname(old_filename)) new_path = encode_filename(os.path.dirname(new_filename)) patterns = encode_filename(config.setting["move_additional_files_pattern"]) patterns = filter(bool, [p.strip() for p in patterns.split()]) for pattern in patterns: # FIXME glob1 is not documented, maybe we need our own implemention? for old_file in glob.glob1(old_path, pattern): new_file = os.path.join(new_path, old_file) old_file = os.path.join(old_path, old_file) # FIXME we shouldn't do this from a thread! if self.tagger.files.get(decode_filename(old_file)): log.debug("File loaded in the tagger, not moving %r", old_file) continue log.debug("Moving %r to %r", old_file, new_file) shutil.move(old_file, new_file) def remove(self, from_parent=True): if from_parent and self.parent: log.debug("Removing %r from %r", self, self.parent) self.parent.remove_file(self) self.tagger.acoustidmanager.remove(self) self.state = File.REMOVED def move(self, parent): if parent != self.parent: log.debug("Moving %r from %r to %r", self, self.parent, parent) self.clear_lookup_task() self.tagger._acoustid.stop_analyze(file) if self.parent: self.clear_pending() self.parent.remove_file(self) self.parent = parent self.parent.add_file(self) self.tagger.acoustidmanager.update(self, self.metadata['musicbrainz_recordingid']) def _move(self, parent): if parent != self.parent: log.debug("Moving %r from %r to %r", self, self.parent, parent) if self.parent: self.parent.remove_file(self) self.parent = parent self.tagger.acoustidmanager.update(self, self.metadata['musicbrainz_recordingid']) def supports_tag(self, name): """Returns whether tag ``name`` can be saved to the file.""" return True def is_saved(self): return self.similarity == 1.0 and self.state == File.NORMAL def update(self, signal=True): new_metadata = self.new_metadata names = set(new_metadata.keys()) names.update(self.orig_metadata.keys()) clear_existing_tags = config.setting["clear_existing_tags"] for name in names: if not name.startswith('~') and self.supports_tag(name): new_values = new_metadata.getall(name) if not (new_values or clear_existing_tags): continue orig_values = self.orig_metadata.getall(name) if orig_values != new_values: self.similarity = self.orig_metadata.compare(new_metadata) if self.state in (File.CHANGED, File.NORMAL): self.state = File.CHANGED break else: self.similarity = 1.0 if self.state in (File.CHANGED, File.NORMAL): self.state = File.NORMAL if signal: log.debug("Updating file %r", self) if self.item: self.item.update() def can_save(self): """Return if this object can be saved.""" return True def can_remove(self): """Return if this object can be removed.""" return True def can_edit_tags(self): """Return if this object supports tag editing.""" return True def can_analyze(self): """Return if this object can be fingerprinted.""" return True def can_autotag(self): return True def can_refresh(self): return False def can_view_info(self): return True def _info(self, metadata, file): if hasattr(file.info, 'length'): metadata.length = int(file.info.length * 1000) if hasattr(file.info, 'bitrate') and file.info.bitrate: metadata['~bitrate'] = file.info.bitrate / 1000.0 if hasattr(file.info, 'sample_rate') and file.info.sample_rate: metadata['~sample_rate'] = file.info.sample_rate if hasattr(file.info, 'channels') and file.info.channels: metadata['~channels'] = file.info.channels if hasattr(file.info, 'bits_per_sample') and file.info.bits_per_sample: metadata['~bits_per_sample'] = file.info.bits_per_sample metadata['~format'] = self.__class__.__name__.replace('File', '') self._add_path_to_metadata(metadata) def _add_path_to_metadata(self, metadata): metadata['~dirname'] = os.path.dirname(self.filename) filename, extension = os.path.splitext(os.path.basename(self.filename)) metadata['~filename'] = filename metadata['~extension'] = extension.lower()[1:] def get_state(self): return self._state # in order to significantly speed up performance, the number of pending # files is cached num_pending_files = 0 def set_state(self, state, update=False): if state != self._state: if state == File.PENDING: File.num_pending_files += 1 elif self._state == File.PENDING: File.num_pending_files -= 1 self._state = state if update: self.update() self.tagger.tagger_stats_changed.emit() state = property(get_state, set_state) def column(self, column): m = self.metadata if column == "title" and not m["title"]: return self.base_filename return m[column] def _lookup_finished(self, lookuptype, document, http, error): self.lookup_task = None if self.state == File.REMOVED: return try: m = document.metadata[0] if lookuptype == "metadata": tracks = m.recording_list[0].recording elif lookuptype == "acoustid": tracks = m.acoustid[0].recording_list[0].recording except (AttributeError, IndexError): tracks = None # no matches if not tracks: self.tagger.window.set_statusbar_message( N_("No matching tracks for file '%(filename)s'"), {'filename': self.filename}, timeout=3000 ) self.clear_pending() return # multiple matches -- calculate similarities to each of them match = sorted((self.metadata.compare_to_track( track, self.comparison_weights) for track in tracks), reverse=True, key=itemgetter(0))[0] if lookuptype != 'acoustid': threshold = config.setting['file_lookup_threshold'] if match[0] < threshold: self.tagger.window.set_statusbar_message( N_("No matching tracks above the threshold for file '%(filename)s'"), {'filename': self.filename}, timeout=3000 ) self.clear_pending() return self.tagger.window.set_statusbar_message( N_("File '%(filename)s' identified!"), {'filename': self.filename}, timeout=3000 ) self.clear_pending() rg, release, track = match[1:] if lookuptype == 'acoustid': self.tagger.acoustidmanager.add(self, track.id) if release: self.tagger.get_release_group_by_id(rg.id).loaded_albums.add(release.id) self.tagger.move_file_to_track(self, release.id, track.id) else: self.tagger.move_file_to_nat(self, track.id, node=track) def lookup_metadata(self): """Try to identify the file using the existing metadata.""" if self.lookup_task: return self.tagger.window.set_statusbar_message( N_("Looking up the metadata for file %(filename)s ..."), {'filename': self.filename} ) self.clear_lookup_task() metadata = self.metadata self.lookup_task = self.tagger.xmlws.find_tracks(partial(self._lookup_finished, 'metadata'), track=metadata['title'], artist=metadata['artist'], release=metadata['album'], tnum=metadata['tracknumber'], tracks=metadata['totaltracks'], qdur=str(metadata.length / 2000), isrc=metadata['isrc'], limit=25) def clear_lookup_task(self): if self.lookup_task: self.tagger.xmlws.remove_task(self.lookup_task) self.lookup_task = None def set_pending(self): if self.state != File.REMOVED: self.state = File.PENDING self.update() def clear_pending(self): if self.state == File.PENDING: self.state = File.NORMAL self.update() def iterfiles(self, save=False): yield self def _get_tracknumber(self): try: return int(self.metadata["tracknumber"]) except: return 0 tracknumber = property(_get_tracknumber, doc="The track number as an int.") def _get_discnumber(self): try: return int(self.metadata["discnumber"]) except: return 0 discnumber = property(_get_discnumber, doc="The disc number as an int.") picard-release-1.3.2/picard/formats/000077500000000000000000000000001245305550700173205ustar00rootroot00000000000000picard-release-1.3.2/picard/formats/__init__.py000066400000000000000000000133461245305550700214400ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys from mutagen import _util from picard.plugin import ExtensionPoint _formats = ExtensionPoint() _extensions = {} def register_format(format): _formats.register(format.__module__, format) for ext in format.EXTENSIONS: _extensions[ext[1:]] = format def supported_formats(): """Returns list of supported formats.""" formats = [] for format in _formats: formats.append((format.EXTENSIONS, format.NAME)) return formats def open(filename): """Open the specified file and return a File instance with the appropriate format handler, or None.""" i = filename.rfind(".") if i < 0: return None ext = filename[i+1:].lower() try: format = _extensions[ext] except KeyError: return None return format(filename) def _insert_bytes_no_mmap(fobj, size, offset, BUFFER_SIZE=2**16): """Insert size bytes of empty space starting at offset. fobj must be an open file object, open rb+ or equivalent. Mutagen tries to use mmap to resize the file, but falls back to a significantly slower method if mmap fails. """ assert 0 < size assert 0 <= offset locked = False fobj.seek(0, 2) filesize = fobj.tell() movesize = filesize - offset fobj.write('\x00' * size) fobj.flush() try: locked = _win32_locking(fobj, filesize, msvcrt.LK_LOCK) fobj.truncate(filesize) fobj.seek(0, 2) padsize = size # Don't generate an enormous string if we need to pad # the file out several megs. while padsize: addsize = min(BUFFER_SIZE, padsize) fobj.write("\x00" * addsize) padsize -= addsize fobj.seek(filesize, 0) while movesize: # At the start of this loop, fobj is pointing at the end # of the data we need to move, which is of movesize length. thismove = min(BUFFER_SIZE, movesize) # Seek back however much we're going to read this frame. fobj.seek(-thismove, 1) nextpos = fobj.tell() # Read it, so we're back at the end. data = fobj.read(thismove) # Seek back to where we need to write it. fobj.seek(-thismove + size, 1) # Write it. fobj.write(data) # And seek back to the end of the unmoved data. fobj.seek(nextpos) movesize -= thismove fobj.flush() finally: if locked: _win32_locking(fobj, filesize, msvcrt.LK_UNLCK) def _delete_bytes_no_mmap(fobj, size, offset, BUFFER_SIZE=2**16): """Delete size bytes of empty space starting at offset. fobj must be an open file object, open rb+ or equivalent. Mutagen tries to use mmap to resize the file, but falls back to a significantly slower method if mmap fails. """ locked = False assert 0 < size assert 0 <= offset fobj.seek(0, 2) filesize = fobj.tell() movesize = filesize - offset - size assert 0 <= movesize try: if movesize > 0: fobj.flush() locked = _win32_locking(fobj, filesize, msvcrt.LK_LOCK) fobj.seek(offset + size) buf = fobj.read(BUFFER_SIZE) while buf: fobj.seek(offset) fobj.write(buf) offset += len(buf) fobj.seek(offset + size) buf = fobj.read(BUFFER_SIZE) fobj.truncate(filesize - size) fobj.flush() finally: if locked: _win32_locking(fobj, filesize, msvcrt.LK_UNLCK) def _win32_locking(fobj, nbytes, mode): try: fobj.seek(0) msvcrt.locking(fobj.fileno(), mode, nbytes) except IOError: return False else: return True if sys.platform == 'win32': import msvcrt _util.insert_bytes = _insert_bytes_no_mmap _util.delete_bytes = _delete_bytes_no_mmap from picard.formats.id3 import ( MP3File, TrueAudioFile, ) register_format(MP3File) register_format(TrueAudioFile) from picard.formats.apev2 import ( MonkeysAudioFile, MusepackFile, OptimFROGFile, WavPackFile, TAKFile, ) register_format(MusepackFile) register_format(WavPackFile) register_format(OptimFROGFile) register_format(MonkeysAudioFile) register_format(TAKFile) from picard.formats.vorbis import ( FLACFile, OggFLACFile, OggSpeexFile, OggVorbisFile, OggAudioFile, OggVideoFile, OggOpusFile, with_opus, ) register_format(FLACFile) register_format(OggFLACFile) register_format(OggSpeexFile) register_format(OggVorbisFile) if with_opus: register_format(OggOpusFile) register_format(OggAudioFile) register_format(OggVideoFile) try: from picard.formats.mp4 import MP4File register_format(MP4File) except ImportError: pass try: from picard.formats.asf import ASFFile register_format(ASFFile) except ImportError: pass from picard.formats.wav import WAVFile register_format(WAVFile) picard-release-1.3.2/picard/formats/apev2.py000066400000000000000000000213751245305550700207170ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import mutagen.apev2 import mutagen.monkeysaudio import mutagen.musepack import mutagen.wavpack import mutagen.optimfrog import mutagenext.tak from picard import config, log from picard.coverart.image import TagCoverArtImage, CoverArtImageError from picard.file import File from picard.metadata import Metadata from picard.util import encode_filename, sanitize_date from os.path import isfile class APEv2File(File): """Generic APEv2-based file.""" _File = None __translate = { "Album Artist": "albumartist", "MixArtist": "remixer", "Weblink": "website", "DiscSubtitle": "discsubtitle", "BPM": "bpm", "ISRC": "isrc", "CatalogNumber": "catalognumber", "Barcode": "barcode", "EncodedBy": "encodedby", "Language": "language", "MUSICBRAINZ_ALBUMSTATUS": "releasestatus", "MUSICBRAINZ_ALBUMTYPE": "releasetype", "musicbrainz_trackid": "musicbrainz_recordingid", "musicbrainz_releasetrackid": "musicbrainz_trackid", } __rtranslate = dict([(v, k) for k, v in __translate.iteritems()]) def _load(self, filename): log.debug("Loading file %r", filename) file = self._File(encode_filename(filename)) metadata = Metadata() if file.tags: for origname, values in file.tags.items(): if origname.lower().startswith("cover art") and values.kind == mutagen.apev2.BINARY: if '\0' in values.value: descr, data = values.value.split('\0', 1) try: coverartimage = TagCoverArtImage( file=filename, tag=origname, data=data, ) except CoverArtImageError as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.append_image(coverartimage) # skip EXTERNAL and BINARY values if values.kind != mutagen.apev2.TEXT: continue for value in values: name = origname if name == "Year": name = "date" value = sanitize_date(value) elif name == "Track": name = "tracknumber" track = value.split("/") if len(track) > 1: metadata["totaltracks"] = track[1] value = track[0] elif name == "Disc": name = "discnumber" disc = value.split("/") if len(disc) > 1: metadata["totaldiscs"] = disc[1] value = disc[0] elif name == 'Performer' or name == 'Comment': name = name.lower() + ':' if value.endswith(')'): start = value.rfind(' (') if start > 0: name += value[start + 2:-1] value = value[:start] elif name in self.__translate: name = self.__translate[name] else: name = name.lower() metadata.add(name, value) self._info(metadata, file) return metadata def _save(self, filename, metadata): """Save metadata to the file.""" log.debug("Saving file %r", filename) try: tags = mutagen.apev2.APEv2(encode_filename(filename)) except mutagen.apev2.APENoHeaderError: tags = mutagen.apev2.APEv2() if config.setting["clear_existing_tags"]: tags.clear() elif metadata.images_to_be_saved_to_tags: for name, value in tags.items(): if name.lower().startswith('cover art') and value.kind == mutagen.apev2.BINARY: del tags[name] temp = {} for name, value in metadata.items(): if name.startswith("~"): continue if name.startswith('lyrics:'): name = 'Lyrics' elif name == "date": name = "Year" # tracknumber/totaltracks => Track elif name == 'tracknumber': name = 'Track' if 'totaltracks' in metadata: value = '%s/%s' % (value, metadata['totaltracks']) # discnumber/totaldiscs => Disc elif name == 'discnumber': name = 'Disc' if 'totaldiscs' in metadata: value = '%s/%s' % (value, metadata['totaldiscs']) elif name in ('totaltracks', 'totaldiscs'): continue # "performer:Piano=Joe Barr" => "Performer=Joe Barr (Piano)" elif name.startswith('performer:') or name.startswith('comment:'): name, desc = name.split(':', 1) name = name.title() if desc: value += ' (%s)' % desc elif name in self.__rtranslate: name = self.__rtranslate[name] else: name = name.title() temp.setdefault(name, []).append(value) for name, values in temp.items(): tags[str(name)] = values for image in metadata.images_to_be_saved_to_tags: cover_filename = 'Cover Art (Front)' cover_filename += image.extension tags['Cover Art (Front)'] = mutagen.apev2.APEValue(cover_filename + '\0' + image.data, mutagen.apev2.BINARY) break # can't save more than one item with the same name # (mp3tags does this, but it's against the specs) tags.save(encode_filename(filename)) class MusepackFile(APEv2File): """Musepack file.""" EXTENSIONS = [".mpc", ".mp+"] NAME = "Musepack" _File = mutagen.musepack.Musepack def _info(self, metadata, file): super(MusepackFile, self)._info(metadata, file) metadata['~format'] = "Musepack, SV%d" % file.info.version class WavPackFile(APEv2File): """WavPack file.""" EXTENSIONS = [".wv"] NAME = "WavPack" _File = mutagen.wavpack.WavPack def _info(self, metadata, file): super(WavPackFile, self)._info(metadata, file) metadata['~format'] = self.NAME def _save_and_rename(self, old_filename, metadata): """Includes an additional check for WavPack correction files""" wvc_filename = old_filename.replace(".wv", ".wvc") if isfile(wvc_filename): if config.setting["rename_files"] or config.setting["move_files"]: self._rename(wvc_filename, metadata) return File._save_and_rename(self, old_filename, metadata) class OptimFROGFile(APEv2File): """OptimFROG file.""" EXTENSIONS = [".ofr", ".ofs"] NAME = "OptimFROG" _File = mutagen.optimfrog.OptimFROG def _info(self, metadata, file): super(OptimFROGFile, self)._info(metadata, file) if file.filename.lower().endswith(".ofs"): metadata['~format'] = "OptimFROG DualStream Audio" else: metadata['~format'] = "OptimFROG Lossless Audio" class MonkeysAudioFile(APEv2File): """Monkey's Audio file.""" EXTENSIONS = [".ape"] NAME = "Monkey's Audio" _File = mutagen.monkeysaudio.MonkeysAudio def _info(self, metadata, file): super(MonkeysAudioFile, self)._info(metadata, file) metadata['~format'] = self.NAME class TAKFile(APEv2File): """TAK file.""" EXTENSIONS = [".tak"] NAME = "Tom's lossless Audio Kompressor" _File = mutagenext.tak.TAK def _info(self, metadata, file): super(TAKFile, self)._info(metadata, file) metadata['~format'] = self.NAME picard-release-1.3.2/picard/formats/asf.py000066400000000000000000000167731245305550700204610ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006-2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config, log from picard.coverart.image import TagCoverArtImage, CoverArtImageError from picard.file import File from picard.formats.id3 import types_from_id3, image_type_as_id3_num from picard.util import encode_filename from picard.metadata import Metadata from mutagen.asf import ASF, ASFByteArrayAttribute import struct def unpack_image(data): """ Helper function to unpack image data from a WM/Picture tag. The data has the following format: 1 byte: Picture type (0-20), see ID3 APIC frame specification at http://www.id3.org/id3v2.4.0-frames 4 bytes: Picture data length in LE format MIME type, null terminated UTF-16-LE string Description, null terminated UTF-16-LE string The image data in the given length """ (type, size) = struct.unpack_from("\d+)(?:/(?P\d+))?$'), 'TPOS': re.compile(r'^(?P\d+)(?:/(?P\d+))?$') } def _load(self, filename): log.debug("Loading file %r", filename) file = self._File(encode_filename(filename), ID3=compatid3.CompatID3) tags = file.tags or {} # upgrade custom 2.3 frames to 2.4 for old, new in self.__upgrade.items(): if old in tags and new not in tags: f = tags.pop(old) tags.add(getattr(id3, new)(encoding=f.encoding, text=f.text)) metadata = Metadata() for frame in tags.values(): frameid = frame.FrameID if frameid in self.__translate: name = self.__translate[frameid] if frameid.startswith('T'): for text in frame.text: if text: metadata.add(name, unicode(text)) elif frameid == 'COMM': for text in frame.text: if text: metadata.add('%s:%s' % (name, frame.desc), unicode(text)) else: metadata.add(name, unicode(frame)) elif frameid == "TMCL": for role, name in frame.people: if role or name: metadata.add('performer:%s' % role, name) elif frameid == "TIPL": # If file is ID3v2.3, TIPL tag could contain TMCL # so we will test for TMCL values and add to TIPL if not TMCL for role, name in frame.people: if role in self._tipl_roles and name: metadata.add(self._tipl_roles[role], name) else: metadata.add('performer:%s' % role, name) elif frameid == 'TXXX': name = frame.desc if name in self.__translate_freetext: name = self.__translate_freetext[name] elif ((name in self.__rtranslate) != (name in self.__rtranslate_freetext)): # If the desc of a TXXX frame conflicts with the name of a # Picard tag, load it into ~id3:TXXX:desc rather than desc. # # This basically performs an XOR, making sure that 'name' # is in __rtranslate or __rtranslate_freetext, but not # both. (Being in both implies we support reading it both # ways.) Currently, the only tag in both is license. name = '~id3:TXXX:' + name for text in frame.text: metadata.add(name, unicode(text)) elif frameid == 'USLT': name = 'lyrics' if frame.desc: name += ':%s' % frame.desc metadata.add(name, unicode(frame.text)) elif frameid == 'UFID' and frame.owner == 'http://musicbrainz.org': metadata['musicbrainz_recordingid'] = frame.data.decode('ascii', 'ignore') elif frameid in self.__tag_re_parse.keys(): m = self.__tag_re_parse[frameid].search(frame.text[0]) if m: for name, value in m.groupdict().iteritems(): if value is not None: metadata[name] = value else: log.error("Invalid %s value '%s' dropped in %r", frameid, frame.text[0], filename) elif frameid == 'APIC': try: coverartimage = TagCoverArtImage( file=filename, tag=frameid, types=types_from_id3(frame.type), comment=frame.desc, support_types=True, data=frame.data, ) except CoverArtImageError as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.append_image(coverartimage) elif frameid == 'POPM': # Rating in ID3 ranges from 0 to 255, normalize this to the range 0 to 5 if frame.email == config.setting['rating_user_email']: rating = unicode(int(round(frame.rating / 255.0 * (config.setting['rating_steps'] - 1)))) metadata.add('~rating', rating) if 'date' in metadata: sanitized = sanitize_date(metadata.getall('date')[0]) if sanitized: metadata['date'] = sanitized self._info(metadata, file) return metadata def _save(self, filename, metadata): """Save metadata to the file.""" log.debug("Saving file %r", filename) try: tags = compatid3.CompatID3(encode_filename(filename)) except mutagen.id3.ID3NoHeaderError: tags = compatid3.CompatID3() if config.setting['clear_existing_tags']: tags.clear() if metadata.images_to_be_saved_to_tags: tags.delall('APIC') if config.setting['write_id3v1']: v1 = 2 else: v1 = 0 encoding = {'utf-8': 3, 'utf-16': 1}.get(config.setting['id3v2_encoding'], 0) if 'tracknumber' in metadata: if 'totaltracks' in metadata: text = '%s/%s' % (metadata['tracknumber'], metadata['totaltracks']) else: text = metadata['tracknumber'] tags.add(id3.TRCK(encoding=0, text=text)) if 'discnumber' in metadata: if 'totaldiscs' in metadata: text = '%s/%s' % (metadata['discnumber'], metadata['totaldiscs']) else: text = metadata['discnumber'] tags.add(id3.TPOS(encoding=0, text=text)) # This is necessary because mutagens HashKey for APIC frames only # includes the FrameID (APIC) and description - it's basically # impossible to save two images, even of different types, without # any description. counters = defaultdict(lambda: 0) for image in metadata.images_to_be_saved_to_tags: desc = desctag = image.comment if counters[desc] > 0: if desc: desctag = "%s (%i)" % (desc, counters[desc]) else: desctag = "(%i)" % counters[desc] counters[desc] += 1 tags.add(id3.APIC(encoding=0, mime=image.mimetype, type=image_type_as_id3_num(image.maintype), desc=desctag, data=image.data)) tmcl = mutagen.id3.TMCL(encoding=encoding, people=[]) tipl = mutagen.id3.TIPL(encoding=encoding, people=[]) tags.delall('TCMP') for name, values in metadata.rawitems(): if name.startswith('performer:'): role = name.split(':', 1)[1] for value in values: tmcl.people.append([role, value]) elif name.startswith('comment:'): desc = name.split(':', 1)[1] if desc.lower()[:4] == "itun": tags.delall('COMM:' + desc) tags.add(id3.COMM(encoding=0, desc=desc, lang='eng', text=[v + u'\x00' for v in values])) else: tags.add(id3.COMM(encoding=encoding, desc=desc, lang='eng', text=values)) elif name.startswith('lyrics:') or name == 'lyrics': if ':' in name: desc = name.split(':', 1)[1] else: desc = '' for value in values: tags.add(id3.USLT(encoding=encoding, desc=desc, text=value)) elif name in self._rtipl_roles: for value in values: tipl.people.append([self._rtipl_roles[name], value]) elif name == 'musicbrainz_recordingid': tags.add(id3.UFID(owner='http://musicbrainz.org', data=str(values[0]))) elif name == '~rating': # Search for an existing POPM frame to get the current playcount for frame in tags.values(): if frame.FrameID == 'POPM' and frame.email == config.setting['rating_user_email']: count = getattr(frame, 'count', 0) break else: count = 0 # Convert rating to range between 0 and 255 rating = int(round(float(values[0]) * 255 / (config.setting['rating_steps'] - 1))) tags.add(id3.POPM(email=config.setting['rating_user_email'], rating=rating, count=count)) elif name in self.__rtranslate: frameid = self.__rtranslate[name] if frameid.startswith('W'): valid_urls = all([all(urlparse(v)[:2]) for v in values]) if frameid == 'WCOP': # Only add WCOP if there is only one license URL, otherwise use TXXX:LICENSE if len(values) > 1 or not valid_urls: tags.add(id3.TXXX(encoding=encoding, desc=self.__rtranslate_freetext[name], text=values)) else: tags.add(id3.WCOP(url=values[0])) elif frameid == 'WOAR' and valid_urls: for url in values: tags.add(id3.WOAR(url=url)) elif frameid.startswith('T'): tags.add(getattr(id3, frameid)(encoding=encoding, text=values)) if frameid == 'TSOA': tags.delall('XSOA') elif frameid == 'TSOP': tags.delall('XSOP') elif frameid == 'TSO2': tags.delall('TXXX:ALBUMARTISTSORT') elif name in self.__rtranslate_freetext: tags.add(id3.TXXX(encoding=encoding, desc=self.__rtranslate_freetext[name], text=values)) elif name.startswith('~id3:'): name = name[5:] if name.startswith('TXXX:'): tags.add(id3.TXXX(encoding=encoding, desc=name[5:], text=values)) else: frameclass = getattr(id3, name[:4], None) if frameclass: tags.add(frameclass(encoding=encoding, text=values)) # don't save private / already stored tags elif not name.startswith("~") and not name in self.__other_supported_tags: tags.add(id3.TXXX(encoding=encoding, desc=name, text=values)) if tmcl.people: tags.add(tmcl) if tipl.people: tags.add(tipl) if config.setting['write_id3v23']: tags.update_to_v23(join_with=config.setting['id3v23_join_with']) tags.save(encode_filename(filename), v2=3, v1=v1) else: tags.update_to_v24() tags.save(encode_filename(filename), v2=4, v1=v1) if self._IsMP3 and config.setting["remove_ape_from_mp3"]: try: mutagen.apev2.delete(encode_filename(filename)) except: pass def supports_tag(self, name): return name in self.__rtranslate or name in self.__rtranslate_freetext\ or name.startswith('performer:')\ or name.startswith('lyrics:') or name == 'lyrics'\ or name in self.__other_supported_tags @property def new_metadata(self): if not config.setting["write_id3v23"]: return self.metadata copy = Metadata() copy.copy(self.metadata) join_with = config.setting["id3v23_join_with"] copy.multi_valued_joiner = join_with for name, values in copy.rawitems(): # ID3v23 can only save TDOR dates in YYYY format. Mutagen cannot # handle ID3v23 dates which are YYYY-MM rather than YYYY or # YYYY-MM-DD. if name == "originaldate": values = [v[:4] for v in values] elif name == "date": values = [(v[:4] if len(v) < 10 else v) for v in values] # If this is a multi-valued field, then it needs to be flattened, # unless it's TIPL or TMCL which can still be multi-valued. if (len(values) > 1 and not name in ID3File._rtipl_roles and not name.startswith("performer:")): values = [join_with.join(values)] copy[name] = values return copy class MP3File(ID3File): """MP3 file.""" EXTENSIONS = [".mp3", ".mp2"] NAME = "MPEG-1 Audio" _File = mutagen.mp3.MP3 _IsMP3 = True def _info(self, metadata, file): super(MP3File, self)._info(metadata, file) id3version = '' if file.tags is not None and file.info.layer == 3: id3version = ' - ID3v%d.%d' % (file.tags.version[0], file.tags.version[1]) metadata['~format'] = 'MPEG-1 Layer %d%s' % (file.info.layer, id3version) class TrueAudioFile(ID3File): """TTA file.""" EXTENSIONS = [".tta"] NAME = "The True Audio" _File = mutagen.trueaudio.TrueAudio def _info(self, metadata, file): super(TrueAudioFile, self)._info(metadata, file) metadata['~format'] = self.NAME picard-release-1.3.2/picard/formats/mp4.py000066400000000000000000000222401245305550700203720ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from mutagen.mp4 import MP4, MP4Cover from picard import config, log from picard.coverart.image import TagCoverArtImage, CoverArtImageError from picard.file import File from picard.metadata import Metadata from picard.util import encode_filename class MP4File(File): EXTENSIONS = [".m4a", ".m4b", ".m4p", ".m4v", ".mp4"] NAME = "MPEG-4 Audio" __text_tags = { "\xa9ART": "artist", "\xa9nam": "title", "\xa9alb": "album", "\xa9wrt": "composer", "aART": "albumartist", "\xa9grp": "grouping", "\xa9day": "date", "\xa9gen": "genre", "\xa9lyr": "lyrics", "\xa9cmt": "comment:", "\xa9too": "encodedby", "cprt": "copyright", "soal": "albumsort", "soaa": "albumartistsort", "soar": "artistsort", "sonm": "titlesort", "soco": "composersort", "sosn": "showsort", "tvsh": "show", "purl": "podcasturl", } __r_text_tags = dict([(v, k) for k, v in __text_tags.iteritems()]) __bool_tags = { "pcst": "podcast", "cpil": "compilation", "pgap": "gapless", } __r_bool_tags = dict([(v, k) for k, v in __bool_tags.iteritems()]) __int_tags = { "tmpo": "bpm", } __r_int_tags = dict([(v, k) for k, v in __int_tags.iteritems()]) __freeform_tags = { "----:com.apple.iTunes:MusicBrainz Track Id": "musicbrainz_recordingid", "----:com.apple.iTunes:MusicBrainz Artist Id": "musicbrainz_artistid", "----:com.apple.iTunes:MusicBrainz Album Id": "musicbrainz_albumid", "----:com.apple.iTunes:MusicBrainz Album Artist Id": "musicbrainz_albumartistid", "----:com.apple.iTunes:MusicIP PUID": "musicip_puid", "----:com.apple.iTunes:MusicBrainz Album Status": "releasestatus", "----:com.apple.iTunes:MusicBrainz Album Release Country": "releasecountry", "----:com.apple.iTunes:MusicBrainz Album Type": "releasetype", "----:com.apple.iTunes:MusicBrainz Disc Id": "musicbrainz_discid", "----:com.apple.iTunes:MusicBrainz TRM Id": "musicbrainz_trmid", "----:com.apple.iTunes:MusicBrainz Work Id": "musicbrainz_workid", "----:com.apple.iTunes:MusicBrainz Release Group Id": "musicbrainz_releasegroupid", "----:com.apple.iTunes:MusicBrainz Release Track Id": "musicbrainz_trackid", "----:com.apple.iTunes:Acoustid Fingerprint": "acoustid_fingerprint", "----:com.apple.iTunes:Acoustid Id": "acoustid_id", "----:com.apple.iTunes:ASIN": "asin", "----:com.apple.iTunes:BARCODE": "barcode", "----:com.apple.iTunes:PRODUCER": "producer", "----:com.apple.iTunes:LYRICIST": "lyricist", "----:com.apple.iTunes:CONDUCTOR": "conductor", "----:com.apple.iTunes:ENGINEER": "engineer", "----:com.apple.iTunes:MIXER": "mixer", "----:com.apple.iTunes:DJMIXER": "djmixer", "----:com.apple.iTunes:REMIXER": "remixer", "----:com.apple.iTunes:ISRC": "isrc", "----:com.apple.iTunes:MEDIA": "media", "----:com.apple.iTunes:LABEL": "label", "----:com.apple.iTunes:LICENSE": "license", "----:com.apple.iTunes:CATALOGNUMBER": "catalognumber", "----:com.apple.iTunes:SUBTITLE": "subtitle", "----:com.apple.iTunes:DISCSUBTITLE": "discsubtitle", "----:com.apple.iTunes:MOOD": "mood", "----:com.apple.iTunes:SCRIPT": "script", "----:com.apple.iTunes:LANGUAGE": "language", "----:com.apple.iTunes:ARTISTS": "artists", "----:com.apple.iTunes:WORK": "work", } __r_freeform_tags = dict([(v, k) for k, v in __freeform_tags.iteritems()]) __other_supported_tags = ("discnumber", "tracknumber", "totaldiscs", "totaltracks") def _load(self, filename): log.debug("Loading file %r", filename) file = MP4(encode_filename(filename)) if file.tags is None: file.add_tags() metadata = Metadata() for name, values in file.tags.items(): if name in self.__text_tags: for value in values: metadata.add(self.__text_tags[name], value) elif name in self.__bool_tags: metadata.add(self.__bool_tags[name], values and '1' or '0') elif name in self.__int_tags: for value in values: metadata.add(self.__int_tags[name], unicode(value)) elif name in self.__freeform_tags: for value in values: value = value.strip("\x00").decode("utf-8", "replace") metadata.add(self.__freeform_tags[name], value) elif name == "----:com.apple.iTunes:fingerprint": for value in values: value = value.strip("\x00").decode("utf-8", "replace") if value.startswith("MusicMagic Fingerprint"): metadata.add("musicip_fingerprint", value[22:]) elif name == "trkn": metadata["tracknumber"] = str(values[0][0]) metadata["totaltracks"] = str(values[0][1]) elif name == "disk": metadata["discnumber"] = str(values[0][0]) metadata["totaldiscs"] = str(values[0][1]) elif name == "covr": for value in values: if value.imageformat not in (value.FORMAT_JPEG, value.FORMAT_PNG): continue try: coverartimage = TagCoverArtImage( file=filename, tag=name, data=value, ) except CoverArtImageError as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.append_image(coverartimage) self._info(metadata, file) return metadata def _save(self, filename, metadata): log.debug("Saving file %r", filename) file = MP4(encode_filename(self.filename)) if file.tags is None: file.add_tags() if config.setting["clear_existing_tags"]: file.tags.clear() for name, values in metadata.rawitems(): if name.startswith('lyrics:'): name = 'lyrics' if name in self.__r_text_tags: file.tags[self.__r_text_tags[name]] = values elif name in self.__r_bool_tags: file.tags[self.__r_bool_tags[name]] = (values[0] == '1') elif name in self.__r_int_tags: try: file.tags[self.__r_int_tags[name]] = [int(value) for value in values] except ValueError: pass elif name in self.__r_freeform_tags: values = [v.encode("utf-8") for v in values] file.tags[self.__r_freeform_tags[name]] = values elif name == "musicip_fingerprint": file.tags["----:com.apple.iTunes:fingerprint"] = ["MusicMagic Fingerprint%s" % str(v) for v in values] if "tracknumber" in metadata: if "totaltracks" in metadata: file.tags["trkn"] = [(int(metadata["tracknumber"]), int(metadata["totaltracks"]))] else: file.tags["trkn"] = [(int(metadata["tracknumber"]), 0)] if "discnumber" in metadata: if "totaldiscs" in metadata: file.tags["disk"] = [(int(metadata["discnumber"]), int(metadata["totaldiscs"]))] else: file.tags["disk"] = [(int(metadata["discnumber"]), 0)] covr = [] for image in metadata.images_to_be_saved_to_tags: if image.mimetype == "image/jpeg": covr.append(MP4Cover(image.data, MP4Cover.FORMAT_JPEG)) elif image.mimetype == "image/png": covr.append(MP4Cover(image.data, MP4Cover.FORMAT_PNG)) if covr: file.tags["covr"] = covr file.save() def supports_tag(self, name): return name in self.__r_text_tags or name in self.__r_bool_tags\ or name in self.__r_freeform_tags\ or name in self.__other_supported_tags\ or name.startswith('lyrics:') picard-release-1.3.2/picard/formats/mutagenext/000077500000000000000000000000001245305550700215015ustar00rootroot00000000000000picard-release-1.3.2/picard/formats/mutagenext/__init__.py000066400000000000000000000000001245305550700236000ustar00rootroot00000000000000picard-release-1.3.2/picard/formats/mutagenext/compatid3.py000066400000000000000000000213231245305550700237370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2005 Michael Urman # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import struct from struct import pack, unpack import mutagen from mutagen._util import insert_bytes from mutagen.id3 import ID3, Frames, Frames_2_2, TextFrame, TORY, \ TYER, TIME, APIC, IPLS, TDAT, BitPaddedInt, MakeID3v1 class TCMP(TextFrame): pass class TSO2(TextFrame): pass class TSOC(TextFrame): pass class XDOR(TextFrame): pass class XSOP(TextFrame): pass class CompatID3(ID3): """ Additional features over mutagen.id3.ID3: * ID3v2.3 writing * iTunes' TCMP frame """ PEDANTIC = False def __init__(self, *args, **kwargs): self.unknown_frames = [] if args: known_frames = dict(Frames) known_frames.update(dict(Frames_2_2)) known_frames["TCMP"] = TCMP known_frames["TSO2"] = TSO2 known_frames["TSOC"] = TSOC known_frames["XDOR"] = XDOR known_frames["XSOP"] = XSOP kwargs["known_frames"] = known_frames super(CompatID3, self).__init__(*args, **kwargs) def save(self, filename=None, v1=1, v2=4): """Save changes to a file. If no filename is given, the one most recently loaded is used. Keyword arguments: v1 -- if 0, ID3v1 tags will be removed if 1, ID3v1 tags will be updated but not added if 2, ID3v1 tags will be created and/or updated v2 -- version of ID3v2 tags (3 or 4). By default Mutagen saves ID3v2.4 tags. If you want to save ID3v2.3 tags, you must call method update_to_v23 before saving the file. The lack of a way to update only an ID3v1 tag is intentional. """ # Sort frames by 'importance' order = ["TIT2", "TPE1", "TRCK", "TALB", "TPOS", "TDRC", "TCON"] order = dict(zip(order, range(len(order)))) last = len(order) frames = self.items() frames.sort(lambda a, b: cmp(order.get(a[0][:4], last), order.get(b[0][:4], last))) framedata = [self.__save_frame(frame, v2) for (key, frame) in frames] framedata.extend([data for data in self.unknown_frames if len(data) > 10]) if not framedata: try: self.delete(filename) except EnvironmentError as err: from errno import ENOENT if err.errno != ENOENT: raise return framedata = ''.join(framedata) framesize = len(framedata) if filename is None: filename = self.filename try: f = open(filename, 'rb+') except IOError as err: from errno import ENOENT if err.errno != ENOENT: raise f = open(filename, 'ab') # create, then reopen f = open(filename, 'rb+') try: idata = f.read(10) try: id3, vmaj, vrev, flags, insize = unpack('>3sBBB4s', idata) except struct.error: id3, insize = '', 0 insize = BitPaddedInt(insize) if id3 != 'ID3': insize = -10 if insize >= framesize: outsize = insize else: outsize = (framesize + 1023) & ~0x3FF framedata += '\x00' * (outsize - framesize) framesize = BitPaddedInt.to_str(outsize, width=4) flags = 0 header = pack('>3sBBB4s', 'ID3', v2, 0, flags, framesize) data = header + framedata if (insize < outsize): insert_bytes(f, outsize - insize, insize + 10) f.seek(0) f.write(data) try: f.seek(-128, 2) except IOError as err: from errno import EINVAL if err.errno != EINVAL: raise f.seek(0, 2) # ensure read won't get "TAG" if f.read(3) == "TAG": f.seek(-128, 2) if v1 > 0: f.write(MakeID3v1(self)) else: f.truncate() elif v1 == 2: f.seek(0, 2) f.write(MakeID3v1(self)) finally: f.close() def __save_frame(self, frame, v2): flags = 0 if self.PEDANTIC and isinstance(frame, TextFrame): if len(str(frame)) == 0: return '' framedata = frame._writeData() if v2 == 3: bits = 8 else: bits = 7 datasize = BitPaddedInt.to_str(len(framedata), width=4, bits=bits) header = pack('>4s4sH', type(frame).__name__, datasize, flags) return header + framedata def update_to_v23(self, join_with="/"): """Convert older (and newer) tags into an ID3v2.3 tag. This updates incompatible ID3v2 frames to ID3v2.3 ones. If you intend to save tags as ID3v2.3, you must call this function at some point. """ if self.version < (2, 3, 0): del self.unknown_frames[:] # TMCL, TIPL -> TIPL if "TIPL" in self or "TMCL" in self: people = [] if "TIPL" in self: f = self.pop("TIPL") people.extend(f.people) if "TMCL" in self: f = self.pop("TMCL") people.extend(f.people) if "IPLS" not in self: self.add(IPLS(encoding=f.encoding, people=people)) # TODO: # * EQU2 -> EQUA # * RVA2 -> RVAD # TDOR -> TORY if "TDOR" in self: f = self.pop("TDOR") if f.text: d = f.text[0] if d.year and "TORY" not in self: self.add(TORY(encoding=f.encoding, text="%04d" % d.year)) # TDRC -> TYER, TDAT, TIME if "TDRC" in self: f = self.pop("TDRC") if f.text: d = f.text[0] if d.year and "TYER" not in self: self.add(TYER(encoding=f.encoding, text="%04d" % d.year)) if d.month and d.day and "TDAT" not in self: self.add(TDAT(encoding=f.encoding, text="%02d%02d" % (d.day, d.month))) if d.hour and d.minute and "TIME" not in self: self.add(TIME(encoding=f.encoding, text="%02d%02d" % (d.hour, d.minute))) if "TCON" in self: self["TCON"].genres = self["TCON"].genres if self.version < (2, 3): # ID3v2.2 PIC frames are slightly different. pics = self.getall("APIC") mimes = { "PNG": "image/png", "JPG": "image/jpeg" } self.delall("APIC") for pic in pics: newpic = APIC( encoding=pic.encoding, mime=mimes.get(pic.mime, pic.mime), type=pic.type, desc=pic.desc, data=pic.data) self.add(newpic) # ID3v2.2 LNK frames are just way too different to upgrade. self.delall("LINK") # leave TSOP, TSOA and TSOT even though they are officially defined # only in ID3v2.4, because most applications use them also in ID3v2.3 # New frames added in v2.4. for key in ["ASPI", "EQU2", "RVA2", "SEEK", "SIGN", "TDRL", "TDTG", "TMOO", "TPRO"]: if key in self: del(self[key]) for frame in self.values(): # ID3v2.3 doesn't support UTF-8 (and WMP can't read UTF-16 BE) if hasattr(frame, "encoding"): if frame.encoding > 1: frame.encoding = 1 # ID3v2.3 doesn't support multiple values if isinstance(frame, mutagen.id3.TextFrame): try: frame.text = [join_with.join(frame.text)] except TypeError: frame.text = frame.text[:1] picard-release-1.3.2/picard/formats/mutagenext/tak.py000066400000000000000000000024061245305550700226340ustar00rootroot00000000000000# Tom's lossless Audio Kompressor (TAK) reader/tagger # # Copyright 2008 Lukas Lalinsky # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # $$ """Tom's lossless Audio Kompressor streams with APEv2 tags. TAK is a lossless audio compressor developed by Thomas Becker. For more information, see http://wiki.hydrogenaudio.org/index.php?title=TAK and http://en.wikipedia.org/wiki/TAK_(audio_codec) """ __all__ = ["TAK", "Open", "delete"] from mutagen.apev2 import APEv2File, error, delete class TAKHeaderError(error): pass class TAKInfo(object): """TAK stream information. Attributes: (none at the moment) """ def __init__(self, fileobj): header = fileobj.read(4) if len(header) != 4 or not header.startswith("tBaK"): raise TAKHeaderError("not a TAK file") def pprint(self): return "Tom's lossless Audio Kompressor" class TAK(APEv2File): _Info = TAKInfo _mimes = ["audio/x-tak"] def score(filename, fileobj, header): return header.startswith("tBaK") + filename.lower().endswith(".tak") score = staticmethod(score) Open = TAK picard-release-1.3.2/picard/formats/vorbis.py000066400000000000000000000270251245305550700212040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import base64 import mutagen.flac import mutagen.ogg import mutagen.oggflac import mutagen.oggspeex import mutagen.oggtheora import mutagen.oggvorbis try: from mutagen.oggopus import OggOpus with_opus = True except ImportError: OggOpus = None with_opus = False from picard import config, log from picard.coverart.image import TagCoverArtImage, CoverArtImageError from picard.file import File from picard.formats.id3 import types_from_id3, image_type_as_id3_num from picard.metadata import Metadata from picard.util import encode_filename, sanitize_date class VCommentFile(File): """Generic VComment-based file.""" _File = None __translate = { "musicbrainz_trackid": "musicbrainz_recordingid", "musicbrainz_releasetrackid": "musicbrainz_trackid", } __rtranslate = dict([(v, k) for k, v in __translate.iteritems()]) def _load(self, filename): log.debug("Loading file %r", filename) file = self._File(encode_filename(filename)) file.tags = file.tags or {} metadata = Metadata() for origname, values in file.tags.items(): for value in values: name = origname if name == "date" or name == "originaldate": # YYYY-00-00 => YYYY value = sanitize_date(value) elif name == 'performer' or name == 'comment': # transform "performer=Joe Barr (Piano)" to "performer:Piano=Joe Barr" name += ':' if value.endswith(')'): start = len(value) - 2 count = 1 while count > 0 and start > 0: if value[start] == ')': count += 1 elif value[start] == '(': count -= 1 start -= 1 if start > 0: name += value[start + 2:-1] value = value[:start] elif name.startswith('rating'): try: name, email = name.split(':', 1) except ValueError: email = '' if email != config.setting['rating_user_email']: continue name = '~rating' value = unicode(int(round((float(value) * (config.setting['rating_steps'] - 1))))) elif name == "fingerprint" and value.startswith("MusicMagic Fingerprint"): name = "musicip_fingerprint" value = value[22:] elif name == "tracktotal": if "totaltracks" in file.tags: continue name = "totaltracks" elif name == "disctotal": if "totaldiscs" in file.tags: continue name = "totaldiscs" elif name == "metadata_block_picture": image = mutagen.flac.Picture(base64.standard_b64decode(value)) try: coverartimage = TagCoverArtImage( file=filename, tag=name, types=types_from_id3(image.type), comment=image.desc, support_types=True, data=image.data, ) except CoverArtImageError as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.append_image(coverartimage) continue elif name in self.__translate: name = self.__translate[name] metadata.add(name, value) if self._File == mutagen.flac.FLAC: for image in file.pictures: try: coverartimage = TagCoverArtImage( file=filename, tag='FLAC/PICTURE', types=types_from_id3(image.type), comment=image.desc, support_types=True, data=image.data, ) except CoverArtImageError as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.append_image(coverartimage) # Read the unofficial COVERART tags, for backward compatibillity only if not "metadata_block_picture" in file.tags: try: for data in file["COVERART"]: try: coverartimage = TagCoverArtImage( file=filename, tag='COVERART', data=base64.standard_b64decode(data) ) except CoverArtImageError as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.append_image(coverartimage) except KeyError: pass self._info(metadata, file) return metadata def _save(self, filename, metadata): """Save metadata to the file.""" log.debug("Saving file %r", filename) is_flac = self._File == mutagen.flac.FLAC file = self._File(encode_filename(filename)) if file.tags is None: file.add_tags() if config.setting["clear_existing_tags"]: file.tags.clear() if (is_flac and (config.setting["clear_existing_tags"] or metadata.images_to_be_saved_to_tags)): file.clear_pictures() tags = {} for name, value in metadata.items(): if name == '~rating': # Save rating according to http://code.google.com/p/quodlibet/wiki/Specs_VorbisComments if config.setting['rating_user_email']: name = 'rating:%s' % config.setting['rating_user_email'] else: name = 'rating' value = unicode(float(value) / (config.setting['rating_steps'] - 1)) # don't save private tags elif name.startswith("~"): continue if name.startswith('lyrics:'): name = 'lyrics' elif name == "date" or name == "originaldate": # YYYY-00-00 => YYYY value = sanitize_date(value) elif name.startswith('performer:') or name.startswith('comment:'): # transform "performer:Piano=Joe Barr" to "performer=Joe Barr (Piano)" name, desc = name.split(':', 1) if desc: value += ' (%s)' % desc elif name == "musicip_fingerprint": name = "fingerprint" value = "MusicMagic Fingerprint%s" % value elif name in self.__rtranslate: name = self.__rtranslate[name] tags.setdefault(name.upper().encode('utf-8'), []).append(value) if "totaltracks" in metadata: tags.setdefault(u"TRACKTOTAL", []).append(metadata["totaltracks"]) if "totaldiscs" in metadata: tags.setdefault(u"DISCTOTAL", []).append(metadata["totaldiscs"]) for image in metadata.images_to_be_saved_to_tags: picture = mutagen.flac.Picture() picture.data = image.data picture.mime = image.mimetype picture.desc = image.comment picture.type = image_type_as_id3_num(image.maintype) if self._File == mutagen.flac.FLAC: file.add_picture(picture) else: tags.setdefault(u"METADATA_BLOCK_PICTURE", []).append( base64.standard_b64encode(picture.write())) file.tags.update(tags) kwargs = {} if is_flac and config.setting["remove_id3_from_flac"]: kwargs["deleteid3"] = True try: file.save(**kwargs) except TypeError: file.save() class FLACFile(VCommentFile): """FLAC file.""" EXTENSIONS = [".flac"] NAME = "FLAC" _File = mutagen.flac.FLAC def _info(self, metadata, file): super(FLACFile, self)._info(metadata, file) metadata['~format'] = self.NAME class OggFLACFile(VCommentFile): """FLAC file.""" EXTENSIONS = [".oggflac"] NAME = "Ogg FLAC" _File = mutagen.oggflac.OggFLAC def _info(self, metadata, file): super(OggFLACFile, self)._info(metadata, file) metadata['~format'] = self.NAME class OggSpeexFile(VCommentFile): """Ogg Speex file.""" EXTENSIONS = [".spx"] NAME = "Speex" _File = mutagen.oggspeex.OggSpeex def _info(self, metadata, file): super(OggSpeexFile, self)._info(metadata, file) metadata['~format'] = self.NAME class OggTheoraFile(VCommentFile): """Ogg Theora file.""" EXTENSIONS = [".oggtheora"] NAME = "Ogg Theora" _File = mutagen.oggtheora.OggTheora def _info(self, metadata, file): super(OggTheoraFile, self)._info(metadata, file) metadata['~format'] = self.NAME class OggVorbisFile(VCommentFile): """Ogg Vorbis file.""" EXTENSIONS = [".ogg"] NAME = "Ogg Vorbis" _File = mutagen.oggvorbis.OggVorbis def _info(self, metadata, file): super(OggVorbisFile, self)._info(metadata, file) metadata['~format'] = self.NAME class OggOpusFile(VCommentFile): """Ogg Opus file.""" EXTENSIONS = [".opus"] NAME = "Ogg Opus" _File = OggOpus def _info(self, metadata, file): super(OggOpusFile, self)._info(metadata, file) metadata['~format'] = self.NAME def _select_ogg_type(filename, options): """Select the best matching Ogg file type.""" fileobj = file(filename, "rb") results = [] try: header = fileobj.read(128) results = [ (option._File.score(filename, fileobj, header), option.__name__, option) for option in options] finally: fileobj.close() results.sort() if not results or results[-1][0] <= 0: raise mutagen.ogg.error("unknown Ogg audio format") return results[-1][2](filename) def OggAudioFile(filename): """Generic Ogg audio file.""" options = [OggFLACFile, OggSpeexFile, OggVorbisFile] return _select_ogg_type(filename, options) OggAudioFile.EXTENSIONS = [".oga"] OggAudioFile.NAME = "Ogg Audio" def OggVideoFile(filename): """Generic Ogg video file.""" options = [OggTheoraFile] return _select_ogg_type(filename, options) OggVideoFile.EXTENSIONS = [".ogv"] OggVideoFile.NAME = "Ogg Video" picard-release-1.3.2/picard/formats/wav.py000066400000000000000000000031611245305550700204700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import wave from picard import log from picard.file import File from picard.metadata import Metadata from picard.util import encode_filename class WAVFile(File): EXTENSIONS = [".wav"] NAME = "Microsoft WAVE" def _load(self, filename): log.debug("Loading file %r", filename) f = wave.open(encode_filename(filename), "rb") metadata = Metadata() metadata['~channels'] = f.getnchannels() metadata['~bits_per_sample'] = f.getsampwidth() * 8 metadata['~sample_rate'] = f.getframerate() metadata.length = 1000 * f.getnframes() / f.getframerate() metadata['~format'] = 'Microsoft WAVE' self._add_path_to_metadata(metadata) return metadata def _save(self, filename, metadata): log.debug("Saving file %r", filename) pass picard-release-1.3.2/picard/i18n.py000066400000000000000000000106371245305550700170050ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2013 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import gettext import locale import os.path import sys import __builtin__ __builtin__.__dict__['N_'] = lambda a: a def setup_gettext(localedir, ui_language=None, logger=None): """Setup locales, load translations, install gettext functions.""" if not logger: logger = lambda *a, **b: None # noop current_locale = '' if ui_language: os.environ['LANGUAGE'] = '' os.environ['LANG'] = ui_language try: current_locale = locale.normalize(ui_language + '.' + locale.getpreferredencoding()) locale.setlocale(locale.LC_ALL, current_locale) except: pass if sys.platform == "win32": try: locale.setlocale(locale.LC_ALL, os.environ["LANG"]) except KeyError: os.environ["LANG"] = locale.getdefaultlocale()[0] try: current_locale = locale.setlocale(locale.LC_ALL, "") except: pass except: pass elif not ui_language: if sys.platform == "darwin": try: import Foundation defaults = Foundation.NSUserDefaults.standardUserDefaults() os.environ["LANG"] = \ defaults.objectForKey_("AppleLanguages")[0] except: pass try: current_locale = locale.setlocale(locale.LC_ALL, "") except: pass logger("Using locale %r", current_locale) try: logger("Loading gettext translation, localedir=%r", localedir) trans = gettext.translation("picard", localedir) trans.install(True) _ungettext = trans.ungettext logger("Loading gettext translation (picard-countries), localedir=%r", localedir) trans_countries = gettext.translation("picard-countries", localedir) _ugettext_countries = trans_countries.ugettext logger("Loading gettext translation (picard-attributes), localedir=%r", localedir) trans_attributes = gettext.translation("picard-attributes", localedir) _ugettext_attributes = trans_attributes.ugettext except IOError as e: logger(e) __builtin__.__dict__['_'] = lambda a: a def _ungettext(a, b, c): if c == 1: return a else: return b def _ugettext_countries(msg): return msg def _ugettext_attributes(msg): return msg __builtin__.__dict__['ungettext'] = _ungettext __builtin__.__dict__['ugettext_countries'] = _ugettext_countries __builtin__.__dict__['ugettext_attributes'] = _ugettext_attributes logger("_ = %r", _) logger("N_ = %r", N_) logger("ungettext = %r", ungettext) logger("ugettext_countries = %r", ugettext_countries) logger("ugettext_attributes = %r", ugettext_attributes) # Workaround for po files with msgctxt which isn't supported by current python # gettext # msgctxt are used within attributes.po, and ugettext is failing to translate # strings due to that # This workaround is a hack until we get proper msgctxt support _CONTEXT_SEPARATOR = "\x04" def ugettext_ctxt(ugettext_, message, context=None): if context is None: return ugettext_(message) msg_with_ctxt = u"%s%s%s" % (context, _CONTEXT_SEPARATOR, message) translated = ugettext_(msg_with_ctxt) if _CONTEXT_SEPARATOR in translated: # no translation found, return original message return message return translated def ugettext_attr(message, context=None): """Translate MB attributes, depending on context""" return ugettext_ctxt(ugettext_attributes, message, context) picard-release-1.3.2/picard/log.py000066400000000000000000000066011245305550700170030ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import os from collections import deque from PyQt4 import QtCore from picard.util import thread LOG_INFO = 1 LOG_WARNING = 2 LOG_ERROR = 4 LOG_DEBUG = 8 class Logger(object): def __init__(self, maxlen=0): self._receivers = [] self.maxlen = maxlen self.reset() def reset(self): if self.maxlen > 0: self.entries = deque(maxlen=self.maxlen) else: self.entries = [] def register_receiver(self, receiver): self._receivers.append(receiver) def unregister_receiver(self, receiver): self._receivers.remove(receiver) def message(self, level, message, *args): if not self.log_level(level): return if not (isinstance(message, str) or isinstance(message, unicode)): message = repr(message) if args: message = message % args time = QtCore.QTime.currentTime() message = "%s" % (message,) self.entries.append((level, time, message)) for func in self._receivers: try: thread.to_main(func, level, time, message) except: import traceback traceback.print_exc() def log_level(self, level): return True # main logger log_levels = LOG_INFO | LOG_WARNING | LOG_ERROR main_logger = Logger(50000) main_logger.log_level = lambda level: log_levels & level def debug(message, *args): main_logger.message(LOG_DEBUG, message, *args) def info(message, *args): main_logger.message(LOG_INFO, message, *args) def warning(message, *args): main_logger.message(LOG_WARNING, message, *args) def error(message, *args): main_logger.message(LOG_ERROR, message, *args) _log_prefixes = { LOG_INFO: 'I', LOG_WARNING: 'W', LOG_ERROR: 'E', LOG_DEBUG: 'D', } def formatted_log_line(level, time, message, timefmt='hh:mm:ss', level_prefixes=_log_prefixes): msg = "%s %s" % (time.toString(timefmt), message) if level_prefixes: return "%s: %s" % (level_prefixes[level], msg) else: return msg def _stderr_receiver(level, time, msg): try: sys.stderr.write(formatted_log_line(level, time, msg + os.linesep)) except UnicodeDecodeError: import traceback traceback.print_exc() print "%r" % msg main_logger.register_receiver(_stderr_receiver) # history of status messages history_logger = Logger(50000) history_logger.log_level = lambda level: log_levels & level def history_info(message, *args): history_logger.message(LOG_INFO, message, *args) picard-release-1.3.2/picard/mbxml.py000066400000000000000000000356001245305550700173420ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from picard import config from picard.util import (format_time, translate_from_sortname, parse_amazon_url, linear_combination_of_weights) from picard.const import RELEASE_FORMATS _artist_rel_types = { "composer": "composer", "writer": "writer", "conductor": "conductor", "chorus master": "conductor", "performing orchestra": "performer:orchestra", "arranger": "arranger", "orchestrator": "arranger", "instrumentator": "arranger", "lyricist": "lyricist", "librettist": "lyricist", "remixer": "remixer", "producer": "producer", "engineer": "engineer", "audio": "engineer", #"Mastering": "engineer", "sound": "engineer", "live sound": "engineer", "mix": "mixer", #"Recording": "engineer", "mix-DJ": "djmixer", } def _decamelcase(text): return re.sub(r'([A-Z])', r' \1', text).strip() _REPLACE_MAP = {} _EXTRA_ATTRS = ['guest', 'additional', 'minor'] _BLANK_SPECIAL_RELTYPES = {'vocal': 'vocals'} def _parse_attributes(attrs, reltype): attrs = [_decamelcase(_REPLACE_MAP.get(a, a)) for a in attrs] prefix = ' '.join([a for a in attrs if a in _EXTRA_ATTRS]) attrs = [a for a in attrs if a not in _EXTRA_ATTRS] if len(attrs) > 1: attrs = '%s and %s' % (', '.join(attrs[:-1]), attrs[-1:][0]) elif len(attrs) == 1: attrs = attrs[0] else: attrs = _BLANK_SPECIAL_RELTYPES.get(reltype, '') return ' '.join([prefix, attrs]).strip().lower() def _relations_to_metadata(relation_lists, m): for relation_list in relation_lists: if relation_list.target_type == 'artist': for relation in relation_list.relation: artist = relation.artist[0] value, valuesort = _translate_artist_node(artist) reltype = relation.type attribs = [] if 'attribute_list' in relation.children: attribs = [a.text for a in relation.attribute_list[0].attribute] if reltype in ('vocal', 'instrument', 'performer'): name = 'performer:' + _parse_attributes(attribs, reltype) elif reltype == 'mix-DJ' and len(attribs) > 0: if not hasattr(m, "_djmix_ars"): m._djmix_ars = {} for attr in attribs: m._djmix_ars.setdefault(attr.split()[1], []).append(value) continue else: try: name = _artist_rel_types[reltype] except KeyError: continue if value not in m[name]: m.add(name, value) if name == 'composer' and valuesort not in m['composersort']: m.add('composersort', valuesort) elif relation_list.target_type == 'work': for relation in relation_list.relation: if relation.type == 'performance': performance_to_metadata(relation, m) work_to_metadata(relation.work[0], m) elif relation_list.target_type == 'url': for relation in relation_list.relation: if relation.type == 'amazon asin' and 'asin' not in m: amz = parse_amazon_url(relation.target[0].text) if amz is not None: m['asin'] = amz['asin'] elif relation.type == 'license': url = relation.target[0].text m.add('license', url) def _translate_artist_node(node): transl, translsort = None, None if config.setting['translate_artist_names']: locale = config.setting["artist_locale"] lang = locale.split("_")[0] if "alias_list" in node.children: result = (-1, (None, None)) for alias in node.alias_list[0].alias: if alias.attribs.get("primary") != "primary": continue if "locale" not in alias.attribs: continue parts = [] if alias.locale == locale: score = 0.8 elif alias.locale == lang: score = 0.6 elif alias.locale.split("_")[0] == lang: score = 0.4 else: continue parts.append((score, 5)) if alias.attribs.get("type") == u"Artist name": score = 0.8 elif alias.attribs.get("type") == u"Legal Name": score = 0.5 else: # as 2014/09/19, only Artist or Legal names should have the # Primary flag score = 0.0 parts.append((score, 5)) comb = linear_combination_of_weights(parts) if comb > result[0]: result = (comb, (alias.text, alias.attribs["sort_name"])) transl, translsort = result[1] if not transl: translsort = node.sort_name[0].text transl = translate_from_sortname(node.name[0].text, translsort) else: transl, translsort = node.name[0].text, node.sort_name[0].text return (transl, translsort) def artist_credit_from_node(node): artist = "" artistsort = "" artists = [] artistssort = [] standardize_artists = config.setting["standardize_artists"] for credit in node.name_credit: a = credit.artist[0] translated, translated_sort = _translate_artist_node(a) if translated != a.name[0].text: name = translated elif 'name' in credit.children and not standardize_artists: name = credit.name[0].text else: name = a.name[0].text artist += name artistsort += translated_sort artists.append(name) artistssort.append(translated_sort) if 'joinphrase' in credit.attribs: artist += credit.joinphrase artistsort += credit.joinphrase return (artist, artistsort, artists, artistssort) def artist_credit_to_metadata(node, m, release=False): ids = [n.artist[0].id for n in node.name_credit] artist, artistsort, artists, artistssort = artist_credit_from_node(node) if release: m["musicbrainz_albumartistid"] = ids m["albumartist"] = artist m["albumartistsort"] = artistsort m["~albumartists"] = artists m["~albumartists_sort"] = artistssort else: m["musicbrainz_artistid"] = ids m["artist"] = artist m["artistsort"] = artistsort m["artists"] = artists m["~artists_sort"] = artistsort def label_info_from_node(node): labels = [] catalog_numbers = [] if node.count != "0": for label_info in node.label_info: if 'label' in label_info.children: label = label_info.label[0].name[0].text if label not in labels: labels.append(label) if 'catalog_number' in label_info.children: cat_num = label_info.catalog_number[0].text if cat_num not in catalog_numbers: catalog_numbers.append(cat_num) return (labels, catalog_numbers) def media_formats_from_node(node): formats_count = {} formats_order = [] for medium in node.medium: if "format" in medium.children: text = medium.format[0].text else: text = "(unknown)" if text in formats_count: formats_count[text] += 1 else: formats_count[text] = 1 formats_order.append(text) formats = [] for format in formats_order: count = formats_count[format] format = RELEASE_FORMATS.get(format, format) if count > 1: format = str(count) + u"×" + format formats.append(format) return " + ".join(formats) def track_to_metadata(node, track): m = track.metadata recording_to_metadata(node.recording[0], track) m.add_unique('musicbrainz_trackid', node.id) # overwrite with data we have on the track for name, nodes in node.children.iteritems(): if not nodes: continue if name == 'title': m['title'] = nodes[0].text elif name == 'position': m['tracknumber'] = nodes[0].text elif name == 'number': m['~musicbrainz_tracknumber'] = nodes[0].text elif name == 'length' and nodes[0].text: m.length = int(nodes[0].text) elif name == 'artist_credit': artist_credit_to_metadata(nodes[0], m) m['~length'] = format_time(m.length) def recording_to_metadata(node, track): m = track.metadata m.length = 0 m.add_unique('musicbrainz_recordingid', node.id) for name, nodes in node.children.iteritems(): if not nodes: continue if name == 'title': m['title'] = nodes[0].text m['~recordingtitle'] = nodes[0].text elif name == 'length' and nodes[0].text: m.length = int(nodes[0].text) elif name == 'disambiguation': m['~recordingcomment'] = nodes[0].text elif name == 'artist_credit': artist_credit_to_metadata(nodes[0], m) elif name == 'relation_list': _relations_to_metadata(nodes, m) elif name == 'tag_list': add_folksonomy_tags(nodes[0], track) elif name == 'user_tag_list': add_user_folksonomy_tags(nodes[0], track) elif name == 'isrc_list': add_isrcs_to_metadata(nodes[0], m) elif name == 'user_rating': m['~rating'] = nodes[0].text m['~length'] = format_time(m.length) def performance_to_metadata(relation, m): if 'attribute_list' in relation.children: if 'attribute' in relation.attribute_list[0].children: for attribute in relation.attribute_list[0].attribute: m.add_unique("~performance_attributes", attribute.text) def work_to_metadata(work, m): m.add_unique("musicbrainz_workid", work.id) if 'language' in work.children: m.add_unique("language", work.language[0].text) if 'title' in work.children: m.add("work", work.title[0].text) if 'relation_list' in work.children: _relations_to_metadata(work.relation_list, m) def medium_to_metadata(node, m): for name, nodes in node.children.iteritems(): if not nodes: continue if name == 'position': m['discnumber'] = nodes[0].text elif name == 'track_list': m['totaltracks'] = nodes[0].count elif name == 'title': m['discsubtitle'] = nodes[0].text elif name == 'format': m['media'] = nodes[0].text def release_to_metadata(node, m, album=None): """Make metadata dict from a XML 'release' node.""" m.add_unique('musicbrainz_albumid', node.id) for name, nodes in node.children.iteritems(): if not nodes: continue if name == 'status': m['releasestatus'] = nodes[0].text.lower() elif name == 'title': m['album'] = nodes[0].text elif name == 'disambiguation': m['~releasecomment'] = nodes[0].text elif name == 'asin': m['asin'] = nodes[0].text elif name == 'artist_credit': artist_credit_to_metadata(nodes[0], m, release=True) elif name == 'date': m['date'] = nodes[0].text elif name == 'country': m['releasecountry'] = nodes[0].text elif name == 'barcode': m['barcode'] = nodes[0].text elif name == 'relation_list': _relations_to_metadata(nodes, m) elif name == 'label_info_list' and nodes[0].count != '0': m['label'], m['catalognumber'] = label_info_from_node(nodes[0]) elif name == 'text_representation': if 'language' in nodes[0].children: m['~releaselanguage'] = nodes[0].language[0].text if 'script' in nodes[0].children: m['script'] = nodes[0].script[0].text elif name == 'tag_list': add_folksonomy_tags(nodes[0], album) elif name == 'user_tag_list': add_user_folksonomy_tags(nodes[0], album) def release_group_to_metadata(node, m, release_group=None): """Make metadata dict from a XML 'release-group' node taken from inside a 'release' node.""" m.add_unique('musicbrainz_releasegroupid', node.id) for name, nodes in node.children.iteritems(): if not nodes: continue if name == 'title': m['~releasegroup'] = nodes[0].text elif name == 'disambiguation': m['~releasegroupcomment'] = nodes[0].text elif name == 'first_release_date': m['originaldate'] = nodes[0].text if m['originaldate']: m['originalyear'] = m['originaldate'][:4] elif name == 'tag_list': add_folksonomy_tags(nodes[0], release_group) elif name == 'user_tag_list': add_user_folksonomy_tags(nodes[0], release_group) elif name == 'primary_type': m['~primaryreleasetype'] = nodes[0].text.lower() elif name == 'secondary_type_list': add_secondary_release_types(nodes[0], m) m['releasetype'] = m.getall('~primaryreleasetype') + m.getall('~secondaryreleasetype') def add_secondary_release_types(node, m): if 'secondary_type' in node.children: for secondary_type in node.secondary_type: m.add_unique('~secondaryreleasetype', secondary_type.text.lower()) def add_folksonomy_tags(node, obj): if obj and 'tag' in node.children: for tag in node.tag: name = tag.name[0].text count = int(tag.attribs['count']) obj.add_folksonomy_tag(name, count) def add_user_folksonomy_tags(node, obj): if obj and 'user_tag' in node.children: for tag in node.user_tag: name = tag.name[0].text obj.add_folksonomy_tag(name, 1) def add_isrcs_to_metadata(node, metadata): if 'isrc' in node.children: for isrc in node.isrc: metadata.add('isrc', isrc.id) picard-release-1.3.2/picard/metadata.py000066400000000000000000000245051245305550700200050ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006-2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. from PyQt4.QtCore import QObject from picard import config, log from picard.plugin import PluginFunctions, PluginPriority from picard.similarity import similarity2 from picard.util import ( linear_combination_of_weights, ) from picard.mbxml import artist_credit_from_node MULTI_VALUED_JOINER = '; ' class Metadata(dict): """List of metadata items with dict-like access.""" __weights = [ ('title', 22), ('artist', 6), ('album', 12), ('tracknumber', 6), ('totaltracks', 5), ] multi_valued_joiner = MULTI_VALUED_JOINER def __init__(self): super(Metadata, self).__init__() self.images = [] self.length = 0 def append_image(self, coverartimage): self.images.append(coverartimage) @property def images_to_be_saved_to_tags(self): if not config.setting["save_images_to_tags"]: return () images = [img for img in self.images if img.can_be_saved_to_tags] if config.setting["save_only_front_images_to_tags"]: # FIXME : rename option at some point # Embed only ONE front image for img in images: if img.is_front_image(): return [img] return images def remove_image(self, index): self.images.pop(index) def compare(self, other): parts = [] if self.length and other.length: score = 1.0 - min(abs(self.length - other.length), 30000) / 30000.0 parts.append((score, 8)) for name, weight in self.__weights: a = self[name] b = other[name] if a and b: if name in ('tracknumber', 'totaltracks'): try: ia = int(a) ib = int(b) except ValueError: ia = a ib = b score = 1.0 - abs(cmp(ia, ib)) else: score = similarity2(a, b) parts.append((score, weight)) return linear_combination_of_weights(parts) def compare_to_release(self, release, weights): """ Compare metadata to a MusicBrainz release. Produces a probability as a linear combination of weights that the metadata matches a certain album. """ parts = self.compare_to_release_parts(release, weights) return (linear_combination_of_weights(parts), release) def compare_to_release_parts(self, release, weights): parts = [] if "album" in self: b = release.title[0].text parts.append((similarity2(self["album"], b), weights["album"])) if "albumartist" in self and "albumartist" in weights: a = self["albumartist"] b = artist_credit_from_node(release.artist_credit[0])[0] parts.append((similarity2(a, b), weights["albumartist"])) if "totaltracks" in self: a = int(self["totaltracks"]) if "title" in weights: b = int(release.medium_list[0].medium[0].track_list[0].count) else: b = int(release.medium_list[0].track_count[0].text) score = 0.0 if a > b else 0.3 if a < b else 1.0 parts.append((score, weights["totaltracks"])) preferred_countries = config.setting["preferred_release_countries"] preferred_formats = config.setting["preferred_release_formats"] total_countries = len(preferred_countries) if total_countries: score = 0.0 if "country" in release.children: try: i = preferred_countries.index(release.country[0].text) score = float(total_countries - i) / float(total_countries) except ValueError: pass parts.append((score, weights["releasecountry"])) total_formats = len(preferred_formats) if total_formats: score = 0.0 subtotal = 0 for medium in release.medium_list[0].medium: if "format" in medium.children: try: i = preferred_formats.index(medium.format[0].text) score += float(total_formats - i) / float(total_formats) except ValueError: pass subtotal += 1 if subtotal > 0: score /= subtotal parts.append((score, weights["format"])) if "releasetype" in weights: type_scores = dict(config.setting["release_type_scores"]) if 'release_group' in release.children and 'type' in release.release_group[0].attribs: release_type = release.release_group[0].type score = type_scores.get(release_type, type_scores.get('Other', 0.5)) else: score = 0.0 parts.append((score, weights["releasetype"])) rg = QObject.tagger.get_release_group_by_id(release.release_group[0].id) if release.id in rg.loaded_albums: parts.append((1.0, 6)) return parts def compare_to_track(self, track, weights): parts = [] if 'title' in self: a = self['title'] b = track.title[0].text parts.append((similarity2(a, b), weights["title"])) if 'artist' in self: a = self['artist'] b = artist_credit_from_node(track.artist_credit[0])[0] parts.append((similarity2(a, b), weights["artist"])) a = self.length if a > 0 and 'length' in track.children: b = int(track.length[0].text) score = 1.0 - min(abs(a - b), 30000) / 30000.0 parts.append((score, weights["length"])) releases = [] if "release_list" in track.children and "release" in track.release_list[0].children: releases = track.release_list[0].release if not releases: sim = linear_combination_of_weights(parts) return (sim, None, None, track) result = (-1,) for release in releases: release_parts = self.compare_to_release_parts(release, weights) sim = linear_combination_of_weights(parts + release_parts) if sim > result[0]: rg = release.release_group[0] if "release_group" in release.children else None result = (sim, rg, release, track) return result def copy(self, other): self.clear() self.update(other) def update(self, other): for key in other.iterkeys(): self.set(key, other.getall(key)[:]) if other.images: self.images = other.images[:] if other.length: self.length = other.length def clear(self): dict.clear(self) self.images = [] self.length = 0 def getall(self, name): return dict.get(self, name, []) def get(self, name, default=None): values = dict.get(self, name, None) if values: return self.multi_valued_joiner.join(values) else: return default def __getitem__(self, name): return self.get(name, u'') def set(self, name, values): dict.__setitem__(self, name, values) def __setitem__(self, name, values): if not isinstance(values, list): values = [values] values = filter(None, map(unicode, values)) if len(values): dict.__setitem__(self, name, values) else: self.pop(name, None) def add(self, name, value): if value or value == 0: self.setdefault(name, []).append(value) def add_unique(self, name, value): if value not in self.getall(name): self.add(name, value) def iteritems(self): for name, values in dict.iteritems(self): for value in values: yield name, value def items(self): """Returns the metadata items. >>> m.items() [("key1", "value1"), ("key1", "value2"), ("key2", "value3")] """ return list(self.iteritems()) def rawitems(self): """Returns the metadata items. >>> m.rawitems() [("key1", ["value1", "value2"]), ("key2", ["value3"])] """ return dict.items(self) def apply_func(self, func): for key, values in self.rawitems(): if not key.startswith("~"): self[key] = map(func, values) def strip_whitespace(self): """Strip leading/trailing whitespace. >>> m = Metadata() >>> m["foo"] = " bar " >>> m["foo"] " bar " >>> m.strip_whitespace() >>> m["foo"] "bar" """ self.apply_func(lambda s: s.strip()) _album_metadata_processors = PluginFunctions() _track_metadata_processors = PluginFunctions() def register_album_metadata_processor(function, priority=PluginPriority.NORMAL): """Registers new album-level metadata processor.""" _album_metadata_processors.register(function.__module__, function, priority) def register_track_metadata_processor(function, priority=PluginPriority.NORMAL): """Registers new track-level metadata processor.""" _track_metadata_processors.register(function.__module__, function, priority) def run_album_metadata_processors(tagger, metadata, release): _album_metadata_processors.run(tagger, metadata, release) def run_track_metadata_processors(tagger, metadata, release, track): _track_metadata_processors.run(tagger, metadata, track, release) picard-release-1.3.2/picard/plugin.py000066400000000000000000000221621245305550700175200ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore from collections import defaultdict import imp import os.path import shutil import picard.plugins import traceback from picard import (config, log, version_from_string, version_to_string, VersionError) from picard.const import USER_PLUGIN_DIR from picard.util import os_path_samefile _suffixes = [s[0] for s in imp.get_suffixes()] _package_entries = ["__init__.py", "__init__.pyc", "__init__.pyo"] _extension_points = [] _PLUGIN_MODULE_PREFIX = "picard.plugins." _PLUGIN_MODULE_PREFIX_LEN = len(_PLUGIN_MODULE_PREFIX) def _plugin_name_from_path(path): path = os.path.normpath(path) file = os.path.basename(path) if os.path.isdir(path): for entry in _package_entries: if os.path.isfile(os.path.join(path, entry)): return file else: if file in _package_entries: return None name, ext = os.path.splitext(file) if ext in _suffixes: return name return None def _unregister_module_extensions(module): for ep in _extension_points: ep.unregister_module(module) class ExtensionPoint(object): def __init__(self): self.__items = [] _extension_points.append(self) def register(self, module, item): if module.startswith(_PLUGIN_MODULE_PREFIX): module = module[_PLUGIN_MODULE_PREFIX_LEN:] else: module = None self.__items.append((module, item)) def unregister_module(self, name): self.__items = filter(lambda i: i[0] != name, self.__items) def __iter__(self): enabled_plugins = config.setting["enabled_plugins"] for module, item in self.__items: if module is None or module in enabled_plugins: yield item class PluginWrapper(object): def __init__(self, module, plugindir, file=None): self.module = module self.compatible = False self.dir = plugindir self._file = file def __get_name(self): try: return self.module.PLUGIN_NAME except AttributeError: return self.module_name name = property(__get_name) def __get_module_name(self): name = self.module.__name__ if name.startswith(_PLUGIN_MODULE_PREFIX): name = name[_PLUGIN_MODULE_PREFIX_LEN:] return name module_name = property(__get_module_name) def __get_author(self): try: return self.module.PLUGIN_AUTHOR except AttributeError: return "" author = property(__get_author) def __get_description(self): try: return self.module.PLUGIN_DESCRIPTION except AttributeError: return "" description = property(__get_description) def __get_version(self): try: return self.module.PLUGIN_VERSION except AttributeError: return "" version = property(__get_version) def __get_api_versions(self): try: return self.module.PLUGIN_API_VERSIONS except AttributeError: return [] api_versions = property(__get_api_versions) def __get_file(self): if not self._file: return self.module.__file__ else: return self._file file = property(__get_file) class PluginManager(QtCore.QObject): plugin_installed = QtCore.pyqtSignal(PluginWrapper, bool) def __init__(self): QtCore.QObject.__init__(self) self.plugins = [] self._api_versions = set([version_from_string(v) for v in picard.api_versions]) def load_plugindir(self, plugindir): plugindir = os.path.normpath(plugindir) if not os.path.isdir(plugindir): log.warning("Plugin directory %r doesn't exist", plugindir) return names = set() for path in [os.path.join(plugindir, file) for file in os.listdir(plugindir)]: name = _plugin_name_from_path(path) if name: names.add(name) log.debug("Looking for plugins in directory %r, %d names found", plugindir, len(names)) for name in sorted(names): self.load_plugin(name, plugindir) def load_plugin(self, name, plugindir): try: info = imp.find_module(name, [plugindir]) except ImportError: log.error("Failed loading plugin %r", name) return None plugin = None try: index = None for i, p in enumerate(self.plugins): if name == p.module_name: log.warning("Module %r conflict: unregistering previously" \ " loaded %r version %s from %r", p.module_name, p.name, p.version, p.file) _unregister_module_extensions(name) index = i break plugin_module = imp.load_module(_PLUGIN_MODULE_PREFIX + name, *info) plugin = PluginWrapper(plugin_module, plugindir, file=info[1]) versions = [version_from_string(v) for v in list(plugin.api_versions)] compatible_versions = list(set(versions) & self._api_versions) if compatible_versions: log.debug("Loading plugin %r version %s, compatible with API: %s", plugin.name, plugin.version, ", ".join([version_to_string(v, short=True) for v in sorted(compatible_versions)])) plugin.compatible = True setattr(picard.plugins, name, plugin_module) if index is not None: self.plugins[index] = plugin else: self.plugins.append(plugin) else: log.warning("Plugin '%s' from '%s' is not compatible" " with this version of Picard." % (plugin.name, plugin.file)) except VersionError as e: log.error("Plugin %r has an invalid API version string : %s", name, e) except: log.error("Plugin %r : %s", name, traceback.format_exc()) if info[0] is not None: info[0].close() return plugin def install_plugin(self, path, dest): plugin_name = _plugin_name_from_path(path) if plugin_name: try: dest_exists = os.path.exists(dest) same_file = os_path_samefile(path, dest) if dest_exists else False if os.path.isfile(path) and not (dest_exists and same_file): shutil.copy(path, dest) elif os.path.isdir(path) and not same_file: if dest_exists: shutil.rmtree(dest) shutil.copytree(path, dest) plugin = self.load_plugin(plugin_name, USER_PLUGIN_DIR) if plugin is not None: self.plugin_installed.emit(plugin, False) except (OSError, IOError): log.warning("Unable to copy %s to plugin folder %s" % (path, USER_PLUGIN_DIR)) def enabled(self, name): return True class PluginPriority: """ Define few priority values for plugin functions execution order Those with higher values are executed first Default priority is PluginPriority.NORMAL """ HIGH = 100 NORMAL = 0 LOW = -100 class PluginFunctions: """ Store ExtensionPoint in a defaultdict with priority as key run() method will execute entries with higher priority value first """ def __init__(self): self.functions = defaultdict(ExtensionPoint) def register(self, module, item, priority=PluginPriority.NORMAL): self.functions[priority].register(module, item) def run(self, *args, **kwargs): "Execute registered functions with passed parameters honouring priority" for priority, functions in sorted(self.functions.iteritems(), key=lambda (k, v): k, reverse=True): for function in functions: function(*args, **kwargs) picard-release-1.3.2/picard/plugins/000077500000000000000000000000001245305550700173265ustar00rootroot00000000000000picard-release-1.3.2/picard/plugins/__init__.py000066400000000000000000000000001245305550700214250ustar00rootroot00000000000000picard-release-1.3.2/picard/releasegroup.py000066400000000000000000000141661245305550700207240ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2012 Michael Wiencek # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import traceback from collections import defaultdict from functools import partial from itertools import combinations from picard import config, log from picard.metadata import Metadata from picard.dataobj import DataObject from picard.mbxml import media_formats_from_node, label_info_from_node from picard.util import uniqify class ReleaseGroup(DataObject): def __init__(self, id): DataObject.__init__(self, id) self.metadata = Metadata() self.loaded = False self.versions = [] self.version_headings = '' self.loaded_albums = set() self.refcount = 0 def load_versions(self, callback): kwargs = {"release-group": self.id, "limit": 100} self.tagger.xmlws.browse_releases(partial(self._request_finished, callback), **kwargs) def _parse_versions(self, document): """Parse document and return a list of releases""" del self.versions[:] data = [] namekeys = ("tracks", "year", "country", "format", "label", "catnum") headings = { "tracks": N_('Tracks'), "year": N_('Year'), "country": N_('Country'), "format": N_('Format'), "label": N_('Label'), "catnum": N_('Cat No'), } extrakeys = ("packaging", "barcode", "disambiguation") for node in document.metadata[0].release_list[0].release: labels, catnums = label_info_from_node(node.label_info_list[0]) countries = [] if 'release_event_list' in node.children: for release_event in node.release_event_list[0].release_event: if "area" in release_event.children: countries.append(release_event.area[0].iso_3166_1_code_list[0].iso_3166_1_code[0].text) formats = [] for medium in node.medium_list[0].medium: if "format" in medium.children: formats.append(medium.format[0].text) release = { "id": node.id, "year": node.date[0].text[:4] if "date" in node.children else "????", "country": "+".join(countries) if countries else node.country[0].text if "country" in node.children else "??", "format": media_formats_from_node(node.medium_list[0]), "label": ", ".join([' '.join(x.split(' ')[:2]) for x in set(labels)]), "catnum": ", ".join(set(catnums)), "tracks": "+".join([m.track_list[0].count for m in node.medium_list[0].medium]), "barcode": node.barcode[0].text if "barcode" in node.children and node.barcode[0].text != "" else _("[no barcode]"), "packaging": node.packaging[0].text if "packaging" in node.children else None, "disambiguation": node.disambiguation[0].text if "disambiguation" in node.children else None, "_disambiguate_name": list(), "totaltracks": sum([int(m.track_list[0].count) for m in node.medium_list[0].medium]), "countries": countries, "formats": formats, } data.append(release) versions = defaultdict(list) for release in data: name = " / ".join([release[k] for k in namekeys]).replace("&", "&&") if name == release["tracks"]: name = "%s / %s" % (_('[no release info]'), name) versions[name].append(release) # de-duplicate names if possible for name, releases in versions.iteritems(): for a, b in combinations(releases, 2): for key in extrakeys: (value1, value2) = (a[key], b[key]) if value1 != value2: a['_disambiguate_name'].append(value1) b['_disambiguate_name'].append(value2) for name, releases in versions.iteritems(): for release in releases: dis = " / ".join(filter(None, uniqify(release['_disambiguate_name']))).replace("&", "&&") disname = name if not dis else name + ' / ' + dis version = { 'id': release['id'], 'name': disname, 'totaltracks': release['totaltracks'], 'countries': release['countries'], 'formats': release['formats'], } self.versions.append(version) self.version_headings = " / ".join(_(headings[k]) for k in namekeys) def _request_finished(self, callback, document, http, error): try: if error: log.error("%r", unicode(http.errorString())) else: try: self._parse_versions(document) except: error = True log.error(traceback.format_exc()) finally: self.loaded = True callback() def remove_album(self, id): self.loaded_albums.discard(id) self.refcount -= 1 if self.refcount == 0: del self.tagger.release_groups[self.id] picard-release-1.3.2/picard/resources.py000066400000000000000000023373661245305550700202550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Resource object code # # Created: ven. juil. 18 23:11:29 2014 # by: The Resource Compiler for PyQt (Qt v4.8.2) # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore qt_resource_data = "\ \x00\x00\x01\x7d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\ \x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\ \x00\x00\x00\x07\x74\x49\x4d\x45\x07\xda\x06\x07\x15\x10\x37\x85\ \x74\x8e\x35\x00\x00\x01\x01\x49\x44\x41\x54\x28\xcf\x75\x90\xb1\ \x4a\x03\x41\x14\x45\xcf\xcc\x0e\x91\x2d\x16\x0c\xa4\x92\x60\x63\ \xa3\xd8\x59\x99\x1f\xb0\xd0\x32\x85\x96\xc1\xc2\x0f\x48\x91\x36\ \xec\xfe\x82\x95\xbf\xb0\x88\x8d\x08\x16\x8a\x58\xa8\x95\x55\x88\ \x85\x48\x8a\x90\xc2\x14\x41\x23\xba\x5a\x98\x7d\x16\xb3\x6c\x66\ \x44\x5f\x33\xf3\xe6\xde\x77\xe7\xde\xa7\x8e\x8e\x9f\x9b\xfc\x5d\ \xbb\xdd\x54\x20\x96\xff\x2a\x16\x10\x0c\xc0\xa4\x18\x51\xce\x59\ \x2d\xee\x06\xe7\xd1\x12\xc4\xfb\x47\x5b\xd0\xc2\x82\x94\x9d\x47\ \xa0\x80\x15\xda\xd3\xf2\x08\x73\x1d\x3c\x82\xf1\x5b\x50\x7c\x72\ \x81\x21\x20\xe2\xf0\x36\x1e\x1a\x6b\xcb\x95\x7d\x45\x58\x25\xa3\ \x4e\xd8\xb8\x6b\x18\x77\x56\x50\xe4\xcc\xa8\xf0\x48\xce\x88\xe5\ \x8f\x50\x6b\x3f\x62\x0e\x04\x7c\x11\xb1\x47\xc6\xe0\x3a\x0f\x4b\ \x93\x52\x92\x22\x74\xe1\x3d\xfc\xfe\x15\x13\x60\xcc\x0d\x15\x14\ \xf0\x0e\x2b\x81\x4d\x51\x2d\x7d\xa4\x4c\xd9\xe0\x05\xe1\x94\x2d\ \x16\xd7\xef\xdf\x4c\xed\x2c\xd9\x71\x57\xbb\x46\xc6\x25\x8a\x1a\ \x9b\x3c\x71\x95\x28\x7f\xf3\x9d\xed\x85\x7d\x96\xfa\xc9\xc9\x79\ \xf7\x20\x68\x4d\x1f\x7a\xed\x1f\x2d\x49\x58\xba\x4e\x19\x3c\x81\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x40\x8c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x20\x00\x49\x44\ \x41\x54\x78\x9c\xed\xbd\xd9\x93\x5c\xc9\x7d\x2e\xf6\xfd\xf2\x6c\ \xb5\x76\x57\x77\x63\xeb\x6e\xa0\xb1\xef\x0b\x67\xe1\x70\x28\x92\ \x96\x28\x5e\xdf\xeb\x7b\x75\xc3\xe1\x08\x3f\xd9\x11\x7e\xf2\xbb\ \xff\x1b\x3f\xf8\x51\x11\x56\x84\xe5\x10\x75\x19\x57\xd2\x95\xc8\ \xa1\x48\x9a\x14\x29\x91\x33\xc4\x0c\x80\x01\x66\x80\xc1\x0e\x74\ \x63\x69\xa0\x17\xd4\x5e\x67\xc9\xf4\x43\xee\xa7\xaa\x81\x06\x06\ \x43\x8e\xa8\xc9\x88\xee\xaa\x3a\x95\x27\x4f\x66\x7e\xdf\x6f\xc9\ \x5f\x2e\x45\xfb\xf7\x9d\xba\x86\xaf\xd2\xbf\x89\x44\x01\x7d\xfb\ \xf6\xed\xcb\x4f\xdd\x6b\x21\x00\x8c\xda\x7d\x04\x0c\xc4\x08\x00\ \x91\xbd\xc1\xbb\xdb\x5e\xa1\xd2\x97\xde\x1d\x34\xf9\x5e\xf2\xaf\ \xe8\xeb\x54\x2e\xc8\xbf\xcf\x79\xde\xf8\x65\xff\xc9\xa5\x07\x12\ \x89\xf1\xe7\x81\x4a\xf9\x54\x53\x4a\x0d\xf2\x8b\x9f\xdc\xe6\xe7\ \xf6\xc5\xa4\x3e\x2c\x97\xe5\xbc\xa1\xb1\x02\x00\x40\x90\xf9\x4e\ \x5d\x13\x00\x98\x93\x51\x4c\xec\x6b\x1a\xab\xe6\xf2\xf2\x46\x5e\ \x99\xae\x63\x52\x0a\x01\x40\x70\x8e\x24\x89\x28\x4e\x02\x55\x7f\ \x5b\x08\x11\x81\x34\x10\x04\xe7\x3d\xe9\xb7\xa5\xeb\xf6\x3d\x88\ \x4c\x7d\x64\x99\x93\xca\xb1\xfd\x45\x4e\xa1\x5e\x1e\x0d\x9c\xff\ \x1d\x8d\x97\xb5\xd5\x33\x88\x0c\x21\xbc\xf6\x90\xfb\x6c\xa7\xde\ \xb0\xf5\x80\xd3\x1e\x94\x9e\x65\xea\xe0\x96\xe3\xe7\x81\x5f\xbe\ \xd7\xbf\x93\x9e\x3d\xb9\x0e\x93\xca\x27\xaf\x1f\xd4\x0d\x2a\x8f\ \xf0\xca\xfb\xcb\xff\xf7\x5f\x3a\xd8\x22\x85\x6e\xc3\xbe\xb4\xc0\ \x2b\x29\xf0\xf3\x97\xeb\xfd\x3c\xe0\xc5\x97\x0a\xf8\x49\xf9\x5f\ \x2f\xf0\xe4\x97\xa9\x52\x51\xe4\x4c\xdf\x27\x84\x10\x80\x4b\x00\ \x46\xa6\xd1\x8e\x74\x91\x5f\x49\x41\xe5\xce\xc4\x38\xf0\x36\xbf\ \x20\x92\xd9\x1d\x46\xc2\x01\x12\x7e\x25\xfd\x46\x09\x55\xb8\x28\ \x81\x35\xa1\x63\x5d\xdb\x41\x70\xde\x0b\xab\x35\x34\x4d\x26\x3c\ \x5b\x40\x6c\x51\x8f\xc9\x20\x91\x79\x86\xea\x0b\xb7\xd4\x09\xe5\ \xdb\x36\x9b\xbe\x33\x05\xf9\xfd\xe8\x56\xbb\x5c\x9f\x92\x86\xf0\ \xea\x26\x6c\xa5\x26\xd7\x87\x01\xc0\x70\xd8\xab\x02\x48\x00\x14\ \x44\x54\x08\x21\xb8\x21\x00\x23\xdb\xa9\x92\xa8\x82\x09\xd7\xe4\ \x40\x98\x9e\x55\xdd\x46\x7e\x65\x6c\x1e\x45\x31\x03\x80\xb0\x0d\ \x24\xe1\x10\x48\xa8\xd6\x92\xd3\x72\x97\xb4\x5a\x6d\xeb\xfe\x10\ \xba\x7c\x7d\xaf\x22\x97\x80\x30\xd2\x12\x84\x11\x4d\x4f\x37\xc3\ \xe6\x54\x23\x8c\x92\x88\x45\x51\xc4\xa2\x38\x42\x18\x06\x2c\x8c\ \x42\x16\x86\x01\x8a\x9c\x8b\xa2\xc8\x45\x96\xe7\x22\xcf\x73\x51\ \x64\x05\xcf\xb2\x4c\xf4\xba\xbd\xbc\xd3\xe9\xe5\x3c\x2f\xec\x33\ \x14\x39\x84\xfa\x24\xeb\x51\x22\xaf\x6e\xb2\xc9\x33\x9e\xdf\x95\ \x54\x7d\x87\xcc\x23\xcc\x25\x63\xd4\x4d\x7f\x03\x04\xa6\x1a\x0a\ \xe3\xd5\x8c\xd7\xcd\x27\x99\xf0\xeb\x40\x02\x22\x14\x42\x60\x30\ \xe8\xee\x01\xc0\x01\x74\x00\xf4\x89\x28\x73\x4d\x00\x31\x66\x1a\ \xc4\x00\x0a\x09\x08\x08\xc2\xaf\xb9\x03\x34\x84\xae\x92\x25\x87\ \x7e\x4b\xb6\xe5\x92\x94\xc2\x76\x8e\x7c\x2f\xca\x79\xe0\x7a\x35\ \x2e\xc0\x32\xbf\xd2\xfb\x42\x68\x41\x42\xb5\x96\xd0\xee\xf9\x5d\ \xf1\xdc\xae\xd9\xb0\x31\xd5\x0c\x9a\x53\xf5\xb0\x5a\xad\x32\x5b\ \x4f\x87\x58\xd6\xe3\x02\xe9\xee\x25\xd8\xeb\x36\x37\x06\x83\x21\ \xef\x75\x7a\x45\xaf\xd3\x2b\x36\xd6\x37\xb3\xa7\xab\x6b\x79\x3a\ \x4a\xb9\x00\x87\x56\xe4\x42\x08\x23\xb5\x42\x08\xab\x21\x4c\xc5\ \xe5\x75\x43\x58\xdb\x7e\x12\x42\x38\x68\xca\x7f\x02\x4e\x79\xca\ \xdd\x93\x65\x73\x59\x86\x81\xdc\xfe\x87\x70\x6d\x0a\x1c\x0d\x2c\ \x8c\x56\x93\x5d\x2d\x12\x21\x84\xc8\xb2\xf4\x08\xa4\xd6\x5f\x01\ \x90\x01\xc8\x1d\x13\x60\x35\x00\x17\x9c\x11\x21\x80\x40\x20\x94\ \x71\x30\xb6\xb4\xcc\x7c\xc3\x46\xb2\x6c\xf7\x6c\xa0\x43\x0e\xa7\ \xb3\x05\xc8\xbf\x07\x5a\x43\x4c\x54\x99\x00\x80\x30\x8a\x68\x7e\ \x71\x77\xb4\x6b\xcf\x8e\x70\xd7\x9e\x5d\x51\x73\xba\xce\x7c\x08\ \xb7\x02\x9e\x3c\xe0\xc5\x16\xc0\x2b\x80\x50\xab\x55\x59\xad\x56\ \x65\x3b\xf7\xec\x8c\x0e\x00\x15\x82\x40\xa7\xdd\x2d\xd6\x9e\xae\ \xe7\x6b\x4f\xd6\xf3\xa7\xab\x6b\x79\x91\xe7\x46\x23\xc1\xbb\xdf\ \xd5\x10\xba\xad\xbe\xd4\xba\x9d\x27\x84\xee\x77\xdd\xbf\x0c\x56\ \x3b\x38\xda\xce\x29\x4f\xdf\x3d\x5e\xb6\xad\x8c\x91\x53\xf9\x12\ \x02\x02\x42\x14\x0b\x00\xfa\x00\x9e\x01\xd8\x00\x40\xd6\x04\x30\ \xa6\xd4\xbf\x20\x26\x5b\x41\x82\xc0\x98\xb4\xfb\xca\x0c\xb9\xf6\ \xca\xd8\xd6\xd2\x65\xd7\xee\x19\x16\xd8\xca\x7b\x76\xdc\xf7\x56\ \x7d\xa7\x45\x59\x6d\x06\x2c\x2c\xcc\x47\x07\x8e\x2c\x45\xf3\x8b\ \x7b\xa2\x30\x0c\x0c\x4d\x5e\x37\xf0\xfe\x17\x4a\xea\x94\x6d\x9d\ \x9a\x6e\x06\x53\xad\x66\x70\xf0\xc8\xfe\xa4\x28\x0a\xb1\xfa\x60\ \x35\x5f\xbe\xf7\x20\x7b\xfa\x64\x2d\x77\xb5\x8b\x5f\x2d\xa7\x8f\ \x6c\xab\xbc\xaf\x2d\xd1\xd9\x44\xff\xc1\xb6\xcd\xd1\x82\xa6\x1f\ \xc9\x7e\xef\x99\x60\xcd\x42\x93\x87\x41\x2a\x24\xed\x03\x84\xea\ \x9a\x43\x00\x22\x30\x06\x18\x65\x49\x82\x20\x55\x9b\x41\x8c\xb6\ \x03\xbc\x93\xc7\x07\x7b\x6b\x8f\x79\x92\x63\x33\xdd\x9a\x0a\x8e\ \x1c\x3f\x14\x2f\x1d\x58\x8c\x92\x6a\xc2\x7c\x15\x5e\xee\x9c\x71\ \xe0\x83\x30\x40\xa3\xd1\x40\x14\x45\x88\xe3\x18\x51\x14\x21\x8c\ \x42\x84\x41\x88\x22\xcf\x91\xe5\x19\xf2\x2c\x47\x96\x65\x48\xd3\ \x14\xbd\x7e\x0f\x9c\x3b\xea\xd6\x90\xc0\x29\x5e\xfd\x0b\xc3\x80\ \x16\x97\x16\xa2\xc5\xa5\x85\x68\x38\x1c\x89\x87\xcb\x0f\xb3\x7b\ \xb7\xef\xa7\xfd\xfe\x40\x78\xce\x5f\xa9\xfd\x6e\x1b\xed\xf5\x2d\ \x80\x77\xe5\x8d\x88\x26\xf5\x97\x05\x5e\xc3\x3e\x29\x8f\xa7\x14\ \x98\xfa\x33\x17\xc7\x87\x81\xd2\x76\x91\xab\x7e\x7e\x97\xc0\xcf\ \xee\x68\x85\xa7\xcf\x9e\x4c\x16\xf6\xcd\x47\xe4\x2a\x78\x2a\x4b\ \xac\x6d\xd7\xdc\x8e\x59\xec\xdc\xb9\x13\xcd\x66\x13\xf5\x7a\x1d\ \xb5\x6a\x0d\x71\x12\xeb\xc8\x96\xcd\x2f\xdc\xfb\xdc\xe7\x0a\x08\ \x41\x18\x0d\x07\x18\x0c\x87\xe8\xf7\x7a\xe8\x76\xbb\x58\x5d\x5d\ \xc5\xc6\xe6\x46\x89\x04\xbe\x04\x57\xab\x09\x1d\x3a\x7a\x20\x3e\ \x78\xe4\x40\xfc\xf0\xc1\xa3\xec\xd6\x67\xb7\xd3\x5e\xa7\xcf\xc7\ \xfa\x04\x80\xdf\x57\xcc\xbe\xff\x82\x80\x2f\xb7\x75\x52\xf2\x87\ \x81\xe4\xf4\xac\x74\x72\xc8\x14\xe6\x74\xe4\x17\x01\xfc\xae\xdd\ \x3b\xc2\x53\xe7\x4e\x24\x7b\x16\x76\x47\x93\x9c\x36\x9b\x1f\x48\ \x2a\x15\x2c\xcc\x2f\x60\xcf\x9e\xdd\x98\x99\x9d\x41\x1c\xc5\x5e\ \x07\x9a\xe4\x02\xae\xed\xa1\x11\x6e\xb2\x9f\x55\x5d\xab\xd5\x2a\ \xaa\xb5\x2a\x66\x67\x67\x40\x20\x9c\x3c\x79\x02\x69\x96\x61\x63\ \x7d\x1d\xab\xab\xab\x78\xf8\xf0\x21\x86\xc3\xa1\x5f\x27\x52\x3a\ \x87\x80\xc5\x7d\x0b\xd1\xe2\xde\xf9\x68\xf5\xd1\x93\xfc\xd6\xf5\ \xdb\x69\x7b\xb3\x53\xb8\x6d\x9c\x04\xbc\xf9\xde\xef\x2b\xdb\xef\ \x9f\x07\xf8\x12\x01\x27\x25\x43\x80\x80\xc1\xd8\x79\x22\x40\x70\ \x01\x41\x04\x56\x02\xbe\xfc\x10\xd7\x37\xd0\x40\xbf\x0c\xf0\x8d\ \x66\x9d\xbd\xf5\x8d\xaf\x55\x17\xf6\xce\x2b\xe0\x75\xcd\x7d\x2c\ \x2b\xd5\x0a\x96\xf6\x2d\x61\x71\x71\x11\xcd\xa9\x06\x98\xe9\x48\ \x99\x8b\x0b\x6e\x3a\xc6\xbd\x2e\x38\x9f\xf8\x5c\x69\xde\xcc\x55\ \x79\x09\xee\x33\xa5\x1b\x16\xc7\x11\x76\xef\xd9\x8d\x3d\x7b\xf6\ \xe0\xdc\xb9\xb3\x78\xd6\x6e\xe3\xc1\xca\x0a\xee\xde\xbd\x8b\x2c\ \xcb\x6c\x43\x01\x69\x3a\x18\x61\xf7\xc2\xae\x70\xcf\xfc\xae\xf0\ \xd1\x83\xd5\xec\xea\x95\xcf\x46\xe9\x68\x24\x48\xa1\xf7\x32\xc0\ \x97\xfb\xda\x35\x7f\xe3\xa6\x66\x32\xf0\xdb\x26\x80\x74\xb8\x1c\ \x6b\x44\x4c\x0d\x7a\xb6\x0f\xbc\x7d\xaf\xcb\x98\x5c\x11\x22\x42\ \x10\x32\x9c\x38\x7d\xbc\x72\xea\xec\xb1\x24\x08\x03\xd3\x85\x2e\ \xf0\x8c\x31\x1c\x38\x70\x00\x8b\x7b\x17\xd1\x6a\xb5\xe0\x54\xcf\ \x24\x0e\xee\xa9\x65\x1d\x13\x10\xc2\x5e\xd7\x43\x36\x35\x24\x02\ \x91\xf4\x79\xb4\xf4\xab\x37\x12\x40\x67\x84\x65\x1f\x26\x10\x04\ \x92\x70\x33\xad\x16\x5a\xd3\xd3\x38\x71\xf2\x24\x36\x37\x36\x70\ \xff\xfe\x32\xee\xdd\xbf\x6b\xf2\x92\xb1\x99\xc0\xfc\xe2\xae\x68\ \xe7\xee\xb9\xf0\xe6\x67\x77\xd2\xfb\x77\xee\xa7\x76\xc8\xfb\x7a\ \x81\xd7\xe5\xd8\x32\x9d\xeb\x2f\x30\x04\xce\x28\x40\xb1\x48\x10\ \x09\x70\x40\x75\x12\x84\xa0\xd7\x09\x3c\x11\x61\xf7\xfc\xce\xe8\ \xed\x6f\xbe\x51\x6d\x4e\x35\x98\x6e\x94\xeb\x68\x11\x11\x0e\x1d\ \x3a\x88\x43\x87\x0f\xa3\x52\xa9\x78\x1d\xa1\x55\x38\x87\x95\x6c\ \xa1\x80\x2b\x8a\x02\xbc\x28\x50\x70\x8e\xa2\x28\x20\x38\xb7\xf7\ \xb8\x1d\x0e\x3d\xc2\x90\xfa\x8d\x31\x02\x63\x0c\x2c\x08\x10\x30\ \x86\x20\x08\xd4\xa8\x08\x8a\x30\xe3\x4e\x15\x13\x02\x73\x73\xb3\ \x98\x9d\x9d\xc5\xd1\x63\x47\x70\xf3\xfa\x0d\xdc\xbb\x77\x4f\x8d\ \x34\xb4\x2e\x61\x08\x23\xa2\x13\xa7\x8f\x26\x7b\x97\xe6\xc3\x4f\ \x3e\xbe\x36\x6a\x6f\xb6\x8b\xd7\x03\xbc\x03\xef\x16\xc0\xbf\x48\ \xfa\x3d\x02\x10\x63\x24\x1f\xa2\x7a\x8b\x63\x5c\x95\x7c\x4e\xe0\ \x01\xe0\xe4\x99\x63\x95\xb3\x6f\x9d\xaa\x18\xbf\x82\xf4\x28\x57\ \x4a\xfc\xd2\xd2\x12\x8e\x1e\x3d\x8a\x4a\xa5\x62\x25\x5d\xb8\x2f\ \xc2\xc4\x9f\x38\xe7\xc8\xb2\x4c\xfd\xa5\x5e\x10\xaa\xec\xb7\x00\ \xfe\x35\x19\xaf\xe1\xaa\x1c\x02\xe7\x1c\x54\x14\xc8\x95\x74\x32\ \x22\x84\x61\x08\x16\x04\x88\xa3\xd8\x04\x7b\x74\x4d\x88\x00\x62\ \x01\x48\x00\xf5\x5a\x1d\xe7\xce\x9d\xc3\x91\xa3\x47\x70\xf3\xc6\ \x4d\x49\x04\xf8\xe6\xac\x39\xd5\x08\xde\xf9\xa3\xb7\x6a\xd7\xae\ \x5c\x1b\x3e\x58\x7e\x94\x8f\x01\xf6\x05\x00\xef\xe6\xd9\x2a\x79\ \x1a\x40\x8d\xff\x35\x79\xc9\x0c\x0a\x5f\x03\xf0\x41\x10\xd0\x3b\ \xdf\x7a\xb3\xba\xff\xd0\xbe\xd8\x07\x5e\x7e\xbf\x6b\xd7\x4e\x9c\ \x3e\x7d\x06\x8d\x46\x43\x45\xcd\xac\x3a\x06\xa9\x48\x99\x10\xe0\ \x9c\x23\x4d\x53\xa4\x69\x8a\x2c\xcb\x8c\xc6\xb0\xcf\x22\x47\x8d\ \x2b\x3b\x4f\x3a\x74\x6c\xc3\xb3\xa4\x59\x40\x76\xa4\x23\xc9\xa5\ \x4c\x08\x80\x2c\xcf\x41\x45\x01\x08\x81\x30\x8a\xc0\x18\x21\x60\ \x81\xd2\x0c\x30\xaa\x25\x50\xa3\x8d\x7a\xbd\x81\x33\x67\xcf\xe0\ \xe0\xc1\x03\xb8\x7c\xe5\x0a\xd6\xd6\xd6\x34\x9e\x92\x54\x01\xe1\ \xd4\xb9\x13\x95\xe6\x54\x33\xbb\x7e\xf5\xe6\xe8\x77\x01\xfc\xb6\ \x7d\x00\xe6\x3c\x04\xa4\x62\xb2\x42\xa2\x4c\xde\x03\x51\xfa\xfc\ \x7c\xe0\x09\xa0\x6a\x2d\xa1\x6f\x7d\xf7\x9b\xf5\x1d\x3b\xe7\x82\ \x32\xf0\xf5\x46\x1d\xa7\x4f\x9f\xc6\xce\x1d\x3b\x41\x44\x2a\xf4\ \x29\x73\x68\x29\xca\x8b\x02\x83\xe1\x10\x69\x9a\xa2\xc8\x73\x25\ \xc9\xd0\xf6\xc2\x8b\xb0\x19\x1b\x6c\x08\xe4\xda\x16\x1b\x61\x83\ \x2b\xd1\x2a\xdc\x2a\x9c\x7a\x4b\x53\xa3\xca\x64\x04\xc1\x0b\x14\ \x1c\x28\x44\x0e\xa6\x4c\x04\x63\x64\x27\x2a\x20\xc0\x08\x60\x41\ \x80\x66\xb3\x89\x77\xbf\xf1\x0d\xac\xae\x3e\xc1\x95\x4f\x2e\x63\ \x38\x1c\x6a\x27\x0a\x00\xb0\x74\x70\x6f\x54\x6f\xd6\xd9\x95\x8b\ \x9f\x0c\x8a\xbc\x70\xaa\x38\xee\xd9\x7f\x1e\xe0\xb7\x6d\x02\x34\ \xa8\x5a\x92\x0d\x04\x5a\x21\x78\x24\xf0\xa5\xfd\x79\xc0\x13\x01\ \xad\xd9\x16\xfb\xce\x9f\x7e\xb3\x5e\x6b\x54\xad\xbd\x57\xe9\xf0\ \x91\xc3\x38\x76\xf4\x18\x18\x63\x80\x9a\xd4\xb1\x49\x80\x73\x81\ \x7e\xbf\x8f\x7e\xbf\x6f\xcb\x37\xdf\x3a\xd2\xe2\x49\xb4\x2d\x45\ \x4b\x32\x84\x30\x76\xd9\x75\xfa\xcc\x84\x8a\x79\xa4\xba\x52\x92\ \x4a\xfd\x95\x06\x91\xf3\x02\x82\x17\xe0\xc4\xc0\x02\x66\xb5\x82\ \x4a\x8c\xc9\xd5\x35\xbb\xf7\xec\xc2\xdc\x8e\x3f\xc6\xa7\x9f\x7c\ \x82\xe5\x95\x15\x8f\x04\x73\x3b\x67\x83\x77\xbe\xf5\x56\xed\xd2\ \xf9\xcb\xc3\x41\x7f\xc8\x5f\x66\x48\xa7\x4c\x19\x79\x79\xb6\x10\ \xca\x6d\x6a\x00\x02\x63\x86\x6b\x60\xa4\x86\x81\xea\xbd\xe9\xe4\ \xe7\x00\x6f\x2b\x66\xdb\xb9\x6f\xff\xde\xe8\x1b\xdf\x7e\xab\x1a\ \x44\xa1\x57\x0d\xc6\x18\xce\x7d\xed\x1c\x16\x16\x16\xa0\x27\x2e\ \xdc\x31\xbb\x10\x02\xbd\x5e\x1f\xbd\x7e\xcf\x48\x18\x29\x14\x84\ \x79\x16\xac\x44\xbb\x13\x4a\xda\xeb\x33\x35\x71\xc1\x96\x9f\x65\ \x69\x66\x92\xc9\x96\x09\xcd\x21\x69\x82\x04\x11\x42\xd2\x4a\x4b\ \x28\x07\x4f\xe7\x94\xf5\xe4\x45\x01\xce\x39\x02\xe5\x40\x9a\x3e\ \x81\x34\x17\x2c\x22\x9c\x39\x7b\x16\xcd\xa9\x29\x5c\xbb\x7a\xd5\ \x1b\x6a\xd6\xea\x35\xf6\xce\x1f\xbd\x5d\xbd\x72\xf1\xd3\xe1\xc6\ \xda\x66\xf1\x4a\xc0\x7b\x79\xc6\xcd\xf1\x8b\x74\x80\xa3\x01\xe4\ \xcd\x26\x30\xc2\x18\xb8\x00\x9e\x17\xaf\xdf\x0a\x78\x22\xc2\xa9\ \x73\x27\x92\xd3\x6f\x9c\xac\xb8\x15\x20\x02\xe2\x38\xc1\xdb\x6f\ \xbf\x8d\x56\x6b\xda\xb3\xc9\xba\x43\x07\x83\x01\xba\xbd\x2e\x78\ \xc1\x1d\x0c\xb5\x29\x22\x73\x8f\xe9\x66\x05\xb2\x23\xc7\xc6\xcd\ \x53\x0a\xc1\xab\xab\x24\x91\x86\x08\xe6\x9a\x7c\x8c\xd6\x19\x6a\ \x88\x28\x04\x58\xa4\x41\x15\x20\x30\xa3\x0a\x44\xa9\x4c\x5e\xe4\ \xe0\x9c\x10\x06\x01\x74\xb0\x47\x3e\x97\x21\x0c\x18\x0e\x1e\x3c\ \x88\x7a\xbd\x86\x8b\x17\x2f\xa2\x28\x0a\xe8\xa5\x15\x61\x14\xd2\ \xb9\xb7\xcf\x56\x6f\x7d\x76\x6b\xb4\x72\xef\x61\xf6\xba\x81\xdf\ \x96\x06\xb0\xb6\x5d\x5a\x14\xa1\x8c\x00\x33\xf6\x67\xfb\xc0\x83\ \x80\x77\xbf\xf3\xf5\xea\xfe\x83\xfb\x62\x9b\x5f\xbe\x4e\x4d\x4f\ \xe3\xad\x37\xdf\x44\xa5\x52\x71\xa7\x47\xc1\x05\xc7\x28\x1d\xa1\ \xd3\xee\x20\xd7\x36\xde\xda\x1f\xcf\x30\x58\xc9\x97\xa0\x94\x35\ \x84\x95\x78\x32\x15\x33\xaa\xde\x8c\xf7\xe1\x6b\x13\xa7\x2c\xef\ \x41\x44\xd2\xfe\x43\x99\x13\x2f\x78\x04\x7d\x97\x47\xa4\xbc\x28\ \x40\xc4\x11\x30\x26\x89\xa0\x08\xca\x88\xb0\x6b\xd7\x2e\x7c\xf3\ \xdd\x6f\xe2\xa3\x8f\x3e\xc2\x60\x30\xb0\x26\x8c\x01\x47\x4f\x1c\ \x4e\x6a\xf5\x1a\xbb\x71\xed\xe6\xe8\xb5\x01\xff\x22\xf1\x87\x25\ \x00\xe9\xc8\x9a\x0e\xc3\x5a\xc1\xd9\x26\xf0\xea\xfa\xd9\x37\x4f\ \x55\x34\xf8\xf6\x56\xc2\xfc\xc2\x3c\xce\x9c\x39\x8d\x80\x05\x36\ \x58\xa3\xec\x7e\xa7\xdd\x41\xb7\xd7\xd5\x0d\x96\xe0\x58\x08\x4b\ \x00\xfb\x75\xf1\x55\xbb\x7c\x96\x55\xe3\xea\xba\xea\x2c\x61\xb3\ \x3a\x7e\x03\xf7\x09\x23\x34\xe0\x1c\x8c\x05\xd0\x86\xc1\x90\x40\ \x97\x4d\xda\x60\x18\xf7\xd3\xfa\x27\x42\xa0\xe0\x1c\x8c\xc1\x06\ \xaf\x00\x30\x62\x98\x9a\x9a\xc2\xbb\xdf\x78\x17\x1f\x7f\xfc\x31\ \xd6\x37\xd6\xe1\x74\x11\xf6\x2e\xcd\x47\xe9\x28\xe5\xcb\xf7\x56\ \xb2\xd7\x01\xbc\x3b\xd1\xb4\x55\x32\x8b\x27\x1c\x0d\xa0\x0a\x99\ \xec\xe0\xa9\x45\x65\x44\xe4\x04\x8f\x88\xc0\x18\x61\xe9\xd0\xbe\ \xe8\xc4\x99\x63\x89\x2e\x4f\xeb\xf0\xe3\xc7\x8f\xe1\x8d\xaf\x7d\ \x0d\x61\x60\x5c\x0e\x69\xf9\xb9\xc0\xfa\xda\x3a\xba\xdd\xae\xec\ \x45\x2e\x14\xf8\xa6\xb5\x50\x32\x0d\x77\xf5\x8c\x50\x9d\xac\x9d\ \x3b\x32\xf6\xdc\x21\x84\x7e\x06\x9c\x08\x20\x5c\xf3\xe0\x38\x9d\ \xde\xb3\xb9\xb2\x1b\x4c\x05\x8a\x6c\xd9\x9e\x44\x09\x7b\xdd\x23\ \xa3\xb0\xcf\xe0\x5c\x06\xa6\x9c\xaa\x83\x88\x50\xa9\x56\xf0\xe6\ \x9b\x6f\x62\x69\xdf\x12\x74\xa5\xb4\x34\x1d\x3c\xba\x3f\x99\xdb\ \x31\x1b\xea\x3e\xd5\x1a\x8f\x4a\x7d\xed\xe0\x21\x8b\x50\xda\x4a\ \x76\x1b\x33\x81\xac\x17\x99\x00\xbb\x7a\x86\xc8\x2c\x0a\x01\x91\ \x2c\x4b\x15\xa0\xd6\x0a\x18\x02\x96\xc9\x42\x24\xbd\xda\xaf\xff\ \xd1\x9b\x55\x17\x78\x62\xc0\x5b\x6f\xbe\x85\xc3\x47\x0e\x83\xc8\ \xae\x7a\x01\x80\x3c\xcf\xb1\xba\xba\x8a\xc1\x60\xa0\x86\x7e\x26\ \xcc\x03\xe3\xa0\x69\xef\x5d\xf0\x92\xed\x2f\x01\xec\x7d\x61\xf3\ \x93\x73\xcd\x10\x49\x38\xe5\x73\x31\x36\x5a\xb4\x8c\xe1\x08\x58\ \xe0\x3f\xd3\xa9\x27\x74\x3b\x4d\x7e\xf7\x59\xba\xfe\x00\xe7\x02\ \x45\x51\x38\x85\xcb\xbe\x8b\xa2\x10\xc7\x8f\x1f\xc3\xb1\x63\xc7\ \x6c\xa7\x42\x6a\x89\x13\x67\x8e\x25\xb5\x46\x8d\x0c\x39\xbc\xbe\ \xde\x3e\xf0\x86\x40\x2f\x26\x80\x51\x29\xa4\x6f\x92\xef\x2d\xf0\ \xcc\x28\x06\x97\x81\xf2\x8b\x5a\xbd\x4a\xdf\xfa\x93\x77\x6b\x61\ \x10\xa8\x9a\x48\x85\x7a\xe2\xc4\x49\xcc\x2f\xcc\x9b\x6e\xd1\xea\ \x29\x4b\x33\x3c\x5d\x7b\x8a\x5c\x05\x72\x7c\x14\xb5\x9c\x3a\x32\ \xea\x48\x98\x28\x01\xec\xda\x7e\x23\xd1\x8e\xe6\x30\x52\xaa\xee\ \x13\xd0\x91\x44\xab\x0b\x64\x79\x70\x08\x2a\xef\x67\xcc\x9a\x0d\ \xdf\x13\x29\x91\xd1\xa9\x83\x19\x4a\x08\xb2\xd9\x84\x0c\x4d\x4b\ \xef\x53\xe6\x23\x46\x08\x82\x00\x4b\xfb\x96\xb0\xb4\xb4\x04\x13\ \x03\x20\x20\x8a\x42\x3a\xfd\xb5\x13\x95\x38\x8e\xac\xf0\xf9\x82\ \xe8\x68\x6a\xad\xea\x2d\xf0\x2e\x9e\x52\x94\x5f\x40\x00\xb9\x18\ \x84\x1c\x80\x99\xb1\x35\x93\x81\xd7\xac\x23\x84\x61\x40\xdf\xfe\ \xd3\x6f\xd6\x2b\xd5\x0a\xd3\x8b\x3a\x09\x84\xbd\xfb\xf6\xe2\xd0\ \xa1\x83\x70\x17\x81\x02\x40\xbf\xd7\xc7\xda\xda\x1a\x78\xa1\x17\ \x5e\xba\x56\x5c\x4a\x1e\xcc\xcc\x1e\x1c\x55\x2b\xe0\x0f\xe6\xc6\ \x4d\x03\x9c\xfc\xbe\xf4\x2b\xd0\x05\x49\xed\x2e\x2c\x19\xac\xa9\ \x11\x46\x9a\x05\x84\x8a\x4d\x38\xf7\xab\x1a\x79\x56\x00\x02\x76\ \x71\x1f\xac\x29\x71\x2e\x68\xbf\x04\x42\xa0\x28\x72\xe3\xb4\x02\ \x52\x78\x82\x30\xc0\x91\xc3\x47\x30\x37\x37\x67\xfd\x12\x02\x6a\ \xb5\x2a\x3b\x71\xe6\x78\x45\xcf\x53\x68\xe0\x99\x0b\x3c\x23\x03\ \xbc\x2b\x94\x12\x4b\x5d\xda\x36\x4d\x80\x03\x3c\xc9\x58\x80\x65\ \xda\x24\xe0\xf5\xf5\x77\xbe\xf5\x56\xa5\x35\x3b\x1d\x68\xe0\x41\ \xc0\xec\xec\x0c\xce\x9c\x39\x63\xd5\x97\x7a\x58\xa7\xdd\x46\xbb\ \xfd\x4c\x95\x6b\x99\xad\xfb\x0e\xaa\xb3\x2c\xb8\x70\x40\xb0\x76\ \xdf\xe4\x72\x4c\x83\x55\x20\x64\x89\xa1\x89\xe4\x00\xeb\x4a\xb9\ \xbc\xd1\x31\x2f\x46\x68\x85\x8a\xf2\x95\x6d\xbc\x9d\x87\x30\x12\ \x6f\xea\x85\x31\xd2\x79\xfa\x57\x61\x51\xf0\x42\xad\x3c\xd2\xd5\ \x25\x84\x51\x80\x53\xa7\x4f\xa2\x56\xaf\xc1\x38\xc2\x04\xcc\xcc\ \xb6\x82\x43\x47\x0f\xc6\x5b\x03\x4f\xcf\x01\x5e\x2e\xfc\xd9\xa6\ \x0f\x40\xe6\xc1\xf2\xbd\x50\x85\x63\x4b\xe0\x89\x80\x53\xe7\x8e\ \x27\xfb\xf6\x2f\xc6\xba\xc2\x44\x40\x92\x24\x78\xeb\xed\xb7\x11\ \x04\x01\x8c\x11\x13\x02\xbd\x5e\x0f\xfd\x7e\xdf\x03\xde\xaa\x2c\ \x40\x4a\xbe\x95\x5e\x2a\x81\xa3\x9d\x24\x5f\xd9\x3b\xe4\xd1\xe4\ \x70\xed\xb4\x35\xc5\x36\xb7\x52\xcd\x65\xc2\xc8\x82\xed\xbd\x32\ \xa8\x33\xc1\xc6\x3b\x12\x4f\xae\xc4\x1b\xf2\xb8\x52\x57\x8e\x6e\ \xca\xc4\x39\x57\x24\xd0\xed\x25\x24\x49\x05\x67\xcf\x9e\x45\x18\ \x86\x1e\x09\xe6\xf7\xee\x89\xf6\x2c\xee\x09\x5f\x05\x78\xab\xc9\ \x5f\x40\x00\x30\xf5\x48\x9a\xe0\xe0\x4d\x00\x9e\x08\x58\xdc\x37\ \x1f\x9d\x3a\x7b\xa2\xa2\x81\x07\x00\x62\x0c\xef\xbe\xfb\xae\x9a\ \xc2\x95\xf6\x8e\x84\x90\x6b\xee\xba\xdd\x09\xc0\x3b\xa3\x0e\x07\ \x4c\x5f\x52\x1d\xe7\x4d\x70\xe5\xf5\x6b\x50\x1c\x68\x3d\xbb\x0f\ \x39\x9b\x69\x0d\x32\x04\xa9\xbd\x74\xa4\xcb\xd5\x2a\xdf\x85\xca\ \x76\x16\x0b\xca\x0e\x60\x49\xe2\x4d\xa2\xf1\x6b\xda\x27\x31\xda\ \xc9\x32\xce\x78\x38\x9c\x9b\x65\xe3\x0a\x02\xd4\xeb\x72\x5e\xc4\ \x60\xa9\xbe\x3d\x74\x6c\x7f\x32\xdd\x9a\x0e\x5e\x16\x78\x22\xa5\ \xc9\x9e\x93\x5c\x1f\xc0\x71\x36\xb4\x44\x53\x09\x34\xf9\x17\x85\ \x21\xbd\xf1\xce\xb9\x8a\x01\x48\xe5\x7d\xeb\xad\xb7\x30\x3d\x3d\ \xed\x00\x44\x28\x8a\x02\xed\x76\x5b\x91\x09\xa6\x71\x6c\x22\x09\ \x9c\x21\x9d\x70\x3b\xcd\x06\x60\xb4\x37\x60\x2a\x03\x28\xb4\x75\ \x1e\x32\x75\xf2\x96\x6d\xbb\xe6\x42\xe8\x52\xd5\xb0\xcf\x85\x5e\ \xc0\x78\xff\x65\x1b\x4f\xae\x63\x07\x5f\xb3\x58\x23\xc1\x9d\x6b\ \x25\x13\xe0\x25\x92\xd1\x4e\x4d\x74\x92\xcf\x9d\x99\x9d\xc1\xe1\ \x23\x47\x6c\x99\x44\x60\xc4\x70\xf8\xf8\xc1\x98\x05\xec\xa5\x80\ \x7f\x89\x38\x00\x41\x7a\xfd\xc6\xe1\x23\x9f\x69\x30\xce\x1d\x23\ \x86\x93\xe7\x4e\x24\xd5\x5a\x85\xe9\x5a\x12\x08\xc7\x8e\x1f\xc3\ \xc2\xe2\x82\x6d\x27\xc9\x9e\x6e\xb7\xdb\xd0\x23\x00\x79\xbf\x6f\ \x56\xcc\x33\xd4\x75\xa1\x1a\xad\x1d\x33\x6f\x2c\xaf\x4d\x94\xe9\ \x7a\xe1\x69\x69\xa9\xc1\x0d\x45\x26\xc0\xa4\xcb\x91\x2a\x42\x13\ \xc6\x91\x6d\xd9\x29\x41\x50\x72\x24\x9d\x34\x69\x00\x50\xbe\x48\ \x93\xb2\xe9\xa7\x90\xf3\xd9\x2e\x65\xd3\xf7\x85\x41\x80\xc5\x85\ \x79\xcc\x2f\x2c\x58\xff\x89\xa4\x53\xb8\xb0\x77\x3e\xf2\x9d\xbb\ \xf2\xf0\x50\x39\xe1\x7a\x44\xa0\xc7\xf2\xcf\x49\x52\x03\x30\x40\ \x2f\x04\x61\x6a\x75\xa8\x02\x88\x5c\xe0\x89\x08\x8d\xe9\x46\x70\ \xe4\xf8\xa1\x44\x03\x4f\x20\xcc\xcc\xcc\xe0\xf8\xd1\x63\xa5\x56\ \x13\x3a\xdd\x8e\x8c\x7b\x97\xd5\xbe\x01\xb2\x64\x72\x34\x03\x05\ \x57\xea\xde\x91\x22\xe3\x4e\xa8\x8e\x14\x4a\xc5\x72\x61\xb5\xba\ \x92\x66\x01\xb2\xf9\x00\xef\xbd\x96\x68\x3b\xb8\x70\x76\xe9\x28\ \xa5\xc3\xdc\x8e\x33\x8a\xc3\xd6\xc3\x33\x41\xe5\x51\x40\x39\x79\ \x5a\xc7\xc9\xa4\x1a\x2f\x89\xeb\xfa\x18\x72\x78\x78\xe8\xd0\x41\ \x63\x4a\xb5\x3f\xb0\x77\x69\x31\x8a\x93\x44\xf6\x3c\xb9\xc3\x43\ \x18\xe0\x6d\xf0\xc8\xd5\xac\x5b\x27\xab\x01\xbc\xf1\xa6\x55\xf9\ \x1a\x78\xed\x84\xbc\xf1\xce\xb9\x0a\x0b\x98\x01\x86\x00\x9c\x3b\ \x7b\xd6\x6c\x2e\xd5\xe5\x0d\xfa\x7d\xb9\x60\xa3\xa4\xea\x61\x24\ \x5f\x5e\x67\xce\x77\xae\x0f\xa2\x25\x53\x4b\xb3\xec\x74\x0e\x77\ \xe0\xa8\x75\x81\xd5\x13\xda\x71\x2b\x2b\x67\xc7\x4e\x0b\x7b\xaf\ \x2e\xdd\x38\x91\xca\x8c\x30\xb9\x41\x42\x59\x31\x6d\x42\x26\xb9\ \x73\x1e\xb2\xb6\x5c\xeb\x55\x7a\xb5\x00\x50\xaa\xbd\x32\x44\x42\ \xfb\x03\x0a\x14\xc6\x10\x86\x21\x0e\x1f\x39\xa2\xed\x00\x20\x08\ \x2c\x60\x74\xe0\xf0\xfe\xf8\x85\xc0\x9b\x61\x23\x79\xa1\xe8\x49\ \x49\xfb\x00\x34\x01\x78\x72\x81\x27\x22\x2c\x2e\x2d\x44\xbb\x76\ \xef\x08\xdd\x46\x2d\x2d\x2d\xa1\xd5\x6a\x99\x26\x12\x11\x46\xe9\ \x08\xc3\xe1\xc0\x01\x5f\x93\x6c\xdc\x01\x44\x09\x78\x49\x08\x66\ \x24\xcd\x07\x98\xac\x17\x2f\xac\xe3\x25\x67\xe9\x60\x72\x1a\xb3\ \x2f\x64\xe7\x6a\x7f\x42\x83\x23\x84\x2d\xd1\xe0\x08\x2d\xfd\x96\ \xdc\x1e\x60\xa4\x6b\xa3\xfe\x93\x85\xd0\xe4\x23\x1f\x78\xb7\x2e\ \x5e\x22\x40\x6b\x2b\x73\xbf\x1a\x15\x08\x21\x90\x17\x39\x04\x17\ \x98\x69\xcd\x60\xa6\x35\x0b\xe3\x8f\x81\x30\xbb\x63\x26\x98\x6e\ \x35\xd9\x76\x80\xb7\xc2\xf4\x02\x02\x8c\x01\x03\x1f\x78\x55\x38\ \x1d\x3f\x7d\x34\x71\xd9\x1c\x86\x21\x4e\x9e\x3a\x05\xd7\x27\x13\ \x82\x63\x38\x18\x8c\x39\x78\xc6\x65\x99\x40\x08\x38\xcf\x25\xc6\ \x8c\x43\x2a\xfb\x4a\xa1\xed\x86\x6d\x01\xd8\x5d\x84\x30\x8e\x97\ \x87\xa4\x03\x2f\x17\x02\x85\xe0\xc8\x8a\x1c\x59\x91\xa3\x28\xd4\ \x30\xcc\x8d\x20\x0a\x00\x42\xce\xe1\x73\x6d\x1f\x88\xd4\xe2\x28\ \x45\x24\xb8\x8f\x21\x70\xef\x29\x4e\x59\xa5\xe4\xcd\x39\x98\x37\ \xba\x27\x6d\xfe\x2c\xcb\x50\xe4\x39\x78\x61\xe3\x0d\x87\x0e\x1d\ \x92\x4b\xe0\x9d\x8e\x5f\x58\x5a\x88\xb6\x03\xfc\x76\x86\x81\x21\ \xe0\x4f\xea\x08\xf2\xd5\xa4\xf2\xf0\x69\x7e\x7e\x67\xd0\x6a\x4d\ \x05\x80\x65\xd5\x89\x13\x27\x50\x49\x12\xb7\x89\x48\xd3\x14\x5c\ \xf8\x5b\xbe\xcb\x62\x40\xba\xe1\x42\x56\xd6\xf8\xcd\x8e\x31\x36\ \x77\xa8\x55\x18\xc2\x48\xa0\x00\x84\xda\xad\xa0\xcb\x76\x1f\x41\ \x72\x75\x70\x9e\xe7\x72\x65\xb0\x9e\x59\xd4\x0e\x15\xc6\xb5\x10\ \x63\x01\xa2\x30\x44\x14\xa9\xd0\xab\x86\xc5\xec\xcc\x75\x34\x82\ \xd3\x36\x23\xfb\x02\xce\x35\x9b\x97\x50\xee\x7c\x59\x51\x21\xa4\ \xc3\xa6\x13\x17\x1c\x79\x9e\x43\x08\x01\xc6\x02\xd8\x99\x59\xb9\ \x1f\x62\x7e\x61\x1e\x0f\x1e\x3c\x30\xcf\x98\x6e\x4d\x05\x8d\x66\ \x9d\xf5\x7a\x03\xae\x9f\x63\xba\xdb\xb5\xfb\x92\x0c\xcf\x65\x80\ \x17\x0a\x96\xbe\x99\x3b\x9c\x50\xa1\x60\x08\x1c\x3b\x7d\xb4\xe2\ \x16\x1e\x46\x21\xf6\x1f\xd8\xaf\x58\xa8\xa5\x5f\x60\x38\x1a\x8d\ \x3b\x7d\xfa\x8f\xc9\xae\xf5\x6d\xbe\xfd\xce\x9b\x80\x92\x7c\xb6\ \xaa\x57\x0d\x2b\xc9\xc2\xa3\xbb\x1f\x80\x5c\xa6\x35\x18\xf4\xd1\ \xed\x74\xd0\xeb\xf5\x25\x11\xd5\x58\x9b\x40\x76\x54\x49\xce\xa8\ \x41\x2b\x97\xa2\xc0\x28\x1d\xa2\x3f\x18\x20\x53\xfb\x05\x85\x72\ \x42\x35\xe8\x36\x91\x25\x87\xae\x13\x69\x1f\xc3\x28\x12\x1f\x73\ \x63\x9a\xac\xdd\xd7\xe5\x66\x59\x86\x2c\xcd\xc0\xb9\x14\x08\xae\ \x96\xb2\x3b\x12\x80\xc5\x85\x45\xe9\x97\xc0\x7e\xb5\xb0\x6f\x3e\ \xd2\x4e\xf8\x16\x7e\x96\x4e\xcf\xc3\xdf\x9a\x00\xf8\x0e\x19\xb9\ \xa1\xe0\x5d\x7b\x76\x06\x73\x3b\x66\x03\x5b\x03\xc2\x89\xe3\xc7\ \x11\x47\x91\xba\x24\xab\x35\x1a\x8d\xa4\xa3\xe6\xd8\x1e\xcf\xdb\ \x47\xd9\x2c\x10\x60\xbc\x59\x6b\xe7\xa4\xd4\x33\x18\xfc\xcd\x39\ \x15\x6e\x88\x95\x14\x78\x1c\x83\x41\x0f\xdd\x6e\x0f\x59\x96\xcb\ \x8e\x84\x33\x43\xe0\x49\x2b\x94\xe3\xee\x4b\xb4\x50\x5d\x11\x86\ \xa1\x94\xc6\xa2\xc0\x70\x94\x22\x4d\xf3\x31\xd2\x58\x1b\xa3\x1c\ \x50\x61\xd5\xb5\xe9\x6c\xa1\x89\x62\xf3\x7a\xf5\x07\x90\xe7\x05\ \x46\xe9\x08\x79\x51\x40\x53\x5b\xdf\x6b\xa2\x84\xaa\xe6\x51\x1c\ \x62\x7e\x7e\xde\xf8\x83\x44\x84\xd6\x4c\x2b\xa8\x37\x6a\xcc\x0f\ \xd3\x33\x6d\x4e\xc9\xed\xd3\x17\x12\x80\x31\xe5\x77\x4b\x12\x90\ \x01\x4e\x15\x7e\xf8\xd8\xc1\x44\xa3\x48\x00\xe2\x28\xc4\x81\x03\ \x07\xbc\x46\x0b\x5e\x20\xcd\xd2\xc9\xb6\xdf\x44\x13\x5d\x42\xe8\ \xef\xed\x04\x92\x91\x26\x13\x77\xb0\xe4\x30\xdc\x37\x4e\x20\xc7\ \x68\x34\x40\xaf\x27\x81\xb7\xfd\xee\x8b\x9f\x30\x93\x3e\xb0\xce\ \xa3\x86\x46\x03\xa5\x1c\xc3\x30\xb4\xd1\x3f\x22\x42\xc1\x0b\x0c\ \x87\x43\xe4\x79\xe1\xf8\x0b\x0e\xb8\x9e\xa4\xba\x03\x02\x9f\x24\ \x4e\x75\xc0\x39\xc7\x68\x34\x92\x5a\x86\xdb\xac\xd6\x88\x0a\xb3\ \x4b\xd9\x75\x28\x17\xe6\xe7\xad\x83\xaa\xfa\x71\xe7\x9e\x1d\x61\ \x19\x78\x6f\x52\x4f\x0b\xd4\x8b\x08\xe0\xaa\x76\x3b\x1a\x90\x7f\ \x49\x25\xa6\xdd\xf3\xbb\x42\x2d\xc5\x20\xc2\xf1\x13\xc7\x11\x46\ \x91\x55\xcf\x04\x29\xfd\xa6\x2c\x38\x7f\xd6\x39\x31\xce\x5e\xe9\ \xbd\xab\x19\x64\xe3\x4a\x5a\xc1\xd4\x4f\x00\x24\x67\xd5\xba\xbd\ \x2e\xd2\x34\xd7\x70\xc1\x8a\x29\x9c\xae\x94\x84\x11\x42\x07\x90\ \x1d\x47\xc1\x68\x01\x61\xec\x71\x18\x46\xe6\x3b\xa3\xce\x01\xe4\ \x79\x86\x34\x4b\xc1\xf5\x3d\x42\x94\xf4\xbc\xd5\x0e\x76\xb4\x02\ \xe3\x48\x6a\x4d\x91\x65\x19\x46\xa3\x0c\x85\x71\x68\x9d\x51\x82\ \x70\xee\x85\x5c\x4c\x62\x13\x21\x8a\x63\xec\xde\xbd\xdb\x6a\x49\ \x02\x66\xe7\x66\x02\x35\xff\x3f\x11\x78\x22\x7d\xf6\xdf\x0b\x08\ \xc0\xbc\x09\x1a\xed\x18\xc9\xd7\xbd\x4b\x8b\x11\x0b\x98\xb5\x5f\ \x04\x2c\x2e\xee\x55\x12\xaa\x6c\x99\xda\xa1\xe3\xa9\x9d\x92\x16\ \x70\xef\xf7\x9e\x05\x72\xee\x53\xf3\xda\xc0\x58\x7d\xd4\x03\x91\ \xa5\x19\x06\x83\x01\x6c\x3f\x93\xe9\x64\x17\x57\xb9\xa6\x43\xcb\ \xab\xa3\xea\x4d\x5e\x3b\x4d\x2c\x04\xc9\xb5\xfe\x41\xe0\xd8\x70\ \x82\xc5\x87\xc0\xb9\x40\x9a\x0e\xc1\x0b\x6e\x9f\xe5\x8d\x38\xd4\ \x5c\x82\x21\x82\xfd\xaa\xc8\x73\x0c\x86\x23\x64\x46\x93\xf8\xcc\ \xf1\x42\xd6\xaa\x4f\xe5\x28\x05\xb0\x35\x00\x76\xee\xdc\x69\xa4\ \x9f\x40\x08\xa3\x80\x5a\xb3\xad\xd0\xfa\x6b\x25\xe0\x5f\xca\x04\ \x10\x81\x29\x1a\x59\x49\x04\xf6\x1d\x58\x8c\x8c\xec\x10\xb0\x63\ \x6e\x0e\xb5\x6a\xc5\x14\x40\x44\x48\x4d\xc0\xc7\x51\xf1\x28\xdb\ \x7c\x87\x18\x63\xd7\x01\x7d\x42\x46\x19\x7c\x38\x75\x19\x8d\x52\ \x8c\x46\x23\x77\x89\x80\xa3\xe0\x14\xc0\x4e\xb0\x47\x83\x20\x04\ \x8c\xfb\x38\x16\x99\x23\x79\x67\x10\x84\xbe\x0a\x77\x4e\xde\x12\ \xa6\x3c\xd9\xd6\x3c\x2f\x34\xf5\x55\x59\x66\x2d\xb1\xc9\xa7\x41\ \x1c\x0c\x87\x18\xa5\x19\x74\xe4\xd2\x75\x5f\xad\xe6\x12\x2e\x65\ \x4c\xd2\xd3\xc6\xba\x8d\xf5\x7a\x5d\x6d\x99\xd3\x75\x63\x98\xdb\ \x39\x13\x6c\x05\xfc\xb6\x67\x03\xd5\xb4\xaf\x04\xdf\x44\x97\x88\ \x9a\x53\x8d\x60\x66\xb6\x15\xc0\xe2\x80\xa5\xfd\xfb\x1d\x4d\x2a\ \xd5\x55\xee\xd8\xfe\x71\xc9\xf7\x4d\x01\x81\x39\x51\x43\x01\xed\ \x04\x96\x27\x87\xe0\x12\x04\x84\x74\x94\x22\xcf\x73\x80\x98\xa3\ \xe2\x1d\x59\x23\x02\x29\x69\xb6\xe4\x20\x1b\xcd\x53\x24\xb3\xbb\ \x7a\xd4\x61\x19\x72\x8a\x10\x51\x14\x19\xf7\x61\x8c\x5c\xe4\x2c\ \x1a\x05\x50\x14\xb9\xac\x8b\x02\x5e\x98\xf0\xb2\xaa\x0d\x17\x18\ \x8d\x52\x0c\x87\x23\x27\xde\x60\x81\x97\xf9\x1c\xe0\x49\xb5\x46\ \x9b\x05\xc7\x89\x2c\x19\x1a\xa9\x05\x60\xa6\x61\x30\x35\x3d\x15\ \x84\x51\xe4\x08\xad\x3b\x8a\xc3\x0b\x67\x03\x55\x1c\x80\xd9\x8c\ \xaa\xe3\x79\xc1\xe5\x50\xc3\x31\x9b\x44\x0c\x7b\xf6\xec\x51\x36\ \x48\x8a\x61\x5e\x70\xa3\xde\xb5\xcd\x53\xcd\xb4\xca\x4b\xb8\xdf\ \x39\xa2\xa7\x3a\x55\x80\xc9\xfc\xa6\xed\xea\xbd\x02\x35\xcd\x33\ \x65\x62\xe4\x22\x4d\x41\x72\x29\x39\x59\x8d\x6b\xf3\xeb\x67\x13\ \x03\x63\x01\x82\x90\xd9\x21\x14\xe9\x76\x92\x79\x05\x00\xce\x0b\ \x44\x51\xec\x8d\xe7\x8d\x36\x21\x0b\xbc\xd0\x6d\x10\x64\xb6\xa8\ \x85\x41\x60\x85\x19\x84\x3c\x2b\x90\x65\x72\x27\xb8\xdd\x6b\xa9\ \xc1\xd4\xcf\xb4\xfa\x83\x60\xf3\xe8\x8b\x66\x87\xb1\x70\x97\xa2\ \x4b\xb2\xcd\xcd\xce\x61\x65\x79\x45\xe2\xa1\x34\x69\x6b\x66\x2a\ \x58\x5f\xdb\x34\x87\x51\x90\x81\xd2\xfa\x76\x2f\x20\x80\x55\xd1\ \x6a\xd8\x4c\x8c\x11\xe6\x76\xce\x86\xfa\x41\x00\xb0\x6b\xe7\x4e\ \x54\x92\xd8\x8e\x8b\x49\x7a\xca\xda\x29\xd1\x2d\x30\xc1\x92\x92\ \x9a\xb5\xd6\x0c\xe6\x0b\x21\xf1\x96\x77\x9a\x03\x22\x98\xe9\xa4\ \xbc\x28\x30\x1a\x8d\xe4\xfa\x7c\xe3\x23\xb9\xe5\x2b\x35\xad\x3a\ \x8d\x58\x80\x30\x08\x9d\x29\x6d\x39\x3f\x20\x84\x74\x1e\x85\x90\ \xea\x3e\x08\xe5\x36\x70\x22\x42\x1c\x25\x88\x13\xb9\x8d\xa1\x50\ \x61\x58\xed\x3d\x90\xe1\x81\x80\x80\x0d\x40\x09\x48\x12\x30\xc6\ \xc0\x88\xa1\x28\x38\xd2\x74\x24\x43\xba\x4c\xdf\x27\x0c\xde\x5a\ \x68\xfc\x5d\xc6\x06\x73\x90\x10\x66\x4b\x9a\x51\x08\xc4\x21\x04\ \xb3\xe4\x00\x21\x4e\x12\xd4\x1b\x0d\xf4\x7b\x3d\xe8\xb5\x97\x8d\ \xa9\x66\xb0\xb1\xfe\xac\x98\x0c\xfc\xf6\x34\x00\xb9\x6a\x9b\x0b\ \x01\x16\x30\xcc\xcd\xcd\x04\x86\xff\x04\x2c\xa8\x05\x9e\x56\x72\ \x85\x5a\xdb\xe7\x08\x81\xb0\x92\xa5\x5b\x22\x00\x30\x04\x10\x5e\ \xfc\xdb\xf1\xa4\x49\x58\x69\x70\x3a\x45\x70\x2e\x37\x56\x92\xd2\ \x10\x5a\x8e\xf4\xde\x55\x2d\x49\x24\xc0\x88\x49\x60\x03\x7b\xcc\ \x5a\x3a\x4c\x31\x54\x9b\x4a\x85\xea\x18\x46\x96\x18\x61\x10\xa0\ \x52\xa9\x60\xba\x35\xad\xac\x11\xa9\x91\x80\x74\xdc\x84\x67\x0b\ \x2c\x29\x85\x50\xed\x27\x20\x4d\x33\xe9\xe8\x15\xb9\xed\x7c\xc5\ \x54\x7b\x2a\x99\x73\x9f\x31\x33\xfa\x1c\x3f\xbd\x58\xd6\xd5\x00\ \x1c\xa4\x26\xb6\xb8\xe0\x08\x10\x02\x8e\x11\x6a\x4d\x4f\x61\xd0\ \xef\x41\x1f\x29\xd7\x9c\x6a\x30\xd7\xb9\x36\x18\x3d\x1f\x7b\x8f\ \x00\xd6\x86\x40\xda\xe3\xd6\x6c\x2b\x0c\x42\x0f\x7f\xec\xd8\xb1\ \x43\x35\x52\x03\x24\x8c\x2a\x36\xaa\x1e\x42\x3a\x15\x82\x2b\x66\ \x93\xa3\x01\x14\x70\xba\x4f\x0d\x41\xc8\xe9\x5e\xcb\x91\x74\x94\ \x1a\x00\x0c\xb9\xb4\x8a\x54\x85\x28\x85\x65\x96\x52\x01\xc0\x68\ \x38\xc2\xb3\x76\x1b\x42\x00\x61\xc0\xc0\x02\xbd\xcc\x4a\x58\x22\ \x04\x72\xc4\x31\x4a\x53\x74\x3a\x5d\x30\xc6\x50\xab\xd5\x11\x29\ \x02\x44\x71\x84\x3c\x97\x81\x25\xf9\x2c\xd7\x74\xe9\xfa\xe5\xe8\ \x0f\xfa\x08\xc3\x00\x95\xa4\x62\x9e\xaf\x4d\x85\xde\x53\x28\xcd\ \xbd\x30\xfd\xeb\x58\x4a\x93\x5c\x55\x0f\xc1\xec\x3e\x44\xb3\xbe\ \xc1\x12\x69\x6a\x6a\x0a\x0f\x1f\x3d\x32\xe2\x12\x27\x11\x55\xaa\ \x15\x96\x8e\x52\xee\x02\xaf\x4d\xc4\x36\x08\x00\x33\x5e\xd4\x20\ \xed\xdc\x35\x17\xb9\x9a\x3d\x8e\x63\x34\x9b\x4d\x5b\x59\x48\xd6\ \xeb\xa3\x56\xac\xed\x02\x64\x84\x83\x01\xa4\x25\x9e\x01\xd0\x84\ \x80\xe9\x4c\xd7\x28\x98\x28\x9b\x02\xaa\x28\x0a\xe4\x45\x0e\x28\ \x72\x70\x65\x27\x49\x99\x18\xf9\x9e\x99\xd5\x4c\x80\xd4\x5c\x9d\ \x76\x07\xa3\xd1\x08\x61\x28\x37\xa1\x14\x45\x81\x3c\x1b\xc2\x86\ \x6d\x75\xd3\x65\xe7\x44\x51\x04\x2e\x04\xf2\xbc\x40\xaf\x3f\xc0\ \x4c\x6b\x1a\x95\x6a\x15\x04\x86\x30\x8c\x50\x14\x85\xb3\xae\x1f\ \xaa\xdd\x1c\xfd\x7e\x1f\x79\x91\x83\x81\x90\x65\x39\xe2\x48\x80\ \x05\x02\x10\x6a\x4b\x98\xd1\x4f\x00\x04\x19\xc7\xd7\x4a\xbe\x6a\ \xbb\x83\x8f\x3a\x9c\x4d\x5d\x53\x3e\x00\x49\x4d\x48\x66\xe3\x29\ \xa1\x56\xaf\xc9\x25\xeb\xc6\x26\x4a\x2d\xb0\xfe\x74\xc3\x99\x1b\ \xd0\xe5\x3f\x9f\x01\x21\x00\x3c\x7e\xdc\x2e\x76\xed\x9c\x0a\xa3\ \x38\x34\x63\x9e\xd9\x1d\xad\x90\xa0\x3b\x1d\x58\x58\x5c\x54\xa2\ \xaf\x9c\x2f\x01\x88\x42\x1f\x23\xa2\xad\xb9\x7c\xbc\xdd\x5c\xe6\ \xb6\x8e\x3c\x29\x52\x3b\xf2\x1d\xd6\x68\xc1\x97\x1d\x97\xa6\xa9\ \x77\x4c\x01\x83\xb3\x6d\x5d\xe5\x65\x24\x17\x4f\x08\x01\x29\xc9\ \xed\x36\xc0\xa4\x36\xc8\xb2\x0c\x45\xc1\x61\x4f\x2a\x25\x10\xe9\ \xf8\xbe\x7e\x26\x21\xcb\x33\x64\x79\x86\xd1\x70\x24\x03\x3e\xa3\ \x14\xd3\xad\x29\x4c\x4f\x4d\x21\x08\x43\x4b\x24\xe5\xcd\xf7\x07\ \x43\x8c\x46\x43\xe3\xb7\xe9\x3a\xa7\x69\x8a\x4a\x25\x51\x23\x02\ \xd9\xae\x31\x87\x52\x01\xa3\xef\x01\xec\x10\xd3\x80\x6e\x3a\xc2\ \xd8\x0a\x39\xb9\x06\x6b\x4e\x18\x31\x34\x1b\x4d\xb4\x3b\x1d\x93\ \xad\xd1\x6c\xb0\x8d\xa7\x9b\x1e\xf0\x2f\x92\x7e\x43\x80\x27\x4f\ \x3b\xc5\xaf\x7e\xf5\xd9\xe0\x8d\x37\xf6\x27\x33\xb3\xf5\x10\x02\ \xa8\x37\x1b\x81\x29\x80\x08\xbb\x76\xee\x84\x96\x50\x3d\xa6\xd5\ \x15\x73\xfe\x79\xaa\x5e\xc3\x25\x5c\x33\xa1\xf3\x78\xc0\xdb\x38\ \x9d\x00\xa1\xc8\x0a\x14\xb9\x3b\xba\xd0\x24\x30\x27\xd7\x80\x00\ \x05\x0e\x61\x38\x1a\xe2\xd9\xb3\x4d\x44\x61\x0c\x2e\x38\x86\xc3\ \x91\x1c\x02\x91\x40\x3a\xec\x8b\x8d\xa7\x4f\xf3\x8d\xf5\xcd\x22\ \x1d\xa6\x22\xcf\x73\x11\xc5\x11\x55\x2a\x09\xcd\xcc\xcd\x06\xb3\ \x3b\xe7\xc2\x20\xae\x52\xc1\x05\xba\xdd\x1e\x2a\xd5\xc2\xac\xbe\ \x9d\x9a\x6a\x2a\xbf\x22\x42\x9a\xf6\xd1\xed\x76\xa5\x49\x20\xd3\ \x0d\xea\x55\x12\x29\xe2\x21\x82\x20\x30\xf0\x4e\x24\x82\x6b\x0a\ \xbd\x1e\xd1\x00\x93\x1d\x11\x29\x5f\x45\xa8\x51\x94\xe9\x32\x02\ \x9a\xcd\x26\x3a\xdd\x8e\xb9\xab\x52\xa9\x30\xe5\x03\x28\xb9\x75\ \xd4\xf7\x8b\x08\x00\x00\x83\x61\x26\x7e\xfd\x9b\x1b\xc3\x63\x47\ \xf6\x24\xc7\x4e\x2e\x44\x95\x4a\x62\x56\x14\x12\x04\xea\x8d\xba\ \xb2\x5f\xb2\x01\x9c\x17\x6a\x9c\xaf\xe1\xe0\x9e\x34\xdb\xf6\x3b\ \x84\x70\x87\x55\xe4\x64\xd2\xdd\xa2\x84\x27\xcb\x32\x98\x21\xa3\ \x90\xb1\x09\x70\x4b\x14\x41\x84\x50\xd9\xf5\x82\x73\x74\x3a\x1d\ \x84\x51\x8c\x3c\x97\x66\x83\x08\x20\x51\xe0\xc1\xbd\xbb\xd9\xfd\ \x3b\x2b\xa9\x39\xcc\x59\x3d\xb1\xc8\x0b\x31\x1c\x0c\xb1\xb9\xf1\ \xac\xb8\x7f\xe7\x7e\xb6\xff\xf0\x52\xbc\x6b\x7e\x3e\xe4\x14\x61\ \x38\x1c\xa1\x28\xe4\xc6\x50\xc6\xe4\x69\xa3\x59\x26\x67\xeb\xb8\ \x59\xba\x25\x55\xbd\xf1\x6d\x94\x54\xa7\x59\x86\x8a\x5a\x50\x6a\ \xab\x6f\xb5\x9e\x7e\xbe\xd6\xdc\x96\x06\x4c\x01\x2c\x8c\x8c\x59\ \x0d\xa0\x37\xaf\xfa\x82\x95\x54\x12\xe7\x33\x21\xa9\x24\x64\xa4\ \xbe\x64\xe6\xb6\x45\x00\x5d\xb1\x6b\xd7\x1f\x65\x88\x92\xe2\x4f\ \x72\x81\x28\xb2\x00\xd7\x2a\x55\xd5\x30\x69\x06\xf4\x78\x51\x0f\ \xde\xcd\xde\x7a\x35\x34\xb3\x43\x3a\xa5\x31\xcc\x18\x5d\xfb\x01\ \x0e\xef\x85\x75\x0c\x05\xe4\xce\xda\xb2\xfa\x94\x66\x55\x6d\xd9\ \x22\x06\x0a\x18\x48\x40\xad\x38\x66\x10\x9c\xa3\x28\x72\x10\x80\ \x74\xd0\xe6\x37\x3e\xbd\x31\xea\xb4\xbb\xdc\x78\xfe\xf0\xa5\x42\ \x2f\x9c\xe4\x9c\x8b\x3b\x37\xee\x8e\x36\xd7\x36\xf3\x83\xc7\x0e\ \x25\x61\x52\xa7\x2c\xcb\xd1\x6e\x77\x01\x62\x18\x0e\x87\x68\x34\ \x9a\x20\xc6\x10\x27\x11\x46\xa3\x54\xa9\x23\x3b\x50\xd4\x9a\xa0\ \x28\xb4\x91\x12\xd6\x9e\x83\x8c\x73\x2c\xc8\x2a\x72\x38\xa1\x69\ \xed\x0d\x59\xa8\xb4\xd6\xb4\xb6\x51\x0f\x45\x55\xc7\x21\x89\x13\ \x5b\x16\xa4\x0f\x97\x24\x09\xa5\x59\x2a\x5c\xe0\xb7\x15\x09\x2c\ \x27\x0a\xe2\xe0\xde\x4a\x17\xdd\x5e\x0e\x12\x40\x14\x84\x88\x93\ \xc4\x32\x56\x0d\xcb\xd4\x13\x4c\x0c\xc1\x0d\x21\x97\x43\xc0\x6e\ \x58\x57\xb7\xdb\x84\x67\xb5\x73\x46\x24\x87\x95\xaa\xe2\x56\xc1\ \xd8\x58\xbf\xf6\xf8\x19\x11\xfa\x6a\x88\xc7\x02\x32\x87\x36\x0e\ \xbb\x9b\xfc\xe2\x07\x17\x87\xdd\x4e\x8f\xbf\xcc\x06\xca\xf6\xb3\ \x36\xff\xf8\xc3\xcb\x83\x74\xd0\xe1\x00\xe4\xb2\xb6\xc1\x10\xa3\ \x91\x9c\x08\x02\x08\x49\x52\x83\x56\xef\x3a\xbc\x6c\x82\x7c\x42\ \xce\x17\xc8\xe9\x5d\x9b\x47\x70\x79\x0a\x59\xce\x09\x45\x41\xd0\ \x9b\x82\x3c\x43\x20\xf4\x42\x56\x2d\x02\xc6\x80\x98\x76\xeb\x10\ \xb7\x5e\xd7\x18\xc7\xb1\x51\xbe\x3a\xca\x1a\x57\x62\xf2\x17\x8b\ \x6e\x73\x45\x50\x39\xcd\xcc\xb6\xa2\x82\x0b\x3c\x78\xdc\x47\xb5\ \x1a\xe2\xf8\x91\x05\x79\x6c\x8c\x1e\xff\xaa\x4a\xbb\x76\xdd\xda\ \x28\xab\xba\xf5\x5e\x48\xcf\xc1\x51\xba\x4f\x9b\x12\x98\x22\x24\ \xbb\xb3\xa2\x80\x12\x4d\x63\x2e\xb4\xd6\x10\x20\xb0\x40\x36\xac\ \x28\x0a\x74\x3b\x1d\x84\x51\xa4\x66\x22\x09\x24\x52\x71\xe3\xd3\ \x1b\x23\x08\x15\x8d\x98\x20\xf1\xd0\x84\xb0\xef\x4d\x26\x5e\x70\ \xdc\xb9\x7e\x27\x3d\x7e\xee\x74\x85\x23\x46\xaf\xdf\x43\xa5\x5a\ \x41\xbf\x37\x90\xab\x85\x28\x04\x58\x05\xbd\xee\x00\x39\x97\x55\ \xcc\x0b\xa0\xe0\x40\xce\x05\x38\x07\xaa\x15\x81\x7a\xa3\x62\x62\ \x0e\x04\xc8\xa5\x0d\xe4\xcc\xb2\x42\x20\x08\x08\x8c\x09\x84\x4c\ \x2e\xee\x94\xef\x05\xa2\x40\x20\x0c\x0a\x84\x81\x0d\x03\x0b\x2e\ \x20\x8c\xa8\x4a\x72\x05\x41\x80\x28\x8a\x91\x67\x99\xe9\xf7\xa4\ \x92\x50\xbf\x37\xf0\xa5\xff\x05\x7e\xc0\x44\x02\x54\x6b\x15\x33\ \x31\x3e\x18\xe4\x28\x30\x0d\xce\x66\x41\xa2\x07\x88\x91\x83\x25\ \xa9\x08\x96\x7e\x0e\xf9\xc3\x41\x87\x18\x92\x08\x04\xa8\xb3\x87\ \xb4\x07\x0d\xe5\x10\xca\x28\x9b\x90\x21\x56\x40\xc5\x12\xec\x5a\ \x5f\xae\x48\x10\xa8\xcd\x11\x83\xc1\x40\x49\x99\x30\xea\x71\xf9\ \xd6\xdd\x6c\xd0\x1f\x70\xeb\xbc\x02\xde\xd9\xbc\x5b\x00\xef\xaa\ \xcc\x6e\x96\x6d\x0a\x04\x00\x00\x1f\xfd\x49\x44\x41\x54\xa7\xcb\ \xef\x5c\xbf\x95\x4d\xed\x59\x8a\x7a\x03\x60\x75\x83\xa1\xd6\x9c\ \x45\xad\x43\x68\x34\xea\xc8\xd2\x08\x8f\x1e\xf5\xd4\xd0\x53\x9e\ \xfc\xc1\x08\x76\x98\x87\x0c\x95\x9a\x3c\x31\x0c\xfa\x80\x08\x41\ \x72\x10\xcc\x2d\x19\x38\x97\x12\x2f\x03\x87\xf2\xf9\x19\x23\x0c\ \x60\x4f\x6e\x0f\x03\x8e\x50\x13\x42\x14\x90\x9b\x95\xac\xeb\x18\ \x27\x89\x3c\x51\x45\xb5\x35\x8e\x63\x72\x35\xb1\x21\xc1\xcb\x12\ \x20\x8a\x23\xef\xae\x6a\xb5\x0a\x50\x04\x8e\x69\x10\xe5\x00\xef\ \x01\x94\xc2\x1d\xfa\x01\x7a\x8c\x6b\x3f\x4b\x07\xc6\x12\xc3\x80\ \xa2\x88\x21\x3f\x33\x70\x65\x03\x0b\x77\x4c\x24\xa4\xa9\xb1\x04\ \x53\x64\x50\x47\xaf\x8c\x46\x23\x84\x41\x88\x54\xa9\xfe\x41\xe7\ \x19\x7f\xb8\xf2\x38\x73\x27\x45\xb4\x69\xb1\x12\xa1\x81\x07\xb2\ \xac\x10\x1b\x9b\x3d\xb1\xb1\xd9\x15\x9b\xeb\x3d\xbe\xbe\xd1\x15\ \x1b\x1b\x1d\xb1\xb9\xd1\xe3\x1c\x62\xf0\xbf\xfe\xef\xff\x4b\xab\ \x32\x33\x1f\x44\xd1\x00\xc7\x4f\xcc\x81\x06\x43\x34\x9b\x53\x88\ \xe2\x04\x20\x86\x82\x4b\x90\x05\x80\x02\x00\x93\x11\x60\x64\x59\ \x2e\x27\xa4\x48\x9e\x0d\x00\x52\xa0\x43\x69\x44\x2e\xc0\x95\x34\ \x33\x65\x2f\xb9\x10\x92\xe4\xdc\x6e\x49\xe7\x1c\xc8\x04\x43\xc1\ \x09\x69\x2e\x27\x7b\x38\x85\x08\x28\x45\x14\xa4\x60\xe0\x72\x1e\ \xc2\x70\x5d\x2e\x1b\xf7\xdb\xff\xaa\x04\x88\x22\xcf\x37\x48\x92\ \xc4\x14\x26\x44\x08\x8e\x26\x32\xc1\x40\x62\x04\x12\x29\x88\x32\ \x18\x7f\x90\xe0\x80\xa6\x34\x82\xc6\x54\x7d\x20\x05\xbc\x80\x1c\ \x97\x4b\x09\x27\xab\x25\x74\x52\xe5\xc9\xeb\x7a\xb7\x0b\x03\x2f\ \xe4\xb2\xad\x20\x8c\x50\x8c\x46\x20\x00\x4f\x57\x9f\xe4\x80\x30\ \x47\xc4\x93\x02\xa0\xd3\x19\x88\xcd\x67\x7d\xd1\x7e\xd6\x17\x9b\ \x9b\x5d\xb1\xbe\xd9\xe3\x1b\xeb\x1d\xd1\xed\x0e\x05\x9e\x93\xae\ \x7f\x72\x6d\x74\xee\xdb\xbb\x6b\x59\x96\x22\x1d\x0d\x10\x30\x00\ \x42\x9e\x06\x56\xab\x56\xd1\xed\xf6\xc0\x89\x20\x98\xd6\x5d\x76\ \x88\x9a\x17\x05\x42\x04\x60\x24\xc3\x5f\xc4\x75\x23\xd5\x5a\x7e\ \x21\x83\x56\x60\x92\x38\xd0\xe7\x10\x08\xa1\x48\x00\x63\xfe\x38\ \x17\xd0\x31\xa0\x82\x33\x70\xaa\x22\xe3\x55\x04\xac\xc0\xda\x66\ \x06\x9e\xe5\xa8\x54\x65\xf4\x32\x08\x02\x1b\xd0\x23\xeb\x61\xbd\ \x34\x01\xe2\xd8\x27\x40\xa4\xa6\x1b\xbd\xdf\xc6\x41\x00\x8e\x2a\ \x04\x2a\x32\x52\x85\x0c\x84\x14\x01\x52\x80\x0a\xeb\xb0\x28\x33\ \x61\x74\xbe\xf2\x7a\x6d\x44\x4c\x3e\xc3\xf8\x16\xda\xee\x97\xb4\ \x89\x9e\xa9\x63\xc4\x90\x71\x19\x21\x84\x52\xff\x69\x9a\xe3\xca\ \xc7\xb7\xd2\x47\x0f\xd7\xf8\xb3\x67\x3d\xb1\xd9\xee\xf3\xcd\xcd\ \x9e\xe8\xb4\xfb\x82\xf3\xe7\xe2\xbc\x65\xba\x73\xf3\x6e\xf6\xc6\ \x77\x0a\x70\x04\x18\x0e\x07\xa8\xd5\xaa\xe0\xbc\x40\x10\x30\x84\ \x21\x93\x1e\x39\x49\x07\x4f\x6e\x4b\x90\x44\x60\x44\xc8\xb2\x42\ \xae\xec\x65\x12\x04\xa6\xb5\x81\x22\x01\x98\x30\x11\x54\x0e\x01\ \xc6\xe5\xa8\xd2\x6d\x3b\x00\x6b\x2a\xf5\x28\xc2\x99\x48\xe2\x22\ \xc4\x93\xf5\x14\x97\x2f\x5f\xc7\x4c\xab\x86\xc3\x07\x76\x20\x09\ \x03\x72\x81\x7f\x65\x1f\xa0\x6c\x02\xa4\xc7\x69\xd5\xbc\x29\xdc\ \x24\x06\x21\x62\x14\x3c\x44\x26\xaa\x80\x28\x40\xe0\x20\x2a\x20\ \x44\x0e\x88\x1c\x04\xae\x88\x21\x1c\xfb\xaf\xe3\xf3\x76\x08\xe9\ \x12\x8d\x0b\xe5\x68\x29\x67\x4b\x80\x40\x39\xc3\xe6\x26\xc7\x9d\ \xfb\x03\x64\x05\xe1\xd1\xea\x26\x58\x31\xc0\x5f\xfd\xd5\x3f\x8d\ \xfc\xd5\xbb\x9f\x2f\x6d\x6e\xb4\x8b\x40\xc2\x03\x5e\x64\xca\x25\ \x29\xc0\x58\x84\x28\x0c\xa0\xe3\x1e\x44\x72\x53\x0a\xd7\x43\x43\ \x2e\xa3\x86\x1c\xd2\x79\x63\x8e\xe4\x6b\xc0\x0d\x09\x54\x1f\x08\ \xd2\xea\x5f\x4e\x97\x31\xad\xc1\x84\x9e\x7f\xb4\x13\x47\x6e\x1b\ \x23\xb5\x28\x77\x63\xb3\x8f\xdf\x5e\xb8\x87\x7c\xd4\xe7\xf5\x28\ \xe7\x8b\x0b\x3b\xf5\x29\xff\xaf\x66\x02\xc2\x28\x1c\xd3\x00\x3a\ \x3d\xcf\xb6\xd8\xb1\x7b\x00\x2e\x02\x70\x1e\x82\xf3\xc8\x54\x9c\ \x73\x21\xb7\x45\x83\x9b\x48\xa2\x3c\x6c\x51\xce\x13\xf4\x7a\x3d\ \x74\x7b\x72\xcd\x5c\x96\x09\xe4\x85\xce\x23\x25\x28\x8c\x22\x44\ \x71\x84\xb5\xcd\x1c\xdd\x81\x3a\x1d\x5c\x08\xe4\xa3\x3e\x7f\x9d\ \xe0\x03\x40\x3a\x4a\x05\xe7\x99\xa0\x20\xa0\xa2\xc8\x10\x06\x0c\ \x10\x05\x18\x01\x51\x14\x40\x6f\x5d\x55\x2d\x97\xb1\x08\x41\x6a\ \x5e\x81\x4b\xd5\xed\x48\xb9\x05\xdd\x02\xae\x49\xc0\x05\x54\x5e\ \x09\x36\x07\x00\xe5\x0f\x68\x12\x70\xee\x83\x2f\x84\xf0\x70\x01\ \x80\xb5\xf5\x2e\xfe\xaf\xff\xfb\xbf\x0e\xde\x79\xe7\x44\xf8\x9f\ \xff\xf3\x1f\xc5\xd3\xad\xc6\x0b\xe3\xc1\x13\x09\x50\x14\xbe\xde\ \xe4\x6e\x60\xc6\x33\x03\x7e\x1a\xbb\xe6\xa8\x2c\xbb\x96\x42\x75\ \x14\x6c\x38\x99\x83\xc9\xc3\x94\x44\x88\x2c\x27\x14\x5c\x80\xab\ \xa9\x53\x82\x8d\x9c\xe9\x20\x10\x0b\x42\xd9\xf5\x6a\x0f\x5f\x18\ \xc5\x2f\x36\x76\x2f\x99\x82\x20\x40\x10\x04\x54\x40\x20\x0a\xa5\ \x3d\x0f\x02\xa6\xd4\x79\xa1\xfc\x17\xe5\xa0\xb8\x8e\x8e\x5a\xd2\ \xac\x01\x46\xc9\xb1\xf3\xae\xa9\x7e\xd0\x26\x40\x4b\xbf\x0e\x91\ \xb9\x4e\xa1\x36\xa9\xae\x06\xce\xf3\xdc\xab\x73\x91\x17\x42\x08\ \x81\xf7\xdf\xff\x34\xff\xe8\xa3\xcf\xf2\xef\x7e\xf7\xcd\xe8\xdf\ \xff\xf7\xef\xc4\x78\x4e\x9a\x48\x80\x2c\x4d\xbd\x7d\x50\xee\x8a\ \x5f\xfd\x5a\x06\x7b\xd2\x42\x07\xf7\xb3\x79\xab\x40\xd5\x0e\xa3\ \x1b\x17\x65\x2c\x50\x76\xd0\x19\x26\xea\x51\x8f\xea\x67\x62\x0c\ \xb1\xf2\xc4\x03\x26\x97\x87\xb1\x30\xa1\xa4\x92\xd0\x68\x38\x7a\ \x6d\x6a\xa0\xd1\x54\x3f\x49\x47\x02\x51\x14\x80\x05\x84\x28\x94\ \x1e\x1c\x2f\x32\x90\x50\x63\x3a\x45\x04\x01\x85\x22\x71\xa5\xbe\ \x01\x72\x86\x7f\x50\x23\x01\x97\x04\x70\x46\x07\xda\xd9\xd3\xa6\ \x51\xf7\x8d\x76\x1d\x74\x9f\xbb\x5a\x20\x4d\x53\xaf\xce\x69\x9a\ \x99\x2f\xb3\xac\xc0\x8f\x7f\xfc\xdb\xec\x9f\xff\xf9\x8a\xcf\x92\ \x52\x9a\x18\x09\xcc\xd2\xdc\x23\x80\x5e\xf1\xeb\x26\x1b\xe9\x9b\ \xfc\x87\x49\xd7\x5e\x70\x5f\x18\x06\xfe\xbd\x7a\x7c\xae\x9a\xa5\ \x3b\x27\x8a\x63\xb5\x00\x24\x90\x9e\x32\x18\xf6\xed\x5f\xf4\xf5\ \xe1\xe7\x4c\x7b\xf7\x2f\xc8\xe9\x70\x12\xa8\x56\x12\x30\x92\xfb\ \x06\x18\xa9\xc5\x1f\xa4\xfc\x7e\xa1\x0f\x98\x90\xcb\xcb\x05\xb8\ \x8a\x11\x48\x33\xc0\x85\xf6\x65\x94\x39\x83\xf2\x05\x94\x49\xe4\ \xca\xf3\x77\xaf\x6b\x49\x2f\x4b\x7e\xd9\x04\x94\x09\x90\x39\x04\ \xd0\xa9\xd7\x1b\x3c\x57\x28\xb6\x20\x80\x5f\x90\x7e\xd0\x8b\x40\ \xdf\x0a\x6c\x13\x68\x29\x7d\xf6\xde\x43\xee\xd1\x33\x43\xc1\x09\ \x7f\x85\x8a\x12\x56\xab\x55\x44\x71\x8c\x30\x0c\x11\x86\x01\x04\ \x08\xc7\x4e\x1e\x49\x9e\xd7\xd0\x97\x4d\x47\x4f\x1d\x49\x40\x40\ \xc0\x08\xb3\xb3\x2d\x54\x92\x18\x81\x8a\xda\x0d\x87\x7d\x09\xb8\ \x02\x5d\x92\xc0\x9e\x69\x10\x28\x02\x58\x5f\x07\x4a\xa5\x6b\xd0\ \x4d\x64\x57\x46\xf9\x84\xb0\xaf\x26\xaf\x0b\x3c\x60\xc2\x66\xdb\ \xd4\x00\xdb\x4d\x13\x09\x90\x66\xd9\x98\x09\xd8\x8e\x04\x4f\xfc\ \x43\xf9\x9a\x05\xd8\x48\x38\x01\x20\x39\xb7\x8f\xf2\x77\xce\xab\ \x00\xd4\x81\x13\xf2\xc8\x55\x08\x8e\x46\xa3\x0e\x00\xd8\x7f\xfc\ \x58\xbc\xff\xd0\xbe\xd7\xa2\x05\x8e\x9e\x3c\x1c\xef\x3d\xb0\x37\ \x22\x12\x98\x9d\x99\x46\x10\x30\x54\x2a\x09\x18\x03\x8a\x3c\xc5\ \x70\xd0\x87\x3c\x61\x44\x81\x6f\x26\xbe\xb8\x8c\x0a\x42\x4f\xee\ \xa8\x9d\x49\xbc\x24\xe5\x5c\x01\xcd\xed\x62\x70\x5e\x92\x7e\x00\ \xc6\xa9\x9c\x24\xfd\x7a\xa3\x89\x9b\x26\x69\x80\x17\xa5\xc9\x04\ \x18\xf9\x3e\xc0\xc6\xc6\x06\x80\x71\x1f\x60\xbb\xaa\x7d\x2b\x42\ \x8c\xdf\xc7\xe4\x90\x13\x56\xea\xcb\x5a\x22\xcb\xe4\x7e\xbd\x99\ \x99\x19\x00\xc0\xf4\xf4\x14\x02\x46\xc8\x11\xe2\x4f\xff\xe3\x77\ \x1b\x49\xe5\xf3\x39\x84\xb5\x7a\x95\x7d\xf7\x3f\xfc\x77\x0d\xb9\ \xdc\x4e\x60\xdf\xbe\xbd\x08\x18\x50\xab\xc9\xdf\x2e\xea\x74\xda\ \x90\xdb\xd9\x24\xf8\xae\x06\x20\x48\x7f\x41\x1a\x78\x6b\x1a\x40\ \x42\x3a\xb6\x1c\x25\x33\x60\x4d\x81\xbc\x46\x9e\x69\xd0\xa0\x73\ \x61\xa5\xdf\x25\x42\xb7\xdb\xf5\xea\x3e\x18\x3c\x3f\xb8\x35\x29\ \x4d\x24\xc0\xb3\x8d\xb6\xe7\x38\x3c\x7e\xfc\x78\xcc\x07\x70\x77\ \x10\xbf\x8c\x49\x70\x7d\x83\xb2\xad\x27\x22\x2f\xea\xe8\x05\x34\ \x14\x29\xb2\x2c\x07\x81\x50\xaf\xd7\xe4\xef\xfb\x91\x25\x43\x32\ \x35\xc3\xfe\xe4\xdf\x7f\xa7\xfe\xb2\x9d\xe0\xa6\x7f\xf7\x9f\xfe\ \xa4\x5e\x69\x24\x44\x24\xb0\x73\xe7\x1c\x9a\xcd\x3a\x1a\x8d\x1a\ \xa2\x90\x81\x31\x81\xcd\xcd\x75\xe8\x73\x63\x48\x49\xbe\xb6\xfd\ \x80\x40\x1c\x47\x90\x86\xdb\xfa\x07\x9a\x28\x42\xc5\x35\x2c\xc0\ \xbe\x3f\xe0\x9e\x60\x22\x1c\xff\x40\xf7\xb7\xeb\x0b\xe4\x79\x8e\ \x76\xbb\xed\xd5\x7d\x73\x7d\xb3\xc0\x4b\xa6\x89\x04\x58\x5f\xdb\ \xf0\x74\x4b\xbf\xdf\x97\xc7\x9b\x3b\xe0\x3d\x8f\x00\x72\x44\x54\ \xb2\xfb\x5b\x68\x02\xcf\xce\x03\xe6\x5c\x1c\x01\xa8\x6b\xfe\xbd\ \x5c\x08\x8c\xd2\x21\x82\x80\xe1\xd0\xa1\x83\x38\x7a\xf4\x28\x76\ \xed\xda\x21\x8f\xa0\x07\xe1\xf0\xe9\x93\xc9\xf7\xfe\xe3\x1f\xd7\ \xa3\x28\x7c\x29\x4d\x90\x54\x62\xfa\x1f\xfe\xc7\xef\x35\x0e\x1e\ \x5b\x8a\x89\x09\x24\x49\x8c\x23\x87\x0f\x21\x8e\x42\xd4\xeb\x35\ \x30\x02\xba\x9d\x36\x06\x83\xbe\x09\xfc\x0a\x47\xf2\xf5\x35\xa9\ \x01\xa4\x62\xb7\xda\x41\xa8\x89\x2d\xee\x99\x01\xae\xfc\x03\x0d\ \xba\xfe\xac\xb5\x04\x00\xc7\x07\xb0\x49\x08\x81\x4e\xa7\xe3\x69\ \x03\x00\xd8\x58\x7b\x79\x02\x4c\x1c\x06\xae\x3f\xf5\x09\x00\x00\ \x9d\x4e\x47\x4e\x0a\xc1\x57\xdb\xfa\xb3\x9b\xcc\x67\x61\x87\x7f\ \xda\x9b\x57\x2f\xc6\x17\x20\xfd\x5e\x0d\xf1\x82\x20\x44\x18\x45\ \xe0\xa9\xfc\x75\x6e\x9d\x47\x0f\x05\x19\xc9\x85\x9c\xb3\xb3\xb3\ \x08\x03\x42\xad\x56\x01\x44\x81\xa2\xc8\x71\xe7\xce\x2d\x14\x85\ \xc0\xf1\x37\xcf\x56\xf6\x1e\x58\x8c\x7e\xfc\x77\x3f\xeb\x3e\x54\ \xbf\xd0\xf5\xbc\xb4\xff\xd0\xbe\xe8\xdf\xfd\xa7\x3f\x6e\x34\x67\ \x6a\x0c\x24\x8f\x89\x3d\x7b\xe6\x14\x92\x24\xc2\xd4\x54\x43\xce\ \xec\x91\xc0\xc3\x87\x2b\xd0\x2b\x74\x08\xfa\x28\x59\x3b\x7a\x8f\ \xa2\x08\x01\x53\x43\x42\x30\x98\x7d\x01\x7a\xa6\x40\xc8\x75\x14\ \xdc\x09\xf1\x0a\x2e\xc0\xd5\xa9\xa4\xe5\x20\x91\x6e\xaf\xc6\xd9\ \x8d\x01\x94\xa5\x5f\x08\x81\xcd\x8d\xf6\xeb\x21\x40\xaf\xdb\x2f\ \xd2\x51\xca\xe3\x24\x36\x1a\xe2\xd9\xb3\x67\xd8\xbd\x7b\xb7\x79\ \x18\x63\xcc\x1e\xc0\x30\x91\x00\xc2\xc4\xb6\xcd\x35\xed\xef\xe9\ \xef\x88\xcc\x36\x37\x52\x4b\xc7\x48\x79\xf9\x59\xd6\x1d\x03\xbe\ \xde\xac\xa3\xd1\x6c\xca\xa1\x58\x9e\x23\x0c\x22\xc4\x51\x84\xe9\ \xe9\x29\x64\xd9\x6e\x00\x1c\x2b\xcb\xf7\x90\x8e\x86\xa8\xcf\xce\ \x06\xff\xf3\xff\xf6\x3f\x4d\x7f\xf2\xd1\x27\xc3\x6b\x57\xae\x8f\ \x1e\xac\x3c\xca\xe1\x08\x0c\x31\xb9\xf1\xf5\xe4\x99\xa3\xc9\x89\ \x73\x47\x12\xf9\xd3\x00\x02\x71\x14\xe1\xd4\xe9\xd3\x68\x34\x6a\ \xa8\xd7\xaa\x32\xea\x47\xc0\xea\xea\x2a\x46\xc3\x01\x64\xe8\x57\ \x01\x2b\xf4\x1a\x03\x29\xb1\x49\x12\x03\xd0\x0e\xa1\x70\x62\x03\ \x46\x9e\x95\xd6\x60\x6a\x0e\xc1\xce\x87\x70\x0e\x10\xd3\x53\xdb\ \xaa\x04\xb5\x0e\x40\x00\x08\x02\x1b\x88\x03\x30\x46\x80\x6e\xa7\ \xc7\xdd\xd5\xcb\xdb\x4d\x13\x09\x00\x00\xcf\x36\xda\xc5\xce\x3d\ \x3b\x0c\x01\x56\x56\x56\x70\xec\xd8\x31\x0b\x26\x26\x07\x84\xdc\ \xef\x35\xe0\xe6\x9a\x21\x00\xcc\xe1\x92\xce\x20\xc0\x44\x0e\x6b\ \xb5\x1a\x7a\xfd\x01\x78\x26\xd7\x1d\x36\xa7\x1a\xa8\xd7\x1a\x30\ \xfb\x02\x85\x5c\xfe\x55\x14\x84\x20\x8a\xd0\x68\x34\xc0\x98\xec\ \xa4\x7a\x35\xc1\x83\x07\x2b\xd8\xd8\x58\x83\x60\x01\x4e\x7d\xfd\ \x4c\xe5\xf4\xdb\xa7\x2b\x45\x96\x89\x41\x6f\xc0\xd3\x51\x2a\x92\ \x6a\xcc\x6a\xf5\x2a\x85\x11\x23\xe3\xd0\x41\x60\x66\x66\x06\xc7\ \x8e\x1d\x43\x1c\xc7\xa8\x56\x2b\xc6\xf1\x6b\xb7\x37\xf1\x60\xe5\ \xbe\x0c\xfc\x08\x0e\x52\x33\x99\x80\x9a\x9f\x80\xdc\x5a\x9e\x24\ \x31\xec\x92\x78\xbd\x60\x56\x81\xae\x96\x8a\x93\x62\xb4\x09\x14\ \xa9\x48\x4f\xa0\xcc\x9b\x0e\x10\x99\xf9\x03\x48\xe1\x90\x9a\xc0\ \x0a\xdb\x93\x27\x4f\xbc\x3e\xdf\x78\x05\xfb\x0f\x3c\x87\x00\xab\ \x8f\x9e\xa4\x3b\xf7\xec\x30\xc3\xaa\xab\x57\xaf\xe2\x7b\xdf\xfb\ \x9e\x6c\xb4\xaa\x88\x76\x4c\xca\x69\x3b\x04\xd0\x13\x1c\x2e\x01\ \xec\x9f\x5c\xf6\x9c\xe5\x05\xaa\xb5\x3a\x88\x98\xb2\x8d\x30\x24\ \x21\x92\x1b\x47\x42\x35\x3b\xd7\xa8\xd7\x51\x49\x62\xcc\x4c\x37\ \x31\x33\x33\x8d\xb5\xb5\x27\x78\xf4\xe8\x21\xda\xcf\x36\x01\x12\ \x08\x93\x90\xa6\x92\x66\xa0\xc1\xd6\xe0\x10\x04\x5a\xad\x16\x96\ \x96\xf6\xc9\x9f\xa7\x65\x84\x46\xa3\x89\x38\x8a\x40\x8c\x30\x1c\ \x0e\x70\xf7\xee\x6d\xe5\xc4\x71\x63\xc3\xb4\x96\x13\x02\x10\xc4\ \x51\xad\x54\x60\x8c\xb9\x03\x3a\x09\x47\x23\xe8\xf5\x11\x6a\xbb\ \x97\x9e\x27\x20\x61\xc3\xbe\x20\x98\x20\x90\x10\x04\xc1\xe5\xc8\ \xa2\x3c\x0c\x7c\xf0\xe0\x81\xd7\xe7\x0f\x97\x1f\x8f\x99\xed\xed\ \xa4\x2d\x09\x70\xff\xee\x4a\x7a\xfa\x8d\x93\xc6\xa3\x5e\x5b\x5b\ \x43\xa7\xd3\xf1\x36\x87\x68\x33\x50\x4e\x65\x02\x98\xa9\x5f\x0d\ \x76\xd9\x17\x80\xe3\x2b\x30\x42\x25\x0a\xd1\x68\x4e\xa1\xdf\x1f\ \x20\x2f\x0a\xb5\xcd\x9f\x2c\x71\xf4\x2b\x01\xc3\xe1\x00\x95\x4a\ \x82\x38\x0a\x11\xc7\x11\xe2\xa8\x85\x4a\x25\x46\x92\x44\xa8\x54\ \x62\x10\x96\xd0\xed\x76\x30\x18\xf4\x90\x67\x29\xf2\x3c\x43\x14\ \x85\xa8\x24\x31\x6a\xb5\x2a\xe6\x66\x67\x11\xc5\x21\x08\x40\xb5\ \x92\xa0\xae\x4e\xec\x86\x72\xfa\x6e\xde\xba\xa9\x56\x03\x93\xf1\ \x49\x8d\x94\x43\x6e\xe1\x0a\x83\x10\x71\x1c\x2a\xff\xc0\x6a\x09\ \x63\x06\xcc\x8f\x4d\x59\xe3\x00\xc1\xc1\xd5\xc6\x16\x8f\x08\xc2\ \x86\x87\xb5\x09\x08\x03\x2b\xfd\x42\x08\x6c\x6c\x6c\x98\xf0\xbc\ \x83\xd7\xeb\x25\xc0\xf2\x5d\xbb\x9c\xda\x5c\x5b\x5e\xc6\xc9\x93\ \x27\xbd\x6b\x5b\x9a\x00\x01\xc0\xb1\xeb\x24\x1c\x90\x1d\x9b\xaf\ \x6d\xbc\x06\x3e\x8c\x62\x33\x1e\x8e\xe3\x18\xc5\x60\x08\x2a\x95\ \xad\x0c\x90\x21\xce\x68\x34\x84\xe0\x11\xaa\xd5\xc4\x2c\xe5\x1e\ \x8d\x06\x18\x8d\xea\x18\x0d\x07\x68\xb5\xa6\x31\x3b\xdb\x42\xc0\ \xd4\xaf\x7c\x92\xfa\x91\x47\xf5\xb9\x52\xa9\xa0\x52\x4d\x10\x39\ \xdb\xcb\x9e\x3c\x79\x8c\xe5\xe5\x65\x08\xa1\x47\x36\x72\x03\x9b\ \x9d\xba\xd0\x9e\x3a\x47\xbd\x51\x1b\x57\xf7\x42\x98\xf6\x5b\xc9\ \xd7\x6d\x60\x2a\xe2\x27\xe4\xa2\x51\x65\x02\x74\x04\x50\xfb\x02\ \xfa\x87\x2c\xf5\xce\x27\x8d\xc7\xe3\xc7\x8f\xbd\xfe\xce\xd2\x4c\ \x3c\x7e\xb0\xfa\x42\x67\x77\x52\xda\x92\x00\xc3\xc1\x88\xaf\x3d\ \x59\xcf\x77\xec\x9a\x33\x79\x6e\xdc\xb8\x81\x93\x27\x4f\x1a\x20\ \x00\x8c\x69\x01\xbb\xd9\x51\x35\x56\xe5\x25\xbd\x53\x0c\xce\x08\ \x40\x00\x60\x84\x24\x92\x1b\x2a\xe4\xca\x58\xa0\x50\x2a\x36\x8a\ \x22\x14\x6a\xaf\x3d\xd9\x9e\xb7\x66\x40\x3e\x51\x05\x88\x52\xf0\ \x22\x43\xa5\x9a\x20\x8e\x02\x04\x41\x80\x9d\x3b\x76\x00\xe0\xf2\ \x3b\x9e\x43\x14\x39\x00\xf9\x4b\xe0\x41\x40\x46\x6b\x68\xad\x42\ \x0c\xe8\x75\xbb\x58\x5e\x59\x41\xb7\xd3\x51\x60\x4b\xb1\x97\x44\ \x76\x02\x32\x04\x00\x0c\xf5\x7a\x1d\x41\xc0\x1c\x87\x4f\x99\x06\ \x70\x03\x38\xd4\xba\x44\xa1\x48\x61\xb5\x81\xef\x0b\xc8\x3a\x90\ \x0d\x11\x2b\xe9\x37\xf7\xaa\xb4\xb2\xb2\xe2\x61\xf5\x70\xe5\x71\ \x36\x49\x13\x6f\x27\x6d\x49\x00\x00\x58\xb9\xf7\x30\x75\x09\xf0\ \xe9\xa7\x9f\xe2\xcf\xfe\xec\xcf\xd4\xee\x17\xd5\xb6\x92\x23\xe8\ \x0d\xdb\xe0\x10\xc0\xd1\x00\xda\xfe\xc7\x71\x88\x30\x8c\x64\xdc\ \x4c\x9f\x9b\x23\x84\x19\x22\xc9\x3c\x31\xf2\x82\x83\x67\xb9\x19\ \x0e\xb9\xbe\x83\x16\x2d\x52\x32\x39\x1c\x0c\xf0\x6c\x73\x80\x74\ \x34\x44\xad\x56\x45\x18\x12\x2a\x49\x0c\x50\x6c\xc2\xb4\x8c\xe9\ \x91\x88\x7e\x96\x40\xbb\xd3\xc6\xda\xd3\xa7\x68\xb7\x9f\x01\x2a\ \x8f\x3e\x71\xcc\x9c\x5a\xa6\x55\x3b\x49\xa9\x4e\x2a\x09\x2a\x15\ \x75\x4e\xa2\x27\xe5\x76\x39\xb6\x5e\x41\x2d\x43\xc7\x8e\x59\x50\ \xf9\xb4\x2f\x20\x60\x63\x02\xc4\x49\x4e\x0f\x0b\x81\x28\xb0\x33\ \x80\x44\x84\x34\x4d\xf1\xe8\xd1\x23\x0f\xa7\xe5\x7b\x0f\x5e\x49\ \xfa\x81\x17\x10\xe0\xd6\xf5\x3b\xe9\xd7\xbe\x7e\xa6\xa6\x3f\x8f\ \x46\x23\xdc\xbb\x77\x0f\x07\x0f\x1e\x34\x79\xca\x8e\xa0\x21\x80\ \x5e\xca\x2b\x44\x09\x30\x35\x5e\x0e\x42\x80\x14\xf3\xb5\x4f\x60\ \x24\x5b\x68\x41\x07\x91\x54\xd1\x9c\x0f\xc0\x45\x61\xbc\x68\x52\ \x2c\x91\xaf\x7a\x8e\x41\xde\xb4\xb9\xb9\x89\x7e\xbf\x0b\x3c\xe5\ \xa8\x54\x12\x54\x2b\x31\xa2\x30\x40\x18\x05\x08\x03\xb9\xab\xa9\ \x28\x32\xe4\x79\x86\x41\xbf\x87\x6e\xa7\x2d\x63\xf6\x3a\xb4\x0b\ \x18\x8d\x50\x70\xbd\x82\x89\x1b\x1f\x9e\xc0\x10\x46\x11\xea\xb5\ \xaa\xf1\x07\x0c\xe0\x46\xca\xb9\xd1\x12\x7a\x98\x28\x89\x50\xf6\ \x05\xa4\x97\xe0\xde\xaf\x57\x40\x33\x92\x53\xd0\xae\xfd\xbf\x7f\ \xff\xfe\x98\xdf\x75\xeb\xfa\x1d\x7f\x56\xe8\x25\xd2\x73\x09\xb0\ \x7c\xff\x41\xd6\x69\x77\x79\x73\xaa\x61\x86\x83\x97\x2e\x5d\xc2\ \xc1\x83\x07\xc7\x40\xd7\x95\x37\x04\xd0\x1a\x9b\xac\x03\x15\xca\ \x45\x16\x5e\x08\x54\x03\xe9\x96\xa3\xb7\x55\xbb\x20\x57\x2a\x15\ \xf0\xc1\x50\x9d\xa9\xeb\x90\xa0\x34\x9a\xe0\x42\xfe\xfa\xa8\x2e\ \x6f\x34\x1a\x62\x38\xec\xc3\xc6\xeb\x65\x88\x56\xa8\x78\xbd\xde\ \x66\x6e\x46\x2b\xaa\x1d\x60\x30\x4b\xba\x04\xd7\xd2\x2b\x41\x08\ \x43\x86\x66\xb3\x51\x92\x72\x6d\xdf\x26\x01\xee\x6e\x03\xd1\x51\ \x41\x1b\x24\xb2\xfd\x01\x04\xaa\x32\x5c\x00\x95\x00\x1e\xf8\x00\ \x70\xeb\xd6\x2d\x0f\xa3\xd5\x47\x4f\xf2\x57\x89\x00\xea\x34\x31\ \x14\x6c\x92\x00\x3e\xfb\xe4\x86\xe7\x6e\x5e\xb9\x72\x65\xcc\x03\ \x7d\xd1\xbc\x40\x18\x06\x48\x92\x18\x51\x14\x7a\x26\xc3\x84\x95\ \x9d\xbc\x00\xec\x19\xc5\x6e\x1e\xc6\x50\xad\x56\x11\xa8\x35\x03\ \xee\x3c\x81\x7b\x6f\x7f\x60\x7f\x68\xda\x7e\x8f\xf1\x7a\x41\xaf\ \xc7\x97\xcb\xb9\xcd\xfa\x7e\x82\x31\x11\x4c\x7d\x27\x4d\xb8\x24\ \x8c\x8c\x0e\x36\xa5\x09\xf1\x42\xc1\xaa\xc3\xca\x33\x77\x70\xe7\ \xf7\xf5\x76\x79\x1d\x19\x14\x86\xfc\x42\x15\xe7\x4e\x02\x55\x93\ \xc0\x9b\x00\x1a\x0c\x06\x63\x0e\xe0\xb5\x2b\x3e\x3e\x2f\x9b\x9e\ \x4f\x00\x00\x57\x2f\x5f\xf7\x1e\x50\x14\x05\x6e\xdc\xb8\x31\x96\ \x6f\xac\x83\x99\x9c\xde\x8d\xd5\xbc\xbd\xbb\x4d\xc9\x05\x44\x5e\ \x80\xbf\x7f\x0f\x2e\x70\x8e\x74\x2a\x4d\x10\xe9\x33\x0a\xf5\xb8\ \xcc\x19\x5e\xf4\xba\x3d\x43\x10\x53\x16\x1c\x13\x81\x12\xd9\xf4\ \x7b\xe5\x0f\x30\x75\x64\xad\xdc\xad\xa3\xfe\x54\x5d\xf4\x30\xd1\ \xba\xf3\x70\xc0\x75\xe3\x21\x0a\x4d\xe1\xcf\x13\x4c\x5c\xd8\xe1\ \x11\x44\x26\x2e\x04\xe2\x10\x72\x29\xba\xce\x27\x04\xee\xdc\xb9\ \xe3\xf5\x39\xe7\x1c\xd7\x3e\xf9\x82\x09\xb0\xbe\xb6\x51\x3c\x79\ \xfc\xd4\x73\x32\x7e\xf1\x8b\x5f\x8c\x05\x80\x5c\xf0\x19\x93\x63\ \x63\x7d\x06\x8f\xdb\xd9\x93\x81\x56\x23\x8a\x92\x84\xba\xaf\x2e\ \x81\xe2\x38\x46\x92\x24\xe6\xf0\x27\x55\x90\x3c\x52\xc6\x9c\x55\ \xbc\xd5\x9f\x8e\x3f\x94\x48\x00\xfb\x3d\x69\x6d\xa0\x62\x0d\x61\ \xc8\x30\xd5\x6c\xca\xb9\x10\x23\xb5\xf2\xd5\x1d\xfe\x09\x63\x5a\ \x94\x54\xc3\x07\x5c\x6a\x7c\x7b\xaf\x95\x7e\x3b\xfd\xab\xf3\x36\ \x2a\xe3\xb3\x7f\x57\xaf\x5e\xf5\xfa\xfc\xfe\x9d\x95\x74\xd0\x7f\ \xfe\x8a\x9f\x17\xa5\x17\x12\x00\x00\x3e\xfe\xe8\xd3\xa1\xfb\xf9\ \xe9\xd3\xa7\xf8\xec\xb3\xcf\xc6\x0b\x63\x4c\x2f\xa6\xf4\x3a\xd7\ \x7d\x35\xef\x69\xfc\x5a\x59\x5d\xdb\xeb\x2a\x0f\x60\x80\x0a\xc3\ \x10\xd5\x4a\x15\x71\x12\x9b\x23\x54\xb5\xfa\x37\x5a\xa1\x5c\x3e\ \x08\x7a\xf3\xa4\xd6\x1e\x65\x22\xda\xe7\xc9\x25\x60\xcd\x46\x1d\ \x33\xad\x16\x92\x24\x76\x8a\xd3\x80\x2b\xef\x5f\x38\xbb\x7b\xc5\ \xf3\xcd\x80\x56\x67\x46\x6b\x08\xad\x21\x34\x11\x80\x6a\x4c\x70\ \x4f\x77\x13\x42\xe0\xe6\xcd\x9b\x18\x0e\x3d\x18\x70\xe5\xe2\xd5\ \xcf\x25\xfd\xc0\x36\x09\xf0\xe9\xe5\x6b\xa3\x6e\xa7\xe7\xb9\x9e\ \x3f\xfb\xd9\xcf\xbc\xe1\x89\x3e\x7b\x6f\x92\x64\x97\x25\x5c\x5e\ \x83\x97\x6f\x12\x51\xbc\xfc\xfa\x3b\x62\x30\xdd\x4d\x84\x28\x8a\ \x51\xad\x54\x11\xc5\x11\xfa\xfd\xd2\xef\x14\x48\x4b\xaf\x8c\xb8\ \x05\xdf\x33\x11\xae\x19\x21\x99\x3f\x08\x43\xd4\x6a\x0d\xb4\x5a\ \x2d\x24\x49\x05\x18\xd3\x20\x1a\x5c\x51\x52\xe1\x65\x33\x60\xa5\ \x1c\x00\x26\x9a\x00\xe1\x94\x01\xa9\x75\x1a\x09\x8d\x49\xff\xa7\ \x9f\x7e\xea\x61\xb2\xbe\xb6\x51\xdc\xbc\x7e\xfb\x95\xbd\x7f\xd3\ \xc7\xdb\xc9\xc4\x0b\x8e\x0b\x1f\x7c\x3c\x70\xaf\x3d\x7d\xfa\xd4\ \xf8\x02\x2e\x68\xe5\xcf\x63\xc0\x12\x3c\x12\x30\x1a\xcf\x63\xd4\ \xbf\x4b\x1c\xe6\x9b\x04\xdf\x87\x20\x15\x01\x6c\xa2\xd5\x9a\x41\ \xad\x5e\x47\x18\x46\xa5\x7c\x5b\xac\x31\x50\x64\x0a\xc3\x08\xb5\ \x6a\x1d\xad\x56\x0b\xad\xd6\x2c\xaa\xb5\x1a\x40\x81\xc9\xe7\xfa\ \x0e\x84\xf1\x4d\x1a\x2e\x60\x65\xe9\x37\x44\x28\x49\xbf\xf7\x9b\ \xc9\xea\xbe\x46\xc5\x8f\xfc\x69\xdb\x5f\x96\xfe\xf3\xbf\xbe\x30\ \xc0\xe7\x52\xfe\x32\x3d\x77\x18\xe8\xa6\x8f\x2f\x7c\x32\x7a\xfb\ \x9b\x6f\x54\xab\xb5\x8a\x21\xcd\x8f\x7f\xfc\x63\x1c\x3e\x7c\x78\ \x5c\x82\x85\x80\xda\x18\x67\xa2\x5e\xde\x10\x11\x7a\x74\x6c\x63\ \xe0\x8c\x08\x05\x74\xe8\x58\x7e\x5f\x40\xa8\xcd\x11\x00\xa9\x79\ \x18\xd2\x3b\x32\xa1\xed\xaa\xcc\x9f\xa6\xa9\xd1\x08\x71\x14\x02\ \xf5\x1a\x38\xcf\x51\xe4\x99\x7c\x2d\x72\x08\xf5\x39\x08\x64\xac\ \x81\x05\x64\x3c\x7d\xa6\xf6\xfe\xc9\x1a\x39\x76\xde\x91\x76\x10\ \x19\xbf\x80\xa0\xe6\xed\x4d\x1e\x0b\x9a\x89\xf6\xc1\xb6\xdd\xe6\ \x53\x31\x0e\x15\x60\x12\xce\xfd\x01\x01\xb5\xc4\x0f\xfc\x64\x59\ \x86\x2b\x57\xae\x78\x58\x3c\xdb\x6c\x17\x9f\xd7\xf9\xd3\x69\x5b\ \x1a\x00\x00\xf2\x2c\x17\x97\x3e\xbc\xec\xd1\x70\x7d\x7d\x1d\xe7\ \xcf\x9f\x1f\x63\xbd\x9b\x8c\x14\x7b\x9b\x16\x27\xfb\x04\x8c\xec\ \x90\xd0\xd3\x14\xfa\x4f\x75\xbc\x85\x45\x4a\xb2\x80\x3c\xaf\xaf\ \xac\xd6\x89\x02\x84\x51\x8c\x38\xae\xa0\x56\xad\xa1\x5e\x6f\xa0\ \xd9\x9c\x42\xad\x56\x47\xb5\x56\x47\x12\x57\x10\x45\xb1\xfa\x91\ \x48\x52\xa6\x42\x6e\x5c\xd1\xa6\x43\x46\xfe\x98\xa3\x09\x9c\xeb\ \xaa\x0e\x42\xe0\xb9\x1a\x61\xec\x1a\xe0\x90\xd8\xe6\x6b\x56\xc9\ \x4c\xfb\xea\xbf\x4f\x3e\xf9\x64\x6c\xd8\xfd\xe1\x6f\x2e\x0e\xbc\ \x5f\x1a\xfb\x1c\x69\xdb\x04\x00\x80\x8f\xde\xbf\x34\xec\xb6\xbb\ \x9e\x2f\xf0\x93\x9f\xfc\x04\xdd\x6e\x77\x62\x34\x70\xa2\x83\x35\ \xe1\xfa\xf8\x7b\x5b\x86\x3b\x6a\x20\xf7\x3b\x03\x82\x3a\x99\x23\ \x2f\x3c\xb5\x6e\xec\xfd\x98\xad\xb7\x3e\x81\x26\x8f\xeb\x27\xf8\ \xaf\xfa\x8f\xec\xab\x7a\x86\x8e\x52\xda\x15\xbc\xee\xdf\x36\x89\ \x60\x47\x93\xa8\xc6\x40\x3d\xf1\x4d\x4b\xbb\xdd\x1e\x1b\x72\x6f\ \xac\x6f\x16\x9f\x7c\x7c\xed\xb5\x48\xbf\x6a\xf9\xf6\x53\x96\xe5\ \xe2\x9f\x7e\xfa\x2f\x3d\xf7\x5a\x9e\xe7\xf8\xe9\x4f\x7f\x0a\x00\ \x63\x24\x00\xf9\xc0\x96\xaf\xeb\x08\x9c\xf9\xa1\x6e\xc0\xde\x03\ \x7b\xaf\x39\xca\x96\xd9\xf7\xf6\x0e\x42\x96\x66\x0e\x21\xac\xc4\ \x5a\xe7\xee\x45\xd7\x5d\x67\xd1\x79\x05\x83\x30\x1a\x40\x49\xbe\ \x22\x02\xd3\x3f\xd2\x00\x9a\x00\xee\x04\x8d\x80\xad\x88\x00\x84\ \x01\x30\xd7\x0c\xbc\x3e\x14\x42\xe0\xe2\xc5\x8b\x63\x9a\xf5\xe7\ \xef\xfd\xaa\xc7\x8b\x57\x9b\xf8\x99\x94\x5e\x8a\x00\x00\x70\xe3\ \xda\xed\xf4\xee\xad\xfb\x9e\xf7\x79\xe9\xd2\x25\x5c\xbb\x76\x6d\ \xac\xb2\x46\x7a\xa1\xc0\x74\xcc\x80\x7b\x5d\x5e\xb3\x11\x39\x7d\ \x5d\x07\x60\x74\x59\x6e\x79\xe6\x26\xc8\x23\xdc\xcb\xce\x1d\x60\ \xb5\x84\x1f\x14\xd2\xd7\xf4\xf5\x32\x09\xb4\xb4\xfb\x44\x30\x5a\ \xc0\x21\x0e\xc1\x12\x63\x5c\xf2\xe1\x13\x41\xe8\xeb\x3e\x11\x18\ \x01\x73\x8d\xc0\x1b\x3a\x0a\x21\x70\xeb\xd6\xad\xb1\x55\x3f\xd7\ \x3f\xbd\x39\x7a\xd5\x79\xff\xad\xd2\x4b\x13\x00\x00\x7e\xfe\xe3\ \x5f\xf5\xf2\xbc\xf0\xd0\xfe\xc1\x0f\x7e\x80\xd5\xd5\xd5\x09\x01\ \x22\xe7\x3d\x7c\xd5\x3e\xa6\xfe\x8d\x53\xef\x4a\xba\x13\x20\x72\ \xde\xeb\xa3\x57\x8a\xa2\x50\x53\xa9\xda\xcc\x38\x80\xb9\xd2\x0e\ \x06\x52\x5e\xbd\xaf\xe2\x4b\x1a\x62\x22\xf8\x5a\xf2\xed\x7b\x33\ \xa2\xd0\x23\x09\x22\xbb\xe3\x87\x3f\x87\x08\xf0\xa3\x87\xb3\x8d\ \xc0\x44\xfc\xf4\xf5\x27\x4f\x9e\xe0\xf2\xe5\xcb\x5e\x3f\xa6\xa3\ \x54\xfc\xd3\x4f\xff\xa5\x8f\xd7\x9c\x5e\x89\x00\xcf\x36\xdb\xfc\ \xc3\xdf\x5c\xf0\x86\x85\x79\x9e\xe3\x2f\xff\xf2\x2f\x27\xfb\x03\ \x0e\xb0\xe6\x55\x5f\x63\x8e\x6d\x07\xe0\x9c\xe2\x6e\x81\x36\x1a\ \x5b\x8d\x10\xd4\xd2\x29\x10\x21\xcb\xe5\x91\x2c\x65\xdb\x4e\x65\ \x50\x49\x47\xec\xcb\xf6\xde\x91\xe4\x31\xf0\x2d\x89\x84\xf9\x21\ \x05\xe6\x95\xaf\x7f\xd9\x4c\x8e\x7e\xd4\xc8\x46\x60\xc2\xf2\xee\ \x71\xff\x60\xba\xca\x20\x0f\x67\xb5\xe4\xe8\xf5\x7a\xf8\xe0\x83\ \x0f\xc6\x66\xfc\x7e\xfd\x4f\xbf\xed\xf7\xba\xfd\xd7\xa7\xfb\x55\ \x7a\x25\x02\x00\xc0\xfb\xbf\xfa\x70\x70\xef\xf6\xb2\x67\x0a\xda\ \xed\x36\xfe\xfa\xaf\xff\x5a\xfd\xec\xda\xb8\x53\x08\x58\xb3\xa0\ \xdf\xbb\xb6\x7e\x6c\x34\x00\x98\xcf\x9e\x5f\xe0\xdc\x9b\x65\x85\ \xf9\xe1\x44\x57\xda\xa1\x35\x82\xe3\xf8\x91\xfb\x7d\xd9\xe9\x53\ \xf7\x18\x92\x38\x44\x10\x8e\xf4\x7b\x7f\x64\xcb\xd3\x24\x34\xcd\ \x36\xda\xc0\xd9\x0d\x04\x4b\x84\x5a\xcc\x50\xaf\x84\x9e\x49\x48\ \xd3\x14\xef\xbf\xff\xfe\xd8\x96\xaf\x6b\x9f\xdc\x18\x5d\x3c\xef\ \x8f\xc0\x5e\x57\x7a\x65\x02\x08\x21\xf0\x0f\xff\xf5\x1f\xbb\x9b\ \xeb\xcf\xbc\xa9\xc8\x7b\xf7\xee\xe1\x47\x3f\xfa\xd1\x98\xc3\xc3\ \x98\x05\xd4\x97\x6c\x3f\xda\x27\x09\x22\x14\x36\xe4\x91\x81\x39\ \x1a\x80\x08\xde\xef\x02\xc2\xb5\xed\xe4\x03\xad\xc6\x02\xd6\x89\ \xdb\xca\xe9\x1b\x73\x16\x4b\x66\xc2\xbd\x4e\x64\xcc\x82\x7e\x9e\ \x09\x38\x3d\xcf\x1f\x00\x90\x84\x0c\x53\xb5\x70\xcc\x2c\x5c\xb8\ \x70\x01\x9d\x4e\xc7\xeb\xe7\xc7\x0f\x9f\xe4\x3f\xf9\x87\x9f\x7b\ \x8e\xf7\xeb\x4c\xaf\x4c\x00\x40\xda\xa5\xbf\xfd\xfe\x0f\x3b\xe5\ \x7d\xf9\x1f\x7d\xf4\x11\x3e\xf8\xe0\x83\x71\xa7\x90\x59\x4d\x50\ \x1e\xf6\x31\xc7\x49\x34\x53\xb3\x80\xd5\x02\xce\x77\x9a\x28\x79\ \x9e\xc9\x71\xf3\x04\x7b\x6f\x1d\xba\x71\x7b\xaf\x49\x20\xa5\x76\ \x82\xf3\xe7\x49\xf9\xb8\x3f\xe0\x99\x12\xed\x5f\x94\xb4\x82\xf1\ \x07\x9c\x2e\x10\x02\xa8\x46\x0c\x33\x8d\xc8\xb9\x26\x49\x70\xed\ \xda\xb5\xb1\xa9\xde\x5e\xb7\xcf\xff\xdb\x7f\xf9\x51\xa7\x28\xf9\ \x5b\xaf\x33\x7d\x2e\x02\x00\xc0\xe6\xc6\xb3\xe2\x87\x7f\xf3\x93\ \x4e\xf9\x30\xa6\xf7\xde\x7b\x0f\xb7\x6f\xdf\x1e\xb3\x65\x7a\xba\ \xd5\x7c\x76\xbd\x44\x94\x7c\x06\x66\xb5\x80\x75\x00\xad\x2f\xc0\ \x8b\xc2\xf9\x9d\x61\xdf\xde\xfb\x52\xad\x49\xb2\x85\xd3\x57\x1e\ \xf6\x41\x9e\x5b\x08\x72\x82\x42\xae\x69\x70\x4c\x06\xb9\x44\x70\ \xb4\x02\xa0\x36\x7a\x0a\x61\xb6\x7a\x4f\x55\x23\x4c\xd7\xe3\xb1\ \x91\xc0\x83\x07\x0f\x70\xf3\xe6\x4d\xaf\x1f\xf2\xbc\x10\xff\xed\ \xbf\xbc\xd7\xf9\x22\xec\xbe\x9b\x3e\x37\x01\x00\xe0\xde\xed\xe5\ \xec\x97\x3f\xf3\xe3\x03\x42\x08\x7c\xff\xfb\xdf\xc7\xd3\xa7\x4f\ \xb7\x24\x81\x6b\x06\x18\xb3\xc3\x3e\x33\x0a\x80\xd5\x02\xc6\x01\ \x54\x64\x90\x87\x55\x8b\xd2\x09\x9c\xda\x39\xb3\x9e\xb9\x67\xef\ \xcb\x92\x5d\x06\xdf\x93\xec\x49\x9a\xc0\x35\x05\xf6\x4f\xe2\x58\ \x72\x08\xd5\x28\x45\xfa\x22\x40\xab\x1e\xa3\x96\x84\x9e\x56\xe4\ \x9c\x63\x63\x63\x03\x1f\x7f\xfc\xf1\x58\x9f\xfe\xec\x87\xbf\xe8\ \x3d\x7e\xf8\x6a\x2b\x7d\x5f\x26\xbd\x16\x02\x00\xc0\xc5\xdf\x5e\ \x1e\x7e\x72\xe9\xaa\xe7\xa8\x8c\x46\x23\xfc\xf9\x9f\xff\x39\xee\ \xde\xbd\x3b\x91\x04\x01\xb3\x80\xea\x34\x16\xfe\xd5\xfd\x0c\xab\ \x01\x18\x23\x47\xfa\x9d\x18\x81\x0b\xb4\xeb\x0f\x4c\x72\xfa\x5c\ \xf5\xbf\xd5\x50\x70\x2b\x32\x94\xb5\x40\xd9\x3f\x70\xc8\xc0\x88\ \x30\xdb\xa8\x20\x89\x7c\x87\x4f\x08\x81\xd5\xd5\x55\xfc\xf6\xb7\ \xbf\x1d\xeb\x9b\x0f\x7f\x73\x71\x70\xf5\xca\xf5\xd7\x16\xed\x7b\ \x5e\x7a\x6d\x04\x00\x80\x9f\xbd\xf7\xcb\xde\x83\xe5\x47\x9e\x0b\ \x3b\x1c\x0e\xf1\x17\x7f\xf1\x17\xf8\xf0\xc3\x0f\xc7\x1a\x4a\x44\ \x08\x03\x3b\xfb\xa5\xa5\xde\x48\xb4\xa3\x05\x98\xee\x5f\xf5\x99\ \xf3\xc2\xf8\x0a\x8c\x59\x2d\xe0\x47\xfb\x1c\x27\x6d\x0b\xa9\x1f\ \xbf\x3e\x3e\x0a\x18\xb3\xff\x13\x49\x61\x1d\x51\x6d\x0e\x92\x28\ \xc4\xdc\x54\x55\x6e\x18\x9d\x10\xe8\xb9\x70\xe1\x02\xca\xfb\xf9\ \xee\xdc\xba\x97\xfe\xea\xe7\xbf\x79\xed\xe3\xfd\xad\xd2\x6b\x25\ \x00\x2f\x38\xfe\xfe\x07\xef\x75\xda\x9b\x1d\xaf\x55\x42\x08\xfc\ \xfd\xdf\xff\x3d\x7e\xf4\xa3\x1f\x8d\x0d\x11\x01\xb9\xf6\x5d\xaf\ \x7f\xa7\x92\xea\x37\x66\x41\x57\x98\xa9\xdf\x2a\x50\xdf\xd9\x25\ \x5c\x72\x93\xc7\x24\x89\x17\xfa\x3c\x3f\x6f\x04\xf0\x1c\x52\x18\ \xd5\x5e\x32\x09\x63\x04\xb1\x84\x23\xe7\x7b\x22\x86\x46\x35\xc1\ \x4c\xa3\x8a\x40\x0d\x51\xdd\xb9\xfd\x8f\x3f\xfe\x78\xe2\xb2\xba\ \xf5\xa7\x1b\xc5\x8f\xfe\xe6\xa7\xdd\xd7\x31\xcd\xbb\xdd\x14\xb4\ \xa6\x77\xfe\x1f\xf9\x30\x75\x41\xd1\x2d\x0c\x61\xa9\xbd\xed\x94\ \x67\x39\xae\x5f\xbd\x99\x2e\xec\xdd\x13\x35\x9a\x0d\x8f\x60\x0f\ \x1e\x3c\xc0\xca\xca\x0a\x8e\x1c\x39\xe2\xfd\xc8\x13\x20\xc1\x94\ \xc7\xb1\x02\x76\x8d\x8c\xff\xaa\x47\x88\x59\x9e\x39\xd2\xe4\xd6\ \x50\x66\xb0\x33\x85\xa5\xca\xd9\x88\x14\x6c\x81\xaa\x7c\xe1\xe6\ \x31\xe3\x0f\xe7\x3d\xf9\xf9\xc6\xae\xc9\xfc\x95\x38\x42\xab\x51\ \x41\xec\xfc\x10\xb5\xac\xa7\xc0\x68\x34\xc2\x85\x0b\x17\xb0\xbe\ \xbe\x3e\xd6\x6f\xf7\xef\xae\x64\x7f\xf3\x57\xff\xd0\x4e\x47\xe9\ \x6b\x87\x9f\x88\x10\x55\x63\x74\x7b\x9b\xef\x73\x5e\xac\x01\x78\ \x0a\x60\x13\x40\xfa\xda\x09\x00\xc8\x49\xa3\x6b\x57\x6e\x8c\x9a\ \x53\x8d\xc0\xdd\x58\x02\x00\x9b\x9b\x9b\xb8\x7a\xf5\x2a\x0e\x1d\ \x3a\xe4\x9d\x37\xa0\x5f\xf5\x41\x4c\x76\x85\x8c\xf6\x09\xc8\xc4\ \xd3\xb3\x54\x9e\xdf\x2f\xcc\x6a\xdc\xad\x6a\x49\x9a\x13\xb0\x41\ \x08\x97\x34\x96\x10\xfe\x35\xb2\xd7\x5c\x02\x90\x25\xa4\x4b\x12\ \x01\x42\x12\x06\x98\xae\x57\x51\x4d\x26\x1f\x53\xd4\x6e\xb7\xf1\ \xd1\x47\x1f\x99\x25\xeb\x6e\xba\x78\xfe\xf2\xf0\xbd\xbf\xfb\x59\ \x37\xcf\xbe\x18\x9f\xef\x77\x4e\x00\x40\xd9\xb9\xeb\x77\xd2\x3c\ \xcb\xc4\xbe\x03\x8b\xb1\x2b\xed\xc3\xe1\x10\x97\x2e\x5d\xc2\x9e\ \x3d\x7b\xcc\xf1\x2e\xe5\x19\xc3\x80\xc9\x05\x12\x5c\x57\x49\x55\ \x8f\x17\x1c\xbc\x28\xcc\x21\xd2\xde\x8f\x78\xab\x6b\xe4\xe0\xee\ \x56\x9f\x14\xc0\xe4\xde\xa0\xae\x09\xc3\x12\xed\x1c\xba\x5a\x01\ \xe6\x3b\x57\xda\x01\x42\x1c\x06\x98\xae\x55\x50\x4b\x22\x33\xa4\ \x2d\x9b\xb8\x47\x8f\x1e\xe1\xd2\xa5\x4b\xe3\x07\x3b\x16\x85\xf8\ \xff\xde\xfb\x65\xef\xb7\xff\xf2\xd1\x6b\x59\xdd\xb3\x55\xfa\xbd\ \x10\x40\xa7\x87\x2b\x8f\xf3\xd5\x47\x4f\xf3\x83\x87\x97\xe2\x40\ \x1b\x7a\xc8\xe5\xe5\x97\x2f\x5f\x46\xb7\xdb\xc5\xe2\xe2\xa2\xf9\ \x75\xae\x71\x22\xc0\x38\x51\x80\x8a\xfd\x3b\xab\x6e\xad\x14\xeb\ \xbb\xd4\x35\xc7\x02\x94\x41\x2b\x6b\x05\xa1\x4d\x82\x03\xbe\x01\ \xdb\xd5\x0a\xb0\xeb\x00\xa2\x20\x40\xb3\x1a\xa3\x51\x89\xb7\xfc\ \x7d\xde\xe1\x70\x88\xcb\x97\x2f\xe3\xf6\xed\xdb\x63\xa4\x18\xf4\ \x07\xfc\x6f\xbf\xff\xc3\xce\xad\xeb\x77\x5e\xeb\xec\xde\xa4\xf4\ \x7b\x25\x00\x00\x6c\x6e\x3c\xe3\xb7\xae\xdf\x49\xf7\x1f\xdc\x17\ \x55\xaa\x89\xe7\x17\x3c\x7c\xf8\x10\x1f\x7e\xf8\x21\x6a\xb5\x1a\ \x76\xed\xda\x05\x40\x4a\x90\x37\x53\x08\xed\x28\x02\xe0\x05\x34\ \x10\xc2\xb3\xe3\x98\xa8\xee\x75\x72\xfd\x02\xef\x3e\xfd\x6a\xae\ \x79\xdb\x3c\xa0\x81\x27\x02\xa2\x80\xa1\x96\x44\x98\xaa\xc6\xa8\ \x25\x11\xc2\xc0\x6e\x8b\x73\x89\x5b\x14\x05\x6e\xdf\xbe\x8d\x0b\ \x17\x2e\x8c\x9d\xe4\x05\x00\x4f\x57\xd7\xf2\x1f\xfc\x3f\x7f\xd7\ \x5e\x7b\xb2\xfe\xca\x3b\x7a\x5e\x26\xfd\xde\x09\x00\x00\xc3\xc1\ \x50\x5c\xbd\x72\x7d\xb4\x7b\x7e\x57\x38\xd5\x6a\x7a\x1e\x52\x51\ \x14\xb8\x7e\xfd\x3a\xae\x5f\xbf\x8e\xb9\xb9\x39\xb4\x5a\x2d\xe3\ \x35\xbb\x21\x63\x19\xf7\x97\x1b\x26\x93\x48\x6a\x07\x22\x7d\x8c\ \x5a\xa9\x9a\x46\x72\x35\x40\xf2\xb2\x28\x6b\x02\xe7\x3e\xbb\xda\ \x58\x2f\x6b\x24\x54\xe2\x10\xf5\x24\xc4\x74\x3d\x46\x35\x0e\x11\ \x85\x5b\xff\x0e\x8f\x10\xf2\xe0\x86\x0f\x3f\xfc\x10\x8f\x1e\x3d\ \x1a\x93\x7a\x00\xb8\x79\xed\x76\xfa\xb7\x7f\xfd\xc3\xce\xf0\x15\ \x8e\x74\x7b\xd5\xf4\xa5\x20\x00\x00\x14\x79\x81\x6b\x9f\x5c\x1f\ \x85\x61\x48\xbb\x17\x76\x45\xe5\x8e\xec\x76\xbb\xb8\x74\xe9\x12\ \x6e\xdc\xb8\x81\xe9\xe9\x69\x8f\x08\x00\xc6\x83\x49\x04\xc4\x21\ \x43\x25\x66\x88\x02\x20\x20\x28\x93\x01\xb3\xcd\xcb\xe8\x71\x07\ \x77\x21\xec\x07\x22\xd9\xc8\x80\x91\x24\x56\xc8\x90\x44\x0c\xcd\ \x6a\x88\xe9\x5a\x84\x4a\x14\xc8\x93\xc2\x81\x31\x69\x77\xc7\xf5\ \x2b\x2b\x2b\x38\x7f\xfe\x3c\xee\xde\xbd\x3b\x36\x9b\x07\x48\x7b\ \xff\xfe\x2f\xcf\x0f\x7e\xfe\x8f\xbf\xea\xbd\xea\x56\xee\x57\x4d\ \xcf\x23\x00\xed\xdf\x77\xea\xda\x70\xb3\x0b\x67\x99\x11\x13\x10\ \x21\x84\x48\x84\x25\xc1\x6b\x4f\x73\x3b\x67\x83\xef\xfe\x87\xef\ \xd4\x17\xf6\xee\xd9\xf2\x74\xcf\xdd\xbb\x77\xe3\x3b\xdf\xf9\x0e\ \x0e\x1f\x3e\xac\x36\x95\xfa\xc1\x14\x3d\x1b\x58\xfe\xec\x12\x46\ \xfe\xc9\x83\x1a\xf3\x42\xbe\x4a\x25\xcf\xd5\x9c\xc4\x84\x85\x1a\ \xaa\xac\x49\xd7\xdc\xcf\x59\x96\x61\x79\x79\x19\xd7\xae\x5d\x9b\ \xa8\xea\x75\xba\x77\x67\x39\xfb\xf9\x7b\xbf\xea\x6d\x6e\x3c\xfb\ \x9d\xa8\xfc\x72\x22\x22\x54\x67\x1a\x78\xb4\x7a\xe7\xff\xcc\xb2\ \xd1\x67\x00\x3e\x05\x70\x07\x40\xe7\xf7\x46\x00\x9d\x4e\x9e\x3d\ \x96\x7c\xeb\xbb\xef\xd6\x6a\xb5\xea\x96\xcf\x49\x92\x04\x67\xce\ \x9c\xc1\xa9\x53\xa7\xb0\xb0\xb0\x00\xc0\x07\x66\xab\x3f\x00\x63\ \xa0\x6d\xf7\x6f\xab\xfb\x8a\xa2\xc0\xea\xea\x2a\xee\xdc\xb9\x83\ \xe5\xe5\xe5\xb1\x48\x9e\x9b\xba\x9d\x1e\xff\xe5\x4f\x7f\xdd\xbb\ \x7e\xf5\xe6\xe7\xde\xc0\xf1\x79\xd2\xf3\x08\xb0\xed\x7d\x01\x5f\ \x54\xfa\xf4\xe3\xcf\x46\xb7\xae\xdf\x49\xdf\x7e\xf7\x8d\xea\xd9\ \x37\x4f\x55\xe2\x64\xfc\xa8\xd7\xd1\x68\x84\xf3\xe7\xcf\xe3\xfc\ \xf9\xf3\x68\x36\x9b\x38\x73\xe6\x0c\x96\x96\x96\x30\x3f\x3f\x3f\ \xf6\xa3\x09\x6e\x72\x7f\xe7\x40\x27\xd7\xc1\x74\xaf\xe9\xa4\xa3\ \x76\x6e\x9e\x34\x4d\xf1\xf8\xf1\x63\x3c\x7a\xf4\x08\xf7\xee\xdd\ \x1b\xdb\xa4\x51\x4e\xc3\xc1\x48\x5c\xfa\xf0\xf2\xe0\xc3\xf7\x2f\ \x0d\x5f\xe5\xfc\xde\xdf\x65\xfa\xbd\x6b\x00\x37\x25\x95\x98\xde\ \xf8\xfa\xd9\xca\xb9\xb7\xcf\x54\x2b\x95\xe4\x85\xbe\x07\x11\x61\ \x71\x71\x11\x07\x0e\x1c\xc0\xee\xdd\xbb\x31\x3d\x3d\x8d\x46\xa3\ \x61\xcc\x45\xd9\x44\x6c\x65\x26\x5c\x09\xd7\x47\xb0\xb6\xdb\x6d\ \x3c\x79\xf2\x04\x0f\x1f\x3e\xc4\xd3\xa7\x4f\xb7\x55\xff\x7e\x6f\ \xc0\x2f\x7c\xf0\xf1\xe0\xd2\x47\x57\x46\x5f\x26\xe0\xbf\xd4\x1a\ \xc0\x4d\xa3\x61\x2a\x7e\xf3\xcb\xf3\x83\x8f\xde\xbf\x34\x3c\xfb\ \xd6\xe9\xca\xa9\xb3\xc7\x93\xd6\xec\x74\xb0\x55\x7e\x21\x04\x96\ \x97\x97\xb1\xbc\xbc\x6c\xae\x31\xc6\xd0\x6a\xb5\x30\x37\x37\x87\ \x66\xb3\x89\x28\x8a\x10\xc7\x31\xa2\x28\x42\x18\xca\x1d\xcb\x79\ \x9e\x23\x4d\x53\xef\xaf\xdd\x6e\x63\x73\x73\x13\xed\x76\x7b\xa2\ \xf7\xfe\xbc\xb4\xf6\x64\x3d\xbf\x72\xf1\xea\xe8\xf2\xc5\x4f\x47\ \x5f\xe4\xe2\x8d\x2f\x22\x7d\xa9\x08\xa0\x53\x9a\x66\xe2\xfc\xaf\ \x2f\x0c\xce\xff\xfa\xc2\x60\xcf\xc2\xae\xf0\xc4\x99\x63\xc9\xd1\ \x13\x87\xe2\x4a\xb5\xf2\x42\x6d\xc4\x39\xc7\xfa\xfa\xfa\xc4\x78\ \xfb\xeb\x4c\xfd\xde\x80\x5f\xff\xf4\xe6\xe8\xd3\xcb\x9f\x8d\x9e\ \x3c\x7e\xfa\x7b\x71\xee\x5e\x47\xfa\x52\x12\xc0\x4d\x8f\x1e\xac\ \xe6\x8f\x1e\xac\xe6\xbf\xf8\xc7\x7f\xee\x1d\x38\xbc\x14\x1f\x3a\ \xba\x3f\x5a\x5c\x5a\x88\xa6\xa6\x9b\x5b\x6a\x86\x2f\x2a\x6d\x6e\ \x3c\x2b\x56\xee\x3d\xcc\x6e\x5d\xbf\x93\xde\xbd\x7d\x3f\x7b\x5d\ \xdb\xb3\x7e\x9f\xe9\x4b\x4f\x00\x9d\x38\xe7\xb8\x75\xfd\x4e\xaa\ \x0f\x44\x9a\x9a\x6e\xb2\x7d\x07\x16\xa3\xbd\xfb\x17\xa3\x3d\xf3\ \xbb\xc2\xe6\x74\x23\xd8\x2a\x40\xf3\x6a\xcf\x13\x68\x3f\x6b\x17\ \x8f\x1f\xac\xe6\xf7\xef\x3e\xc8\xee\xdf\x59\xce\xca\x5b\xe4\xff\ \x10\xd2\xbf\x1a\x02\x94\x53\xfb\x59\x87\x5f\xb9\x78\x75\xa4\x0f\ \x49\x08\x82\x00\xad\xd9\xe9\x60\x66\xae\x15\xcc\xce\xb5\x82\xd6\ \x6c\x2b\xa8\xd5\xaa\x2c\x4e\x22\x8a\xa2\x88\xa2\x58\xfe\x85\x61\ \x80\x3c\x2b\x90\x65\x99\xc8\xd2\x4c\xa4\x69\x26\xd2\x34\x15\x83\ \xde\x80\x6f\xac\x6d\x16\x1b\xeb\x9b\xc5\xfa\xda\x66\xb1\xb9\xf1\ \xac\x78\x9d\x5b\xb0\xbe\xac\xe9\x5f\x2d\x01\xca\xa9\x28\x0a\xac\ \x3d\x59\x2f\x7e\x57\xf1\xf5\x3f\x94\xf4\x3b\x1b\xe2\x7d\x95\xbe\ \x9c\xe9\x2b\x02\xfc\x1b\x4f\x5f\x11\xe0\xdf\x78\xfa\x8a\x00\xff\ \xc6\x93\x5e\x86\xb3\xe5\x1c\xf7\x57\xe9\x0f\x20\x3d\x07\xdb\x10\ \x00\x2a\xd3\xfe\x2f\xad\xa9\xb8\xb8\x70\x0e\xb2\xf9\x8a\x1d\xff\ \xfa\x93\x00\xbc\xb3\x6a\x01\x00\x21\x05\xf4\x6d\xfd\xa1\x28\x72\ \x36\x1c\xf6\xaa\x83\x41\x77\x4f\x96\xa5\x47\x84\x28\x16\x84\x40\ \x15\x5f\x99\x8a\x3f\x84\xc4\xb3\x6c\xb4\x0e\x60\x04\xa0\x80\x5e\ \x05\x59\x9a\x0a\x25\x00\x09\x80\x9d\x00\x96\x00\xec\x02\x50\xc1\ \x57\x1a\xe0\x0f\x21\x09\x48\xf0\xd7\x00\x2c\x03\x78\x0c\x60\x30\ \x29\x10\x54\x00\xe8\x00\x58\x01\xf0\x0c\xc0\x6b\xfd\x55\xee\xaf\ \xd2\xef\x35\xe5\x00\xfa\x90\xcb\xc1\x32\x00\x82\xca\x53\x9f\x24\ \xf7\x50\x05\x00\x62\xfc\x8e\xd7\x03\x7c\x95\xbe\xf0\x24\x20\x49\ \x90\x61\x2b\x02\x00\xc6\x14\xf8\xdb\x5f\xbe\x4a\x7f\x08\x49\x83\ \x2d\xcf\x38\x15\x42\xfc\xff\x17\x69\x09\x93\x93\x7f\x7e\xdc\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x07\x22\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x03\x1e\x69\x43\x43\x50\x49\x43\x43\x20\x50\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\x01\x85\x54\xdf\x6b\xd3\x50\x14\xfe\xda\ \x65\x9d\xb0\xe1\x8b\x3a\x67\x11\x09\x3e\x68\x91\x6e\x64\x53\x74\ \x43\x9c\xb6\x6b\x57\xba\xcd\x5a\xea\x36\xb7\x21\x48\x9b\xa6\x6d\ \x5c\x9a\xc6\x24\xed\x7e\xb0\x07\xd9\x8b\x6f\x3a\xc5\x77\xf1\x07\ \x3e\xf9\x07\x0c\xd9\x83\x6f\x7b\x92\x0d\xc6\x14\x61\xf8\xac\x88\ \x22\x4c\xf6\x22\xb3\x9e\x9b\x34\x4d\x27\x53\x03\xb9\xf7\xbb\xdf\ \xf9\xee\x39\x27\xe7\xe4\x5e\xa0\xf9\x71\x5a\xd3\x14\x2f\x0f\x14\ \x55\x53\x4f\xc5\xc2\xfc\xc4\xe4\x14\xdf\xf2\x01\x5e\x1c\x43\x2b\ \xfc\x68\x4d\x8b\x86\x16\x4a\x26\x47\x40\x0f\xd3\xb2\x79\xef\xb3\ \xf3\x0e\x1e\xc6\x6c\x74\xee\x6f\xdf\xab\xfe\x63\xd5\x9a\x95\x0c\ \x11\xf0\x1c\x20\xbe\x94\x35\xc4\x22\xe1\x59\xa0\x69\x5c\xd4\x74\ \x13\xe0\xd6\x89\xef\x9d\x31\x35\xc2\xcd\x4c\x73\x58\xa7\x04\x09\ \x1f\x67\x38\x6f\x63\x81\xe1\x8c\x8d\x23\x96\x66\x34\x35\x40\x9a\ \x09\xc2\x07\xc5\x42\x3a\x4b\xb8\x40\x38\x98\x69\xe0\xf3\x0d\xd8\ \xce\x81\x14\xe4\x27\x26\xa9\x92\x2e\x8b\x3c\xab\x45\x52\x2f\xe5\ \x64\x45\xb2\x0c\xf6\xf0\x1f\x73\x83\xf2\x5f\xb0\xa8\x94\xe9\x9b\ \xad\xe7\x10\x8d\x6d\x9a\x19\x4e\xd1\x7c\x8a\xde\x1f\x39\x7d\x70\ \x8c\xe6\x00\xd5\xc1\x3f\x5f\x18\xbd\x41\xb8\x9d\x70\x58\x36\xe3\ \xa3\x35\x7e\x42\xcd\x24\xae\x11\x26\xbd\xe7\xee\x74\x69\x98\xed\ \x65\x9a\x97\x59\x29\x12\x25\x1c\x24\xbc\x62\x54\xae\x33\x6c\x69\ \xe6\x0b\x03\x89\x9a\xe6\xd3\xed\xf4\x50\x92\xb0\x9f\x34\xbf\x34\ \x33\x59\xf3\xe3\xed\x50\x95\x04\xeb\x31\xc5\xf5\xf6\x4b\x46\xf4\ \xba\xbd\xd7\xdb\x91\x93\x07\xe3\x35\x3e\xa7\x29\xd6\x7f\x40\xfe\ \xbd\xf7\xf5\x72\x8a\xe5\x79\x92\xf0\xeb\xb4\x1e\x8d\xd5\xf4\x5b\ \x92\x3a\x56\xdb\xdb\xe4\xcd\xa6\x23\xc3\xc4\x77\x51\x3f\x03\x48\ \x42\x82\x8e\x1c\x64\x28\xe0\x91\x42\x0c\x61\x9a\x63\xc4\xaa\xf8\ \x4c\x16\x19\x22\x4a\xa4\xd2\x69\x74\x54\x79\xb2\x38\xd6\x3b\x28\ \x93\x96\xed\x1c\x47\x78\xc9\x5f\x0e\xb8\x5e\x16\xf5\x5b\xb2\xb8\ \xf6\xe0\xfb\x9e\xdd\x25\xd7\x8e\xbc\x15\x85\xc5\xb7\xa3\xd8\x51\ \xed\xb5\x81\xe9\xba\xb2\x13\x9a\x1b\x7f\x75\x61\xa5\xa3\x6e\xe1\ \x37\xb9\xe5\x9b\x1b\x6d\xab\x0b\x08\x51\xfe\x8a\xe5\xb1\x48\x5e\ \x65\xca\x4f\x82\x51\xd7\x75\x36\xe6\x90\x53\x97\xfc\x75\x0b\xcf\ \x32\x94\xee\x25\x76\x12\x58\x0c\xba\xac\xf0\x5e\xf8\x2a\x6c\x0a\ \x4f\x85\x17\xc2\x97\xbf\xd4\xc8\xce\xde\xad\x11\xcb\x80\x71\x2c\ \x3e\xab\x9e\x53\xcd\xc6\xec\x25\xd2\x4c\xd2\xeb\x64\xb8\xbf\x8a\ \xf5\x42\xc6\x18\xf9\x90\x31\x43\x5a\x9d\xbe\x24\x4d\x9c\x8a\x39\ \xf2\xda\x50\x0b\x27\x06\x77\x82\xeb\xe6\xe2\x5c\x2f\xd7\x07\x9e\ \xbb\xcc\x5d\xe1\xfa\xb9\x08\xad\x2e\x72\x23\x8e\xc2\x17\xf5\x45\ \x7c\x21\xf0\xbe\x33\xbe\x3e\x5f\xb7\x6f\x88\x61\xa7\xdb\xbe\xd3\ \x64\xeb\xa3\x31\x5a\xeb\xbb\xd3\x91\xba\xa2\xb1\x7a\x94\x8f\xdb\ \x27\xf6\x3d\x8e\xaa\x13\x19\xb2\xb1\xbe\xb1\x7e\x56\x08\x2b\xb4\ \xa2\x63\x6a\x4a\xb3\x74\x4f\x00\x03\x25\x6d\x4e\x97\xf3\x05\x93\ \xef\x11\x84\x0b\x7c\x88\xae\x2d\x89\x8f\xab\x62\x57\x90\x4f\x2b\ \x0a\x6f\x99\x0c\x5e\x97\x0c\x49\xaf\x48\xd9\x2e\xb0\x3b\x8f\xed\ \x03\xb6\x53\xd6\x5d\xe6\x69\x5f\x73\x39\xf3\x2a\x70\xe9\x1b\xfd\ \xc3\xeb\x2e\x37\x55\x06\x5e\x19\xc0\xd1\x73\x2e\x17\xa0\x33\x75\ \xe4\x09\xb0\x7c\x5e\x2c\xeb\x15\xdb\x1f\x3c\x9e\xb7\x80\x91\x3b\ \xdb\x63\xad\x3d\x6d\x61\xba\x8b\x3e\x56\xab\xdb\x74\x2e\x5b\x1e\ \x01\xbb\x0f\xab\xd5\x9f\xcf\xaa\xd5\xdd\xe7\xe4\x7f\x0b\x78\xa3\ \xfc\x06\xa9\x23\x0a\xd6\xc2\xa1\x5f\x32\x00\x00\x00\x09\x70\x48\ \x59\x73\x00\x00\x04\x9d\x00\x00\x04\x9d\x01\x7c\x34\x6b\xa1\x00\ \x00\x01\x64\x69\x54\x58\x74\x58\x4d\x4c\x3a\x63\x6f\x6d\x2e\x61\ \x64\x6f\x62\x65\x2e\x78\x6d\x70\x00\x00\x00\x00\x00\x3c\x78\x3a\ \x78\x6d\x70\x6d\x65\x74\x61\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x3d\ \x22\x61\x64\x6f\x62\x65\x3a\x6e\x73\x3a\x6d\x65\x74\x61\x2f\x22\ \x20\x78\x3a\x78\x6d\x70\x74\x6b\x3d\x22\x58\x4d\x50\x20\x43\x6f\ \x72\x65\x20\x34\x2e\x34\x2e\x30\x22\x3e\x0a\x20\x20\x20\x3c\x72\ \x64\x66\x3a\x52\x44\x46\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\ \x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ \x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\ \x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\x22\x3e\x0a\ \x20\x20\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\x44\x65\x73\x63\x72\ \x69\x70\x74\x69\x6f\x6e\x20\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\ \x3d\x22\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ \x78\x6d\x6c\x6e\x73\x3a\x78\x6d\x70\x3d\x22\x68\x74\x74\x70\x3a\ \x2f\x2f\x6e\x73\x2e\x61\x64\x6f\x62\x65\x2e\x63\x6f\x6d\x2f\x78\ \x61\x70\x2f\x31\x2e\x30\x2f\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\ \x20\x20\x20\x3c\x78\x6d\x70\x3a\x43\x72\x65\x61\x74\x6f\x72\x54\ \x6f\x6f\x6c\x3e\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\ \x2e\x6f\x72\x67\x3c\x2f\x78\x6d\x70\x3a\x43\x72\x65\x61\x74\x6f\ \x72\x54\x6f\x6f\x6c\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x2f\x72\ \x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ \x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x3c\x2f\ \x78\x3a\x78\x6d\x70\x6d\x65\x74\x61\x3e\x0a\xad\x12\xec\x34\x00\ \x00\x02\x3a\x49\x44\x41\x54\x38\x11\xa5\x52\xcf\x6b\x13\x41\x14\ \x7e\xf3\x63\xb3\x9b\x34\xbf\xda\x34\x39\xd8\x42\xa1\x92\x56\x6d\ \x69\x63\x44\xa9\x91\x50\x44\x2f\x1a\x28\x52\xaa\x3d\x88\xf7\x9a\ \x93\x9e\xfc\x1f\x14\x4f\xa5\xe8\xc1\x73\x4b\x23\x55\x04\x45\xec\ \x45\x2a\x08\x16\x63\x52\x53\x45\x8a\x54\x4b\x3d\x08\x26\x4d\x62\ \xd3\x68\xb2\x99\x9d\x75\x26\xb0\x25\xc1\x26\x08\xbe\x65\x78\x6f\ \xde\x7e\xdf\xb7\xef\xdb\x19\x64\x9a\x26\xfc\x4f\xe0\x76\xe4\xb7\ \x0b\x23\xe3\x72\xb5\xc3\xd0\x76\x2f\x83\xe1\x2b\xb3\x60\x8a\x07\ \x60\xb4\x25\x4e\x5a\x38\x68\xa5\x13\xa1\x18\x2f\x2e\x33\x5e\x7c\ \xc6\x64\x7d\x10\x46\xf6\x5a\x5a\xe8\x1b\x9e\xb8\x83\x78\x91\x80\ \x58\xbd\xc7\x2e\xdc\x6e\x35\x01\x92\x2a\x56\x3c\x9f\x0d\xfa\x5d\ \x0a\x1d\xb2\x77\x75\x4c\x86\xce\xdd\x8c\x83\x91\x13\x02\x3a\x70\ \xe4\x31\x3e\xac\xdc\x9f\x2b\x15\x2a\x4b\x25\x4e\xd7\x63\xd7\x33\ \x05\x8b\x83\x56\xe6\x82\x47\x83\x63\x17\x1f\x77\x06\x8e\xf8\x08\ \xa6\x4e\xa2\xa9\x1a\x46\x18\x6a\x95\x6f\x60\x1a\x65\x61\x4f\x07\ \x40\x00\x54\x09\x00\x37\x74\x60\x7a\xa5\x6c\x30\xf6\xb3\xf8\x63\ \x7b\xe7\xcb\xda\xea\x74\x7d\x82\x8d\xa7\x67\x67\x0e\x9f\xba\x76\ \x97\xa0\x5d\x07\x17\x24\x83\xfd\x02\xce\x04\x99\x57\x84\x88\x0e\ \x08\x71\x51\xef\x02\x11\x99\x2a\x2a\x30\x08\x96\xb6\x32\x2f\x6f\ \x0d\x4e\xbc\xbe\xb7\x6f\x61\xe3\xc9\xd8\x54\x5f\x78\xea\x81\x82\ \xb3\x1e\x56\xdb\xab\x8b\x18\xb5\x32\x70\x29\xc2\xf2\x80\x4c\x03\ \xa8\xcd\x06\x06\x1e\xc8\x7f\x5d\x4f\xc5\x47\x2f\xbf\x5b\x94\x36\ \xf6\x05\xe4\x26\x3d\x3f\x72\x7e\x30\x72\x69\x91\xf0\xad\x2e\x26\ \xa6\xa8\x55\x4b\x60\x54\x0b\xd2\x81\xf8\x32\x01\xb0\x0d\xe5\xb6\ \x33\xc9\xab\xc3\xd3\x6b\xcb\x12\x2f\xa3\x49\x40\x36\x0a\x99\x99\ \x4d\x55\xd9\xec\x67\x35\x61\xc3\x60\x62\x74\x00\x4c\x10\x60\x4c\ \xe0\x77\xb5\xe7\x73\xe0\x64\x62\x40\xe2\xac\x68\x3a\x46\x71\x0a\ \x6e\x8c\x4a\xdd\x18\x74\xe1\x17\x81\x62\xb3\x83\x4d\xd3\x80\x12\ \x0a\x84\x12\x50\x54\xe4\x97\x18\x8b\x2c\x73\xd3\x4d\xf4\xb9\xb5\ \xa8\xc3\x65\x77\x03\x73\x80\x49\xfc\x95\x7c\x76\x2f\x69\x22\x44\ \x7c\xdd\xae\x30\xc5\xdf\x55\xa2\x69\x5e\x9f\x53\x3d\x2d\x78\x2f\ \x2c\x91\xa6\x09\x3c\x01\x6f\x14\xd3\x43\x7a\x2e\xef\x7e\xf5\x69\ \x35\x15\xeb\x39\xf3\x28\xda\x1b\x59\x8a\x7c\x4c\xa6\x26\xb3\x3b\ \x9d\x6f\x88\xda\x5f\x73\x7a\x3b\xa2\x16\xb9\x9e\x1b\xaf\xe8\xfb\ \x87\x27\xe2\x99\xc4\xf1\xf1\xc6\x5e\x63\x9d\x5e\x08\xc5\xd2\xf3\ \xa1\x1b\x8d\xbd\xbf\x7e\x62\x93\xfa\x3f\x6c\xfe\x00\x30\x2a\x2f\ \x9b\x6a\x8a\xe5\x15\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x00\xac\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\ \x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\ \x00\x00\x00\x07\x74\x49\x4d\x45\x07\xda\x06\x07\x15\x1a\x1f\x4a\ \x2e\xce\x45\x00\x00\x00\x30\x49\x44\x41\x54\x28\xcf\x63\xfc\xcf\ \x80\x1f\x30\x11\x90\x67\x60\x41\xe6\xb8\xa3\x19\xb7\x93\x11\x4d\ \x01\x03\x83\x2f\x12\x7b\x33\x71\x56\x8c\x2a\xc0\x12\xd4\xb0\xd0\ \x43\x06\x8c\x14\xc7\x26\x00\xbe\x5b\x05\xd6\xa8\x8e\xff\x70\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\xf4\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x03\x1e\x69\x43\x43\x50\x49\x43\x43\x20\x50\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\x01\x85\x54\xdf\x6b\xd3\x50\x14\xfe\xda\ \x65\x9d\xb0\xe1\x8b\x3a\x67\x11\x09\x3e\x68\x91\x6e\x64\x53\x74\ \x43\x9c\xb6\x6b\x57\xba\xcd\x5a\xea\x36\xb7\x21\x48\x9b\xa6\x6d\ \x5c\x9a\xc6\x24\xed\x7e\xb0\x07\xd9\x8b\x6f\x3a\xc5\x77\xf1\x07\ \x3e\xf9\x07\x0c\xd9\x83\x6f\x7b\x92\x0d\xc6\x14\x61\xf8\xac\x88\ \x22\x4c\xf6\x22\xb3\x9e\x9b\x34\x4d\x27\x53\x03\xb9\xf7\xbb\xdf\ \xf9\xee\x39\x27\xe7\xe4\x5e\xa0\xf9\x71\x5a\xd3\x14\x2f\x0f\x14\ \x55\x53\x4f\xc5\xc2\xfc\xc4\xe4\x14\xdf\xf2\x01\x5e\x1c\x43\x2b\ \xfc\x68\x4d\x8b\x86\x16\x4a\x26\x47\x40\x0f\xd3\xb2\x79\xef\xb3\ \xf3\x0e\x1e\xc6\x6c\x74\xee\x6f\xdf\xab\xfe\x63\xd5\x9a\x95\x0c\ \x11\xf0\x1c\x20\xbe\x94\x35\xc4\x22\xe1\x59\xa0\x69\x5c\xd4\x74\ \x13\xe0\xd6\x89\xef\x9d\x31\x35\xc2\xcd\x4c\x73\x58\xa7\x04\x09\ \x1f\x67\x38\x6f\x63\x81\xe1\x8c\x8d\x23\x96\x66\x34\x35\x40\x9a\ \x09\xc2\x07\xc5\x42\x3a\x4b\xb8\x40\x38\x98\x69\xe0\xf3\x0d\xd8\ \xce\x81\x14\xe4\x27\x26\xa9\x92\x2e\x8b\x3c\xab\x45\x52\x2f\xe5\ \x64\x45\xb2\x0c\xf6\xf0\x1f\x73\x83\xf2\x5f\xb0\xa8\x94\xe9\x9b\ \xad\xe7\x10\x8d\x6d\x9a\x19\x4e\xd1\x7c\x8a\xde\x1f\x39\x7d\x70\ \x8c\xe6\x00\xd5\xc1\x3f\x5f\x18\xbd\x41\xb8\x9d\x70\x58\x36\xe3\ \xa3\x35\x7e\x42\xcd\x24\xae\x11\x26\xbd\xe7\xee\x74\x69\x98\xed\ \x65\x9a\x97\x59\x29\x12\x25\x1c\x24\xbc\x62\x54\xae\x33\x6c\x69\ \xe6\x0b\x03\x89\x9a\xe6\xd3\xed\xf4\x50\x92\xb0\x9f\x34\xbf\x34\ \x33\x59\xf3\xe3\xed\x50\x95\x04\xeb\x31\xc5\xf5\xf6\x4b\x46\xf4\ \xba\xbd\xd7\xdb\x91\x93\x07\xe3\x35\x3e\xa7\x29\xd6\x7f\x40\xfe\ \xbd\xf7\xf5\x72\x8a\xe5\x79\x92\xf0\xeb\xb4\x1e\x8d\xd5\xf4\x5b\ \x92\x3a\x56\xdb\xdb\xe4\xcd\xa6\x23\xc3\xc4\x77\x51\x3f\x03\x48\ \x42\x82\x8e\x1c\x64\x28\xe0\x91\x42\x0c\x61\x9a\x63\xc4\xaa\xf8\ \x4c\x16\x19\x22\x4a\xa4\xd2\x69\x74\x54\x79\xb2\x38\xd6\x3b\x28\ \x93\x96\xed\x1c\x47\x78\xc9\x5f\x0e\xb8\x5e\x16\xf5\x5b\xb2\xb8\ \xf6\xe0\xfb\x9e\xdd\x25\xd7\x8e\xbc\x15\x85\xc5\xb7\xa3\xd8\x51\ \xed\xb5\x81\xe9\xba\xb2\x13\x9a\x1b\x7f\x75\x61\xa5\xa3\x6e\xe1\ \x37\xb9\xe5\x9b\x1b\x6d\xab\x0b\x08\x51\xfe\x8a\xe5\xb1\x48\x5e\ \x65\xca\x4f\x82\x51\xd7\x75\x36\xe6\x90\x53\x97\xfc\x75\x0b\xcf\ \x32\x94\xee\x25\x76\x12\x58\x0c\xba\xac\xf0\x5e\xf8\x2a\x6c\x0a\ \x4f\x85\x17\xc2\x97\xbf\xd4\xc8\xce\xde\xad\x11\xcb\x80\x71\x2c\ \x3e\xab\x9e\x53\xcd\xc6\xec\x25\xd2\x4c\xd2\xeb\x64\xb8\xbf\x8a\ \xf5\x42\xc6\x18\xf9\x90\x31\x43\x5a\x9d\xbe\x24\x4d\x9c\x8a\x39\ \xf2\xda\x50\x0b\x27\x06\x77\x82\xeb\xe6\xe2\x5c\x2f\xd7\x07\x9e\ \xbb\xcc\x5d\xe1\xfa\xb9\x08\xad\x2e\x72\x23\x8e\xc2\x17\xf5\x45\ \x7c\x21\xf0\xbe\x33\xbe\x3e\x5f\xb7\x6f\x88\x61\xa7\xdb\xbe\xd3\ \x64\xeb\xa3\x31\x5a\xeb\xbb\xd3\x91\xba\xa2\xb1\x7a\x94\x8f\xdb\ \x27\xf6\x3d\x8e\xaa\x13\x19\xb2\xb1\xbe\xb1\x7e\x56\x08\x2b\xb4\ \xa2\x63\x6a\x4a\xb3\x74\x4f\x00\x03\x25\x6d\x4e\x97\xf3\x05\x93\ \xef\x11\x84\x0b\x7c\x88\xae\x2d\x89\x8f\xab\x62\x57\x90\x4f\x2b\ \x0a\x6f\x99\x0c\x5e\x97\x0c\x49\xaf\x48\xd9\x2e\xb0\x3b\x8f\xed\ \x03\xb6\x53\xd6\x5d\xe6\x69\x5f\x73\x39\xf3\x2a\x70\xe9\x1b\xfd\ \xc3\xeb\x2e\x37\x55\x06\x5e\x19\xc0\xd1\x73\x2e\x17\xa0\x33\x75\ \xe4\x09\xb0\x7c\x5e\x2c\xeb\x15\xdb\x1f\x3c\x9e\xb7\x80\x91\x3b\ \xdb\x63\xad\x3d\x6d\x61\xba\x8b\x3e\x56\xab\xdb\x74\x2e\x5b\x1e\ \x01\xbb\x0f\xab\xd5\x9f\xcf\xaa\xd5\xdd\xe7\xe4\x7f\x0b\x78\xa3\ \xfc\x06\xa9\x23\x0a\xd6\xc2\xa1\x5f\x32\x00\x00\x00\x09\x70\x48\ \x59\x73\x00\x00\x04\x9d\x00\x00\x04\x9d\x01\x7c\x34\x6b\xa1\x00\ \x00\x01\x64\x69\x54\x58\x74\x58\x4d\x4c\x3a\x63\x6f\x6d\x2e\x61\ \x64\x6f\x62\x65\x2e\x78\x6d\x70\x00\x00\x00\x00\x00\x3c\x78\x3a\ \x78\x6d\x70\x6d\x65\x74\x61\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x3d\ \x22\x61\x64\x6f\x62\x65\x3a\x6e\x73\x3a\x6d\x65\x74\x61\x2f\x22\ \x20\x78\x3a\x78\x6d\x70\x74\x6b\x3d\x22\x58\x4d\x50\x20\x43\x6f\ \x72\x65\x20\x34\x2e\x34\x2e\x30\x22\x3e\x0a\x20\x20\x20\x3c\x72\ \x64\x66\x3a\x52\x44\x46\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\ \x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ \x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\ \x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\x22\x3e\x0a\ \x20\x20\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\x44\x65\x73\x63\x72\ \x69\x70\x74\x69\x6f\x6e\x20\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\ \x3d\x22\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ \x78\x6d\x6c\x6e\x73\x3a\x78\x6d\x70\x3d\x22\x68\x74\x74\x70\x3a\ \x2f\x2f\x6e\x73\x2e\x61\x64\x6f\x62\x65\x2e\x63\x6f\x6d\x2f\x78\ \x61\x70\x2f\x31\x2e\x30\x2f\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\ \x20\x20\x20\x3c\x78\x6d\x70\x3a\x43\x72\x65\x61\x74\x6f\x72\x54\ \x6f\x6f\x6c\x3e\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\ \x2e\x6f\x72\x67\x3c\x2f\x78\x6d\x70\x3a\x43\x72\x65\x61\x74\x6f\ \x72\x54\x6f\x6f\x6c\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x2f\x72\ \x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ \x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x3c\x2f\ \x78\x3a\x78\x6d\x70\x6d\x65\x74\x61\x3e\x0a\xad\x12\xec\x34\x00\ \x00\x02\x0c\x49\x44\x41\x54\x38\x11\xa5\x52\xbf\xab\xda\x50\x14\ \x3e\xc9\x8d\x26\x31\xf5\x3d\xf5\x35\xab\x43\x87\x82\xed\xd0\xc1\ \xc5\x16\xe4\x81\x54\x10\x5e\x5d\x1e\xd5\x82\xfd\x0f\x1c\xc4\xc5\ \xd5\x49\xf0\x47\x1d\x84\xd2\xad\xff\xc0\x1b\xa4\xa3\xd0\x14\x87\ \x52\x51\x5c\x8b\x53\xe9\x16\x71\x30\x6d\x29\xea\x7b\xb9\x49\x8c\ \xbd\x47\xf0\xf1\x42\x55\x0a\x3d\x70\xc8\xbd\x39\xdf\xf7\x9d\x5f\ \x97\xdb\x6c\x36\xf0\x3f\xc6\x1f\x23\x57\xab\xd5\x73\xf4\x63\x18\ \xe1\x58\x30\x9d\x4e\xbf\x65\x15\x62\x89\x4f\x0e\xe2\x30\xbe\xcf\ \x1b\x8d\xc6\x85\xae\xeb\x0e\x3a\x9e\xf7\x61\xf0\xdf\xc1\x16\x12\ \x89\xc4\x1b\x06\x20\xae\xeb\x92\x78\x3c\xde\x3a\x54\x01\x87\x2a\ \x3b\x2b\x95\x4a\xaa\x28\x8a\x8f\xc3\xe1\xf0\x65\xa1\x50\x28\x5a\ \x96\x45\xb6\x59\x78\x7e\xdd\xed\x76\xdf\x19\x86\xd1\xf5\xf9\x7c\ \x5f\xeb\xf5\xfa\xaf\x1d\x87\x2b\x97\xcb\x31\xd6\xeb\x87\x68\x34\ \x7a\x46\x08\xb9\x27\x07\x64\x89\xf0\x04\x16\x8b\x05\x38\x6b\x07\ \xdc\xb5\x0b\x3c\xcf\x83\x2c\xcb\xc0\x04\x81\x52\xba\xb2\xa8\xf5\ \x5b\x9f\xea\x3f\x06\x83\xc1\x2b\x32\x1c\x0e\x8d\x5e\xaf\xe7\xc4\ \x1e\xc5\x5e\x08\x44\x90\xa9\x49\x61\xb5\x5a\x81\x69\x9a\x40\x2d\ \xba\x25\xd9\xb6\x0d\xcb\xe5\x12\xc9\xc0\x92\xf8\x99\xc1\x64\x32\ \xa9\xb3\x0d\xf5\x6e\x5b\xe8\x74\x3a\x2f\x53\xa9\xd4\x7b\x8e\x70\ \xa7\xf4\x86\x02\x92\x58\x26\x70\x5c\x67\x7b\x06\xd6\xa9\x24\x49\ \x28\xf0\x73\x34\x1a\x15\x2b\x95\xca\x15\xb6\x71\x2b\x80\x97\x5a\ \xad\xf6\x3c\x93\xc9\x5c\xb1\xc1\x45\xa8\x4d\x01\x85\x6e\xae\xaf\ \x19\x8a\x03\xd1\x2f\x82\x28\x89\xc6\x78\x3c\x7e\xcd\xc8\x1f\x11\ \x8f\xe6\x11\xc0\x1f\xda\x27\xed\xbb\xdf\xe7\x7f\x80\xe5\xda\x6b\ \x7b\xbb\x62\x81\x17\x30\x33\xb6\xf5\x2d\x9b\xcd\x3e\x44\xdc\xce\ \x3c\x6b\x64\x5b\x38\xe1\x80\xbb\x8f\x41\x24\x04\xa4\x00\x28\xb2\ \x02\x82\x5f\x00\x36\x7d\x90\x64\x49\x45\xcc\x8e\x8c\x5f\x8f\x40\ \x30\x18\x4c\x46\xce\x22\x27\x6c\x95\x38\x75\x73\x3e\x9f\x7f\x61\ \xab\x1b\x32\x21\x8a\x5b\x08\x9d\x86\x42\x0c\xf3\xf4\xa0\x00\x5b\ \x65\x92\x91\xad\xd9\x6c\xf6\x59\xd3\xb4\x8b\x7c\x3e\x9f\xcc\xe5\ \x72\xcf\xfa\xfd\xfe\xe5\x74\x3a\x1d\x29\x8a\x62\xab\xaa\x9a\xbc\ \x2b\xe0\x79\xc6\xed\x76\xbb\xd8\x6a\xb5\xce\xf1\xf1\xec\x73\x7c\ \xd2\xcd\x66\xb3\x7c\x37\xf6\xd7\x10\x3d\xea\xff\x70\xf9\x03\x24\ \xeb\x32\x12\xe4\xb3\x60\xa5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x00\xbc\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\x0c\x50\x4c\x54\x45\xed\x1c\x24\ \x79\x00\x00\xff\xff\xff\xff\xff\xff\xad\x92\xf9\x1b\x00\x00\x00\ \x04\x74\x52\x4e\x53\xff\xff\xff\x00\x40\x2a\xa9\xf4\x00\x00\x00\ \x26\x49\x44\x41\x54\x78\xda\x62\x60\x46\x03\x0c\x38\x04\x18\xa1\ \x00\x21\xc0\x04\x06\x54\x16\xc0\xb0\x85\x01\x0c\x28\x13\x40\x37\ \x14\x8f\x6f\x01\x02\x0c\x00\x41\x86\x02\x47\xbe\x28\x98\x01\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xb5\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\ \x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\ \x00\x00\x00\x07\x74\x49\x4d\x45\x07\xda\x06\x07\x15\x18\x20\xce\ \x7e\x81\xfa\x00\x00\x00\x39\x49\x44\x41\x54\x28\xcf\x63\xfc\xcf\ \x80\x1f\x30\x11\x90\x67\x60\x41\xe6\x48\xa3\x19\xf7\x94\x11\x4d\ \x01\x03\xc3\x53\x64\xe5\xc4\x59\x41\x07\x05\x68\x8e\x94\x26\xa4\ \x40\x1f\x89\x7d\x71\x80\x1c\x79\x11\x43\x01\x23\xc5\xb1\x09\x00\ \xb8\xf7\x07\x13\xe5\xef\x3f\x61\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x00\xcf\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\x15\x50\x4c\x54\x45\xff\xfe\xfe\ \xff\xfd\xfd\xff\xfd\xfc\xf6\x8e\x56\x7b\x2e\x00\xff\xff\xff\xff\ \xff\xff\x4e\x85\xdc\x40\x00\x00\x00\x07\x74\x52\x4e\x53\xff\xff\ \xff\xff\xff\xff\x00\x1a\x4b\x03\x46\x00\x00\x00\x2d\x49\x44\x41\ \x54\x78\xda\x62\x60\x43\x03\x0c\x38\x04\x58\xa0\x00\x21\xc0\xca\ \xca\xc8\xc0\xc0\x84\x22\x00\x02\x24\x09\x60\x18\xca\x0c\x06\x54\ \x16\x40\xb7\x05\x8f\x6f\x01\x02\x0c\x00\xc5\x62\x05\x2a\xa0\xa2\ \xeb\xe9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xc7\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\ \x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\ \x00\x00\x00\x07\x74\x49\x4d\x45\x07\xda\x06\x07\x15\x18\x36\x3a\ \xaa\x34\xab\x00\x00\x00\x4b\x49\x44\x41\x54\x28\xcf\x63\xfc\xcf\ \x80\x1f\x30\x11\x90\x67\x60\x41\xe6\xd8\xa0\x19\x77\x84\x11\x4d\ \x01\x03\xc3\x11\x06\x06\x86\x7f\x0c\x8c\x0c\x0c\x0c\xff\x19\xec\ \x30\x4d\x40\xb6\x95\x91\x58\x37\x90\xe6\x48\x06\x06\x1b\x42\x0a\ \x52\x91\xd8\xb3\xa9\xe4\x06\xaa\xfb\x62\x36\x86\x02\x46\x8a\x63\ \x13\x00\x29\x51\x09\x03\x00\x20\x62\x2f\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xa3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x04\x1c\x0b\x36\x39\xbb\x24\x9f\x47\x00\x00\x01\x30\x49\x44\ \x41\x54\x38\xcb\x63\x60\xa0\x10\x30\x62\x13\x2c\xad\x35\xed\x67\ \x60\xfa\x5a\x40\x48\x33\x13\x13\xc7\x5e\x16\xec\x32\x5f\x0b\x82\ \x83\x02\x09\xda\xbe\x76\xdd\x7a\x67\x26\x6c\x12\xff\xff\x33\x7e\ \x23\xd6\x0b\x2c\x04\x6c\xc0\x2a\xfe\xff\x1f\xc3\xbf\x90\x90\x40\ \x26\x82\x06\x30\x30\x30\x30\x74\x37\x5e\xc3\x08\xa7\x92\x3a\xed\ \xef\x0c\x0c\x0c\x1c\x0c\x0c\x0c\x0c\x4c\x64\x06\xfe\x3f\x78\x70\ \x61\x8d\x1a\xc6\xff\x5c\x78\xa3\x0e\x49\x9e\x89\xd2\x74\x40\x56\ \x2c\x20\xcb\xb3\x30\x30\x30\x30\x64\x15\x5a\x48\x32\xb3\xfc\x89\ \xfd\xf1\xfd\xbb\x93\x80\xf0\x7f\x77\x06\x86\xff\x0c\xbf\xfe\x7c\ \x86\x6b\xc0\x27\xcf\xc2\xc0\xc0\xc0\xf0\xf9\xd3\xa7\x3a\x35\x2d\ \xb6\x0c\x13\x33\x55\x06\x7e\x5e\x75\x06\x7e\x6e\x65\x86\x7b\x4f\ \xd7\x32\x88\x89\x73\x32\x10\x92\x67\x61\x60\x60\x60\x90\x90\x61\ \xc8\xb0\xb7\xb7\x66\xf8\xf7\xef\x0f\x03\x33\x33\x3b\xc3\xdd\x27\ \x6b\x18\x2e\x9d\x7f\xfd\xff\xcd\xeb\xff\x5b\xf1\xc9\xbf\x7a\xc1\ \xd4\x00\x4f\x07\xf7\x1e\x9e\x67\xe0\xe0\x60\x61\xe0\xe7\x7b\xcb\ \x70\xf3\xfa\x5b\x86\x77\x6f\xff\x5e\x3c\x7d\xec\x43\x17\x3e\xf9\ \xb3\x27\xdf\xee\x87\x27\x92\xc4\x4c\xb5\xdb\x22\x62\x2c\x2a\x0c\ \x0c\x0c\x0c\xb7\xaf\xff\x5c\xb4\x61\xd5\xdd\x78\xe4\x80\x43\x97\ \x97\x57\x94\xa8\x98\xd8\x79\xf4\x39\xa5\xb1\xc8\x00\x00\xbd\x75\ \x89\xf9\x6f\x29\x4a\x9e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x00\xbc\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\x0c\x50\x4c\x54\x45\xf7\x94\x1d\ \x7d\x49\x00\xff\xff\xff\xff\xff\xff\x79\x47\x09\x64\x00\x00\x00\ \x04\x74\x52\x4e\x53\xff\xff\xff\x00\x40\x2a\xa9\xf4\x00\x00\x00\ \x26\x49\x44\x41\x54\x78\xda\x62\x60\x46\x03\x0c\x38\x04\x18\xa1\ \x00\x21\xc0\x04\x06\x24\x09\x60\x98\xc1\x00\x06\xb4\x16\x40\xb7\ \x16\x8f\x6f\x01\x02\x0c\x00\x34\x2a\x02\x2f\xf2\x15\x30\xa5\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xb8\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\ \x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\ \x00\x00\x00\x07\x74\x49\x4d\x45\x07\xda\x06\x07\x15\x19\x15\x81\ \xd6\x74\x98\x00\x00\x00\x3c\x49\x44\x41\x54\x28\xcf\x63\xfc\xcf\ \x80\x1f\x30\x11\x90\x67\x60\x41\xe6\x04\xa0\x19\xb7\x81\x11\x4d\ \x01\x03\xc3\x06\x64\xe5\xc4\x59\x41\x9a\x1b\x60\xc6\xe2\x51\x10\ \x88\xc4\x5e\x4f\x25\x37\xd0\x41\x01\x9a\x2f\xd6\x63\x28\x60\xa4\ \x38\x36\x01\x3b\x7f\x07\x26\x94\x9e\xb7\x50\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x61\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x01\xf3\x49\x44\x41\x54\x78\xda\x94\ \x53\x4d\x6b\x13\x51\x14\x3d\x77\xe6\x75\xe2\x84\x04\x1b\x13\x37\ \xa2\x66\x51\x10\xdb\x66\x61\x8b\x88\x75\xad\x1b\xc5\x45\x71\x21\ \xdd\x89\x0b\x7f\x80\xb8\xd5\x90\xc1\x45\xbb\x29\xe8\x42\x08\xfe\ \x02\x83\xe8\x42\x24\x8a\x62\x15\xa4\xea\x26\x62\xc5\x80\xa5\x2d\ \x18\x43\x48\x85\x68\x0c\x3a\x9d\x96\x24\xb7\xf3\xe6\x23\x99\xa4\ \x1f\x90\x33\xcc\x3c\xe6\xbd\x77\xcf\x3d\xe7\xde\xf7\x28\x9b\xcd\ \x3e\xae\x56\xab\x57\x30\x18\xae\xa6\xd3\xe9\x1c\x33\x03\x99\x4c\ \x86\x07\x85\x8c\x91\x2c\x92\x40\xf8\x94\xb5\x5a\xad\x43\x4f\xf6\ \xc3\x24\xc7\x00\xc8\xfd\x1c\x8a\xc5\x7a\xa4\x88\x7e\x6d\x44\xe4\ \x8d\x2e\x91\x9b\xc9\x27\xe3\x1d\x5e\x44\x30\x83\x1f\x20\xa3\x89\ \x03\xf3\xe4\x29\x60\xda\x9b\x80\x82\x0a\xd8\x9b\x90\xc1\xec\xc9\ \x71\x16\xf7\x53\xe0\xe4\x27\x74\xf6\x93\xab\xc7\x8f\x65\xf4\x17\ \x65\x17\x0b\xec\x6c\x23\x74\xcd\xb8\xc5\xdc\xb0\x1a\x78\xfd\x76\ \x1e\x42\xdb\x82\xa2\x08\x44\xe2\x65\xdc\x7b\x78\x7e\x31\x3d\x77\ \xa6\xd4\x25\x60\x57\x3e\x05\xfc\xf8\x09\xff\xd6\xd7\xc1\x4a\x05\ \x27\x47\xc7\x61\x9a\x26\x8e\x1d\x3f\x81\xb0\xae\x4f\x2d\x7e\xf8\ \x38\x25\x82\x06\x7a\x0a\xea\xf5\xb1\xdd\x66\xb4\xda\x4d\x68\x9a\ \xc0\xf2\xf7\x92\xfd\xaf\xa1\x5c\x2e\x23\x99\x8c\xfd\xd7\x75\x5d\ \x51\x3a\x02\xc8\x97\xec\xd7\x82\x9d\x60\x09\x55\x55\x61\x59\x9b\ \x88\x86\x53\x98\x99\x7e\x80\x8d\x3f\xa7\xb1\xb2\xb6\xfa\xae\xd5\ \x6e\xe9\x4a\x6f\x49\xd8\x29\x34\x07\xce\x83\x44\x34\x72\xd8\xf6\ \x4e\xce\xeb\x43\xd7\x43\x4d\x99\x70\x47\x1b\xdd\x7e\x73\xa7\xe5\ \xeb\xbf\x7e\x60\xe9\x5b\x1e\x43\x21\x5b\x17\x69\xce\xdc\x3f\xb3\ \x84\x28\x68\x44\x88\x40\x17\x62\x7d\x47\x54\x22\xf7\xe4\x2e\xea\ \xe6\x7b\x4c\x4e\x4e\xe0\x77\x7d\x08\xd8\x54\xf1\x2c\x7f\x1f\x17\ \x2e\x03\x07\x87\x4f\x8d\x17\x0a\x9f\x1a\x22\x91\x48\x3c\x37\x0c\ \xe3\xd2\x6e\x57\x8e\x43\x0b\x18\x4d\x85\x61\x5a\x15\xbc\x79\xf9\ \x13\x4a\xb3\x88\xf8\xd1\x02\xce\x9e\x1b\xc1\xca\x6a\x11\x0b\xaf\ \x2a\x06\x39\x57\x72\x0f\xdc\xba\x33\x76\x31\x74\x40\xb9\x6e\xf7\ \xe2\x48\xf1\x8b\x65\x3c\x7d\xb4\xf6\xe2\xf6\x6c\xea\x86\xaa\xf2\ \xb5\x46\x9d\x8a\x5f\x3f\x6f\xdd\xdc\x16\x60\x00\xf7\x95\xd5\x0e\ \xdc\xcd\xd4\x8e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x00\xce\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\x15\x50\x4c\x54\x45\xff\xfd\xfd\ \xff\xfe\xfe\xff\xfd\xfc\x82\x7b\x00\xff\xf2\x00\xff\xff\xff\xff\ \xff\xff\x39\xf1\x4d\xef\x00\x00\x00\x07\x74\x52\x4e\x53\xff\xff\ \xff\xff\xff\xff\x00\x1a\x4b\x03\x46\x00\x00\x00\x2c\x49\x44\x41\ \x54\x78\xda\x62\x60\x43\x03\x0c\x38\x04\x98\xa1\x00\x21\xc0\xc0\ \xca\xc0\xc8\xc8\x84\x22\x00\x02\xcc\x78\xb4\xb0\x80\x01\xdd\x05\ \xd0\xdd\x81\xc7\xb7\x00\x01\x06\x00\xaa\x13\x05\x09\xc3\xbb\x83\ \x16\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xc8\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\ \x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\ \x00\x00\x00\x07\x74\x49\x4d\x45\x07\xda\x06\x07\x15\x19\x2d\xa9\ \xd4\xcc\x06\x00\x00\x00\x4c\x49\x44\x41\x54\x28\xcf\x63\xfc\xcf\ \x80\x1f\x30\x11\x90\x67\x60\x41\xe6\x94\xa2\x19\xd7\xcd\x88\xa6\ \x80\x81\xa1\x93\x81\x89\xe1\x1f\x03\x23\x03\x03\xc3\x7f\x86\x72\ \x4c\x13\x90\x6d\x65\xc4\x66\x05\x03\x54\x17\x4e\x37\x30\x30\xe4\ \x23\xb1\x27\x12\xe7\x8b\x21\xa1\x00\xcd\x9b\x13\x31\x14\x30\x52\ \x1c\x9b\x00\xca\x15\x09\x34\x69\x85\x73\x4d\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xca\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\x15\x50\x4c\x54\x45\xff\xfd\xfd\ \xff\xfe\xfe\xff\xfd\xfc\xff\xff\xff\x40\x66\x18\x8d\xc6\x3f\xff\ \xff\xff\x51\xdb\xa3\x29\x00\x00\x00\x07\x74\x52\x4e\x53\xff\xff\ \xff\xff\xff\xff\x00\x1a\x4b\x03\x46\x00\x00\x00\x28\x49\x44\x41\ \x54\x78\xda\x62\x60\x43\x03\x0c\x38\x04\x58\xa0\x00\x21\xc0\xc0\ \xcc\xc0\xc8\xc8\xc4\x82\x47\x05\x2b\x18\x0c\xbc\x00\xba\xc3\xf0\ \xf8\x16\x20\xc0\x00\xd4\xa1\x05\x60\x3f\xd8\x4a\xa0\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xcf\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\x09\x50\x4c\x54\x45\x00\x58\x26\ \x00\xa6\x51\xff\xff\xff\x25\xa5\x29\xf6\x00\x00\x00\x03\x74\x52\ \x4e\x53\xff\xff\x00\xd7\xca\x0d\x41\x00\x00\x00\x3d\x49\x44\x41\ \x54\x78\xda\x8c\xce\x41\x0a\x00\x20\x08\x44\xd1\x3f\xde\xff\xd0\ \x11\x36\x52\x2e\xaa\x36\xf2\x3e\x22\x11\xed\x71\x0d\xc0\x11\x90\ \x04\xcd\xdb\x46\xda\x01\x7b\x05\x64\x67\x98\x5a\xae\x0d\xbb\x6e\ \xd8\xd1\xe7\xe3\xeb\x7f\x61\x08\x30\x00\xe6\xec\x01\xbc\xa5\x84\ \x11\x80\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xb1\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x00\x09\x50\x4c\x54\x45\x00\x5e\x20\ \x39\xb5\x4a\xff\xff\xff\x03\x37\x7e\xe2\x00\x00\x00\x03\x74\x52\ \x4e\x53\xff\xff\x00\xd7\xca\x0d\x41\x00\x00\x00\x1f\x49\x44\x41\ \x54\x78\xda\x62\x60\x42\x03\x0c\x38\x04\x18\xa0\x00\x21\xc0\x08\ \x06\x43\x41\x00\xdd\xe9\x78\x7c\x0b\x10\x60\x00\xcb\xf8\x01\x7d\ \x3e\xec\x68\x1d\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x00\xc3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\ \x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\ \x00\x00\x00\x07\x74\x49\x4d\x45\x07\xda\x06\x07\x15\x1a\x0f\x57\ \x99\xde\x21\x00\x00\x00\x47\x49\x44\x41\x54\x28\xcf\x63\xfc\xcf\ \x80\x1f\x30\x11\x90\x67\x60\x41\xe6\x44\xa2\x19\xb7\x9c\x11\x4d\ \x01\x03\xc3\x52\x06\x26\x86\x7f\x0c\x8c\x0c\x0c\x0c\xff\x19\xa2\ \x31\x4d\x60\x80\x0a\xe2\xb4\x82\x81\x21\x02\x89\xbd\x82\x38\x47\ \x0e\x0f\x05\x68\xe1\xb0\x02\x43\x01\x23\xc5\xb1\x09\x00\xcf\xcf\ \x09\x2a\x8d\x33\xc2\x9f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x02\x4c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd6\x01\x05\x0d\x20\x02\x71\x5f\x5a\xcd\x00\x00\x00\x1d\x74\x45\ \x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\ \x64\x20\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\ \x64\x25\x6e\x00\x00\x01\xb0\x49\x44\x41\x54\x38\xcb\xc5\x93\xc1\ \x4a\x1b\x51\x14\x86\xbf\x58\xb1\x4e\x92\x96\x8e\xd1\x04\x6d\x25\ \xa5\x30\x12\x90\x80\x82\x08\x03\xc5\xa2\xd0\x40\xe9\x32\x96\x3a\ \x4f\xd0\x17\x28\xa4\xf4\x01\xa4\x79\x91\x8e\x21\xe4\x01\x3a\x82\ \x81\xd9\x04\x5c\xb8\xc9\x26\x38\x82\x19\xb1\x8b\x99\x26\x8c\x2d\ \x33\xde\x28\x2d\x76\xd1\xce\x74\x62\x4d\x37\x2e\x7a\x56\xe7\xde\ \x73\xf9\x39\xe7\x3f\xdf\x85\x5b\x46\x62\x54\xe1\xf9\xfb\xbd\xab\ \x30\xdf\xdd\xde\x18\xf9\x6e\x3c\x4c\xd4\x57\xef\xb6\xd2\x4a\x49\ \x07\xf0\x2d\x43\x03\xa8\x94\x15\xaa\x0d\x6b\xa8\x76\x5d\x2c\x12\ \x48\x2b\x25\xbd\x52\x56\xd8\x3f\xf4\x68\x52\xd2\xf3\x59\x09\xfb\ \x8b\x20\x9f\x95\xb0\x29\xe9\xeb\xc5\x69\x56\x17\x64\x60\xef\x2a\ \x2e\x32\x1e\x57\xdb\x3f\xf4\xc8\xc9\x93\x6c\xad\x3d\x8a\xee\xd4\ \x42\x06\xb5\xf0\xa7\x7e\x3d\xc6\xc2\xc4\xb7\x0c\xad\xd9\xee\x01\ \x70\xec\x04\xd4\xcc\x6e\xf0\xe9\xc0\xa1\x66\x76\x83\xcf\x7d\x01\ \x40\xb3\xdd\x8b\xc6\x1b\x32\x31\x34\x2c\x9f\x95\x50\x0b\x19\x6a\ \x66\x37\xf8\xfe\xf5\xc4\x10\xee\x51\x7d\xe2\x7e\x6e\x2d\x39\xbb\ \xf8\x7a\xf3\xe9\x63\xb9\xd5\xe9\x63\xbb\x62\xc8\xd8\xa8\x83\x4a\ \x59\x41\x2d\x64\x00\x78\x90\x96\x52\xc2\x3d\xaa\xb7\xea\x1f\xf4\ \xcb\x6f\x8e\x79\x2f\x29\xc9\xe1\x38\x95\xb2\x72\xf3\x16\xaa\x0d\ \x2b\xea\xe0\xfc\xe2\xf2\x62\xbe\xf8\xec\x2d\x40\x72\xae\xf8\xe6\ \xcc\x17\x01\x90\x6a\x75\xfa\xec\x98\xe2\x6f\x0f\x76\xb7\x37\x12\ \xbe\x65\x68\xb6\x2b\xc8\xcf\x48\x2c\x3d\x99\xba\x7b\xfe\x63\x62\ \x71\x7e\xf9\xe5\xc7\x3b\xa9\x99\x95\x17\x2b\x0f\x53\x00\xb6\x2b\ \xf0\x2d\x43\x8b\x6f\x21\x11\x07\x67\xbd\x38\x4d\x4e\x9e\x1c\x49\ \x9d\xe3\x0d\x68\xb6\x7b\x43\x2c\x8c\xc5\x1f\xac\x2e\xc8\x38\xde\ \x80\x1d\xf3\x94\x56\xa7\x0f\xc0\xaf\xb6\x4f\x71\xbc\xc1\x6f\x0e\ \xfe\x81\x72\xb8\x0d\xdf\x32\xb4\x10\xac\x6a\xc3\x8a\xce\x37\x91\ \x78\xeb\xbf\xf0\xff\xe3\x27\x7e\x4f\xb4\x84\x11\xee\x2e\x39\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xb8\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ \x67\x9b\xee\x3c\x1a\x00\x00\x01\x4a\x49\x44\x41\x54\x38\x8d\x95\ \x93\xbd\x4a\x03\x41\x14\x85\xbf\x7b\xf7\x27\x21\x60\x70\xb1\xcb\ \x73\x08\xd6\xd6\x29\xd2\x07\xc2\x82\xa4\xd0\x4a\x1b\x51\x31\xb6\ \x42\x4a\x11\x4c\x33\x46\x92\x17\x48\x17\xd8\xe7\x49\x2d\xb1\x4a\ \xa5\x73\x2d\x64\x93\x8c\x49\x94\x1c\x58\x98\xbd\x77\xee\x37\x67\ \x0e\x8c\x0c\x87\xc3\x6b\x33\x7b\x30\xb3\x84\x3d\x24\x22\x5f\xaa\ \x3a\x88\xcd\xac\xd7\xe9\x74\x0e\x44\x64\x9f\x79\x00\x46\xa3\xd1\ \x55\x6c\x66\x69\x92\x24\xcc\x66\x33\x44\x84\x12\xb4\xbe\x5e\x97\ \x99\x01\xd0\x68\x34\x00\x24\x2e\x1b\x45\x51\x6c\x3d\xa5\xd9\x6c\ \x72\x76\x7e\x11\xd4\x5e\x07\x2f\xcb\x75\xbc\xde\xe8\x76\xbb\xc1\ \x46\xe7\x1c\xaa\x4a\x5a\xa9\x06\xf5\x75\x67\x01\x00\x60\x3e\x7f\ \x07\x20\xcb\x8e\x00\x7e\x00\xd5\x10\xa0\xaa\xbb\x01\xbf\xb5\xcd\ \xc1\x9f\x80\xf2\xe4\x52\x93\xc9\x84\xd3\x93\xe3\xa0\x36\x9d\x4e\ \xc9\xf3\x7c\x13\xe0\x9c\xdb\x70\x50\xab\xd5\x68\xb7\xdb\xcb\x7f\ \xef\x3d\xe3\xf1\x78\xe5\xa0\x0c\xa4\xd5\x6a\x71\x79\xd7\x0b\x86\ \x9f\xfb\x8f\x14\x45\x81\x99\xe7\xe3\x63\x8e\x88\x50\xaf\x1f\x06\ \x7b\x96\x0e\x44\xe4\xcf\xb4\x77\x29\x00\x24\x95\x4a\xd0\x2c\xc3\ \x12\xd1\x65\x36\xde\xfb\xdd\x80\x28\x0e\x33\x55\x55\x16\x8b\xc5\ \x46\x36\x49\xb2\x7a\x36\x01\xa0\x7f\x7f\x83\xaa\x06\x5f\x9e\xe7\ \x88\x08\x66\x86\x99\xe1\xbd\x0f\x5c\xc4\xc0\x27\x40\x96\x65\xff\ \xde\x77\x9b\xe2\x28\x8a\x9e\x9c\x73\xb7\x40\xb4\xe7\xac\x4f\xd3\ \xf4\xed\x1b\x64\x92\x5d\xec\x20\x2a\x74\x16\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xf2\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0b\x0a\x12\x39\x0d\xf9\xdd\x70\x50\x00\x00\x01\x7f\x49\x44\ \x41\x54\x38\xcb\xa5\x91\x4d\x88\x52\x51\x18\x86\x9f\x63\x2a\xfe\ \x40\xa6\x8b\x10\x5a\x04\x41\xb4\x0e\x82\x99\x20\x9a\xe5\x2c\xe3\ \x62\x11\xb4\xa9\x88\x20\x88\xfe\x98\xdd\x6c\x66\xb6\xb3\x08\xa2\ \x5d\x50\x33\xce\x2a\x44\xa4\x65\x49\x50\xb6\x6c\x17\x18\x46\x9b\ \x88\x22\x28\x05\x0b\xb1\x7b\x8f\x47\xcf\xfd\x66\x71\xed\x0a\xe2\ \x05\xcd\x97\x0f\x0e\x9c\xc3\xf7\xbc\x2f\xef\x51\x97\x2e\x97\xb6\ \x8a\xc5\xe2\x36\x53\x32\xc6\x04\xe7\xc0\xdc\xda\xdb\xdd\x7f\x42\ \x84\xd4\x9d\x7b\xb7\xe5\xfa\xd5\x1b\x33\x1f\xb5\xf6\x78\xb6\xf7\ \x94\x5e\xaf\x77\xa5\x5a\xa9\x3d\x8f\x04\x94\x9c\x8b\xb4\x3e\xb5\ \xa2\x4c\x78\xdb\x78\x33\x7d\xf5\xa8\x5a\xa9\x3d\x00\x88\x03\xa4\ \xd3\x19\x8e\xe4\xf2\x91\x00\xe7\x42\x29\x70\x53\x0a\xa5\x14\xb5\ \x17\xd5\xfb\x40\x00\x30\xc6\xe0\x79\x2e\xaf\x3f\xf6\x69\x76\x32\ \xcc\xa5\xc3\x0e\x67\x6e\x3a\x52\x48\xe9\xcf\x61\x82\x66\x27\xc3\ \xe3\x8d\x75\xb4\xb1\x73\x31\x52\xc9\x43\xdc\x7d\x58\x3f\x15\x07\ \xf0\x3c\x17\x80\x9f\xbf\x35\x5f\xda\x7f\xe7\x02\x9c\x38\x9a\x05\ \x20\xa6\xb5\x26\x9d\x9e\x33\xfa\x0c\xc5\x5c\xd7\x0d\x13\xfc\x17\ \xe0\x5f\x07\x4b\x01\x16\x4d\x60\xad\x8f\x1e\x06\x65\x87\xbf\x90\ \x88\xf9\x08\x20\x22\x28\xa5\x10\x11\x44\xc0\x17\xc1\x5a\x61\x68\ \x7d\xcc\x48\x18\x8c\x2c\x43\x2b\xe4\xb2\xc9\x09\xc0\xf3\x5c\x8e\ \xe7\x06\x74\xfb\x86\x1f\x5d\x0f\x44\xe1\x23\x8c\x07\x11\x10\x04\ \x91\x31\x18\x18\x59\x99\x00\x7e\x75\xda\x9c\x3e\x7b\x8e\x0f\x5f\ \xff\x8c\x97\x02\x77\x11\xf0\x11\x04\x05\x22\x61\xaa\x95\x93\x05\ \xea\x2f\x5f\x91\xd7\xdf\xcb\xea\xfc\xb5\x9d\x86\x9b\x38\xb6\xb6\ \x68\x79\xd9\xe1\xb7\xf7\xef\xca\x9b\xab\x2c\xab\x03\xc2\x87\xb4\ \xca\xa7\xb0\xe2\xf8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x02\xab\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ \x67\x9b\xee\x3c\x1a\x00\x00\x02\x3d\x49\x44\x41\x54\x38\x8d\x85\ \x93\x4d\x68\x13\x41\x18\x86\xdf\x99\xec\xe6\x0f\x6b\xc0\x60\xd2\ \x43\xfc\xc1\xaa\xf5\x22\x1a\x8f\x49\xb4\xe0\xc1\x8b\xf1\x22\x14\ \x2f\x1e\x2a\xe2\x41\x14\xea\xa1\x55\xf1\x2a\x08\xd2\x15\x3c\xa9\ \x50\x84\x9c\x14\x21\xa2\x52\x53\x5b\x72\xb1\xd6\x55\x08\xb5\x2d\ \x14\x7b\xa8\x55\xb4\x54\xcd\x9a\xae\xfd\x0b\xe9\x26\xb3\xb3\x9f\ \x87\xd6\x1a\x9b\x18\xdf\xe3\x37\xdf\x3c\xf3\xbe\xf3\xcd\x30\x22\ \x42\xb5\xe2\xdd\x6a\x1e\x84\x30\xea\x89\xc1\xd0\x7b\x44\x73\x75\ \x49\xa9\x69\x22\x84\x6f\x5d\x48\xc3\x76\x04\x6c\x47\x60\xc9\x2a\ \x60\xc9\x32\x01\x00\x77\x1f\xdd\xa8\x01\xd7\x02\x00\x30\xc6\x90\ \x9b\x79\x8e\xb2\x5d\x42\xa1\x38\x83\x8f\x73\x63\x68\x3f\x78\xb5\ \xae\x29\x5e\xaf\x58\x1d\xca\xa3\xf8\xeb\x6e\x6c\x08\x00\x11\x88\ \x1c\x10\x11\x14\xee\x6e\x08\x50\x12\x97\x55\x9d\x1c\xc4\xd6\xed\ \xbb\x60\x39\x24\xbd\x92\x6c\x48\xb2\xb1\x5c\x36\x51\xbd\x16\xef\ \x52\xd7\x0d\x32\x8e\x37\x0a\x39\x48\x45\x42\x2d\xd1\x8b\x27\xaf\ \xfb\x14\x97\x0a\x22\xc7\x2b\x49\x82\x98\x04\xb8\x44\x51\x16\xa0\ \x7a\x39\xb8\xc2\x70\xfe\xd4\x35\x2f\x08\x10\xa2\x82\x74\x36\x55\ \x9a\x5f\x9c\x4b\x31\x22\x42\xa2\x5b\x4d\xb7\x45\x8f\x27\x8f\x44\ \x93\x9e\xf7\xf9\x57\x90\x5c\x40\xa2\x8c\x15\x7b\x11\xd3\xf3\x39\ \x10\x68\x2d\x16\x47\xdb\xf6\xd3\x18\x9d\x18\x29\x4f\x4e\x8d\xf7\ \xbd\xee\x11\xed\x7c\x2d\x72\xc7\xcb\xb1\x8c\xf1\xc5\x98\xa2\x48\ \x70\x2f\x88\x57\x00\x97\x8d\x42\x65\x1a\xaa\x8f\xc1\xed\xe3\x50\ \x7d\x2e\x44\x23\x47\x61\x2e\x98\x34\xf9\x61\xdc\x20\xc2\x99\xf5\ \x4b\xd4\x35\x51\x04\x21\xf9\x70\xf0\x9e\xe5\xe5\x4d\x08\xf8\x83\ \x28\xd1\x4f\x94\x5d\x8b\x70\x7b\x39\xdc\x3e\x17\xb6\x6d\xd9\x83\ \x90\xaf\x05\xd9\xa1\x8c\x45\x0e\x92\xba\x26\x8a\x7f\x4d\x41\xd7\ \xc4\x44\x45\xac\x74\x3e\x18\xbc\x53\xda\x11\x38\x00\x9b\x95\xa0\ \x7a\x56\x4f\xde\xbc\x29\x80\xfd\xa1\x63\xe8\xcb\x3e\x2e\x09\x51\ \xe9\xd4\x35\x31\x51\x77\x8c\xba\x26\x7a\x67\x8d\x4f\x2f\x86\xc7\ \x06\x44\x6b\x30\x01\xae\x30\x28\x6e\x8e\x43\xe1\x13\xc8\xbd\x7b\ \x5b\xf9\x61\x7e\xeb\xd7\x35\xd1\xdb\xf0\x1d\x90\x83\x8e\xa1\x91\ \x81\xef\xa6\xb1\x40\xbb\x9b\x62\xd8\xe5\x8f\xc1\xfc\xba\x4c\xb9\ \x51\x3d\xef\xc8\xd5\xdc\x0d\x01\xba\x26\x8a\x24\x91\xcc\x64\x9f\ \x59\x5b\xb1\x0f\x41\xa7\x15\x4f\xfb\x9f\x58\x8e\xfc\x93\xbb\x5a\ \x6c\xe3\x6f\xfc\xad\x78\x97\x7a\x2e\xd2\xbc\xf3\x36\x00\xcc\xe6\ \x3f\x5f\xda\x68\xfd\xbf\x00\x00\x38\x7c\x45\xbd\x0f\x00\xc3\x37\ \xc5\xd9\x7f\xf5\xfc\x02\x73\x4a\x12\x2a\x86\x68\x1c\xcb\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x75\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\xf2\x49\x44\ \x41\x54\x38\x8d\x75\x93\xdf\x4f\x9b\x75\x14\xc6\x3f\xdf\xef\xfb\ \xf6\x7d\xdf\xf2\x96\x1f\xb3\x5d\x19\x43\xa8\x5b\x9c\xa3\x83\x6d\ \x81\x18\x45\x3b\x37\x9b\x90\xc9\x58\x76\xd1\x1b\x88\xba\xe0\x30\ \x64\x89\x11\xff\x00\x13\x76\xe3\x95\xd7\x9a\x6c\xc9\x6e\x9c\xe1\ \x12\x63\x08\x41\x59\x8c\x57\x88\x5b\xa2\x71\x74\xfc\x50\x47\xcc\ \xaa\x03\x27\x94\x42\xdf\xb6\xbc\x94\xb5\xb4\x5f\x2f\x40\x64\x21\ \x7b\x92\xe7\xe6\x9c\xf3\x3c\x39\x27\xe7\x1c\xa1\x94\xe2\x59\x88\ \x9e\xbd\xf2\x2e\xf0\x31\xb0\x02\x2c\x03\x4b\xc0\xd2\xc6\x46\x3a\ \x9f\x76\x16\xed\xfa\xc3\x27\x3f\xd7\x9f\xa9\xde\xc6\x29\xa0\x19\ \xa0\xb8\xf5\x44\xad\xac\xfc\x71\xb7\x58\xca\xbd\xe6\x38\x49\xa1\ \x94\xc2\x67\x07\xba\xf5\xc4\xf5\xc8\xa1\x0a\x59\x3e\xa7\x81\x4f\ \xea\x86\x4f\xd7\x0d\x5b\x0a\xe9\x93\x6a\xcb\xf7\x72\x9d\xb7\xe3\ \xf6\x6c\x8e\x8d\x7c\x92\xb4\xb3\x2c\x42\xa1\xd0\x2b\x3d\x3d\x57\ \x44\x2c\x16\xa3\xb3\xf3\x02\x08\x6a\xf5\xa0\x56\xba\x65\x6b\xea\ \x2d\xcc\x6a\x94\x61\x33\xbf\xba\xf5\xed\x0f\x73\x6b\xe7\x47\xe3\ \x29\xfd\xc7\xdf\x53\x34\x34\x34\xd2\x7f\xb9\x97\x58\x2c\x46\x53\ \x53\xd3\xbe\x8e\xa5\x10\xaa\x06\xb3\x0a\xac\x1a\x66\x92\xb2\xf4\ \xfa\xb5\x3b\x9d\x37\xee\xba\xa2\xfd\xe2\x7b\x4c\x4e\x4e\x12\x8f\ \x4f\x31\x30\x30\xc0\xf4\xf4\x34\xdd\xdd\x3d\x44\x22\x67\xc8\xe5\ \x72\xbb\x06\x3a\xd2\x50\x18\x95\x60\x56\xb3\x90\x75\xb4\xc3\x87\ \x82\xfc\x72\x2f\x4e\x26\x93\x61\x7c\x7c\x9c\xc1\xc1\x6b\x4c\x4c\ \x4c\x60\x9a\x16\x5e\x2b\x40\x6a\x35\x41\x3a\x9d\xfe\xdf\x40\x78\ \xac\x32\x9e\x0a\x30\x2b\xc1\x53\x44\x08\x41\x36\x9b\xe5\xf4\xa9\ \x93\xa8\xb2\xc2\xb4\x6a\x39\xd2\xf8\x2a\xb6\xed\xa7\x54\x2a\x92\ \x5a\x4d\x3c\x3d\x02\x9a\xa1\xd0\x2d\xf0\x54\x6c\x13\x81\xe3\x38\ \x64\xb2\x39\xfa\x2f\x5d\xa0\xbe\xae\x05\xdb\xf6\xa3\x54\x99\xfc\ \x66\x66\xdf\x9a\x74\x21\xf5\x12\xd2\x03\x9a\x01\x9a\x07\xc4\x9e\ \xa4\x51\x81\xd7\x6b\xf1\xf8\x9f\x39\x1e\x2f\xcd\x02\x8a\x70\xf8\ \x04\x7e\xbf\x7f\x8f\x01\xb2\x8c\xf8\x4f\x25\x9e\x72\xd7\xa4\x89\ \x2a\xe7\x58\xf8\x3b\xce\xd0\xd0\x10\x1d\x1d\x1d\x18\x86\xb1\x5b\ \xa9\x6b\xa6\xd0\xa1\x5c\x5c\xcb\x6e\xf0\xcd\x9d\xfb\x8c\xfe\xbc\ \x08\x7b\x0e\x53\x0a\x93\x42\x71\x99\x83\x07\x6b\xe9\xea\xea\xda\ \x8d\xbb\xae\xcb\xba\xeb\xd2\xf8\x7c\xb5\xd2\x7f\x5d\x70\xcc\x77\ \x6e\xde\xa3\xf2\x40\x80\x37\xce\x45\xe9\xfd\x28\xba\x5b\x58\xe5\ \x85\x50\x63\x2b\xb3\xbf\xdd\xa6\xaf\xef\x7d\xa2\xd1\x37\x71\x5d\ \x97\xe1\xe1\xaf\xf0\xd9\x07\xa8\xab\x3d\x5e\x10\x57\xcf\xbf\x98\ \x48\x79\xc3\x2f\x0c\x7f\x3d\x82\x94\x12\x80\x44\x22\x41\x5b\x5b\ \x1b\x0f\x3e\xbb\xc4\xc3\x64\x15\x23\x33\x62\xea\xbb\xf8\x5c\x7d\ \x7e\x73\x2d\x20\xa5\x47\xd6\x54\x87\x68\x3a\x76\x16\x81\x58\xd0\ \xa5\xda\x52\xa5\x52\x89\xbd\x4f\x35\x36\x36\xc6\xd1\xba\x1a\x82\ \xa6\x4b\x30\xb0\x48\x7b\x64\x7d\xe4\xd3\x5b\x3f\x7d\x72\xb5\xef\ \x86\xe5\xf1\x58\x67\xa4\xd0\x5a\x11\xb4\x16\x0a\x79\x47\xef\x8f\ \x3c\x37\x7f\xf9\xcb\xa9\x23\xa7\x5b\xc2\x9c\x68\x6e\xe1\xcf\xc4\ \x43\xfe\x7a\xb4\xc8\xf5\xde\x63\xb0\xe9\x40\x61\x1d\xc0\x00\xb8\ \xf9\xc5\x07\x9b\xc0\xf7\x3b\xdc\xde\x42\xb8\xa1\x72\x70\xfc\x43\ \xed\xc1\xe8\xfd\xdc\xf1\xf9\xe4\x4c\xb0\xbd\xd9\x2a\x5e\x7c\x3b\ \xbc\xfe\x92\x5f\x48\x9e\xe4\xec\x1d\xf1\xc4\xbe\x03\xd8\xc1\xbf\ \xce\x15\x14\xa7\xaa\x2a\x88\xcd\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x03\xc4\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xdd\x06\x0f\x0c\x1a\x34\x2d\xd4\xb7\xad\x00\x00\x03\x51\x49\x44\ \x41\x54\x38\xcb\x75\x93\x4b\x4c\x5c\x55\x00\x86\xbf\x73\xce\xbd\ \x97\xb9\x33\x17\x86\x81\x21\x20\x94\x16\x28\x8d\x8f\x34\x84\x82\ \x82\x49\x8d\x80\x89\x62\x37\x26\x9a\xa8\xa9\x12\x74\xa7\x2d\x75\ \xe3\x63\xa1\x31\x31\x1a\xdd\x18\x31\x31\x6a\xd0\xc4\xa6\x58\x7c\ \xa4\xa9\x24\xc6\x52\x11\x88\x69\x2b\x2a\xc2\x68\x84\x85\xe0\xa2\ \x64\xca\x33\x35\xa1\x33\x0e\x05\xee\x3c\xce\xbd\xd7\x0d\x4d\xd4\ \xe8\xb7\xfc\x93\x6f\xf3\xe7\xff\x05\xff\xe2\x95\x47\x1f\x6e\xdf\ \x72\x22\x4f\x7a\x4a\x75\x02\xf5\xbb\x71\x52\x79\xde\x45\x67\x6b\ \x7b\xf0\xd5\x33\x67\xa7\xf9\x3f\xfa\x8f\x74\x0f\x9c\xec\xed\x99\ \x5b\x9d\x9b\xbb\xb0\x93\xc9\x64\x3c\xad\x7d\x4f\x6b\x7f\x27\x93\ \xb9\xbe\x32\xfb\xeb\xd4\xc9\xde\x9e\xb9\xfe\x23\xdd\x03\xff\x29\ \x9f\x6e\x6d\x19\x5d\xfb\x64\xe8\x73\x2f\x9f\xf7\xaf\x4e\x4e\x06\ \xab\xa3\xa3\xc1\xca\xc8\x48\xb0\x3e\x31\x11\x6c\x24\x12\xc1\xf6\ \xea\x6a\xe0\x69\xed\xaf\x0e\x0d\x8d\x9e\x6e\x6d\x19\xbd\xe1\x29\ \x80\xb7\xef\xbf\x6f\xe0\x81\xa7\x8f\x89\x58\x57\xd7\x23\xeb\xc3\ \xc3\xb2\xb0\xb1\x01\xb9\x1c\x12\x10\x80\xb2\x2c\xa4\x52\x78\x3b\ \x3b\x22\x7a\xe8\x50\x63\x3c\x56\x9a\xaa\x75\xb7\x5b\xc7\x2e\x2f\ \x9e\x57\x7d\x27\x8e\xb5\x37\x28\xe3\xf8\xe1\x17\x5f\xba\x27\x35\ \x35\x25\xfd\x42\x01\x9d\x4e\x93\x4f\x5d\x23\x9f\x4e\xa1\x37\x37\ \x91\xa6\x89\x0a\x87\x91\x86\x49\x10\x04\xc4\xda\xda\x6b\xe6\x27\ \xc6\xc3\x7b\xef\xbe\xeb\x17\xd5\xd6\x76\xc7\xcb\xbd\x27\x9e\xd9\ \x2b\xaf\x6f\x55\xea\xcd\x4d\xfc\x5c\x16\x59\x54\x84\x15\x8f\x13\ \x69\xd8\x4f\x64\x5f\x1d\x76\xcd\x1e\xdc\xe5\x2b\xa8\x70\x18\xdf\ \x75\xf1\xb5\x26\xba\x6f\x5f\x21\xf1\xfb\x82\x6d\x00\x9d\x15\x0d\ \xfb\xeb\xb3\x4b\x4b\x28\xdb\xc6\xcf\xe5\xb0\x62\x65\xa4\x13\x09\ \x16\x26\xc6\x01\x82\x3b\x9f\x7f\x41\x94\xb6\xb4\x90\x9a\xfe\x09\ \xbb\xba\x06\xad\x35\xf1\xba\xfa\x38\xd0\x29\x81\x7a\x2b\x1c\xb6\ \x54\x28\x84\xe1\x38\x20\x04\xa1\xea\x6a\x16\x26\xc6\x83\x38\xa2\ \x49\x07\x41\x45\xa2\xff\x2d\x3f\x54\x55\x85\xbb\xb2\x8c\x9f\xcf\ \xe3\xb9\x2e\xaa\xa8\xc8\x04\xea\x8d\xdd\x32\x85\xb2\x6d\xd0\x1a\ \x69\x59\x98\xb1\x18\x4a\x08\x7f\x59\x17\x96\x01\x4c\xc8\x03\x21\ \xcf\x75\xf1\xf3\x79\x30\x0c\x7c\xad\x05\x20\x24\x90\x2c\xb8\xae\ \x56\xb6\x8d\xb2\x6d\x42\x95\x95\x78\xdb\xdb\xdc\xfe\xec\x73\xd2\ \x96\xea\x6a\x08\x16\x5b\xfb\xfa\xac\xcc\xdc\x1c\xca\x0e\xe3\xe5\ \x72\xf8\xf9\x3c\x6e\x26\xe3\x01\x49\x09\x5c\xbc\xb6\xb4\x94\x36\ \x1c\x07\xc3\x71\x88\x34\x36\x52\xf8\x33\x45\x45\x47\x87\x78\xf0\ \xd2\x77\xa1\x87\x26\x7f\x28\x2f\xbe\xf5\x36\x79\x65\xf0\x14\x46\ \x34\x8a\x9f\xcd\x22\x2d\x8b\xd4\xda\xaa\x0b\x5c\x30\x80\xc1\xf1\ \xfe\x37\xbb\x9f\xf8\xe8\x54\x85\x70\x1c\xa4\x65\x21\x0f\xdc\xcc\ \x76\x32\x49\x6a\x66\x9a\x42\x3a\x8d\xb4\x2c\x4a\x5b\x5a\x10\x42\ \x12\x78\x1e\x91\xda\x5a\x66\x5e\x7f\x2d\x4b\xb1\x33\xa8\x12\x33\ \x3f\xaf\x75\x54\x55\xde\x52\x6d\x9a\x37\x95\x1e\x3c\x58\x22\xa4\ \x44\x28\x85\xb4\x2c\xac\xf2\x72\x42\xd5\x35\x98\xb1\x32\x84\x52\ \xe8\xad\x2d\x4a\x9b\x9b\x59\x39\xf7\x55\x66\x7e\xfe\xb7\xb3\x6f\ \x7c\x76\xe6\x43\x05\x30\x76\x79\xf1\x7c\xf3\xca\xd2\xbd\xc5\x76\ \x38\x1e\x6b\x6a\x0a\xa1\x14\x3a\x9b\x25\xf0\x7d\x7c\x20\x90\x12\ \xa3\xa4\x84\x68\x53\x13\xc9\xe1\x2f\xf2\xb3\x23\xe7\x26\x8f\x5f\ \x9a\x3c\x0a\x28\x75\x63\xd3\x5f\xae\xad\x7f\x7a\x60\x33\x53\x37\ \xfb\xcd\xd7\xf5\x65\x7b\x6a\x2d\xd3\x71\x64\x28\x1e\xc7\x88\x46\ \xd1\x4a\xf1\xc7\xca\xb2\x37\xf6\xee\x3b\x3b\xc9\x85\x85\x8f\x9f\ \xfa\xfe\xc7\xa3\xbb\x5a\x20\xfe\xf6\x27\x01\x18\x8f\xf7\x3c\x76\ \x38\x12\x09\xf7\x1a\xca\xe8\x12\x52\xd4\x0a\x21\x84\xef\xfb\x6b\ \x5a\xeb\x6f\x4d\xd3\xfc\xe0\xfd\xf7\x06\xfe\x71\xe7\xbf\x00\xb7\ \x72\x61\x14\x06\xc0\xe7\xf4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x02\x19\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0b\x15\x11\x32\x0d\x10\x15\x50\x0b\x00\x00\x01\xa6\x49\x44\ \x41\x54\x38\xcb\xa5\x91\xbf\x4f\x53\x51\x14\xc7\x3f\x2f\x7d\xa8\ \xef\xd1\x06\x0b\x0c\x4d\x4c\x37\x19\x60\x73\x42\x13\x23\x03\x83\ \x7f\x00\x08\x46\x06\x24\x0c\x12\x10\x1c\xdc\x0c\x04\x06\x17\x07\ \x16\x36\x13\x7e\x0e\x04\xd4\x30\x03\xd1\x41\x47\x06\x13\x12\x0c\ \x6c\x84\x68\x4c\x84\x26\x6d\x6d\xe0\xbd\xe7\xed\xbb\xf7\x38\xb4\ \x69\xad\x79\x4d\x31\x7e\x72\x93\x7b\x4f\xce\x3d\xdf\xf3\xbd\xe7\ \x5a\x0f\x06\xfb\x66\x53\xa9\xd4\x1c\x7f\xa1\x94\x2a\xed\xbf\xd4\ \xd8\xca\xf2\xda\x6b\xea\x60\x4d\x3e\x9b\x90\x91\xe1\xd1\xc8\x64\ \x10\xf8\x2c\xad\x2c\x52\x28\x14\x1e\xbd\x7b\xb3\xb5\x11\x29\x30\ \xfe\x74\x4c\x06\xfa\x07\x39\x3c\x3a\x04\xc0\x6e\x8a\x91\x48\xc4\ \x69\x44\x2e\x9f\x7d\x39\xfe\x64\x6a\xc6\xd6\x5a\xe3\x38\x2e\xd7\ \x5b\x92\x25\xc5\x98\xe1\xe1\xc0\x50\x43\x81\xcd\xb7\xeb\xd3\xc0\ \x8c\xad\x94\xc2\xf7\x3d\xf2\x3f\x73\x00\x24\x5b\x5b\x00\xf0\xbc\ \x8b\xba\xc5\xae\xdb\x5c\x39\xdb\x61\x18\xd6\x38\x00\x53\x49\x1e\ \x95\x9f\xf5\x27\x9d\x9d\x5d\x35\xb1\x0d\x44\x3a\x88\xba\x1c\xc5\ \xa5\x1d\xc4\xe3\x09\xd2\xe9\x74\xb4\x80\xef\x7b\xbc\xff\x72\xce\ \x41\xc6\x05\x60\xfe\xc3\x7a\x9d\x7e\x9f\x6b\xa2\xde\x89\x25\xb1\ \x01\x1c\xc7\xe5\x20\xe3\xb2\xf0\xfc\x3e\x81\xd2\x5c\x86\x6b\x57\ \x62\x4c\xcd\xef\x56\x67\x00\xf0\x23\x17\x70\x7c\x76\xd1\xb0\x58\ \x6b\x43\xba\xdd\xad\x0e\xd1\x71\x4a\x81\x00\x22\x82\x65\x59\x88\ \x08\x22\x60\x44\xd0\x46\x08\xb5\x50\xd4\x06\x15\x1a\x42\x2d\xb4\ \x25\xae\xd6\xfe\xc2\xcd\xa4\x4f\xf6\x5c\xf1\x3d\xeb\x83\x58\x18\ \x84\xf2\x42\x04\x04\x41\xa4\x2c\x0c\x04\x45\x53\x15\x38\xcd\x9c\ \x71\xeb\xce\x5d\xf6\x4f\xf2\xe5\xa2\x52\x77\x11\x30\x08\x82\x05\ \x22\x15\x57\xdd\x1d\xad\xec\x6e\xef\x90\x0c\xbe\xad\x5a\xf7\x1e\ \xbf\xfa\xe8\x35\xdd\xe8\xe1\x1f\x69\x2e\x7e\xdd\xfb\xb4\xfa\xe2\ \x36\xff\xcb\x6f\x37\x66\xca\x8b\x19\x6f\x71\x8b\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\xb8\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xdd\x06\x0f\x0d\x22\x3a\xdc\x31\x4c\x66\x00\x00\x03\x45\x49\x44\ \x41\x54\x38\xcb\x5d\x93\x5f\x68\x5b\x75\x14\xc7\x3f\xbf\xdf\xbd\ \xf7\xd7\x7b\x93\x26\x25\xcd\xda\x35\x69\xec\x7a\xd3\x0d\x3b\x58\ \x99\x6c\x93\xba\x96\x41\x05\xc5\x17\x57\x95\x6e\x8e\xb5\xb5\xab\ \x08\x7b\x51\x2a\xbe\x6c\x82\x82\x74\x0f\x32\x8a\x0c\xec\xd0\x39\ \xd8\xcb\x90\x39\x65\xe0\xc3\x70\xee\xa1\x6a\xbb\x4a\xc1\x20\x53\ \x99\x52\x85\x26\xad\xdd\xba\xd6\xd6\xad\x49\x4b\xfe\xdf\x9b\xc4\ \x07\xdb\x51\x76\x1e\x0f\xe7\xc3\x39\x5f\x0e\x1f\xc1\x63\x35\x32\ \x64\xb5\x03\x83\x40\x17\x60\x6f\xb4\xe7\x80\x89\xe2\x7c\xdb\xf5\ \xd4\xf8\x89\xdf\x3f\x5a\x7f\x73\x61\x73\x5e\x7f\x0c\xbe\x50\x5b\ \x1b\xec\x18\x18\x18\x58\x35\xb6\x1f\x0b\x63\xee\x52\x00\xe4\x67\ \x22\x85\xa5\xab\x4f\x8d\xbe\x75\xf7\xa5\xea\x96\xdf\x96\xf8\x95\ \xfd\x9b\x8c\xd8\x02\xdf\xec\xed\xed\x4b\x35\x1e\x38\x77\x2c\x9b\ \x38\x23\xf2\xf9\x3c\xe5\x72\x85\xf4\xb2\x07\x5f\x4d\x15\xde\xf0\ \xd3\x5c\x78\x25\x4d\x36\xb9\x9a\xd3\x9f\x1b\x9e\x4a\x7e\x79\xe6\ \x75\x29\x34\x8f\xd8\xdc\xdc\xdb\xdb\x17\x68\x7c\xb2\xe7\xe8\xec\ \x9d\x2b\xb2\x52\xa9\x60\x18\x06\x4a\x29\x16\x6e\xd7\x72\x63\x78\ \x07\x9a\x2e\x29\x64\x36\xce\x36\xcb\x25\x27\x5f\xa1\x5c\x12\x47\ \xf5\x91\x21\xab\xbd\xb6\x36\xd8\xd1\x78\xe0\x5c\x5b\x72\xfa\x7d\ \x61\x18\x8a\xb5\xb5\x14\xeb\xeb\xeb\x08\x21\xb0\x9a\x57\x79\xf5\ \x93\x1c\x37\x87\x77\x92\x4f\xff\x9f\xc8\x1b\xf4\x69\xd6\xc1\x8f\ \x67\xb3\xe6\x1f\x8b\x12\x18\xec\xef\xef\x17\xfc\x7b\x59\x48\x29\ \x11\x02\x7c\x3e\x3f\xf5\xf5\xdb\xb1\xed\x28\x2d\x2d\x51\x76\xb7\ \x47\x68\xd8\x93\x7e\x94\xb8\x69\x5f\x91\x23\x27\xf7\x9b\xc0\xa0\ \x0e\x74\x55\x85\x5e\xb3\x59\xfd\x1a\xa5\x14\xae\xeb\x52\x5d\xed\ \x23\x91\x48\x10\x8b\xc5\x00\x2a\x2f\x1c\xea\x13\x0f\xe3\x7b\x39\ \xf8\xc6\xdf\xf8\x83\x26\xb7\xaf\x05\x10\xb9\xd6\x3a\xa0\x4b\x07\ \x6c\x4c\x5b\xa1\x1a\x30\x2b\x0e\x42\x48\x02\x81\x00\xb1\x58\xac\ \x62\x59\xe6\xde\x74\x3a\xb3\xf8\xed\xf5\x1f\x56\x5e\x3e\x7b\x52\ \xae\xa5\xbf\x21\x1a\xb5\xa9\x6f\x71\x70\xdd\xa8\x0e\xd8\xf2\xd1\ \x37\x8c\x06\x84\x51\x87\xae\xeb\x68\x9e\x16\xa4\x14\xe5\x54\x2a\ \x75\xd7\x75\x1d\x57\x0b\x2c\x15\xed\x8e\x6d\x38\x8e\x83\xeb\xba\ \x84\xf7\xa4\x09\xef\xce\x09\x40\x48\x60\x8e\xc2\x3d\x17\x15\x06\ \xa3\x81\x9a\x1a\x3f\x14\x16\xe8\xe9\x39\x22\x95\x52\xff\xe8\xba\ \x91\xe8\xee\x3e\xac\x8a\x0b\xa3\x28\x65\xe0\x38\x2e\xae\xeb\x52\ \xcc\xcc\x97\x80\x39\x09\x4c\x94\x56\x3e\x4f\x52\x65\x83\x19\xa5\ \xba\xfe\x10\xd9\xec\x1a\xa1\xd6\x13\xe2\xed\x0f\x67\xcc\x77\xce\ \xc6\x83\x91\x48\x44\x4e\x4c\xdc\xc2\xb2\x2c\x1c\xa7\x88\xae\xeb\ \x2c\x2f\xaf\xe4\x80\x71\x31\x32\x64\xb5\xd7\xd5\xd5\x5d\x1d\x7c\ \x2f\x6e\x53\x4a\x83\x9b\x82\x42\x02\x67\x75\x9c\x78\x7c\x86\x4c\ \x26\x83\xae\xeb\x78\x3c\x1e\xa4\x94\x28\xa5\x68\xda\xd9\xc9\xa5\ \x4f\x3f\x78\x90\x4c\x26\x5f\xd4\xc6\x62\xee\xfd\xce\xb6\x62\xeb\ \x8e\xc0\x7c\xc8\x1f\xe9\xf6\x23\x74\x90\x1e\x34\xbd\x8a\xa0\x2f\ \x4f\x20\x10\xc0\xeb\xf5\x22\xa5\x24\x9f\xcf\xd3\xdc\x6c\xf3\xcb\ \xcf\xe3\x6b\xd3\xd3\x7f\x5e\x3b\x7d\x3e\x77\x51\x03\x18\x8b\xb9\ \x37\x42\xde\xbf\x9e\x0f\xfb\x66\xb7\x05\x9a\x0e\x9b\x48\x05\xce\ \x12\xa2\x9c\x45\x50\x00\x04\x96\x65\x12\x6a\xda\xc7\x4f\x53\xdf\ \x15\x27\x27\x27\x7f\x3c\x7d\x3e\x77\x1c\xd0\xb4\x4d\x17\xc6\x62\ \xee\x95\x46\xdf\x4c\xf3\x9d\xa9\x8b\xf6\xae\xd0\x03\x65\x9a\x96\ \xc4\xf7\x0c\xd2\x6c\x42\xf1\x90\xc5\xc5\x7b\xa5\xaf\xbe\xb8\x94\ \x8d\xc7\x67\x2e\x9f\x1a\xcd\x1d\xdf\xc0\x2a\x62\x8b\x8c\x02\xd0\ \xdf\x1d\xa0\xd3\xe7\xd5\x07\x34\x4d\x7b\x56\x4a\xf9\x84\x10\x42\ \x94\xcb\x95\xfb\xae\xeb\x7c\x6f\x18\xc6\x67\xa7\x46\x73\xb1\xad\ \x06\xff\x07\xd9\xf3\x34\xb2\x81\x3a\x3d\x2c\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x50\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\x00\x00\x03\x02\x49\x44\x41\x54\x78\x9c\x75\ \x93\xdd\x4b\x9b\x67\x18\xc6\xdf\xb1\x8e\xf1\xec\xa0\x62\x07\x1b\ \x2b\xb2\xff\x60\xc7\x61\x67\x3b\x19\x0c\x61\x2d\x8c\x8d\x95\x7d\ \x48\x08\x41\x2c\xda\x67\x12\xa2\x0d\x21\x58\x41\x4a\xd7\xa7\xd0\ \x4e\x02\x4b\x59\xdc\x3c\xe8\x41\x37\x3a\x26\xcc\x42\xf6\x55\xba\ \xae\x6a\xac\xd6\xc5\x58\x35\xa6\xd5\x24\x26\x31\x7e\x24\x26\x31\ \x9a\x2f\xf3\xe6\xfd\xed\x20\xcd\x3e\xda\xee\xe0\x3e\xb9\xb9\xef\ \x1f\xf7\x7d\x71\x5d\x1a\xa0\xfd\xbb\x94\x14\x26\x25\x85\x47\x49\ \x11\x52\x52\x54\x1e\x57\xe8\x71\xcf\xf4\xe4\xfc\x93\xcb\x9e\x91\ \xc1\xb6\xe0\x61\xc4\x79\x9b\x62\x70\x8f\x7a\xc9\xa0\x5e\x32\x28\ \x06\xf7\x2b\xab\x0e\xff\xc8\x60\x5b\x50\x49\xe1\x79\x26\x40\x49\ \xe1\x4b\x4e\x5b\xaf\xa3\x17\x8c\x62\xd8\xce\x6e\xb0\x87\x74\xa0\ \x9b\xfc\x62\x2f\xb5\xa8\x13\xb2\xe3\x50\x2f\x19\xf1\x29\x8b\x4f\ \x49\xe1\xfb\x0f\x40\x49\xe1\x49\x4e\x5b\xbf\x25\xe7\xab\xaf\xdd\ \xf9\x84\xd5\xdf\x3f\x66\x7d\xd2\xcc\xe6\x6c\x27\x99\xf9\x1e\x2a\ \xab\x0e\xd8\x74\x43\xe6\x3a\x94\x23\xac\x4f\x9a\xef\x35\x2f\xd1\ \x94\x14\xa6\x91\xc1\xb6\x20\x7a\xc1\xc8\x2e\x48\xe2\x53\x16\x1e\ \xf8\xde\xe3\xcf\x1f\xdf\x25\x30\x7e\x82\xc5\x9f\xde\x67\x7b\xae\ \x0b\x3d\xe6\x82\x6d\x2f\xe4\x7c\xa0\x17\xf0\x9e\x3b\xbe\xa4\xa4\ \x30\x69\x4a\x0a\x4f\x65\xd5\xb1\xc0\xa6\x9b\xfc\x62\x2f\x09\xbf\ \x85\xd8\x84\x99\xe4\xb4\x95\xfc\x62\x2f\xe5\x47\xfd\xb0\x71\x89\ \x74\xa0\x1b\x23\x3e\x00\x89\x21\xc8\xdc\x60\xeb\x7e\xd7\x86\x92\ \xc2\xa3\x29\x29\x42\x14\x97\x2a\x24\x86\x28\x3d\xec\x27\x7a\xb7\ \x83\x74\xa0\x9b\xe9\xef\xdf\x61\xb8\xaf\x95\xe1\xbe\x56\x23\x35\ \xd3\x09\xe9\x6b\x24\xfc\x16\x8a\x61\x7b\xe3\x9a\xd4\x95\xaa\x92\ \x22\xa4\x29\x29\x2a\xd4\x4b\x06\xdb\x5e\x8c\xf8\x00\xb1\x09\x33\ \x7a\xcc\xc5\x70\x5f\xab\xf1\xd5\xc0\x6b\x6f\x5c\xb6\x1d\x7d\xd9\ \x7d\xf6\x58\x9d\x6a\x8a\xf9\x9b\x27\xd9\x5b\xea\xa5\xf4\xb0\x1f\ \xd2\xd7\x0c\x25\x45\xa5\x09\x68\xa8\xbc\xe9\x26\x39\x6d\x85\x9d\ \x51\xdc\x67\x8f\xe9\x4a\x8a\x16\x25\x45\xcb\x70\x5f\x6b\x99\x6a\ \x8a\x99\x1f\xda\xd9\x0d\xf6\x50\x58\xb6\xc1\x96\x07\x25\x45\xb5\ \xf1\x42\x29\x5c\xe3\x60\x0e\x32\x37\xd8\x0f\xd9\x20\x31\x44\x6a\ \xa6\xd3\xf8\xc2\xde\x52\xbe\x6c\x3b\x9a\x89\xde\xed\xa8\x57\xd7\ \x1c\xcc\xdf\x3c\xc9\xd6\xfd\x2e\xb2\x0b\x92\xea\x9a\x43\x57\x52\ \xac\x68\x4a\x0a\x8f\x1e\x73\xed\x50\xcb\xc2\xc1\x1c\xec\x8e\x51\ \x0c\xdb\xa1\x30\x09\x87\x3b\x70\xb8\x43\x2d\xea\xe4\xe7\xaf\xdf\ \x24\x7c\xeb\x14\x09\xbf\x85\xc2\xb2\x8d\xf8\x94\x65\xbf\x29\xa2\ \x69\x74\xe8\xf5\x08\xc6\x21\xd4\xb2\x50\x8e\x40\xfe\x57\x0e\x23\ \x4e\x96\x7f\xf9\x80\xd9\xb1\x76\x02\xe3\x27\x08\xdf\x3a\xc5\xa3\ \xdb\x1f\xb1\x3e\x69\x86\x6d\x2f\xde\x73\xc7\xd3\x4a\x0a\xd3\xdf\ \x46\x4a\xf8\x2d\x49\xea\xa5\x7f\x20\xd9\x71\xea\xeb\x2e\x9a\xae\ \xdc\xb8\x67\x65\xe5\xb7\x0f\xd1\x63\x2e\x66\xc7\xda\xf3\x17\xcf\ \x88\xab\x4f\x59\x39\xf2\xc7\xa7\x39\xf4\x42\x03\x92\xf3\x41\xea\ \x0a\xb5\xa8\x93\x83\x15\x7b\xe3\xad\x2d\x0f\x93\xdf\xbd\x5d\x6d\ \x5a\x59\xd3\xb4\xe7\x9f\x0a\xd3\x97\xce\x57\x32\xb9\x07\xb2\xc6\ \xb6\xb7\xa1\xc9\xde\x1d\x48\x5e\x20\x36\x61\xd6\xaf\xba\x5e\xdd\ \xff\xdf\x30\x69\x9a\xf6\x9c\xa6\x69\x2f\x38\x3a\xb4\xb7\xce\x9f\ \x3e\xf2\xcd\xe7\x3d\x2f\x46\x95\x14\xfa\xa5\xcf\x5e\xaa\x5f\x3c\ \x23\xe2\xe7\x4f\x1f\x19\x7d\x56\x9c\xff\x02\x85\x5c\xd5\xd5\x28\ \xd2\xd4\xa2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x86\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7\x6f\ \xa8\x64\x00\x00\x00\x1a\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\ \x72\x65\x00\x50\x61\x69\x6e\x74\x2e\x4e\x45\x54\x20\x76\x33\x2e\ \x35\x2e\x31\x31\x47\xf3\x42\x37\x00\x00\x01\xf5\x49\x44\x41\x54\ \x38\x4f\x63\xc0\x07\x14\xa2\xb6\x70\x88\xc6\x1e\xb1\x64\x0b\x39\ \x90\xc5\x1e\x7e\x78\xa2\x78\xca\xf1\x93\x72\xb9\x67\xbe\xf1\x07\ \x6e\x4f\x86\x2a\xc1\x04\x4c\xc1\x87\xd4\x04\xe2\x8f\x2e\x94\x4e\ \x3b\x79\x47\x22\xeb\xcc\x6f\x99\x82\xf3\x7f\xb4\xea\xaf\xfe\x37\ \xe9\xbe\xfd\xdf\x66\xea\xfd\xff\xba\x4d\xd7\xfe\x33\x84\x1c\x6e\ \x80\x2a\xc7\x04\x52\xee\xb3\x73\x35\x6b\xaf\xfe\x37\x02\x6a\xb0\ \x06\x6a\x70\x5f\xf0\xf8\x7f\xe0\xea\xe7\xff\xbd\x96\x3d\xfb\xaf\ \xdc\x74\xe3\x3f\x5b\xc6\x39\xfc\x06\x28\xfa\xcc\x2e\x09\xdd\xf4\ \xfa\xbf\xdf\x9a\x17\xff\xed\x96\x3c\xfb\xaf\x36\xeb\xc5\x7f\xfe\ \xde\xd7\xff\x19\xaa\x1f\xfe\x67\x28\xbe\xf9\x9f\xbb\xe4\xe2\x1f\ \x7c\x06\x30\xaa\x04\x2d\x2a\xf1\x5b\xff\xfa\x3f\x5b\xce\xd5\x3f\ \x0c\x99\x37\x7e\x31\x45\xee\xbf\xc8\xe4\xbf\x65\x12\xa3\xe7\x8a\ \x54\x76\x9b\x0e\x4d\xed\x92\xfd\xf8\x5d\xa0\x16\xba\xa8\xc4\xa0\ \xeb\xe6\x7f\x26\xe7\xb9\x8e\x0c\xea\x29\x1c\x50\x61\x38\xd0\xaf\ \x3a\x44\xc0\x80\x90\x85\x60\x03\xa0\x5c\x0c\xa0\x5f\x73\x98\x42\ \x03\x6a\x8f\x10\x30\x20\x98\x42\x03\x54\x29\x36\x20\x68\x3e\x86\ \x01\xe6\x65\x27\xd8\x39\xa2\x0e\x37\x70\xc5\x1e\xdd\xa8\x51\x7f\ \xe6\x2f\x76\x03\x82\x0e\x71\xb2\x84\x1f\x4e\x17\x08\xdd\xb2\x09\ \xdd\x00\xd1\xb4\xe3\xdb\xd2\xb7\xbf\xfd\x1f\xbf\xff\xc3\x7f\xcd\ \x29\xc0\xf4\x80\x61\x40\xd4\x21\x16\xe5\xc2\xb3\x67\xd3\x36\xbd\ \xf8\x6b\x3c\xf1\xf6\x5f\x64\x03\xa2\x27\x6e\x63\x91\x2d\xb8\x76\ \x57\x6a\xee\xf7\xff\xac\xb3\xbf\xff\x67\x6a\xbc\xff\x5f\x32\xe9\ \xa0\x21\x54\x1a\x02\x58\xfc\x76\x68\xeb\x74\x3d\xf9\xaf\xb2\xf8\ \xc7\x7f\x8e\x49\x1f\xff\xb3\xe4\x9c\x7f\x0a\x95\x02\x03\x3e\x8f\ \x59\x05\x0c\x75\xd7\x7f\x32\xb4\x5e\xfe\xc9\xee\xd0\xd7\x1c\xba\ \x6a\x15\x23\x54\x0a\x0c\x18\x05\x55\x5d\xc5\x58\x12\xf7\x5d\x67\ \x58\xfa\xf5\x3f\xe3\xd4\x07\xbf\x78\xfd\x7a\x2b\x80\xe2\xbc\x40\ \xcc\x0e\xc4\xac\x40\xcc\xc3\xc0\x2c\x60\xc4\xc0\xc4\x65\x04\x15\ \x67\x03\x62\x26\x20\x06\x03\x16\x20\x36\x65\x60\x64\x2e\x62\xe0\ \xd3\xe8\x67\x60\xe1\xaf\x01\xf2\x7d\x81\x18\xe4\x4c\x29\x20\x16\ \x01\x62\x49\x20\x56\x80\x62\x69\x20\x16\x02\x62\xa0\xc1\x0c\x8c\ \x00\x6e\x47\xe8\x46\x99\x3f\xe6\x62\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x03\x90\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ \x67\x9b\xee\x3c\x1a\x00\x00\x03\x22\x49\x44\x41\x54\x38\x8d\x6d\ \x52\x4d\x6c\x54\x65\x14\x3d\xf7\x7b\xef\x95\xf9\xad\x33\x6d\x07\ \x5b\xa8\xb6\x0a\x86\x12\xa6\xa1\xa2\x33\x8d\x7f\xd1\x98\x46\x37\ \xc4\x60\x58\xa8\xbc\x44\x8c\x90\x81\xf0\xb3\x61\x07\x1b\x0c\x4d\ \x0c\x11\x74\x61\xa2\xe0\x03\xa3\x31\x4c\x25\x98\x34\x01\x37\xfc\ \x04\x21\x92\xd4\xc2\xab\x71\xd1\xd0\x92\xd4\xd2\xc6\x01\x46\x3b\ \xb4\x1d\xe8\xcc\xb4\xf3\xde\xfb\xbe\xeb\xa2\xf3\x92\x59\x70\x92\ \x9b\xdc\xc5\x3d\x27\x27\xe7\x5c\x62\x66\xf8\x48\x65\xb2\xcf\x34\ \xe8\xda\x11\x10\xde\xf4\xa4\x6a\xd5\x84\x98\x27\xc2\xb8\xe3\xca\ \x13\x00\x2e\xd8\x96\xe9\xd6\xdd\x1e\x04\x70\x82\x7c\x81\x74\x26\ \xbb\x45\xd3\xc4\x40\x4f\xd7\x2a\x7d\x5d\x67\xb3\xd1\xd6\x14\x01\ \x98\x51\x28\x56\x30\x32\x76\xbf\x7c\x67\xfa\xa1\x27\x15\xef\xb6\ \x2d\xf3\x6c\x7a\x57\x36\xc3\x8c\xef\x00\xc4\x88\x99\x91\xca\x64\ \xd7\x1b\xba\x18\xd9\xda\xd7\x1d\x8a\xc7\x82\xd0\x89\xd0\x1c\x0d\ \x20\x1c\xd0\x11\x0d\x19\x08\x1a\x02\x33\xc5\x45\x1c\xcf\x0e\x57\ \x0a\xc5\x8a\x1d\x0d\x35\xf4\x3e\x2e\x57\x0d\x66\x34\x11\x33\xe3\ \xd5\x3d\x67\x4f\xf5\xac\x6b\xfb\x34\x18\x30\xc4\xad\xd1\x1c\xaa\ \xae\x07\x43\xd7\xe4\x9a\xd5\xb1\xc5\xbe\xf4\xf3\xe1\xde\xf5\xad\ \xa4\x09\x82\x10\x84\x5f\xae\x4d\xa8\xb7\x5e\x6c\x17\x07\xbe\xbe\ \xea\x38\xae\x6c\xd1\x01\x80\x99\x3f\xbc\x33\x5d\x10\xae\xa7\x58\ \x31\x2f\x32\xe3\x33\xc7\x95\x67\xc6\xa7\x67\x93\x13\xf7\xe6\x8f\ \x5e\xef\x68\xee\xda\xb7\x75\x53\x28\x11\x0b\xe1\xe3\x77\xbb\x44\ \x2d\x06\x02\xa0\x04\x00\x48\xa9\xc2\x55\xc7\xf3\x92\x2f\x3c\xfb\ \x83\x94\xea\x11\x80\x41\xdb\x32\xf3\xb6\x65\x5e\xf9\xe3\xdb\x8f\ \x5e\x1a\x9d\x2c\xec\xdd\x7d\xec\x12\xee\x3f\x2c\x61\x7a\xa6\x0c\ \xa9\x18\x00\x03\x00\x0b\x2c\xaf\xaa\xe9\xa9\x48\x7f\x63\x24\xf0\ \x55\x67\xfb\xca\x6e\x00\x53\x75\x69\xeb\xba\x26\x76\x6e\x7b\x27\ \xe9\x76\x3e\x1d\x45\xa2\x71\x05\x34\x41\xbe\x03\xd6\x6b\x77\xf1\ \x5f\x3f\xdf\xbc\x80\x27\xe3\xb4\x27\xd5\x6b\x17\x87\x27\xab\x57\ \xed\xa9\x25\xdf\xbc\xe3\xaa\x00\x00\xf6\x5b\xa8\x02\x30\x6a\x04\ \xae\x9b\xdf\x00\xec\x04\xe0\x3e\x41\x58\xb7\x2d\xf3\x9e\x2f\xe0\ \x9d\x3f\xfa\xbe\x06\x10\x98\x19\x17\xed\x7f\xd4\xa9\xf3\x7f\xe5\ \xa4\x54\x3d\xb6\x65\x16\xeb\x59\x87\xb3\x63\xab\x4a\xe5\xa5\x8e\ \xdf\x47\xc6\x6f\x00\x88\xe9\x00\x40\x04\x10\x11\xee\xfe\x57\x86\ \x21\x18\x27\x07\xff\x24\x00\x5f\xd4\x93\x53\x99\x6c\x98\x88\xee\ \xf6\x6e\x5c\x7b\x26\x3f\x33\x97\x02\xa0\x01\xa8\x0a\x00\x10\x44\ \x04\x00\x1d\x89\x10\x56\xb7\x84\xf1\xe5\xfe\xb7\xa9\xad\x25\x72\ \xec\x95\x3d\x3f\xdf\x4a\x65\xb2\xe9\x9a\xc6\xf6\x15\x86\xae\xe7\ \xf2\xb3\x07\xf2\x85\xe2\xeb\x9a\x46\xae\x6d\x99\xae\x58\x76\x40\ \x78\x5c\x71\x71\x61\x68\x8a\x3d\x8f\xd1\xbe\x32\x8a\xc3\x3b\xde\ \x08\x7d\xd0\x97\x7c\xb9\xb5\x39\x72\x2d\xbd\x6b\xc0\x35\x74\xf1\ \x8d\x54\x32\x3e\xf7\x68\x01\x4d\x8d\x41\xd2\x84\x18\x04\x00\xff\ \x91\xa8\xff\xc7\xa1\xa5\x89\xdc\xdc\xe4\xa5\xe1\xc9\xce\xcc\x96\ \x4d\xe1\x44\x2c\x88\xee\xb5\x09\x7a\xae\x3d\x1e\x2a\x96\x5d\xfc\ \x3b\x5b\x82\xe3\x78\x14\x09\x1a\x38\x77\x79\xb4\xe2\x49\x75\x04\ \x00\x96\x1f\x49\x31\x4d\xe4\xe6\x4e\xdf\x3c\xb9\x2d\xf9\xa0\xb0\ \xf0\x49\xff\xf7\x37\xe6\x8f\x0f\xdc\x2c\x0d\xdf\xce\x23\x3f\x5b\ \x46\xd5\x95\x10\x44\x28\xcc\x97\xe4\xb9\xcb\xa3\x8b\x52\xa9\x8c\ \x6d\x99\x63\x00\xe0\xb7\xf0\x13\x80\xed\xb6\x65\x72\x2d\x30\x03\ \xc0\x7b\x0d\x86\xb6\x57\x31\x6f\x90\x52\xc5\x0d\x5d\x9b\x21\xc2\ \x50\xd5\x91\x87\x6c\xcb\xfc\xdb\x0f\xf7\x7f\x2e\x55\x76\x6a\x13\ \x65\xcc\xc6\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x8d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0b\x0a\x09\x32\x0e\x93\x53\xb4\xb0\x00\x00\x02\x1a\x49\x44\ \x41\x54\x38\xcb\x9d\x93\xbd\x4f\x93\x51\x14\xc6\x7f\xf7\x6d\x0b\ \xe5\xa3\xbe\xa0\xc4\x1a\x4d\xa0\x68\x9b\x02\xb6\x0b\xc4\x94\x44\ \x87\x8e\xba\x32\x69\xd2\x81\x11\xfe\x22\x3b\x32\x74\x66\x23\xb2\ \x90\x40\x58\x44\x07\x30\x92\x16\x9a\x68\x63\xf8\xb0\x24\xa4\x2d\ \x4d\x5b\x28\xf6\x3d\xc7\xe1\x7d\x4b\x10\x89\x1a\x4f\x72\x73\x93\ \x9b\xf3\xfc\x9e\xe4\x39\xf7\x18\x6e\x54\x0e\x52\xc0\x3c\x90\x06\ \xc6\xbd\xe7\x12\xb0\x0e\x2c\x65\x60\xeb\x7a\xbf\xb9\x21\x7e\x3b\ \x1c\x0a\x2d\x4c\x26\x93\x04\xc3\x61\x7c\x03\x03\xa8\x2a\x9d\xb3\ \x33\xce\xcb\x65\x8a\x85\x02\xd5\x66\x33\x9b\x81\xc5\xdf\x00\x39\ \x78\x37\x9d\x4c\xbe\x1c\x99\x99\xe1\x72\x7b\x1b\xe7\xf4\x14\x1c\ \x07\x55\x45\x0c\x58\x43\x77\xf1\x4f\x4d\x52\xdd\xdd\xe5\x53\xb1\ \xb8\x9a\x81\x57\x00\xbe\xae\xf3\x74\x32\xf9\xfa\x5e\x2c\x46\x7b\ \x73\x13\x6d\x34\x40\x04\x55\x41\x45\x41\x04\x69\xb6\xe8\x1c\x7c\ \xa3\x3f\x16\xc3\xb6\xac\xe8\x8b\x6a\xf5\xc1\x32\xac\x98\x1c\xa4\ \x86\x43\xa1\xf7\xcf\xe6\xe6\xb8\x58\x5b\x43\x9d\x0e\xaa\x8a\x2a\ \xa8\x7a\x62\x05\xc5\x85\xa9\x31\x04\x53\x29\x3e\x6f\x6c\x50\x6b\ \xb5\x66\x2d\x60\x7e\x32\x91\xe0\x72\x67\x07\x75\x1c\x10\x50\x01\ \x15\x71\x0f\xea\x81\x14\x54\xc1\x71\xb8\xc8\xe7\x79\x3c\x16\x01\ \x98\xf7\x03\xe9\x60\xf8\x3e\x3f\x3e\x7c\x44\x45\x19\x2b\x7f\xe7\ \x4f\xb5\x6f\xdf\x41\xaa\x35\x02\x0f\x1f\x01\xa4\xfd\xc0\xb8\xd5\ \x3f\x88\x8a\x1b\xd8\xdf\x4a\x44\x51\xed\x60\x7a\x02\x00\xe3\x16\ \x70\x95\xf6\xbf\x00\xf0\xfa\x54\x05\x00\x3f\x50\xea\xd4\xcf\x26\ \x14\x83\xaa\xc3\x97\x91\x11\xb7\x41\xc4\xbd\x51\x37\x3c\x37\x55\ \x44\xdd\x20\xb5\xd9\x02\x28\x59\xc0\xfa\xf9\xc9\x09\xc6\x1e\xba\ \x22\xff\x22\xee\x3a\x8a\x27\x56\xc1\x1a\x1c\xa4\x5d\xab\x01\xac\ \x5b\xc0\xd2\xfe\xde\x1e\x81\x78\xdc\x25\xcb\x75\x91\x37\x3a\xed\ \x4e\x43\x50\x63\xf0\x47\x22\x94\x0e\x0f\x01\x96\xac\x0c\x6c\xd5\ \x5a\xad\x6c\xa5\x90\xa7\x67\xea\xa9\x0b\xb9\xe6\x8a\x77\xab\x28\ \x18\x43\x4f\x34\x46\xe3\xe0\x80\x7a\xbb\x9d\xcd\xc0\x96\x0f\x60\ \x19\x56\x9e\x57\x2a\xb3\xb6\xcf\x17\x1d\x48\x24\x70\x1a\x0d\xe4\ \xa2\x7d\xf5\x13\x15\x30\x76\x88\xde\xf8\x04\x8d\x72\x99\xc2\xf1\ \xf1\x6a\x06\xde\xdc\xba\x4c\x76\x5f\xdf\xc2\x93\xd1\x51\x02\xb6\ \x8d\xe9\xed\x45\x45\x70\x9a\x4d\x3a\xf5\x3a\x5f\x8f\x8e\xba\xce\ \x8b\xb7\x6e\xe3\xff\xac\xf3\x4f\xc2\x47\x66\x1e\xb9\x58\x76\x77\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x31\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ \x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd5\x0a\ \x0e\x00\x1c\x15\xaf\xe2\xf1\x18\x00\x00\x01\xd0\x49\x44\x41\x54\ \x38\xcb\x95\x93\xb1\x6b\x53\x51\x14\xc6\x7f\xf7\xbd\x34\x82\x24\ \x31\x8d\xd4\x94\x0c\x85\x22\x06\x5c\x5c\xb4\x6a\x62\x04\xd1\x12\ \x70\x76\xd0\x21\x38\x14\x45\x6d\x1d\xc4\xc5\x41\x97\x82\x38\x08\ \x8e\xfa\x0f\x34\x83\xbb\x9b\xa8\x4b\xd5\x2e\xba\x38\x29\x91\x52\ \xa8\xd1\x48\x42\x5e\x6f\x6c\xd0\x46\xef\x39\x0e\xa1\x31\x2f\x6d\ \x20\x7e\xdb\xfd\xce\x3d\x3f\xce\xf9\xe0\x18\x06\x54\x2a\x95\x8c\ \xef\x7b\xcf\x9d\x93\xd9\x7e\xdf\xf7\xbd\x17\xce\x49\xb1\x5c\x2e\ \x6b\xbf\x6f\x00\x6e\xce\x9a\x2b\x06\x1e\x2a\x8c\x2b\x1e\x76\xf2\ \x12\xb9\xdc\x11\x3c\xcf\x00\x20\xa2\xac\xac\x7c\x60\x5f\xed\x29\ \x06\x01\x68\xaa\xea\xad\xc7\x2f\x59\x32\xf3\x67\x89\xf8\x9e\x09\ \x2e\x9c\x39\x18\xfb\xd2\xc9\xf0\x2e\xc8\xd2\xb4\x1d\xa6\xa7\xa7\ \x30\x66\x1b\x20\xac\xad\xad\x93\x4c\x44\x39\x9a\xfc\xcc\xa4\xbf\ \xce\xb3\xd7\xab\x56\x54\x53\x11\x20\xe6\x79\x66\x2c\x1a\xf1\x79\ \x5f\xcf\xb2\x78\xff\x11\x41\x10\x50\xa9\x54\x42\xab\xcd\xcd\x1d\ \x22\x95\x4a\x71\xef\xee\x6d\x2e\x66\xbe\x21\xaa\x31\x20\x1a\xe9\ \xff\xd4\xde\x82\x44\x22\x81\xaa\x30\x33\x73\x6c\x30\x1e\xe2\xf1\ \x38\x5b\x7f\xc0\xa9\xe9\x79\x3d\x80\x6a\x28\x1b\x96\xdf\xbc\x0d\ \xbd\x0b\xf9\x1c\xbb\x29\xc2\x10\x9d\x3e\x95\xe7\x1f\x5c\x10\x71\ \xc3\x01\xba\x4b\x61\x7b\x02\x55\x45\x45\xc8\x9d\x3c\xfe\x7f\x13\ \x14\xf2\x39\x44\x04\x11\x41\x55\xb0\xd6\x32\x31\x91\x1e\x0d\xd0\ \xdf\x28\xd2\x6d\x6e\xfd\x68\x8d\x3e\x81\x88\xeb\x41\xaa\x5f\xab\ \x34\x1a\xf5\x1d\x21\x87\x01\x03\x35\xe7\xba\x80\x56\xcb\xd2\xa8\ \xd7\x29\x16\xcf\x0f\xdb\x14\x6f\xd8\x04\xd6\x6e\x50\xfb\x5e\x43\ \x44\x7a\xfe\xf5\xf9\xab\x5c\x9e\x5a\x1e\xbe\xc2\xde\x31\xa5\x19\ \x34\x49\xa7\x33\xa4\xd3\x19\xb2\xd9\xc3\x58\xbb\x81\xaa\x70\x63\ \xe1\x5a\xaf\xd9\x37\x1a\x02\x6c\x8a\xe8\xef\xf6\x2f\xb7\xe7\x44\ \xf2\x23\x0f\x16\xef\xf0\xd3\xed\x8c\xa6\xb0\xff\x13\xab\xed\x03\ \x00\x24\xb5\x8a\x31\x66\x53\x55\x3b\x06\x60\xe1\x5c\xf7\x1a\x31\ \x8c\x33\x82\x54\xbb\xd7\xf8\xe4\x15\x4b\x7f\x01\x4f\xe6\xe1\x98\ \x78\x69\xc4\xda\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x03\xb2\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xdd\x06\x0f\x0d\x23\x21\x4f\x4f\xb4\xcb\x00\x00\x03\x3f\x49\x44\ \x41\x54\x38\xcb\x5d\x93\xdd\x4f\x5b\x75\x18\xc7\x3f\xbf\xdf\x39\ \x3d\x9e\xd3\xd3\x42\x5f\x06\x05\x47\x69\x0b\x59\x64\x60\xe2\x5b\ \x04\x83\x59\xc2\x96\x78\x61\x62\xd8\xdc\x82\x66\xbc\x28\x1a\xbd\ \x20\xcc\x5b\xff\x01\x6f\x66\xf4\xce\x31\xf0\x72\x89\xe2\xa2\xde\ \xa8\x31\xdc\xe8\x86\xee\x45\x69\xc1\x10\xb7\x69\x02\xab\xa4\x44\ \x0a\x85\xc2\x66\x05\x7a\xda\x9e\x9e\xe3\x85\xeb\x42\xf6\x5c\x3e\ \x79\x3e\xdf\xe7\xf9\xe6\xc9\x57\xf0\x48\x8d\x9f\x1b\xeb\x01\x46\ \x81\x3e\x20\xf1\xa0\xbd\x02\xcc\xaa\xab\xf5\xdf\x7a\x66\xa3\xb7\ \x3e\x2e\x8c\xff\x5d\x9b\x57\x1f\x81\x27\xc3\xa1\x70\xef\xc8\xc8\ \x9b\x3b\xcd\xcd\xcd\x8f\x1b\x86\xa1\x01\x14\x8b\xc5\x96\x6c\x76\ \xed\xe9\x4b\xef\x7d\x73\xb2\xdc\x56\x58\x67\x91\xe7\x6a\x8c\x38\ \x00\xcf\x0c\x0e\x0e\xdd\xef\xe9\x7e\xe1\xf5\xa5\xa5\x25\x61\x59\ \x16\x8e\xe3\x60\xe5\x6c\x7c\x01\x1f\x8d\x87\x0f\xf1\xc5\xe9\x2b\ \xec\xde\xdb\x2f\x6e\x9d\x58\xbc\x61\x7e\xd9\xf9\x96\x14\x8a\x57\ \xd4\x36\x0f\x0e\x0e\x07\x8f\x76\x1c\x1d\x58\x5c\x5c\x94\xae\xeb\ \xe2\xf1\x78\xd0\x34\x8d\xed\xdf\xf6\x48\x7e\xf0\x17\x52\x55\x28\ \xef\x55\xfe\x3f\x5b\x97\xd5\x8a\x55\xc5\xad\xba\x03\x72\xfc\xdc\ \x58\x4f\x38\x14\xee\xed\xe9\xee\x79\x2d\x93\xc9\x48\x8f\xc7\x83\ \x65\x15\xd9\xde\xc9\xb3\x91\xcb\x42\x7c\x9f\x63\x9f\x1c\x41\x0f\ \xa9\xe0\x02\x2e\xf8\xc2\x5e\x45\x9e\xd9\xc8\x14\x46\x7e\xcf\x4a\ \x60\x74\x68\x78\x44\xe4\x72\x39\x21\xa5\x44\x4a\x81\xcf\xe7\xa7\ \xb1\x21\x42\x22\xde\x4e\x7b\xdb\x11\x9e\xe8\x69\x27\xd0\xe5\x7d\ \xe8\x38\xf2\x6c\x80\xfe\x77\x5f\xd6\x81\x51\x15\xe8\x6b\x39\xdc\ \x92\xc8\xe7\xf3\x68\x9a\x46\xc5\xae\xe0\x33\xfd\xa4\xd3\x69\xe6\ \x92\xbf\x00\xb8\xaf\x1c\x7b\x55\xec\xa5\x2b\x74\xbc\xdd\x88\x3f\ \xe4\x67\xe9\xeb\x2c\xcf\x58\xed\x0d\x40\x9f\x0a\x24\x74\x5d\xd7\ \x34\x4d\xc3\x71\x1c\x84\x80\x60\x30\xc8\x5c\xf2\x57\xd7\x6b\x98\ \x4f\xfd\xbb\x5b\xc8\xce\x7c\x37\xb3\xf9\xce\xf9\x31\xf9\x67\x61\ \x81\xb6\x44\x03\xc1\x76\x13\x6c\xa1\x02\x09\x59\xfb\x86\xa6\x69\ \x68\x9a\x86\xaa\xaa\x98\xa6\x89\x94\xc2\xb9\x77\x7f\x67\xd5\xb6\ \x6d\xbb\x1a\xb0\xca\xf1\xde\x26\x2a\x95\x0a\xb6\x6d\x13\xea\x32\ \x09\x77\xf8\x05\x20\x24\xb0\x52\x2a\x95\xec\x9a\x40\x7d\x7d\x80\ \x52\xa9\xc4\x99\xd3\x03\x52\xd3\xb4\x0d\x55\x55\xd3\x27\xfb\x4f\ \x69\x99\x4c\x06\x4d\x7b\xec\xa1\xc8\xee\xee\x6e\x15\x58\x51\x81\ \xd9\xf5\xf5\xf5\x70\x6b\x6b\x6b\x03\x40\x53\xa4\x89\xcd\xad\x1c\ \x9d\x9d\x9d\xe2\xc3\xf3\x1f\xe9\x80\xbe\xba\xba\xca\x95\xab\x3f\ \x90\x88\xb7\x51\xa9\x54\xf0\x7a\xbd\xe4\x36\x73\x45\xe0\xaa\xd2\ \xdd\xfd\x7c\xfe\x6e\x7a\xb9\xff\x78\xdf\x89\xa0\xa2\x28\xa8\xaa\ \x8a\xa1\x1b\x6c\xe5\xb7\x58\x58\x48\x71\xfb\xf6\x2d\xf2\xdb\x79\ \x1a\x1b\x22\x08\x21\x91\x52\x12\x8d\x46\xb9\x7c\x79\xba\x50\xb4\ \x8a\xef\x2b\xa9\xe4\xfc\x5a\xd7\x93\x9d\x1d\x81\x40\xa0\xb9\x35\ \xda\x5a\x27\x84\x40\x4a\x05\x55\xf5\xe0\xf3\xf9\x09\x06\x43\x98\ \xa6\x0f\x29\x25\x96\x65\x11\x8f\xc7\x49\xa5\x92\xff\xdc\xf9\xe3\ \xce\x57\x17\x27\xa6\x3e\x55\x00\x52\xc9\xf9\xef\x0d\xaf\xfe\x92\ \x69\xfa\x0e\xc5\x62\x31\x5d\x4a\x49\xb9\x5c\xc6\x71\x1c\x5c\xd7\ \x05\xc0\x30\x0c\x62\xb1\x18\x37\x6f\xde\x28\xff\xf4\xf3\xec\xb5\ \x8b\x13\x53\x67\x01\x45\xa9\x65\x21\x95\x9c\xff\xdc\xe7\xf7\xc6\ \xaf\x5f\xbf\x96\x88\x44\x9a\x34\x5d\xd7\x65\x5d\x5d\x1d\x86\x61\ \x00\xb0\x96\x5d\xab\x4e\x4f\x7f\xb6\xbf\x7c\x77\xf9\xd2\xc4\x85\ \xc9\xb3\x0f\x30\x57\x1c\x08\xa3\x00\xd4\xa1\xe1\xc1\x17\x4d\xd3\ \xfb\x86\xaa\xa8\xc7\x85\x14\x51\x21\x84\x70\x1c\x67\xcd\xb6\xed\ \x1f\x3d\x1e\xcf\xd4\xc4\x85\xc9\xb9\x83\x09\xfe\x0f\x0e\x6f\x35\ \xe4\xf1\x24\xb6\x8b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x03\x27\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0a\x1c\x16\x1d\x31\x68\x41\x64\x5e\x00\x00\x02\xb4\x49\x44\ \x41\x54\x38\xcb\x85\x93\x5d\x48\x93\x51\x18\xc7\x9f\x73\xde\x77\ \xaf\xaf\xdb\xd4\x7d\xa5\xdb\x6c\xf8\x15\x68\x78\xd1\x55\x10\x74\ \x61\x94\x49\x57\x45\xde\x64\x22\x11\x68\x69\x96\x58\xa8\x69\x81\ \x90\x04\x95\xa5\x7d\x81\x88\x10\x94\x18\xe8\x10\xf4\x4a\x90\x24\ \xba\x0c\x02\xb5\x30\x6d\x33\x36\xf2\x63\xef\x36\x75\x9b\xee\x75\ \x5f\xef\x76\xce\xdb\x4d\xce\x61\x5a\xe7\xee\xfc\xff\x0f\x3f\xfe\ \xcf\xf3\x9c\x83\x20\xe5\x3c\xeb\x7d\x72\x0e\x00\xde\xf3\x3c\xef\ \x6d\xba\x79\xbb\x74\x8f\xd7\xcf\xb2\xec\xa5\x3b\xcd\xad\xba\x54\ \x1d\xa7\x5e\x18\x86\x19\xbb\xd5\xd8\xac\x8d\x46\xa3\xcb\x7d\xfd\ \xaf\x3b\x53\x3d\x05\xab\xb8\x70\xe6\x74\xb9\xe6\xc5\xab\x9e\x4f\ \x07\x02\x08\x21\xfc\x4f\x87\x1d\xd7\xd5\xd6\x57\x10\x42\x8e\xed\ \xe8\x4f\x7b\x1e\x97\x99\x73\xcd\xa6\xed\x90\x88\x28\xa5\x27\x0e\ \x04\x60\x8c\x43\x4b\x4b\xbf\x80\x4f\x4b\x43\xb1\x58\xac\x74\x27\ \x05\xcb\xb2\x53\x85\x85\x85\xe0\x71\x7b\x28\xa5\xd4\xf1\xaf\x04\ \x15\x36\x9b\x0d\x56\x5d\x2b\xa8\xae\xb6\xbe\x38\x91\x48\x9c\xea\ \x79\xde\x3d\x50\x52\x52\xa2\x40\x80\xc1\xe1\x74\x00\x00\x58\x0f\ \x04\xdc\x6d\xbd\xf7\x19\x63\xbc\xbc\xb8\x68\x07\x3e\x8d\x47\x92\ \x24\x1d\xd7\xeb\xf4\xd7\x64\x0a\xb0\xbe\xb1\x46\x01\x60\xa2\xad\ \xa5\xe3\xe1\x81\x00\x00\x00\x4a\x69\xe5\xc2\x8f\x05\x79\x6d\xcd\ \x03\x8d\x37\x9a\x54\xf1\x44\x1c\x89\x62\x10\xe6\xe6\xe6\x24\x00\ \xe8\xda\x5b\xff\x17\xa0\xad\xa5\x63\x1a\x63\x3c\x64\x5f\xb4\xd1\ \x60\x70\x0b\x6b\x34\x1a\x10\xdc\x82\x2c\xcb\xf2\xbb\xb6\x96\x8e\ \xe9\xff\x02\xfe\xa4\x98\x9a\x9d\x99\xc6\x4e\xa7\x03\xd2\x39\x1e\ \x32\xdf\x0e\x46\x10\x42\x6f\xf6\xab\x45\x7b\x85\x31\xa3\xb1\x97\ \x50\x7a\x3d\xbe\xb9\xa9\x26\xe5\x65\x32\x33\xf9\x11\x15\x18\x73\ \x40\x20\x74\x0b\x21\x34\x50\xe9\xf1\xb4\xef\x0b\x18\x33\x99\x3a\ \xe3\x7e\xff\x83\xa3\x26\x13\x24\x28\x45\xde\xad\x4d\xd9\x17\xde\ \x1e\x66\x65\x54\x55\x90\x9d\xc3\xf0\x1c\x47\x25\x59\x06\xe7\xfa\ \x3a\x28\xb2\xb2\xae\x56\xba\xdd\x43\xc9\x16\xc6\xcd\xe6\x1a\xc9\ \xe7\xeb\x2a\x36\x1a\xe9\xc2\xca\xca\x54\x30\x12\x96\x02\x41\x11\ \xd7\xc4\x69\x4d\x94\x23\x3a\x96\xc1\x34\x10\x12\x13\x8e\xd5\xd5\ \x0f\x47\xf4\x7a\x12\xf3\xf9\x06\xc7\xcd\xe6\xdd\x97\x3a\x6a\x30\ \x08\xf3\x45\x45\x64\x84\x61\xee\x03\x00\xcc\x58\x2c\x21\xab\x52\ \x99\xd8\xf1\x47\x18\x86\x7c\xc9\x35\x07\x01\x00\x86\x31\x6e\xff\ \x96\x9f\x4f\x46\x0d\x06\x61\x77\x88\xb1\x98\x5e\x92\x24\x52\x45\ \xc8\xa3\x09\x95\xea\xa5\x82\x65\x79\x84\xb1\x3d\x39\x69\x8e\x9b\ \x51\xf3\xe9\xaa\xc9\x8c\x8c\xbe\xcb\x94\x76\x83\x2c\x53\x20\xc4\ \xb0\x0b\xe0\x38\x41\xad\x54\x32\x5f\xf3\xf2\x62\x26\x9d\xae\x69\ \x5e\x10\xbc\x8a\xcc\xcc\x2b\xc9\x8f\xa4\xd5\x36\x7c\x77\xb9\x36\ \x0e\x1f\x3a\xd4\x30\x6b\xb1\xc4\x08\xa5\x18\x30\x0e\x00\x00\x30\ \x00\x00\xd5\x5a\xad\xcf\xe5\xf7\x9f\xf4\x4b\x12\x1b\x00\x90\x39\ \xb5\xfa\xec\x45\x41\x48\xee\xdc\x2a\x8a\xee\xea\xec\x6c\x8f\x37\ \x10\xc8\xf1\x87\xc3\x1a\x5f\x24\xe2\x53\xa8\x54\xe7\xad\xa2\xe8\ \xfe\x0d\xa0\xf3\x3a\x07\xdc\x34\xc1\x3c\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x8f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0b\x0a\x0d\x37\x0f\x9e\x2a\xd8\xbf\x00\x00\x00\x8c\x74\x45\ \x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x4d\x65\x6e\x75\x2d\x73\ \x69\x7a\x65\x64\x20\x69\x63\x6f\x6e\x0a\x3d\x3d\x3d\x3d\x3d\x3d\ \x3d\x3d\x3d\x3d\x0a\x0a\x28\x63\x29\x20\x32\x30\x30\x33\x20\x4a\ \x61\x6b\x75\x62\x20\x27\x6a\x69\x6d\x6d\x61\x63\x27\x20\x53\x74\ \x65\x69\x6e\x65\x72\x2c\x20\x0a\x68\x74\x74\x70\x3a\x2f\x2f\x6a\ \x69\x6d\x6d\x61\x63\x2e\x6d\x75\x73\x69\x63\x68\x61\x6c\x6c\x2e\ \x63\x7a\x0a\x0a\x63\x72\x65\x61\x74\x65\x64\x20\x77\x69\x74\x68\ \x20\x74\x68\x65\x20\x47\x49\x4d\x50\x2c\x0a\x68\x74\x74\x70\x3a\ \x2f\x2f\x77\x77\x77\x2e\x67\x69\x6d\x70\x2e\x6f\x72\x67\x67\x8a\ \xc7\x47\x00\x00\x02\x84\x49\x44\x41\x54\x38\xcb\x9d\x92\x4d\x48\ \x54\x61\x14\x86\x9f\xb9\xdd\xf1\xe6\xcf\xe4\x4c\xe0\xb5\x31\xcd\ \x91\xb2\x51\x6c\x51\x51\x34\x26\x14\xb8\xc8\x16\x45\x14\x2e\x42\ \x28\x2c\x82\x8a\xa9\xc1\x56\x2d\x2a\xca\x45\x11\x54\x10\x06\x52\ \xb4\x28\x0a\x22\xb0\x28\x28\x6a\x5b\xd0\x22\x89\x44\x8a\xa6\x45\ \x99\x54\x6a\x86\xa4\xe8\xdc\x9b\xce\xfd\xf9\x4e\x0b\x61\x6c\xb2\ \x36\xbd\x9b\xf3\xc1\xe1\x3c\x9c\xf7\x3d\x5f\xe0\xc8\xd9\xe3\x27\ \x3f\x5b\x15\xda\xd8\xb8\x33\x09\x54\x01\x5b\x81\x86\xa0\x26\xd9\ \xd0\xc2\x9f\x3f\x16\x19\xce\xcd\xbb\xe7\xcf\x9d\xe0\x1f\x0a\x34\ \x77\x74\xed\x8d\xad\xac\x8f\x55\x97\x9b\x83\xab\x6b\xca\x3a\xaa\ \x23\x85\x6b\x6d\xcf\x27\xfd\x2d\xc3\xeb\xde\xe7\xea\xc3\xd7\x51\ \xe2\x91\x37\xcb\xba\x3b\xef\x0c\xff\x15\x90\x3c\x7d\xbe\xdb\x9d\ \x1a\x3b\xec\x89\xc6\xa8\x1f\x66\xda\x28\x63\x81\x1e\xa4\xad\x65\ \x23\xcb\x2b\x16\x73\xf9\xfe\x0b\xfc\xa1\x3e\x62\x05\xe3\x7f\x9b\ \xef\x24\x79\x2c\x25\x5f\x46\x06\x44\x44\x64\xe0\x73\x5a\x7a\xd3\ \x03\x92\xba\xf6\x44\x12\x07\x2f\x48\xcf\xab\x2f\xd2\xf5\xf4\xad\ \xb4\x9e\xba\x2e\xef\x06\x87\xe5\x77\x59\x96\x25\xa9\x8e\xa4\xe8\ \x86\xee\xb3\xb4\x3c\xc6\xc4\xc4\x04\xe1\x92\x72\xb4\xc0\x24\x85\ \xe2\x00\xd0\xf7\x71\x14\xb3\x44\xe7\xfb\x78\x86\xf7\x03\x9f\x58\ \xb2\xa8\x10\x02\x00\x42\x41\x41\x01\x00\xba\xe7\x82\x28\xc1\x57\ \x8a\xed\x27\x6e\xcc\xdb\xb1\x77\x70\x02\xd7\xf3\xb9\xd8\xf3\x92\ \x8b\x3d\x2f\x01\x78\x7c\x76\x1f\xc8\x6c\x5f\x03\x50\xa2\x50\xbe\ \xa2\xeb\x50\x23\x00\xed\xbb\x77\xd2\x98\x58\xc7\xcc\x8c\x4d\x34\ \xa4\xd1\x94\x58\xcf\xde\xd6\xed\x00\xec\x69\x5e\x81\xf2\x15\x22\ \x32\x07\x10\x11\x22\x91\x30\x15\x65\x31\x2e\x1d\x58\xc7\xcd\xbb\ \x0f\x88\xc7\xaa\xd0\x08\xa0\x11\x20\x51\x5f\xcd\xad\x7b\x8f\x68\ \xdb\x5c\xc3\x8e\xa6\xf5\x14\x15\x17\xe5\x03\x00\x2c\xcb\xc2\x34\ \x4d\xaa\xa3\xb5\x39\x48\xe3\xaa\xe5\xd4\xc6\x2a\xb9\x7c\xfb\x21\ \x6d\x9b\x6b\xd8\xb5\x29\x81\x69\x9a\x38\x8e\x93\xb3\xa8\x03\x28\ \xa5\xb0\x6d\x1b\x00\xd3\x34\x31\x4d\x93\xee\xa3\x85\x1c\xbb\xda\ \x43\xd6\xf5\xd9\xdf\x52\x4f\xfb\xb6\x2d\x68\x9a\xc6\xd4\xd4\x14\ \xb6\x6d\x13\x0a\x85\xe6\x00\x86\x61\x50\x59\x59\x99\x17\xde\x9a\ \x86\x0d\x3c\xbb\xb2\x01\x00\xdb\xb6\x71\x1c\x87\xe9\xe9\xe9\x79\ \x21\xeb\x00\xfd\xfd\xfd\xb8\xae\x9b\xd7\xf0\x3c\x0f\x5d\xd7\x73\ \xef\x3f\x15\x89\x44\xf2\x33\xf0\x3c\x8f\x74\x3a\xcd\xc8\xc8\x08\ \x99\x4c\x06\x11\x41\x44\x30\x0c\x83\xa1\xa1\x21\x42\xa1\x50\xae\ \x5a\x96\x85\x65\x59\xf9\x57\x50\x4a\x51\x5c\x5c\x44\x30\x18\xcc\ \x7d\x12\x00\xd7\x75\x11\x35\x0b\x13\x35\x7b\x3e\xe5\xfb\xf9\x16\ \xc2\xe1\x30\xa5\xa5\xa5\x44\xa3\x51\x00\xb2\xd9\x2c\x40\x2e\xed\ \x78\x5d\x1c\xa5\x14\xf1\xba\x3a\x94\x52\x2c\x89\x46\x73\x96\x03\ \xa9\x8e\xe4\x19\xe0\x34\xff\xa7\xce\x5f\x93\x3b\x33\x4c\xd5\x22\ \x62\x6d\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\xa3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x04\x01\x11\x35\x35\x2a\x7d\x29\x4b\x00\x00\x03\x30\x49\x44\ \x41\x54\x38\xcb\x6d\x93\xcb\x4f\x5c\x65\x18\xc6\x7f\xdf\x77\xce\ \xf9\x38\x67\xce\x40\xe7\x52\x18\x28\x65\x2e\x0d\x8b\x8a\xb5\x0b\ \x4d\x69\xa2\x1b\xda\xc4\x6d\x35\x9a\xd6\x94\x52\x75\xd3\x18\x84\ \xb5\x2b\xff\x00\x8d\x5b\x28\xb8\xd3\x88\xd8\xa4\xba\x6c\xd8\xa8\ \x45\xa1\xd8\xb9\x40\x24\xb6\x2c\x60\x08\x81\x04\x28\x30\x83\x17\ \x98\x0e\x73\xae\x6e\x4a\x62\x88\xef\xf2\xc9\xfb\xcb\xb3\x78\x9e\ \x47\x70\xe2\x86\x86\x07\x2f\x03\x1f\x02\x7d\x40\xee\x85\xbc\x06\ \x4c\x03\x5f\x8d\x8e\x8c\xe5\xff\xfb\x2f\x4e\xc0\x63\xc9\x44\xf2\ \xf5\xdb\xb7\x3f\xd8\xef\xe8\xe8\x78\xd5\xb2\xac\x66\x80\x7a\xbd\ \x5e\xdb\xda\xda\x7c\x32\x31\xf1\x4d\xa4\xba\x5f\x9d\x1b\x1d\x19\ \x1b\xe4\x7f\x9c\xa7\x1e\xcd\xcd\x7e\xe7\x79\x5e\xb0\xb4\xb4\x14\ \x2e\x2c\x2c\x84\xa5\x52\x29\x5c\x5c\x5c\x0c\xcb\xe5\x72\x58\xad\ \x56\x43\xdf\xf7\x83\xd9\xd9\x99\xa9\xa1\xe1\xc1\xa9\x63\x4e\x3b\ \x76\xee\xef\x1f\x10\x2f\x9d\xef\xb9\x91\xcf\xe7\xe5\xc1\xc1\x01\ \xbe\xef\x23\x84\x40\x08\x81\x61\x18\x48\x29\x69\x34\x1a\x22\x9b\ \xcd\x75\x27\x12\x89\xfd\x88\x6d\xbe\x56\x2c\x94\x1e\x68\x43\xc3\ \x83\x97\x93\x89\xe4\xc7\xb7\xfa\x07\xae\x2e\x2f\x2f\x4b\xdf\xf7\ \xa9\xd5\x0e\x39\xac\x1d\x50\xab\x1d\x50\xaf\x3f\x47\xd3\x35\x9a\ \x94\x42\xd3\x74\xc2\x30\xa4\xbb\xbb\xbb\x33\x9f\x7f\x1c\x79\xe5\ \xe2\x85\x79\xad\xb7\xf7\xd2\xa7\x77\xee\x7c\x94\x76\x1d\x37\x55\ \xaf\xd7\x71\x5d\x07\x5d\x37\x68\x6e\x6e\x21\xd5\xd6\x4e\x6b\x6b\ \x1b\x89\x44\x92\x4a\x75\x97\x26\xd5\x84\xe3\xb8\xf8\xbe\x4f\xaa\ \x2d\xe5\x2e\x2e\xfe\x6e\xe9\x40\xdf\xd9\xce\xb3\xb9\x4a\xa5\x82\ \x52\x0a\xd7\x73\x89\xda\xcd\xac\xae\xae\x92\x2f\xfc\x06\x10\xde\ \xb8\xfe\x9e\xc8\xe5\xce\xb1\x52\x5e\x26\x11\x4f\xe2\x79\x1e\x67\ \xce\x74\x9e\x06\xfa\x24\x90\x33\x4d\x53\x29\xa5\x30\x4d\x13\x21\ \x20\x1e\x8f\x93\x2f\x3c\x0e\x23\x96\x7d\xd1\xf7\xfd\xd6\xef\x7f\ \xb8\x1f\xc4\x62\x31\xaa\xd5\x0a\x9e\xe7\xe1\x38\x0e\x86\x61\x18\ \x40\x4e\x3f\x8e\x53\x29\x45\x10\x04\xe8\xba\x8e\x6d\xdb\x48\x29\ \x82\x3f\xff\xda\xdf\x00\xd0\x34\xcd\x01\x4c\xc7\x71\xf0\x3c\x0f\ \x21\x04\xbe\xef\x0b\x40\x48\x60\xad\xd1\x68\x78\x4a\x29\x94\x52\ \x9c\x3a\x15\xa3\xd1\x68\xf0\xee\x3b\xd7\xa5\x52\xea\x99\xae\xeb\ \xab\x6f\x5d\x7b\x5b\xad\xaf\xaf\xa3\x54\x13\xae\xeb\xe2\x79\x1e\ \x87\x87\x87\x3e\xb0\xa6\x03\xd3\xdb\xdb\xdb\xc9\x74\x3a\xdd\x0a\ \xd0\x9e\x6a\x67\x77\x6f\x87\x9e\x9e\x1e\xf1\xf9\x67\x5f\x98\x80\ \xb9\xb1\xb1\xc1\xcf\x0f\x7f\x24\x97\x3d\x87\xeb\xba\x44\x22\x11\ \x76\x76\x77\xea\xc0\x43\xad\xb7\xf7\x52\xa5\xbc\xba\x72\xed\x4a\ \xdf\xd5\xb8\xa6\x69\xe8\xba\x8e\x65\x5a\xec\x55\xf6\x98\x9f\x2f\ \xf2\xe4\xc9\x1f\x54\xaa\x15\xda\x5a\x53\x08\x21\x91\x52\xd2\xd5\ \xd5\xc5\xbd\x7b\x93\xff\xd4\x8f\xea\x9f\x68\xc5\x42\x69\xf3\xe5\ \x0b\x3d\xe7\x63\xb1\x58\x47\xba\x2b\xdd\x22\x84\x40\x4a\x0d\x5d\ \x37\x88\x46\x9b\x89\xc7\x13\xd8\x76\x14\x29\x25\x47\x47\x47\x64\ \xb3\x59\x8a\xc5\xc2\xdf\x4f\x97\x9e\xde\xbf\x3b\x3a\xfe\xa5\x06\ \x50\x2c\x94\x1e\x58\x11\xf3\x4d\xdb\x8e\x9e\xce\x64\x32\xa6\x94\ \x12\xc7\x71\x08\x82\x80\x30\x0c\x01\xb0\x2c\x8b\x4c\x26\xc3\xdc\ \xdc\x23\xe7\x97\x5f\xa7\x67\xee\x8e\x8e\xdf\x04\x34\xed\xb8\xd3\ \xc5\x42\xe9\xdb\x68\x73\x24\x3b\x3b\x3b\x93\x4b\xa5\xda\x95\x69\ \x9a\xb2\xa5\xa5\x05\xcb\xb2\x00\xd8\xdc\xda\xf4\x27\x27\x27\x9e\ \xaf\x94\x57\xbe\x1e\x1d\x19\xbb\xf9\x02\x0b\xc5\x89\x65\xea\xb7\ \x06\xfa\xdf\xb0\xed\xc8\xfb\xba\xa6\x5f\x11\x52\x74\x09\x21\x44\ \x10\x04\x9b\x9e\xe7\xfd\x64\x18\xc6\xf8\xc9\x39\xff\x0b\xba\x95\ \x51\x6e\x4a\x98\xb4\x3a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x02\x47\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x02\x0e\x49\x44\x41\x54\x78\xda\x63\x64\xa0\x10\x30\x0e\ \x5e\x03\x6c\x6d\x6d\x6c\x19\x99\x18\x5d\x5e\xbf\x7e\x8d\x21\xc7\ \xcb\xcb\xcb\x20\xc0\x2f\xb0\x69\xd7\xae\xdd\x67\xb1\x1a\x20\x21\ \x29\x11\xe9\xee\xe6\x36\x5f\x4b\x4b\x9b\xfd\xfd\xfb\xf7\x0c\x7f\ \xfe\xfc\x61\xf8\xfb\xf7\x2f\x03\x0f\x0f\x0f\xc3\xbb\x77\xef\xc0\ \xec\x7d\xfb\xf6\xb6\xdd\xba\x75\xbb\x1a\xc3\x00\x11\x11\x91\x42\ \x47\x47\x87\x6e\x3f\x3f\x7f\xe6\xc0\xc0\x40\x86\xe9\xd3\xa7\x33\ \x5c\xbc\x78\x91\x41\x4d\x4d\x8d\xa1\xa0\xa0\x80\x61\xdd\xba\x75\ \x0c\x9b\x37\x6f\x66\x38\x70\x60\x7f\xfb\xdb\xb7\xef\xaa\xe0\x06\ \x30\x32\x32\x32\xf1\xf3\xf3\x77\x5a\x59\x59\x15\x0b\x08\x08\x30\ \x56\x54\x54\x30\x68\x68\x68\x30\xfc\xfc\xf9\x93\x61\xd3\xa6\x4d\ \x0c\xbe\xbe\xbe\x0c\x5c\x5c\x5c\x0c\xb7\x6f\xdf\x66\x28\x2b\x2b\ \x03\xba\x60\x5f\xe7\xd7\xaf\x5f\x2b\x60\x06\xb0\x71\x73\x73\xcd\ \x33\x35\x35\x8b\x06\x29\x82\x39\xb7\xa1\xa1\x81\x41\x5d\x5d\x1d\ \x64\x38\x18\xdf\xbb\x77\x8f\x21\x27\x27\x87\xe1\xfb\xf7\xef\x0c\ \xc7\x8f\x1f\xeb\xfa\xf3\xe7\x6f\x39\xcc\x80\x7c\x23\x23\xa3\x09\ \xdc\xdc\xdc\x70\xff\xfe\xfb\xf7\x8f\xc1\xdd\xdd\x9d\xa1\xb1\xb1\ \x11\xac\xe0\xff\xff\xff\x0c\x6d\x6d\x6d\x0c\x4b\x96\x2c\x61\x00\ \xda\xcc\xf0\xfc\xf9\xf3\x6e\xa0\x58\x19\xcc\x00\x5e\x16\x16\x96\ \x25\x40\xdb\xfd\x40\x0a\x99\x98\x98\x80\xb1\x60\xcb\x30\x63\xc6\ \x0c\xb0\xb3\x7f\xff\xfe\xcd\x00\x94\x67\xf8\xf6\xed\x1b\x43\x5a\ \x5a\x1a\xc3\xde\xbd\x7b\x41\x16\xf5\x00\x2d\x29\x45\x0e\x44\x0e\ \x66\x66\xe6\x69\xec\xec\xec\x09\x9c\x5c\x9c\x8c\x5b\xb7\x6c\x65\ \x50\x54\x54\x64\x78\xfc\xf8\x11\xc3\x94\xa9\x53\x18\xd2\xd3\x32\ \x18\x94\x94\x94\x18\x5e\xbc\x78\xc1\x10\x1a\x16\xca\x70\xf7\xce\ \xdd\x5e\xa0\x4b\x4b\xd0\x63\x81\x05\x68\x48\xab\x9c\x9c\x6c\x89\ \x91\xb1\x11\x53\x7a\x5a\x3a\xc3\xd2\x65\x4b\x18\x3e\x7f\xf9\x02\ \x8c\x77\x7e\x86\xc8\xc8\x68\x86\x55\xab\x56\x32\x5c\xbc\x70\x81\ \xe1\xfc\xf9\x8b\x7d\x40\x97\x15\x63\x4b\x07\x4c\xc0\x00\x2b\x02\ \x1a\xd0\xae\xa6\xa6\xc2\xc2\xc7\xcf\xc7\xc0\x07\x4c\x38\x20\xf0\ \x05\xe8\xf7\x77\x6f\xdf\x31\x7c\xfa\xf4\x99\xe1\xd0\xc1\xc3\xfd\ \xc0\xb0\x28\xc2\x95\x12\x19\x81\x51\x19\x06\xb4\xc1\x1d\xe8\x57\ \x0c\x35\xc0\x30\xfa\xcf\xc9\xc9\xb9\x02\x98\xa8\x76\x0d\x7c\x66\ \x02\x00\x31\x2e\xd4\x11\xcb\x82\x32\x5b\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x54\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0b\x12\x0f\x0f\x00\x8f\x23\xd2\xcb\x00\x00\x02\xe1\x49\x44\ \x41\x54\x38\xcb\xd5\x94\xdb\x4b\x54\x51\x14\xc6\xbf\xbd\xcf\x71\ \xce\x8c\x33\xc7\x99\x74\x9c\x71\x6a\x52\xc6\xd0\x46\xb3\x32\x82\ \x4a\xe9\x26\x74\x21\x2a\x5f\x24\xba\xf9\x16\x05\x41\x14\xf4\x1f\ \xf4\x27\x44\x10\x85\x44\x17\xe8\xc1\x91\x32\x28\x7c\xe9\x25\x2a\ \xb1\xec\x6e\x79\xa3\x99\x8a\x74\x9c\xa3\xa3\xa3\xce\xc5\xb9\x9c\ \xb3\xf7\xee\xc5\x82\xa2\xcc\xf1\xcd\x0f\x16\xac\xcd\x5e\xfc\xd6\ \xe2\xdb\xac\x0d\x2c\x37\x91\x7f\x5d\x44\xa3\x37\x54\xa7\x62\x51\ \x92\x24\x43\x6c\x36\x53\x16\xf8\x9c\x20\xe4\x92\x58\x32\x38\x1c\ \xbe\x5e\xb8\xb2\xd8\x5a\x0a\x26\x3b\x40\x61\x01\x18\xd1\x05\xcf\ \x72\x5d\x9e\x55\x18\xd3\x48\x49\x6b\x2a\x6f\xb0\x10\x5d\x0a\xb2\ \xc9\xd5\xe0\xcc\xc3\x04\x9c\x10\xb0\x01\x9c\x40\xd0\x39\x49\xa6\ \x53\xd0\x85\x86\x6c\x2a\x44\x4a\x4f\xe5\xfe\x07\x96\x7f\x3b\xcd\ \xcd\x96\x80\xc0\xc5\x0c\xa3\x1c\x7c\xac\x5e\xb0\x98\x9f\x50\x65\ \x0e\x92\x7b\x88\x19\x8e\x90\x20\x54\xc8\xb6\xc2\x14\x80\xef\x8b\ \x06\x0b\x11\x90\x90\x80\x0a\x2a\x1c\x10\x5a\x4d\x7c\x76\xf4\xb4\ \xd5\xde\x58\x44\x4d\xe5\x9c\x64\x9f\x07\x21\xe5\x1e\x10\xe1\x4c\ \xe5\x98\x14\x13\xe2\xe1\x08\x21\x87\xc5\x22\x27\x4e\x15\x80\x16\ \x98\x18\x27\x66\xb0\x19\xaf\xc5\x5a\xab\xca\xb6\x83\x04\xc4\x2c\ \x71\x48\x55\x24\x1d\xd8\x4c\x4d\xe6\x20\x27\x0e\x13\xa6\xd3\x14\ \x00\x5b\x08\x4c\x7f\x65\xc1\x04\x87\xa0\x1c\x92\xc4\x40\x94\x34\ \xa1\x2c\x03\x3e\x07\x88\x1c\xb8\x1e\xa1\x23\x9a\xc9\xaf\x1b\x60\ \x80\xc1\xb0\x42\xe1\xf9\x3d\x5e\x3a\xe0\x33\x0c\x56\x49\x90\xa9\ \x86\x31\x7a\xc0\xe0\xce\x9d\x5c\x58\xd5\x64\x72\x90\xc6\x52\x3e\ \x1e\x1a\x1e\x48\xd7\xad\xaf\xad\xaf\xa8\x3a\x13\xcc\x0f\x3c\x73\ \xd7\xae\xcb\xf0\x51\x42\x57\x81\xe7\x3c\xe0\x13\x95\x93\xd1\xc9\ \x0d\xa1\xb0\x75\xfb\x4c\xba\xc8\xae\x58\x3c\xa2\xaf\xf7\xf1\x78\ \xcf\xeb\xe9\xea\x8e\xf6\x7b\x89\xc5\x59\x01\x80\x38\x4e\xce\x16\ \x80\x84\x25\x21\x46\x04\x4c\x41\x4a\xbd\xdd\xce\xb2\xda\x36\xc5\ \x64\xbd\x98\x9c\xfa\x9a\x1a\x0e\x7d\x23\xe5\xfe\xa6\xb2\x4c\x26\ \xf3\xf1\x44\xeb\x31\x77\xde\x9b\x27\x62\x01\x25\x8d\xb4\xdd\x22\ \x2b\x6a\x16\xba\x2e\x98\x9c\x38\x73\xe1\x81\x59\xb5\xe9\x6f\xfd\ \x9b\xb6\x94\xb9\x5d\x1e\xb4\xdf\xe9\x1c\xb3\x3b\xec\xbb\x6e\xde\ \xb8\x1d\xcc\x6b\xa5\xff\xa6\x23\x47\x5b\x8a\xb4\xf1\xc8\xab\x96\ \xe3\x87\xab\x5c\xa5\x2e\xd2\x19\xe8\x9a\x28\x29\x2e\x6e\xbe\x76\ \xb5\xed\xe5\x82\x56\xfc\x4f\x1d\xed\xf7\xe2\x65\x6e\xcf\x86\xf6\ \x3b\x9d\x7d\xda\xb8\xc6\x9a\x5b\xf6\xbb\xe2\xf1\x78\xd7\xb9\xf3\ \x67\x0f\xfd\x59\x2b\xe5\xfb\x6b\x0d\xf4\x0f\xb2\x86\xc6\x6d\x6d\ \xcf\x9e\xf4\xec\xab\x58\xe3\x75\xad\xaf\xaf\x55\x87\xfa\x83\x07\ \x9b\x9a\x76\x4f\xbc\x7c\xd1\xfb\x6e\xc9\xe0\x79\xb8\x18\x0b\x47\ \x6e\x45\xb5\xa9\x1d\xe5\x3e\xaf\x7b\xdd\xc6\xb5\x45\x5f\x3e\x7f\ \xdd\xb7\x77\xef\x9e\xb1\xee\xe7\x3d\xef\x97\x02\xa6\x00\x2c\x00\ \x54\x00\x76\x2d\x32\xfe\x28\x32\xaa\xd5\x55\xf8\xbc\xee\xba\xfa\ \x1a\xdb\xfd\x8e\x87\x5b\x47\x47\xc2\x57\x00\xb0\x7c\xc1\x0a\x00\ \x33\x80\x42\x00\x56\x00\xea\x64\x74\xea\x69\x6c\x26\xd7\xf0\xa2\ \xe7\x03\x6a\xfc\x95\x97\xfb\x3e\x7c\x7a\x03\x40\x27\x4b\x70\x42\ \x9e\x6f\xf0\x33\x00\x20\x07\x20\x3b\x1f\x3a\x96\xa5\x7e\x00\x3b\ \xbd\x3b\x41\xf8\x2b\x55\x3b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x02\x00\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ \x67\x9b\xee\x3c\x1a\x00\x00\x01\x92\x49\x44\x41\x54\x38\x8d\xb5\ \x94\xbf\x6e\xc2\x30\x10\xc6\xbf\x33\xe6\x8f\x1a\xb5\x20\x24\xd8\ \x78\x83\x0e\x7d\x80\x3e\x04\x88\xbd\x42\x05\xd4\xb5\x5b\x87\x56\ \xea\x8c\xd4\xbd\x54\x49\x20\x33\x03\x23\xcf\xc3\x03\xa0\x8a\x11\ \x15\xf0\x75\x28\xe7\x26\x71\xa2\x0e\x0d\x27\x9d\x6c\xe5\xbb\xfb\ \xf9\x7c\xb1\x4d\xcc\x8c\x73\x98\x3a\x0b\xf5\x9c\x60\x1d\x45\xd1\ \xf4\x70\x38\x8c\x0b\x5c\xc4\x68\xad\x7d\xf8\xbe\x7f\xe4\x82\xcd\ \xf7\xfd\xa3\x96\x4a\xd7\xeb\x35\x88\xc8\x2e\x2b\xf3\xf4\x98\x9e\ \xcb\xcf\x97\xb1\xd3\xe9\x00\x80\xd2\xf1\xe0\xcd\x66\x83\xdd\x6e\ \x97\x0b\x11\xf3\x3c\x0f\xad\x56\x2b\x13\x2c\x66\xc1\x4a\x29\x94\ \x4a\x25\x28\xa5\xfe\x04\x4b\x1c\x33\x5b\x9d\x99\x13\xf0\x04\xb8\ \xdd\x6e\x5b\x98\x78\x5e\x3b\xd2\xd5\x12\x51\x36\x98\x88\xb0\x5a\ \xad\x9c\xea\xc4\xba\xdd\xae\x8d\xbb\x1b\x3f\x38\x7a\xf4\xf1\x9e\ \x0f\x06\x80\xe1\xf0\xde\x49\x0a\xc3\x19\x94\x52\x36\xce\xbb\xbc\ \x72\x62\xe2\x3b\x4c\x80\x7f\x13\x15\xb6\xdb\x4f\x1b\xd0\x68\x34\ \x13\x3a\x00\x5c\x64\x80\xa5\xe7\xb9\x15\xc7\x61\xe9\x44\x00\x58\ \x2c\x16\xb8\xbd\xb9\x76\xf4\xe5\x72\x89\x7e\xbf\x9f\x0f\x0e\x82\ \xc0\x49\x4a\x57\x3c\x1a\x8d\x1c\x3d\x08\x82\xec\x56\x10\x11\x7a\ \xbd\x1e\x1e\x5f\x5e\x9d\xa4\xe9\xdb\xc4\xd9\x55\x56\xbb\x72\xc1\ \x44\x84\x6a\xad\xe6\x80\xd3\xc7\x8f\xd9\xa0\x5e\x6f\x58\x9d\xd9\ \x38\xbb\x72\xc0\xba\x5c\x71\xc0\x72\x69\x04\x1c\x86\x33\x27\x26\ \xb7\x62\x11\x26\xcf\x4f\x16\x14\x07\x8a\x0f\x06\x83\x53\x95\x6c\ \xdd\x18\x63\xc7\x38\xd8\x00\x50\xcd\xa6\x7b\x12\xfe\x61\x86\xe6\ \xf3\x79\xd1\xef\x31\x2b\xa5\x42\x92\x43\x4d\x3f\x0d\xd2\x27\x2f\ \x03\xa8\xc4\xbc\x7a\xfa\x46\x00\x0e\x00\xf6\x00\xbe\x62\xbe\x17\ \x67\xe6\x23\x00\x50\xfa\xb9\x2b\xca\xbe\x01\xd3\xd8\xe4\x64\x97\ \x03\xd0\xba\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x23\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0b\x0a\x14\x2d\x15\xc0\x92\x43\xe1\x00\x00\x02\xb0\x49\x44\ \x41\x54\x38\xcb\xd5\x95\xcb\x4b\x94\x61\x14\xc6\x7f\xef\x37\x23\ \xf3\x35\x33\x2a\xa6\x79\xcb\x21\x28\xd0\xa4\x56\x5d\x34\x37\xb9\ \x8e\x08\x11\x11\x57\x2e\xa3\x55\x59\xd0\x2e\x68\x51\x7f\x40\xd0\ \xa2\x4d\x2b\x89\x82\x49\xc7\x4d\xb4\x08\x0a\x0a\x22\x0b\x1a\x33\ \x75\x34\x2c\x4c\x6b\x70\x9c\x71\x1c\x73\xee\x33\xdf\xe5\x6d\x31\ \x33\x3a\xe6\x18\x5e\x68\xd1\x59\xbc\xbc\x9c\x73\x78\x9e\x73\x1e\ \x9e\xf7\xfb\xe0\x7f\x0b\xd1\xdf\xdf\x7f\xda\xc4\x78\x2e\x84\x02\ \x20\x40\x6c\x6a\xb0\x08\xe5\xea\xe0\xe0\xe0\xd3\x5d\x03\x77\x75\ \x5d\xf2\x0e\x5c\xbf\x71\x6a\xbb\x86\x27\xee\x91\xcc\xda\x6a\xa0\ \x73\xc8\xed\xf9\xb0\x1b\x60\xab\x89\xd4\xe3\xf1\x38\x63\x5e\x6f\ \xc9\x86\x23\x4d\x8d\xb6\xc9\x5f\xc1\x67\xbd\x7d\x3d\x17\x86\xdc\ \x1e\xef\xce\x81\x0d\x73\xcd\xa6\x56\x52\x5d\x5d\xb3\x6d\x53\xc7\ \xb9\xf3\x87\xde\x8d\xbe\xfe\xd8\xdb\xd7\x53\xaa\x7c\x7f\xc8\xed\ \x19\xd8\x02\xac\x58\x84\x23\x9b\x8e\x6a\xaa\xaa\x96\x2d\x2c\xcc\ \x23\x84\x00\x21\x50\x84\x82\x28\x92\xfb\x44\xeb\xc9\x92\xa4\xbe\ \x99\xa9\x6b\xc0\x56\x60\x55\x55\x27\x02\x4b\x8b\x67\xed\x07\x1c\ \xd4\xd5\xd5\x63\x18\xc6\x8e\x75\x94\x52\x6e\x2f\x05\xf0\x3d\x14\ \x0a\x6a\x87\x1b\x5d\x65\x8b\x4b\x8b\xa4\x64\x39\x93\x6b\x75\xac\ \x65\x6d\x7f\x05\x55\x2d\xb9\x01\xd2\x15\xdd\x9c\xb9\xdc\xbd\x89\ \xa1\xd9\x19\x7c\x6f\x05\xe6\x23\x91\x55\xad\xbd\xad\x83\x68\x34\ \xca\xdb\x39\xb8\x75\xe5\xe2\xbe\x3c\x7c\xef\xe1\x70\xab\x15\x88\ \x64\x32\x59\x6d\xe1\xc7\x02\xc1\x50\x90\x98\xee\x22\x99\xd6\xf0\ \xf9\x63\x7b\x02\x6d\xac\x52\x89\x67\xa4\x6e\x05\x7c\xe1\x70\x48\ \x73\x35\xb9\x48\xc4\x13\xb0\xba\xbf\x17\x17\x8d\xac\xc8\xb4\x6e\ \xf1\x2b\x43\x6e\x4f\xc0\x30\x4c\xdd\xef\xf7\x33\x39\x17\xa4\xb3\ \xad\x05\xb9\x47\xd0\x4a\x7b\x19\x89\x54\xc6\x6c\x4a\xbc\xba\x69\ \x05\xd0\x35\x5d\x93\x48\x92\xa6\x8a\xab\xb6\x9c\xd5\x84\x86\x94\ \x20\x91\x20\x05\xac\x53\xe5\xee\x42\x88\xa2\xda\xba\x47\xb0\xdb\ \x2c\xf8\x02\x61\x0d\xf0\x59\x01\x1c\x4e\xbb\x77\x79\x39\x74\xb4\ \xa5\xf9\x38\xf6\xaa\x3a\xfc\x91\x14\x69\xdd\x2c\x78\x8a\x1c\x85\ \x40\x90\xbb\x0b\x44\x9e\x6f\x63\xb7\x83\xce\x32\x74\x43\x32\x31\ \xfd\xed\xe7\x1b\xb7\x27\x60\xcd\xcd\x21\x3e\xc5\xe3\xb1\xde\x86\ \x63\x8d\xac\xc4\xb2\x04\x22\x99\xa2\xaf\x49\x6e\x32\x89\x44\xe4\ \xef\xb9\x5c\xbe\x06\x20\x05\x59\x43\x32\x36\x36\xa1\xd5\x26\x47\ \xef\x16\x7c\x6c\xf3\xfb\x17\x27\xcb\x2b\xca\xcd\xf6\x86\x1a\xc5\ \x17\xd2\x36\xa6\xcd\xaf\x58\x38\xc5\xba\x20\xa2\x28\x0b\xb5\x95\ \x36\x34\xc3\xe4\xcb\xf4\xc4\xf2\x4b\xb7\xe7\x51\x01\xb8\x66\x6a\ \x6a\xca\x51\xdf\x50\xaf\xbc\x98\x49\x96\x7a\x5e\xc8\x82\xb6\x05\ \x21\xd6\x27\xcd\xd5\x74\x5d\x42\x6c\xc9\x20\x19\x1c\x06\x14\xc0\ \xb4\x02\xb1\x70\x38\x3c\xfb\x79\x7c\xfc\x8e\xc3\x39\x7d\x7b\xaf\ \x36\xd3\x57\x66\xbf\x8e\x8f\x3c\x78\x0c\x38\x81\x68\x61\x3b\x15\ \xb0\xe7\x93\xce\x3c\xeb\x6e\x42\x02\x59\x20\x09\x44\x80\x94\x28\ \xd1\xa4\xf0\xe7\x6f\x64\xe7\x61\x16\x79\xf3\xdf\xc4\x6f\x97\x71\ \x39\x10\x00\x75\x1a\x77\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x02\xd1\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x02\x63\x49\x44\x41\x54\x78\xda\xb4\ \x95\xcd\x6b\xd4\x40\x14\xc0\xdf\xc4\x7c\x6c\x76\xdb\x93\x87\x15\ \xa1\x66\xdd\x76\xaf\xc5\x8f\x93\xa8\xb4\xa7\x6e\x0f\x3d\xf4\x1f\ \x58\x4f\xd5\xaa\x88\x16\x29\x45\x10\xa5\x20\xde\x44\x44\x44\x11\ \x7a\x29\xbd\xae\xb0\xbd\x08\xed\xa5\x5d\xa3\xde\xea\xdd\x5b\x56\ \xa1\xb4\xba\xc5\xd3\x36\x4d\x36\x3b\xe3\xbc\x90\x94\x6c\x32\x63\ \xf1\xb0\x0f\x5e\x26\xc3\x7b\xef\x97\xf7\x66\xde\x4c\x08\x63\x0c\ \x06\x21\x0a\x0c\x48\xa4\xe0\x6f\x8a\x62\xd9\xba\xee\xe0\x28\xb3\ \x6f\x9a\xe6\xae\xcc\x0e\xb8\x14\x69\xdd\x21\xc4\xfa\x98\xcf\xb1\ \xce\xea\x2a\xc3\x11\xe7\xff\x63\x47\x55\x44\x99\xec\x9b\x86\x33\ \xf1\xee\x3d\x78\xad\x16\xe0\x88\xf3\x38\xb3\x93\xec\xb1\x90\xe4\ \xe6\xa5\x83\x62\x31\x2c\x0b\x9a\x77\xe6\xa1\xe8\x7a\x57\xb9\xfd\ \xcb\x3f\xec\xa5\x4b\x94\xb6\x32\x60\x5c\xd3\xcb\x2b\x2b\x56\x32\ \x28\x1d\x9c\x86\x86\xcb\xd9\xeb\x41\xae\x5c\x86\x9d\xb9\xb9\xd6\ \x75\xdf\x2f\x89\x32\x3e\xed\x0c\xe5\xdb\xd3\x6f\xde\x82\x08\xae\ \x73\xb8\xef\x38\x18\x86\x38\x0e\x0c\x18\xeb\x51\x30\x46\x47\x99\ \x7d\xef\xae\x22\xcd\x38\x82\x8f\xf0\x72\x7f\x64\x32\xe3\x6e\x8c\ \x32\x20\x94\x86\x5b\x4e\x3b\x1d\x4a\xbb\x1e\x33\xc7\xc7\x99\xbd\ \x70\x5f\x2d\x1e\x7a\xe7\x63\xa8\xb0\xdd\xb8\xf1\x27\x7e\x19\xcb\ \xc6\xf2\xe1\xf8\xbb\x14\x48\xd0\x05\xf6\xa7\xcd\xe8\xde\x6e\x10\ \xec\xef\xf9\xb9\x91\x73\x5d\x7b\xe1\x81\x7a\xa6\x4b\xcb\x49\xa8\ \xb4\x8f\xd1\x29\x82\x33\xbd\x64\x61\xc9\x00\x87\x2e\x67\xf3\x6c\ \x7f\xfd\x26\xf4\xa0\xad\xe9\x95\x8a\xf9\x79\xf9\x69\xee\xac\x61\ \x8e\x5d\xf4\x3c\x27\xcd\x20\xa2\x23\xbd\x3e\x5c\xb8\xa2\x53\xfa\ \x75\xf2\xd5\x6b\x70\xeb\xf5\xc8\x53\xc1\xb5\x88\x57\x25\x7c\x9a\ \xd5\x69\x68\x3e\x79\xdc\xd7\x0d\x52\xf0\x71\xcb\x3d\x7b\x0e\x47\ \x1b\x1b\xfd\xbb\x1f\x6d\x5b\x52\x72\xd5\xaa\x10\xae\x88\xa0\x93\ \x2f\x5e\x66\xa0\x48\x2d\xd4\x6a\x99\xea\xd0\x0f\xfd\xd3\x87\xa4\ \x0f\xdc\x51\xd5\x26\x3a\xb9\x8d\x46\x06\x90\xbf\x51\x83\xad\xdb\ \xb7\xc0\x9c\x99\xc9\xd8\xd0\x1f\xe3\x30\x5e\x08\x2e\x04\xc1\xc4\ \xe6\xd2\x22\x98\xb3\xb3\xfd\x50\x9e\xe9\xd6\xfc\x4d\x56\x3c\xf2\ \xaf\x6d\x3f\x5a\x0a\xe7\x49\x41\xff\xed\xc5\x87\x61\xbc\xf4\x12\ \xc2\x0b\xa5\x31\x94\x67\xee\xda\x1a\x3b\x98\x9a\x0a\xc7\xe4\x45\ \x83\xa3\xad\xa9\x52\x7b\xac\xd2\xdb\xed\xc3\x70\x41\x1a\x14\xdf\ \x6e\x32\xbb\x14\x8c\x82\xce\x9f\x34\xcd\xa9\x13\x52\xc1\x6a\xd3\ \xba\x4e\xc8\x18\xf7\xf9\xce\xf5\x82\xa8\x72\x61\x1f\x13\x42\x54\ \xec\xa4\x48\x8d\x08\x96\x16\x0f\x9b\x02\xf7\x0e\x95\x73\x7a\x27\ \x1e\x10\x0e\x8e\x5f\x4f\x71\xd5\x04\xed\x8b\x73\x7e\x1c\xa1\x1b\ \x9f\x97\x34\x87\x0c\xea\x67\xfa\x57\x80\x01\x00\x35\x8f\xf6\xe0\ \xa6\x1b\xb5\x58\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x05\x92\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xdd\x06\x0f\x0c\x19\x11\x4d\xfd\x30\x29\x00\x00\x05\x1f\x49\x44\ \x41\x54\x38\xcb\xb5\x95\x6d\x8c\x5c\x55\x19\xc7\x7f\xe7\x9c\x7b\ \xef\xdc\xb9\x3b\xfb\xd6\xe9\xb2\xcb\xbe\x18\xdb\x9d\xd2\xed\x3a\ \x48\x48\x28\xaf\x0d\x2f\xc1\x1a\x05\xc5\x95\x28\x9a\xf8\x61\x79\ \x89\xd1\x88\x26\x46\x4d\x93\x56\x3e\xa1\x82\x46\x82\x40\x42\x13\ \x12\x08\x0b\x44\x23\xee\x12\x6b\x84\x6a\x6c\x2b\x21\x52\xa2\xd8\ \x25\xdb\x6c\xd9\xd2\x29\xc8\xd2\xe2\x38\xed\xb2\xdb\x76\xee\xdc\ \x3b\x77\xee\xcb\x39\x7e\xe8\x76\xb3\x85\x60\xe0\x83\xe7\xcb\xf9\ \x70\x92\xdf\xf3\xe4\xff\xfc\x9f\xff\x81\xff\xd3\x11\xff\xeb\xf1\ \xa1\xad\x37\x8e\xfb\x1d\xed\x5f\x4c\x2c\xfb\x0a\x23\x65\x1f\x20\ \x84\xd1\x27\xec\x24\x79\xb5\xbd\xee\xef\xfa\xfe\x9e\x7d\x4f\x7d\ \xac\x6a\x53\x9b\x46\xc6\x9f\xbc\x7c\xf3\xfc\xf4\xb6\x6d\x7e\xfd\ \xad\xb7\xb2\xd8\xf7\x4d\x1a\xc7\x26\x8d\x13\x13\xfb\x75\x73\xa6\ \x72\x44\xcf\xfe\xfc\xfe\xf0\xc9\x2b\x36\xbf\x3b\xb5\x69\x64\xfc\ \x23\x75\xbc\x6b\x43\xe9\x91\xe1\x9b\xbf\xf0\x8d\xd2\xf6\xed\xdd\ \x18\x23\xc2\x63\xc7\x88\x6a\x27\x31\x3a\xc3\xca\xbb\x58\x9e\x87\ \x7b\x61\x1f\xb9\x9e\x1e\xb2\x38\x61\x6e\xc7\xf6\xe0\xd8\x4b\x2f\ \x3d\x35\x56\x39\x7a\xf7\x6a\x8e\x7a\x3f\x74\xf4\x5b\xdf\xbe\xe3\ \xa2\x1d\x3f\xee\xf4\xe7\xe6\xc4\xa9\x7f\x1e\x20\x3a\xb1\x80\x4e\ \x53\xa4\x65\xa3\x72\x39\x8c\xce\x40\x6b\x74\xb3\x89\x50\x92\x81\ \xaf\xde\xe6\x64\xd5\xea\xa5\x9f\x5b\x5a\x5c\xff\xdb\xf7\x16\xff\ \xf0\x01\xf0\xd4\xa6\x91\xf1\x81\xd1\xd1\x6d\xe5\x07\x1e\xe8\x5c\ \xf8\xeb\x8b\xd4\xe7\x0e\x63\xb4\x41\x67\x1a\x84\x40\xb5\xb5\xa1\ \x5c\x17\x74\x86\x52\x12\x74\x0a\x46\xa3\x5b\x11\xbd\x9f\xbf\x49\ \x36\xa6\xa7\xcb\xd7\xda\xf6\xf1\xdf\xff\xa7\x36\x03\x20\xcf\x81\ \x97\x8a\x6b\x7e\x76\xf1\xa3\x3b\xbb\xfc\x4a\x85\xc4\xaf\x93\xeb\ \xe9\x41\x3a\x0e\x48\x81\xce\x34\x59\x9a\x92\x35\x9b\x98\x38\x46\ \x87\x0d\x4c\x2b\x84\x24\xc2\xa4\x09\x59\xc3\x67\xe3\x3d\xf7\x58\ \x4b\x03\xfd\x0f\x9f\xd7\xf1\x7d\x63\xb7\x8c\x5f\xf7\x99\xad\x5f\ \xef\xbb\xea\x6a\xab\x71\xa4\x02\x3a\x43\x5a\x0a\xa1\x14\x26\x4d\ \xc9\x0f\x0d\x61\x17\x0a\x58\xed\x05\xa4\x49\x11\xad\x00\x29\x41\ \x28\x05\xda\x90\xd4\x7d\x72\x3d\x17\xd0\x38\xf6\x8e\x3d\x54\x2a\ \x9d\x7e\x79\x66\xe6\x1f\x16\x40\x58\x68\xfb\xda\x27\xbf\x7c\xab\ \xd3\x5a\x58\x00\x61\x10\x18\x4c\x9a\xa0\x24\xe4\x3e\x31\xc8\x99\ \x43\xb3\x54\x9e\x7d\x16\x8d\x61\xf8\xfa\x6b\x19\xdc\xba\x85\x2c\ \x6c\x90\x26\x29\x69\xba\x88\xf4\x0a\x08\x27\xc7\xf0\x0d\x37\xca\ \x57\x5e\xf8\xe3\x0f\x80\x47\xce\x4a\xe1\x38\x5b\x0a\x03\x03\xe8\ \x66\x88\xb2\x2c\xa4\x49\x31\x61\x1d\xcb\x82\xe0\xc8\x61\x4e\xec\ \x7e\xc1\x0c\x6d\xdc\xf8\xaf\x8b\x46\x3f\xb5\x3b\x98\x3f\x9e\xd5\ \x5e\x3e\x80\xbd\xb6\x97\xd6\x7b\x0b\x08\x21\x10\x96\x8d\x8e\x63\ \x8a\xa5\x12\x51\x92\x0c\xac\x68\x9c\x64\xba\x4d\x3a\x0e\xd2\x71\ \x90\xb6\x42\x89\x04\x19\x9d\x41\xa5\x01\xaf\x3d\xf3\x34\x6b\x07\ \x87\xfe\x74\xc9\xc4\xc4\xf0\xc8\x13\x4f\xdc\x6c\x07\xc1\xd6\xa3\ \x7f\xfe\x0b\x4e\xff\x10\xaa\xa3\x1b\xab\x78\x01\xaa\xd0\x0e\x42\ \x62\x7b\x1e\x49\x12\x5b\x2b\x60\x21\xce\xfa\x59\x58\x16\xd2\x92\ \x48\x1d\x23\x92\x26\xa4\x2d\x8a\x8e\x43\xbd\x52\xf9\xc5\xb9\xa1\ \x1c\xac\x55\xff\x66\xc0\xe0\xe4\x31\x56\x0e\x23\x25\xc6\x18\x8c\ \xd6\x48\xb9\xe2\x05\x2c\x00\x5b\x59\x91\x49\x92\xbc\x72\x5d\x8c\ \x57\x40\x77\xac\x45\x46\x29\x5a\xd9\xf4\x5e\x73\x35\x8d\x03\x33\ \x8f\x4d\x5c\x7e\xd9\xc5\x00\xc3\x8d\xe0\xa1\xbe\xbb\x6e\x17\x59\ \xe8\x93\xf8\x3e\x46\x28\x90\x12\xa1\x14\xb2\x15\xe1\xd8\x4e\xb6\ \x02\xce\x5b\xd6\xbb\x61\xad\xb6\xc1\xed\xec\x40\x7b\x05\x54\xc7\ \x1a\xb4\x86\x2c\x8a\xe9\xfd\xd2\xad\xb8\xa5\x91\x91\xd2\xe4\xef\ \x5a\x18\xa3\x07\xef\xfe\x8e\x2a\x5e\x76\x09\x61\xe5\x10\xd2\xb6\ \x48\xc3\x00\x21\x24\x6e\x5f\x1f\xf5\x6a\x15\x2f\x9f\x6f\xae\x80\ \x59\x5c\x7a\xf4\xcd\xc9\xc9\x5f\x7d\xfa\x7b\xdf\x15\x32\x6a\xa1\ \xd6\xf4\x20\x0b\x1d\x24\x41\x48\xdc\x08\xf1\x46\xca\x94\xee\xbd\ \x54\x0a\x21\xa5\x30\x29\xfe\xdb\xef\x20\xe3\x08\xd5\xd6\x85\xae\ \x87\xe8\x2c\xc6\x2e\x16\x39\x3a\x39\x89\xe7\x38\xaf\xae\x80\x77\ \x4c\x3d\xf7\xf0\xc0\xd2\xe2\x2f\x47\xc7\xc7\x6d\xab\x50\x40\xd8\ \x36\x69\x10\x20\x8c\x44\x66\x82\xe0\xdf\x55\x92\xd3\xf5\x65\xdf\ \xa6\xd8\x39\x85\xed\x80\x0c\xea\x20\x14\x6e\x5f\x1f\x3a\x8a\xa8\ \xbe\x3e\x6b\x46\xcf\xf8\xb7\x9d\xb7\xd2\xdf\xf4\xbc\x46\x63\x76\ \xf6\xb3\xfd\x63\x63\x02\xc0\x20\xc0\x80\x11\x02\x1d\xa7\xc8\x7c\ \x1e\xe5\x79\x28\xc7\x81\x2c\x83\x34\x45\x87\x0d\x72\xbd\xfd\x78\ \xeb\xd6\xf3\xc6\x4f\xef\x25\x0e\xc2\x5d\xb7\x3c\xff\xfc\xc4\x79\ \xe0\xdf\x2c\x2c\x4c\xdf\xd5\x6a\x89\xb0\x19\x5e\x57\xbc\x66\xcb\ \xd9\xe8\x13\x12\x8c\x21\x0b\xc2\xb3\x6b\xea\xd8\x08\x0c\x64\x29\ \x26\x4d\x71\xfb\x07\xf1\xd6\xad\xe3\xed\x9d\x3b\x59\x9a\x9d\x3d\ \x75\xd3\xde\x7d\x57\x01\x06\x30\x6a\x39\x3a\x5d\x20\xff\xf8\xe2\ \xe2\xcc\x57\xea\xf5\xf2\xc9\xd7\xa6\x4b\x6b\xaf\xbc\x12\xbb\xab\ \x0b\x1d\x27\x68\x9d\x21\x2c\x85\xca\x39\x08\x29\xb1\x3b\x3b\x28\ \x94\x86\xc9\xd2\x84\x23\x0f\x3e\x48\xf5\xd0\x6c\xf4\x93\xb9\xc3\ \x5b\x8e\x47\x51\x0b\x48\x57\x83\xe5\xf2\x6d\x4f\x54\xab\x2f\x6e\ \xe8\xee\x92\x07\xff\xfe\xca\x66\x1d\x35\x85\x55\x68\xc7\xee\xee\ \xc6\x2e\x16\x51\x9d\x9d\x88\x8e\x76\xc2\x24\xe1\xe0\xbe\xbd\xec\ \x79\x6e\x8a\x7a\xb3\x39\x75\xfb\x9e\xbd\x77\xce\x37\x9b\x75\x20\ \x58\x06\xeb\xd5\x41\x2f\x97\x87\xd9\x0e\x58\x6d\xae\xdb\xb6\xe3\ \x47\x3f\xdc\xad\xb5\x5e\xdf\x68\x06\x56\xab\xd5\x12\x00\xb9\x5c\ \x0e\x2f\xef\x69\xdb\xb2\xab\xbf\x7e\xfa\x99\xb1\xd7\xe7\xe7\x4f\ \x01\xa7\x81\x08\x68\x2d\x4b\xa1\x3f\xec\xcf\x93\xab\xd2\xcf\x2a\ \x97\xcb\x5d\xe5\x72\xb9\xdf\x75\xdd\xb6\x5a\xad\x56\xdb\xbf\x7f\ \xff\x49\xdf\xf7\xa3\x73\xdd\x9d\xd3\x75\x35\xe0\xbf\x05\xd5\x4c\ \xec\x72\xd2\x98\xab\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x09\x26\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x03\x1e\x69\x43\x43\x50\x49\x43\x43\x20\x50\x72\x6f\x66\ \x69\x6c\x65\x00\x00\x78\x01\x85\x54\xdf\x6b\xd3\x50\x14\xfe\xda\ \x65\x9d\xb0\xe1\x8b\x3a\x67\x11\x09\x3e\x68\x91\x6e\x64\x53\x74\ \x43\x9c\xb6\x6b\x57\xba\xcd\x5a\xea\x36\xb7\x21\x48\x9b\xa6\x6d\ \x5c\x9a\xc6\x24\xed\x7e\xb0\x07\xd9\x8b\x6f\x3a\xc5\x77\xf1\x07\ \x3e\xf9\x07\x0c\xd9\x83\x6f\x7b\x92\x0d\xc6\x14\x61\xf8\xac\x88\ \x22\x4c\xf6\x22\xb3\x9e\x9b\x34\x4d\x27\x53\x03\xb9\xf7\xbb\xdf\ \xf9\xee\x39\x27\xe7\xe4\x5e\xa0\xf9\x71\x5a\xd3\x14\x2f\x0f\x14\ \x55\x53\x4f\xc5\xc2\xfc\xc4\xe4\x14\xdf\xf2\x01\x5e\x1c\x43\x2b\ \xfc\x68\x4d\x8b\x86\x16\x4a\x26\x47\x40\x0f\xd3\xb2\x79\xef\xb3\ \xf3\x0e\x1e\xc6\x6c\x74\xee\x6f\xdf\xab\xfe\x63\xd5\x9a\x95\x0c\ \x11\xf0\x1c\x20\xbe\x94\x35\xc4\x22\xe1\x59\xa0\x69\x5c\xd4\x74\ \x13\xe0\xd6\x89\xef\x9d\x31\x35\xc2\xcd\x4c\x73\x58\xa7\x04\x09\ \x1f\x67\x38\x6f\x63\x81\xe1\x8c\x8d\x23\x96\x66\x34\x35\x40\x9a\ \x09\xc2\x07\xc5\x42\x3a\x4b\xb8\x40\x38\x98\x69\xe0\xf3\x0d\xd8\ \xce\x81\x14\xe4\x27\x26\xa9\x92\x2e\x8b\x3c\xab\x45\x52\x2f\xe5\ \x64\x45\xb2\x0c\xf6\xf0\x1f\x73\x83\xf2\x5f\xb0\xa8\x94\xe9\x9b\ \xad\xe7\x10\x8d\x6d\x9a\x19\x4e\xd1\x7c\x8a\xde\x1f\x39\x7d\x70\ \x8c\xe6\x00\xd5\xc1\x3f\x5f\x18\xbd\x41\xb8\x9d\x70\x58\x36\xe3\ \xa3\x35\x7e\x42\xcd\x24\xae\x11\x26\xbd\xe7\xee\x74\x69\x98\xed\ \x65\x9a\x97\x59\x29\x12\x25\x1c\x24\xbc\x62\x54\xae\x33\x6c\x69\ \xe6\x0b\x03\x89\x9a\xe6\xd3\xed\xf4\x50\x92\xb0\x9f\x34\xbf\x34\ \x33\x59\xf3\xe3\xed\x50\x95\x04\xeb\x31\xc5\xf5\xf6\x4b\x46\xf4\ \xba\xbd\xd7\xdb\x91\x93\x07\xe3\x35\x3e\xa7\x29\xd6\x7f\x40\xfe\ \xbd\xf7\xf5\x72\x8a\xe5\x79\x92\xf0\xeb\xb4\x1e\x8d\xd5\xf4\x5b\ \x92\x3a\x56\xdb\xdb\xe4\xcd\xa6\x23\xc3\xc4\x77\x51\x3f\x03\x48\ \x42\x82\x8e\x1c\x64\x28\xe0\x91\x42\x0c\x61\x9a\x63\xc4\xaa\xf8\ \x4c\x16\x19\x22\x4a\xa4\xd2\x69\x74\x54\x79\xb2\x38\xd6\x3b\x28\ \x93\x96\xed\x1c\x47\x78\xc9\x5f\x0e\xb8\x5e\x16\xf5\x5b\xb2\xb8\ \xf6\xe0\xfb\x9e\xdd\x25\xd7\x8e\xbc\x15\x85\xc5\xb7\xa3\xd8\x51\ \xed\xb5\x81\xe9\xba\xb2\x13\x9a\x1b\x7f\x75\x61\xa5\xa3\x6e\xe1\ \x37\xb9\xe5\x9b\x1b\x6d\xab\x0b\x08\x51\xfe\x8a\xe5\xb1\x48\x5e\ \x65\xca\x4f\x82\x51\xd7\x75\x36\xe6\x90\x53\x97\xfc\x75\x0b\xcf\ \x32\x94\xee\x25\x76\x12\x58\x0c\xba\xac\xf0\x5e\xf8\x2a\x6c\x0a\ \x4f\x85\x17\xc2\x97\xbf\xd4\xc8\xce\xde\xad\x11\xcb\x80\x71\x2c\ \x3e\xab\x9e\x53\xcd\xc6\xec\x25\xd2\x4c\xd2\xeb\x64\xb8\xbf\x8a\ \xf5\x42\xc6\x18\xf9\x90\x31\x43\x5a\x9d\xbe\x24\x4d\x9c\x8a\x39\ \xf2\xda\x50\x0b\x27\x06\x77\x82\xeb\xe6\xe2\x5c\x2f\xd7\x07\x9e\ \xbb\xcc\x5d\xe1\xfa\xb9\x08\xad\x2e\x72\x23\x8e\xc2\x17\xf5\x45\ \x7c\x21\xf0\xbe\x33\xbe\x3e\x5f\xb7\x6f\x88\x61\xa7\xdb\xbe\xd3\ \x64\xeb\xa3\x31\x5a\xeb\xbb\xd3\x91\xba\xa2\xb1\x7a\x94\x8f\xdb\ \x27\xf6\x3d\x8e\xaa\x13\x19\xb2\xb1\xbe\xb1\x7e\x56\x08\x2b\xb4\ \xa2\x63\x6a\x4a\xb3\x74\x4f\x00\x03\x25\x6d\x4e\x97\xf3\x05\x93\ \xef\x11\x84\x0b\x7c\x88\xae\x2d\x89\x8f\xab\x62\x57\x90\x4f\x2b\ \x0a\x6f\x99\x0c\x5e\x97\x0c\x49\xaf\x48\xd9\x2e\xb0\x3b\x8f\xed\ \x03\xb6\x53\xd6\x5d\xe6\x69\x5f\x73\x39\xf3\x2a\x70\xe9\x1b\xfd\ \xc3\xeb\x2e\x37\x55\x06\x5e\x19\xc0\xd1\x73\x2e\x17\xa0\x33\x75\ \xe4\x09\xb0\x7c\x5e\x2c\xeb\x15\xdb\x1f\x3c\x9e\xb7\x80\x91\x3b\ \xdb\x63\xad\x3d\x6d\x61\xba\x8b\x3e\x56\xab\xdb\x74\x2e\x5b\x1e\ \x01\xbb\x0f\xab\xd5\x9f\xcf\xaa\xd5\xdd\xe7\xe4\x7f\x0b\x78\xa3\ \xfc\x06\xa9\x23\x0a\xd6\xc2\xa1\x5f\x32\x00\x00\x00\x09\x70\x48\ \x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\ \x00\x05\xae\x49\x44\x41\x54\x38\x11\x6d\x95\x5b\x6c\x14\x55\x18\ \xc7\xbf\x99\xd9\xd9\x76\x7b\xef\x96\xb6\xb4\xdd\xda\x0b\xb7\x4a\ \x29\xd1\x16\x22\x09\x18\x5a\x41\x0c\x22\x3c\x20\x4a\xa2\x81\xc8\ \x8b\x35\xe0\x83\x4f\x26\xbe\xd8\x16\x1f\x7c\xd0\x44\x89\x4f\x40\ \x14\x50\x8c\x5a\x49\x54\x88\x72\x69\xb5\x21\xa4\x09\x6d\x81\xde\ \xdc\x96\xde\xb7\xed\x6e\xf7\x3a\x9d\xdd\x99\xdd\xb9\xef\x1c\xbf\ \xd9\xd6\x4d\x51\x4e\xf2\x65\xce\x7c\xe7\xcc\xef\x7c\xdf\x77\xfe\ \xe7\x0c\x10\x42\xe0\x69\xd6\xde\xde\x63\x7b\x9a\x7f\xad\xaf\x93\ \x10\x06\xe0\x0d\x66\xad\xef\xdf\x3e\x65\x75\xd6\x36\x8a\xa2\x68\ \xf4\x51\xe8\x4b\x5a\x7e\x7c\x77\x96\x54\x1d\xab\xab\xdf\x5e\xe9\ \x2a\x2f\xcd\xb7\x53\x4a\x9c\x1f\xb8\x7a\x67\x7a\x02\x46\x26\x71\ \x5e\xea\xe3\x8e\x8e\x0e\x5b\x5b\x5b\x9b\xf1\x04\x67\x2d\x78\x15\ \x6a\xae\x02\xab\xbf\x38\x77\xf9\xdd\xca\xda\xea\x23\x65\x25\x85\ \x5b\x6a\x9e\xa9\xb0\x89\x92\x02\x7d\x6e\x2f\x04\x42\xcb\x9c\x6f\ \xc1\x7b\xff\xa7\x1b\xfd\x97\xfd\x8f\x2e\x5e\xb3\xe6\xff\x0f\x6e\ \x81\x57\xe1\x56\xa4\xa9\xfe\xe9\xd6\x8f\x8e\x5e\xbf\x7e\x67\x7e\ \x72\x3e\x4c\xa6\x42\x2a\x91\x0c\x1c\xc1\x36\xb3\x18\x24\xbf\xf6\ \x2d\x90\xab\xf7\xbc\xa4\x7b\x28\x40\x7e\xff\xb3\x9f\x7c\xf0\xe1\ \xe7\x57\x91\x5b\x84\xc3\xd0\xde\xde\x9e\x2e\x9f\x6d\x35\xba\x74\ \x49\xce\x9c\xf9\xf8\xe4\x6b\xc7\x0e\x5f\xa9\xad\xdf\x0e\xc4\xd4\ \x74\x55\x96\xc0\x17\x94\x99\x98\x20\x52\x51\x85\x00\x03\x26\xe4\ \xb2\x24\xe9\xcc\x48\x9a\x05\x9b\x2b\xed\xdb\xb6\x9c\x78\xbb\xc6\ \xe5\x74\x61\xb6\xaf\x23\x9c\x4b\x47\x6e\xad\xd4\xd3\xb3\xb2\x51\ \x00\x7b\x5f\x7c\x30\x30\x2c\xab\xe8\x9c\x8f\x28\x32\x1f\x13\xc8\ \xd4\x52\x8c\x4c\x86\x0d\x32\xea\x93\x49\xdf\x6c\x9c\xfc\x35\xec\ \x23\x43\x93\x5e\x32\x8b\xd1\x73\xbc\xa0\x4b\x09\x51\x9b\xf3\x2c\ \x90\xb3\x9f\x9c\xfb\xde\x62\x59\x66\x6d\x28\xda\xca\xae\xe2\x1b\ \xfb\xe3\xcf\x7f\x74\xe3\x80\xd5\x14\x4d\x91\xc8\xe3\xd9\x45\x32\ \x32\xcf\x93\x19\x9e\x90\x69\x2e\x49\xfa\x67\x45\xd2\x37\xc9\x11\ \x7f\x88\x23\x09\x49\x4e\x4d\x8c\x45\x79\xc3\xe3\x99\x23\xb7\xef\ \xf4\x90\x57\x0e\xbf\xf7\x26\x3a\x2d\x38\x63\x23\x9d\x9d\x96\x02\ \xe0\xc0\xc1\xf7\xf7\xef\x6c\xac\xdf\x67\xf5\x55\x45\xb6\xcd\xf8\ \x05\x30\x58\x27\x38\x1c\x0e\x30\x93\x26\x98\x26\x81\x24\x06\x93\ \x9f\x41\x81\x2f\x1c\x83\xbe\xf1\x00\x64\xdb\x29\xa8\x2c\xce\x61\ \x6c\x60\x68\x95\xae\x52\xfb\x81\xe6\xe7\x4e\x61\x49\xae\x21\x38\ \x49\x23\x27\x25\x93\xb7\x8e\xb7\xec\x73\x55\xba\x20\x9e\x90\x8d\ \xd1\xd9\x30\xc3\x9b\x39\x90\x95\x9d\x85\xc3\x04\x90\x09\x9a\x91\ \x04\x1d\xcd\x66\xa3\x61\xeb\x86\x72\x68\xac\x73\x01\x63\x77\x40\ \x80\x4b\x80\xaa\x6a\x8c\x20\x8a\x90\x9b\xe7\xd8\xe5\x74\x1e\xac\ \xb3\x82\xb3\xc0\x96\x56\xe9\x9a\xea\xb2\xad\x3e\x2e\x0e\x57\x7a\ \x66\xcc\xa9\x28\x03\x92\x4e\x40\x48\x68\xa0\xe9\x26\xa8\xba\x01\ \x7c\x5c\x85\x1c\x8c\xb0\xa6\x34\x17\x1c\x19\x76\xa8\x2c\xc9\x83\ \x96\xc6\x6a\xa8\x2e\xcb\x85\xc5\x00\x4f\x07\xc3\x3c\xf8\x97\x95\ \x82\x9d\xbb\x6b\x37\x59\xcc\x94\x2a\xf0\x99\xb9\x18\x14\x0b\x37\ \x36\xb0\xb0\x69\x7d\x0e\xb5\x20\x18\x90\xe4\x04\x10\xe2\x76\x28\ \xc8\x62\x81\xa6\x08\xc4\x12\x2a\x94\x96\x67\x81\x8d\x49\xc5\x82\ \x59\x60\x69\x0c\x1d\xcd\x00\x31\x2e\x03\xc7\xf1\xc4\xb7\xac\x51\ \x61\x99\x71\xae\x05\x9b\x13\x5e\x4e\xcf\x18\x0b\x81\xae\x88\xb0\ \xbd\xa2\x08\x4a\x8b\xf2\x60\xd8\xc3\x83\x7b\x3e\x06\x79\x0e\x1b\ \x88\x92\x06\x94\xa1\x40\x45\x01\x0b\x76\x1b\x05\x84\xa2\x21\x11\ \x4f\x20\x58\x83\xe2\x7c\x16\xfa\x06\xc3\xd4\x62\x44\x01\x57\x51\ \xa6\x96\x06\x63\xb1\x95\xf6\xcf\xbe\x5d\x44\x05\x40\x0c\x57\x7f\ \x09\x53\x2c\x75\xe6\x40\xbe\x83\x06\x6d\x28\x00\xee\xa5\x18\xe0\ \xee\x81\x3f\x1c\x85\xb9\x85\x00\x48\x92\x0c\x2f\x37\x3d\x03\xe5\ \x85\x2c\x88\x58\x5b\x21\x16\x23\xa1\xa8\x42\x59\x4a\xca\xd4\x64\ \xaf\x05\xb6\xf2\x4a\xa9\x22\xce\x85\xfb\x89\x14\x83\x75\xd9\x36\ \x26\x2b\x83\x4d\xdd\x01\x05\xb9\x59\x70\x74\x77\x0d\xec\xab\x2b\ \x80\x65\x5e\x80\xa8\x28\xc1\xfd\x69\x1e\xae\x0d\x47\x60\xc0\xbd\ \x08\xd1\x28\x0f\xa8\x63\x70\x4f\x2f\x25\xc7\xfd\x0a\x64\x33\xc9\ \xe9\x99\xae\x87\xe3\x29\x70\x6b\xeb\x85\x54\x9d\xbb\xbf\xfc\xee\ \xa6\xba\xec\x0f\x86\x05\x95\x1e\x1c\xf3\x18\x9a\x2a\x83\x2c\x2b\ \x40\xd3\xb8\x86\x9e\x00\x4f\x90\x87\x38\x66\x43\x61\xea\xf9\x74\ \x12\x4f\x23\x0f\x91\xc8\x32\xf0\xfc\x32\x08\x62\x1c\x0a\x33\xf1\ \x4c\xaa\xf2\x8d\x61\xb1\x37\x94\x02\x5f\xb8\xd0\x9a\xba\xc5\x86\ \x94\xa1\xc9\xa8\x77\xfa\x1b\xc6\x90\xe1\xfc\xad\x49\xa6\x7f\x70\ \xc2\x14\x62\xcb\x30\x37\xe7\x81\xde\xa1\x39\x88\x88\x6a\x0a\x10\ \x89\xc6\x21\x1c\x93\x52\xf5\x15\x84\x28\x78\x7d\x01\xcd\x1b\x96\ \x59\x4a\x11\x83\xbe\xbf\xdd\x5f\x5b\xd0\x96\x96\x0e\x9b\x75\x97\ \x12\x3c\xdf\x74\x73\x73\x33\x39\x72\x68\xef\x62\xdd\xe6\x86\x17\ \x98\x82\x0a\x57\x1e\xab\x99\x79\xac\x4c\xee\x0e\x4c\xd3\x3f\xf4\ \x73\xe0\x40\xfd\x26\xf0\x76\x53\x15\x0d\x6b\x9c\x00\x3d\x1e\x23\ \x65\xd9\x8a\x11\xe2\x13\xf6\xc7\x1e\x01\x42\xf3\xb3\x9f\x0e\x0d\ \xfe\x76\xeb\x2e\x45\x91\x9e\x4b\x6d\x46\xfa\xf2\xa9\xdb\xb3\x27\ \x77\xa2\xb7\x37\x1f\x17\xdc\x79\xf8\x54\xc7\xd9\xe3\xaf\xee\xda\ \x96\xcd\xaa\x70\xa9\x7b\xc1\xec\x8f\x50\xe6\x7a\xd6\xa4\x14\x5d\ \xc7\x52\xa8\x60\xea\x32\x14\xb0\x26\xf3\x7c\x55\x16\xf0\x5c\x14\ \x46\x47\xa6\xce\x8f\x3d\xfa\xe5\x62\x59\x4d\x4d\xc4\x3f\xc7\x04\ \x08\x99\x52\xd3\x60\x3c\x24\xb6\xda\xfa\xa6\xf2\x59\xf7\x43\x4b\ \x87\x75\xef\x9c\x3c\x7d\xc2\x51\x5c\xd5\xe2\xd7\xf3\x1d\x04\xf7\ \x57\x52\x10\x88\xf5\xa5\x89\x01\x2c\xfe\x03\x68\x94\x9e\xc0\x71\ \x9e\xb1\x91\xd1\x6b\x11\xef\xbd\xdb\xc5\xc5\xc5\x9c\x14\xa6\x96\ \x12\x10\x0a\x59\x55\x48\x83\xad\xda\x20\xdc\x5e\x5e\x5b\xbf\xde\ \x50\x7d\x85\x21\x5f\x74\x1d\xc0\x86\xc6\xfd\x87\xf6\xee\x60\x73\ \xf2\x37\xd2\x0c\x5b\x44\x4c\xc2\x24\x75\x5d\x52\x25\x71\x89\x0f\ \xfb\xdc\xc3\x0f\x6e\x0d\xe0\x67\x33\x25\x15\x15\x62\xc8\xa7\x05\ \x01\xc2\x61\x64\xae\xfc\x79\xb0\x63\x31\xd3\x0d\xe1\x94\xd3\xb9\ \x31\xb7\xa9\xa9\x26\xa7\xab\xab\x2b\x13\x07\x72\xd1\xac\x2c\xac\ \xa7\xa5\x20\x05\x0d\x85\x0d\x51\x34\xb9\xea\xd9\x26\x79\x7e\xfc\ \x61\x0c\x39\x12\xbe\xa7\xdb\x13\x11\xa7\xbd\xab\x9d\x1d\xad\xad\ \x6c\x49\x46\x06\x7d\xf3\xc6\x57\x14\x78\x56\xf4\x6e\x0d\x59\x1b\ \xed\x68\x68\x20\x39\x81\x80\xd1\xd9\xd9\x99\x8a\xf0\xbf\xdf\xfe\ \x03\x41\x9e\x9c\x5e\xe1\xf9\x56\x48\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x03\xe9\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0b\x15\x11\x2f\x34\xb0\x7c\xb4\x1f\x00\x00\x03\x76\x49\x44\ \x41\x54\x38\xcb\xb5\x95\x5f\x68\x5b\x55\x1c\xc7\x3f\xe7\xe6\x36\ \xbd\x49\x6e\xd6\xa6\xd9\xb2\xb6\xeb\xaa\x73\x45\xa7\xed\x3a\x64\ \xca\x64\x0a\x82\xe0\xab\x20\xce\x89\x0f\x05\x41\x7c\x56\x61\xf8\ \xa6\x82\xfa\xaa\xbe\xf9\xa0\x0f\x83\xe9\xd4\xb2\x75\x20\xb8\x87\ \x81\x3e\xf8\x20\xee\xc1\xfe\x59\x6c\x6b\xbb\x3f\x76\xa5\x25\x49\ \xdb\x2c\xa6\x69\xd2\x36\xc9\xb9\xe7\xe7\xc3\x4d\xd2\xc8\xb6\xc8\ \x0a\x7e\xe1\x1c\x7e\xfc\x7e\xe7\x7e\x7f\xbf\x7b\x7e\x7f\x8e\xe2\ \x3e\x38\xf7\xcd\xd9\xd3\x28\x46\x3d\xed\x21\x08\xad\xa0\x50\x08\ \x82\x08\x9f\xbc\xf9\xc6\x5b\xef\xb7\x3c\x7c\xe1\xd2\x77\xf2\x20\ \x28\x14\x0a\x72\xee\xfc\xd9\x46\x04\xf6\xc8\xc8\xc8\x71\x83\x77\ \x59\x29\xcb\x77\x8e\x22\x1c\x0e\x59\xba\xea\x01\xe0\x79\xda\x57\ \xdf\x07\xc6\x18\x00\xb4\xae\x12\x0c\x06\x1b\x7a\xbb\x50\xc8\x7f\ \xf9\xf6\x3b\xef\xee\x6f\x3e\xbc\xb2\x9a\xa6\xb7\xf7\x00\x00\x93\ \x93\x93\xa4\xd2\x69\x2c\xa5\x7c\x7e\xd9\xb9\x00\x10\x8c\x08\xb1\ \x58\x27\x43\x83\x43\x0d\x27\x00\xb6\x41\x74\xb1\x58\x64\x62\x7c\ \x1c\x80\x70\x24\x4c\x5f\x7f\x2f\x27\x9f\x79\x96\x7c\x3e\xc7\xc0\ \xc0\x00\x47\x8e\x3c\x86\x65\x05\x7c\x22\x23\x88\x48\x43\x06\xc1\ \xb6\x6d\x52\xe9\x0c\x5a\xeb\x26\x62\xcf\xac\xb7\x3b\x1d\xc4\xe3\ \x7b\x01\x88\x27\x3a\x39\x79\xe2\x39\x4a\xa5\x12\x8b\x8b\x8b\xfc\ \x3e\x3e\x8e\x13\x0a\x35\xc5\x48\x83\xa0\x3d\x18\xe4\xa1\xfe\x7e\ \x06\x07\x87\x58\x5d\xcb\xe0\xba\xee\x0e\xb1\x15\x50\x91\xca\x76\ \xa1\xea\x38\x4e\xdb\xea\x5a\x86\x3d\xb1\x08\xa1\x50\x88\x85\x85\ \x9b\x54\xb5\xe6\xe8\xf0\x10\x4a\xfc\x3b\x56\x96\x42\x8c\xa0\x2c\ \x50\x4a\x61\x3c\x21\xb1\xbf\x9b\xb9\xf9\x79\xe6\xe6\xe7\x88\xc7\ \xbb\x3e\x6d\x10\x3b\x8e\x93\x4c\x67\x52\x4f\x87\x43\x11\x22\xae\ \xcb\x0b\xcf\xbf\x48\x36\xbb\xc6\x5f\x0b\xb7\xd9\x28\x6e\x80\xe0\ \x97\x9b\x31\x48\x3d\x8d\x96\xc2\xb6\x03\x84\x9c\x10\x89\x44\x82\ \x3f\x66\xae\xd1\xd5\x15\xfb\xec\xe5\x97\x4e\x9d\x69\x64\xe0\xd5\ \xd7\x5e\x79\xef\xd8\xf0\xb1\x0f\xfb\xfa\x0e\x86\x9d\x70\x1b\x9d\ \xb1\x1e\xbe\xbd\x92\x64\x36\xbf\xaf\x65\x39\x3a\x01\xbf\x6a\xb6\ \xbd\xc0\x5d\xb6\x47\xdd\x95\xab\x36\x70\x3b\x97\xfb\xbb\x7a\xe8\ \xf0\xc3\x3c\x39\xfc\x14\x63\x3f\x5c\x66\xe4\xf5\xd3\x28\x55\x2b\ \x31\xa5\xfc\x16\x50\xfe\xf2\x13\xc7\x8e\xfd\x1e\xf8\xfc\xab\x8b\ \x8f\xdb\x40\xae\x5c\xae\x54\x3d\xcf\x23\x1a\x8d\x72\x75\xc9\xe1\ \x68\xc5\x30\x9b\x2a\xb1\x1b\xf4\xc6\x1c\x8a\x65\xd1\x16\x30\x93\ \xcd\xae\x56\x3d\xad\x49\x65\x52\x04\x03\xe6\x3f\x5b\xb8\x15\x0a\ \xb9\x3b\xb2\xad\x03\xcb\xd6\x85\xd1\xb1\xb4\xe3\x84\x24\x1a\xed\ \xa0\xb8\x51\xe0\xf8\x13\x07\x90\x5d\xf2\x76\x84\xdb\x28\x6d\x95\ \x4d\x5f\xe9\xe7\x33\x16\x40\x61\x7d\xbd\x6c\x44\xf3\xfd\x8f\xbf\ \xd2\x93\x88\x93\xdf\xf2\x10\x01\x23\x82\x31\x60\x8c\xd4\x16\xb5\ \x06\x69\xb6\xd1\xd0\x87\xdb\x03\x2c\xa5\xb3\x55\x60\xc6\x06\x88\ \xb8\x91\xf1\x5b\x37\x16\x0e\xf5\xf4\x1d\xc6\xdd\xd7\x4f\x2a\x5f\ \x61\x5b\xd7\xda\xb3\xd6\x65\x52\x9b\x61\xd4\x25\x55\xb7\xf9\xe8\ \x72\xdb\xd0\x9e\x90\x9c\xbd\xb9\xf4\xcb\xe8\x58\xda\xf6\x3f\x66\ \xb2\x58\x2c\x9e\xea\x7e\xe4\x20\xb9\xa2\x26\x9d\x2b\x37\xcd\x44\ \x01\xf1\xc7\xa2\xaa\xc9\xbe\xae\x66\x03\x10\x45\xc5\x13\x26\x26\ \x92\xd5\xc4\xe6\x6f\x1f\x03\xd8\x40\xfb\xf2\x72\x2a\x19\xdd\x13\ \x35\x27\x7a\x13\xd6\xcc\xaa\xde\x89\xb6\xe6\xb5\xbe\xab\x7f\xcd\ \xdf\x1d\x5b\xa2\xa3\x9d\xaa\x67\x98\x9b\x4d\xae\xfd\x34\x3a\xf6\ \x75\x9d\x78\xef\xf4\xf4\x74\xa4\xbb\xa7\xdb\xba\xf2\xe7\xe6\xdd\ \x19\x11\xff\x1a\x68\xda\x55\x23\x52\xdf\xa6\xb5\xc0\x46\xc6\x63\ \x73\xe5\x22\x60\x01\xc6\x06\x36\xb2\xd9\xec\xf5\x6b\x53\x53\x1f\ \x45\xdc\xd9\x0f\x76\x5b\x66\xfa\xce\xf5\x1b\x53\x97\xbe\x38\x0f\ \xb8\x40\xa1\xfe\x77\x0e\x10\xae\x29\xdd\x9a\xd7\x07\x81\x00\x15\ \x60\x13\xc8\x01\x5b\xf7\xea\x4b\xab\xe5\x93\xd1\x1a\xa6\xf9\x29\ \xf8\x5f\xf0\x0f\xa8\x39\xd1\x64\xf2\x5e\x8a\xb6\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x70\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xdd\x06\x0f\x0d\x21\x24\x0d\x13\x22\xc6\x00\x00\x04\xfd\x49\x44\ \x41\x54\x38\xcb\xa5\x95\x5b\x6c\x54\x45\x18\xc7\x7f\x33\x73\xce\ \xd9\xdd\xb3\x67\x2f\x85\xb6\x94\xaa\x41\x5b\x8b\x85\x6a\x90\xaa\ \xad\x4a\x83\xa8\x41\x82\x06\xf5\xc1\x1b\xd1\x78\x7b\x42\x1f\x30\ \x62\xd4\x18\xa2\x89\x31\x60\x7c\xd0\x28\xe1\x45\x13\x8d\xfa\x42\ \xa2\xc6\x20\x16\x90\x80\x20\x82\x56\x8c\x8a\x26\x90\x80\x01\x01\ \xa5\xa5\x2d\x65\xbb\xbd\xec\xe5\xec\x39\x67\xc6\x07\xb6\x9b\x4a\ \xbc\x3c\x38\x2f\x93\x99\x64\x7e\xf3\xcd\xf7\xff\x7f\xdf\xc0\xff\ \x1c\x6b\xd3\xef\x34\x3c\x93\xde\x38\xfb\xc2\x7d\xeb\xdf\x0e\xbd\ \xb2\x46\x3d\x02\xac\x00\xba\x81\x26\x40\x00\x43\xc0\xf7\xc0\xe6\ \x17\xdf\x88\x3e\x08\x95\x59\x16\x37\x4e\x16\xd8\xf8\x9f\xe0\x2a\ \xf0\xe5\xee\xee\xee\x99\x4b\x6f\x5b\xe1\xe2\xae\x90\xa8\xd9\xe7\ \xb9\x51\x7f\xb3\x99\xfc\xf8\xae\xef\xbe\xeb\x5b\x06\xbb\xd7\x95\ \x3f\xca\xe5\x29\xcc\x28\x5c\x08\x16\x7f\x03\xdd\xd0\xdd\xdd\xfd\ \xe0\xd2\x3b\x9e\xaf\x03\x2d\x0a\xa3\xdf\x90\xcf\xe7\x31\x46\xe3\ \x38\x0e\x23\x47\xb2\xc4\xec\x99\x48\xb7\x9b\xc8\x1f\xe5\xfd\x95\ \x83\x20\x04\x22\xd4\xcb\xb5\x10\x45\x83\xb6\x04\xb2\x22\x2e\x84\ \x2e\x5f\xbe\xfc\xb1\x6b\x6e\x7e\xd7\x9b\xe8\x7f\x8d\xc1\xc1\x41\ \xa2\x28\x44\x29\x8b\x58\xcc\x21\x91\x70\x19\x3c\xe4\xb2\xf5\x85\ \xcb\x28\x8c\xd8\x00\x18\x00\xa3\x11\x42\x9e\x5f\x1b\x33\xa2\xb5\ \xbe\x4f\x4d\x7f\x7e\x6b\x6b\xcb\x73\xb7\xdd\xb3\x35\x33\xf8\xeb\ \x5a\x4e\x9f\xfe\x03\xad\x35\x5a\x6b\x84\x00\xc7\x89\x61\xdb\x36\ \x5e\x63\xc0\xb5\x0f\x4c\x52\x1e\xb7\x38\x73\xd8\x41\x08\x81\x10\ \x02\x63\x0c\x2a\x73\xe6\x80\x2e\x7b\xd7\xbd\x3a\xf6\xc4\x51\x39\ \x2d\xe0\x75\x2b\x1f\x5e\x97\x0d\x73\xaf\x53\x2e\x97\x49\xa7\xd3\ \x58\x96\x85\x10\xb2\x76\x41\xa5\xe2\x13\x86\x21\xc2\xf6\x59\xf2\ \xf4\x10\xe9\xd9\xba\x76\x38\x39\x23\x22\x76\xe7\x5b\xf3\xd7\xe7\ \x57\x8d\x03\xc8\xa9\x68\x6f\xbd\xf5\x96\x06\xec\xb9\x62\x74\x34\ \x8f\x65\x59\xd8\xb6\x4d\x3c\x1e\x47\x4a\x41\x7d\x7d\x3d\x9e\xe7\ \xe1\x79\x1e\x8e\xe3\x10\x86\x21\x23\x27\x14\xe3\x43\x0a\xa9\xc0\ \x8a\x47\x14\x72\x8a\x39\xe9\x1b\xbd\xf5\xcf\x3a\xab\x6b\xae\x10\ \x82\xfb\xaf\xbf\xfe\x06\x87\xd2\xf6\xea\xd3\x24\x51\x14\x22\xa5\ \xa4\xb1\x71\x16\xbf\xff\x7e\x8a\xbd\x7b\xf7\x62\x0c\x74\x76\x2e\ \xa4\xb3\xf3\x1a\xf6\x6f\x4d\xd1\xd0\xe2\x73\xe7\x5b\x47\x49\x78\ \x8a\xcd\x4f\x5d\x8e\x3e\x7e\xa3\x70\xe7\xee\x5f\x03\x95\x0d\x12\ \x40\x29\xab\x47\xa4\x1e\x23\x0c\x26\x50\xea\x7c\xda\x83\x20\xc0\ \xb6\x1d\x06\x06\xfa\x39\x78\xf0\x67\xd3\xd2\xd2\xfa\x5b\x7b\x7b\ \xfb\xb6\xe1\xe1\xb3\xd1\xa1\x43\x87\x99\xd1\xac\xb8\x7d\xc3\x0f\ \x24\x67\x44\x24\x52\x92\x87\xde\x3f\xcd\x65\x9d\x31\xfc\xa2\xbe\ \xa8\x96\x8a\x28\x0a\x93\xa8\x06\x94\xb2\xb0\x6d\x0b\xa5\x24\x5a\ \x1b\x00\x76\xec\xd8\x41\x53\x53\xd3\xf6\xbb\x1e\x3d\xd8\x7a\xfb\ \x83\xdf\xdf\x11\x45\xd1\xd2\x03\x07\xfa\x58\xb2\xfa\x52\x52\x99\ \x38\x9e\xe7\x11\x8f\xc7\xb1\x6c\xe8\x59\x35\x87\x40\x17\xad\x1a\ \x78\xca\xcf\x42\xa6\x90\x52\x56\x05\x8b\xd0\x5a\x93\x4a\xa5\x18\ \x18\xe8\x7f\x6d\x4a\xa4\x63\xc7\x8e\xed\x03\x0c\xb2\x0e\x21\x24\ \xc6\x50\x13\x17\x99\xfc\x6b\xe5\xd9\xb6\x53\x46\xe7\x13\x58\x17\ \x13\x8b\x8d\x51\xa9\x54\x48\x24\x12\x00\xcc\x9b\x37\x9f\x13\x27\ \x7e\x7b\xfb\x95\x35\xea\x2a\x80\x54\xca\x7b\x73\xf1\xe2\xc5\x82\ \xf0\x24\xa5\x52\x91\xaa\x46\x48\xa9\x70\x53\x27\x71\x1c\x27\x82\ \xd2\x79\xb0\xe3\xd8\xa7\x99\xdc\xd4\x46\x7c\x11\xca\x1e\x24\x16\ \xab\x90\x4c\x6a\x82\xa0\x42\x67\xe7\x42\x1a\x1b\x1b\xda\x8d\x31\ \xbe\x31\xe8\x9e\x9e\x1e\xd5\xd6\xd6\x46\xee\xec\x61\x2c\xcb\xc2\ \xf7\xcb\x08\x21\xc9\x66\xb3\xe4\xcf\x1d\xc1\x75\xdd\x12\x94\x50\ \x00\x37\x75\x19\xa9\x64\xb4\xec\x92\xb9\x8f\x08\xcc\x38\xb6\x0a\ \x88\xc7\x04\x4a\x29\x7c\xdf\x27\x9d\xce\xd0\xd1\xd1\x21\x3a\x3a\ \xe6\xcb\x54\xca\x13\xb9\x5c\x8e\x20\x08\x70\x9c\x18\x41\x10\x10\ \x45\x21\x8d\x8d\xb3\xd8\xb7\x6f\x1f\xc5\x62\x71\xff\x96\x9d\xe3\ \x1f\x2a\x80\x2f\xbf\x8d\x0e\xb4\xcf\x39\xb3\x76\xd1\xa2\x25\x0a\ \xbb\x0d\x44\x02\x41\x80\xa0\x88\xd6\x86\x5c\xee\x1c\x23\x23\x23\ \x4c\x4c\x8c\x33\x36\x36\x86\xd6\x1a\x29\x15\xc6\x68\x8c\xd1\x64\ \x32\x59\x94\x92\xec\xde\xbd\xc7\x18\xa3\xbb\x7a\xbf\x2c\x94\x6a\ \x95\x67\x0c\xcf\x7f\xba\xe9\x39\x83\xcc\x80\x6a\x04\xab\x19\xcb\ \x4e\xd5\x7a\x44\x26\x9b\x26\x9d\xce\xe0\x79\x1e\x00\x95\x8a\x4f\ \xa1\x50\x24\x99\xf4\xa8\x9b\xd9\xca\x96\x2d\x9f\x23\xa5\xdc\xbc\ \xea\x85\xa1\x73\x00\xb5\x5e\xb1\x6b\x7f\xf8\xe3\xa2\xce\x40\x50\ \xf9\xe9\xa6\x8b\x5b\xef\xad\x1a\x46\xa2\xc4\x18\x95\x4a\x09\x10\ \xd5\x12\x17\x35\x17\xd4\xd5\xd5\x51\xdf\x70\x11\xbb\x76\x6e\xe6\ \xd4\xa9\x93\xa3\x4f\xae\x1d\xbe\xa1\xda\x97\x8c\xaa\x5a\x2d\x0e\ \x24\xbe\xf8\xaa\xfc\xf3\xd5\xed\xa3\x57\xf6\x9f\xe8\xbd\x7c\xde\ \xdc\x66\x88\x77\x81\xce\x81\x99\x44\x4a\x81\x6d\xdb\x20\x20\xe9\ \x26\x69\x6a\x9a\x45\x18\x46\x6c\xed\xfd\x8c\xe3\xc7\x8f\x95\xdf\ \xdd\x34\xda\x33\x34\x82\x0f\x84\xd3\xc1\xb2\x3a\xdb\xdb\xf6\x94\ \xf6\x5c\x31\x67\x58\xfe\xf4\xe3\xd7\xd7\x59\xfa\x88\x70\x13\x9a\ \x64\xd2\x25\xee\x5e\x42\x2c\x51\x8f\x1b\x07\xdf\x2f\xd3\xd7\xd7\ \x47\x6f\xef\xe7\x4c\x4e\x4e\x7e\xf2\xec\xfa\xf1\xc7\xcf\x0c\x33\ \x0e\x14\xaa\x60\x3d\xbd\x1f\xcb\xaa\xaf\x53\x80\xe5\xb9\x24\x5f\ \x7f\x69\xf6\x36\xad\x75\x4b\xa1\x50\xb0\x7c\xbf\x2c\x00\x62\xb1\ \x38\xae\xeb\x6a\xdb\xb6\x06\x36\xbe\x37\x70\xf7\x2f\x47\x18\x05\ \xf2\x40\x19\xf0\xab\xa9\xd0\xe2\x1f\xbe\xbb\x29\x51\x15\x60\x75\ \x2d\x20\xdb\xb5\x80\x66\x37\x41\xf2\x8f\x01\x06\xb7\x7f\xc5\x70\ \x7e\x82\xf2\x54\x74\x53\x79\x9d\x0e\xf8\x13\xcb\xef\x0c\x40\x37\ \xea\x17\x2a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x2a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ \x67\x9b\xee\x3c\x1a\x00\x00\x03\xbc\x49\x44\x41\x54\x38\x8d\xb5\ \xd5\x5f\x6c\x53\x55\x1c\x07\xf0\xef\xb9\xff\xda\x6e\xeb\x9f\xb9\ \x75\x1d\x43\xb3\x08\x73\x41\xb2\xbf\xea\x36\x8d\xf2\x82\x89\xcc\ \x08\x0f\x83\xae\x69\x70\xf2\xe0\x50\x94\x04\x12\x40\xcd\x66\x42\ \x02\x6a\xdc\x83\x0f\x26\xc4\x07\xcd\x02\x1a\x30\xa6\xe9\x9a\x18\ \x36\xf7\x00\x4a\x7c\x80\x28\x5d\x35\x5a\xc2\xd6\x06\xcd\x9a\xe9\ \xd6\x6d\x4c\x60\x32\xb6\xde\xde\x9e\x73\x7f\x3e\xf4\x0e\x06\x91\ \x39\x35\xfb\xe5\x9e\x7b\x4e\x72\xef\xfd\xfc\x6e\x7e\xe7\x9c\x7b\ \x19\x11\x61\x35\x42\x5a\x15\x15\x80\xb2\x38\xa8\xab\xdb\x54\xcc\ \x34\x63\x07\x40\x05\x24\x49\x73\x12\x89\xe1\x9f\x63\xb1\xa1\xff\ \x0a\x33\x22\x42\x43\x73\x73\x23\x11\xfb\x1a\xc0\xb7\x60\x2c\x0d\ \x90\x5b\x96\xa4\x76\x97\xb3\x68\xa1\xf2\x41\xdf\x34\x11\x18\x91\ \x99\xca\x66\x8d\x03\xe1\x50\xe4\x97\x15\xc3\x75\x4d\x2d\xfd\x8c\ \xe8\x72\xfc\x87\xa1\xb7\x01\x20\x10\xf4\x6f\x7f\xa0\xa4\xe4\xe4\ \xe8\x58\xba\x70\xdb\xd6\x56\x6a\xac\xaf\x31\xc7\x27\x26\xc4\xe0\ \xc0\x20\x17\x42\xf4\x72\xce\x0f\x87\x43\x91\xb9\x65\xe1\xba\x27\ \x9a\xed\x00\xa6\x00\xac\x8f\xc7\xa2\xd7\x02\x41\xbf\x4d\x55\xd5\ \xb1\xdd\xaf\x74\xfa\x86\x13\x57\x68\x64\x24\x89\xbd\xaf\xbf\xcc\ \x55\x45\x23\x06\x86\x6f\xce\x9d\xcb\x5d\x38\x7f\xc1\xe0\x9c\xbf\ \x01\xe0\xd3\x70\x28\xf2\xb7\xb3\x2f\x01\x78\x06\x40\x22\x1e\x8b\ \x5e\x03\x00\x59\x96\xdf\xac\xae\xae\x76\x96\x95\x95\x61\x6c\x34\ \xc5\x7e\x9f\x98\x40\x46\xcf\xd0\xcd\xb9\x59\x31\xb7\x70\x93\xb7\ \xb6\x6e\x91\xbb\xbb\xbb\x0a\x1e\xdd\xb8\xe1\x43\x55\x55\x2e\x07\ \x82\xfe\xa7\xee\x07\x4f\x03\x28\xb6\x4a\x50\xce\x18\xeb\xde\xba\ \xed\x85\x82\x91\x44\x02\x43\x3f\xfe\x04\x15\x8c\xcd\x4c\x5f\x05\ \x81\x60\x18\x59\x73\x72\x7a\xdc\x10\xc4\x8d\x3d\xaf\xee\xd1\xf6\ \xed\xdb\xbf\xce\xeb\xf5\x9e\xdd\xd9\x11\xec\x0b\x04\xfd\x6b\xef\ \x85\x13\x00\x72\xf5\x4d\x2d\xef\x00\x38\x58\x5b\x57\x2b\x7b\x3c\ \x6e\xf8\xca\xbc\x50\x65\x42\x71\xb1\x93\x5c\x1e\x97\x49\xd6\x82\ \x27\x02\xfd\x39\x37\xcb\xaf\x8c\x26\xe7\x5d\x9e\x22\xe3\xe8\x91\ \xa3\xea\xae\x5d\x2f\x3d\xef\x70\x38\x92\xc1\x9d\x81\xc3\x81\xa0\ \xdf\x76\x7b\xf2\xea\x9b\x5a\x7c\x00\x22\x9a\xaa\x6c\xac\x5a\xf7\ \x90\xa7\xab\xeb\x2d\x49\xb3\x69\xc8\x66\x33\x42\x08\x21\x4c\x22\ \xd3\x34\xf3\x43\x61\x0a\x61\x9a\xc2\x14\x22\xdf\x2b\xb2\x8a\x87\ \x2b\xab\x0a\x9d\x45\x6e\xed\xf4\xe9\x2f\xf5\x33\x67\xce\xde\x32\ \x4d\xb3\x56\x02\x80\x78\x2c\x3a\x1d\x8f\x45\x37\x19\x39\x5e\x9b\ \xc9\xe8\x9f\xf5\xf5\x45\x16\x1c\x76\x07\x29\xb2\x4a\x60\x0c\x20\ \x22\x22\x02\x81\xac\xe3\xce\xdb\xeb\x86\x2e\x86\x93\xf1\x1b\x99\ \xcc\xbc\x51\x55\x55\xa5\x48\x92\x34\x1c\x0e\x45\xae\xdf\xb5\xf3\ \xe2\xb1\x68\x5a\x53\x95\xd7\x52\xa3\xa9\xf4\x40\xff\x57\xba\x66\ \x73\x30\x57\x91\x9b\x31\x49\xba\x83\x02\xf9\x93\x95\x0a\x44\xe4\ \x74\xba\x54\x67\x91\xdb\x76\xfc\xf8\x09\x70\xce\xf7\x2e\xd6\xf8\ \xae\x08\x87\x22\xb9\x5c\x2e\xf7\xf8\xc5\x8b\xdf\xf7\xbe\xff\xee\ \x7b\x7a\x32\x99\x24\x5f\x69\xb9\xe2\x76\x16\xcb\x00\xb3\xf0\x3c\ \x0b\x0b\xdf\xb0\xbe\xc6\x3d\x30\xd8\x9f\xcd\x66\xb3\x9f\x84\x43\ \x91\x5f\x6f\xd7\xf8\x7e\x11\x08\xfa\x1f\xd1\x34\xed\xe3\xd2\xd2\ \x92\xa6\x17\x3b\x3a\xec\x15\x15\x15\xe6\xd5\x3f\x26\xb3\x37\x66\ \xaf\x1b\xa6\x55\x65\x6f\xa9\x4f\x2b\xf7\xae\x75\x1e\x3a\x74\x70\ \x5e\x08\x51\xb9\xb8\x71\x96\x85\x97\x24\xd8\xa2\xaa\x6a\x6f\x43\ \x63\x83\xa7\xdd\xdf\x6e\x53\x14\x59\x8c\x8d\xa7\x6e\xcd\x67\xe6\ \xf9\x93\x8f\x3d\x5d\x72\xec\xa3\x63\xfa\xa5\xf8\xa5\x03\xe1\x50\ \xe4\xc4\xe2\x33\x2b\x82\x2d\x5c\x91\x24\x69\xbf\x2c\xcb\x47\xda\ \xda\xda\xa4\xcd\x9b\x9f\x55\x85\xe0\xe6\xd4\xd4\x14\x7a\x7a\x7a\ \x46\x39\xe7\x35\x4b\x77\xe1\x8a\xe1\x25\x09\xbc\x8a\xa2\x7c\x50\ \x58\x58\xd8\xde\xb9\xbb\x53\x3a\x75\xf2\x94\x98\x99\x99\x79\x2e\ \x1c\x8a\x7c\xb7\xf4\xbe\x7f\x0d\x2f\x49\xd0\xa0\xa8\x4a\x2f\x08\ \xbf\x7d\xf1\x79\x68\xc7\xbd\xd7\x97\x85\x19\x63\x0c\x80\xdd\x6a\ \x36\x00\x1a\xf2\xdf\x70\x06\x80\x00\xf0\x35\x15\x6b\xe4\xc9\xf4\ \xe4\x2c\x00\x1d\x80\xbe\xb8\xc6\xff\x09\x96\x2d\xd0\x0e\xc0\x01\ \xa0\xc0\xea\x25\x00\x06\x80\x8c\xd5\x74\xab\x37\x56\x04\xff\x9f\ \x58\xb5\x7f\xde\x5f\xf5\x72\xf5\x72\x11\x6f\xdf\x2b\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x61\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\x00\x00\x05\x13\x49\x44\x41\x54\x78\x9c\xb5\ \xd5\x6b\x6c\x53\x75\x18\xc7\xf1\x47\x4e\x05\x87\x38\xd0\x25\x4e\ \x88\x97\xc4\x44\x25\xde\x88\x1a\x4d\xd4\xa8\xe1\x05\xd1\x17\x12\ \xa3\x41\x8c\x23\x8c\x65\x59\x66\x33\xea\x9c\xc7\xda\x8c\x31\x8b\ \x7a\x64\x83\x0d\x1d\xea\x00\x11\x45\x4d\x54\x84\x21\x13\xe3\x86\ \x4a\x16\xaf\x4c\x27\x32\xc6\xba\xad\x5b\x57\xd6\x75\x6d\x77\xe9\ \x7a\x5b\x6f\xb0\xf5\xf2\xf5\x45\x67\x03\x8a\x26\xbe\xf0\xc5\x79\ \x73\xce\x3f\x9f\xff\x93\xdf\xf3\x3c\x39\x02\xc8\xff\xf1\xfc\xeb\ \x47\x4d\x55\xd6\x69\xaa\x72\x50\x53\x15\x97\xa6\x2a\x09\x4d\x55\ \x92\x9a\xaa\x78\x34\x55\x69\xd6\x54\x65\xdd\x7f\x86\x67\xc1\xe1\ \x6f\xf7\xdf\x17\x21\x58\x9b\x62\xba\x07\x92\x7e\x48\x06\x60\xda\ \x42\xda\x6f\x4e\xb7\xb7\xac\x88\x6b\xaa\xe2\xfe\xa7\x0b\x2e\x84\ \xbe\xf5\xed\xfe\xfb\xfc\x44\x0f\xa7\x89\x36\x13\x75\x19\x71\x5b\ \x4a\x70\x75\x17\x33\xd1\xaf\x27\xe4\xa8\x80\x60\x2d\x9c\x3d\x05\ \xf1\xa3\x7c\xf9\xd1\x9d\x51\x4d\x55\x76\xfc\x2b\xac\xa9\xca\x5b\ \xbf\x1f\x7d\x34\x42\x72\x82\xb0\x53\xc5\xd6\x51\x80\xb5\x7d\x35\ \xb6\x8e\x02\x9c\x5d\x45\x78\x07\xca\x98\xb4\xad\x27\xe6\x36\x92\ \xf0\x56\x41\x78\x2f\x24\x27\x69\x3b\xf8\x40\x62\xb3\x51\xf7\xc1\ \x05\x61\x4d\x55\xd6\x7d\xba\xe3\x86\x00\x49\x3f\x63\x7d\xa5\x74\ \x7d\xf7\x18\x96\x1f\x9f\xc0\xf2\xe3\x13\x58\xdb\x57\x33\x72\xaa\ \x98\x49\xdb\x7a\xbc\x03\x65\x84\x9d\x2a\x71\x8f\x89\xe4\x64\x35\ \x4c\xed\x82\x99\x01\x9a\xde\xbd\x25\xa1\xa9\x4a\xd1\x85\x60\x37\ \x91\x03\xe9\x84\xb7\x0a\x47\x67\x21\x43\x27\xd6\x62\x6d\x5f\x4d\ \xcf\x4f\xab\xe8\xfd\x79\x15\xc3\x27\x8b\xf0\xf4\x94\x30\xda\x5b\ \x8a\xdf\x6e\x20\xec\x54\x99\x99\xa8\x82\x60\x1d\x44\x9b\x49\x4e\ \x56\x53\x6b\x9a\x37\x75\x1e\xac\xa9\xca\xba\xf6\x96\x15\xd3\x9c\ \xed\xc2\x3b\x50\x86\xab\xbb\x18\x57\x77\x31\x8e\xce\x42\xfa\x8e\ \x3d\xc9\x44\xbf\x1e\xdf\xa0\x81\xa9\xe1\x0a\x7c\x83\x06\x26\xfa\ \xf5\x04\x87\xca\x89\x7b\x4c\xcc\x4c\x54\x71\x66\xd4\x04\xd1\x26\ \xbe\xfc\xe8\xce\x54\xcd\x8b\x73\xcb\xb3\xf0\x6b\x2f\x28\xad\x69\ \xbf\x19\x82\xb5\x4c\xda\xd6\xe3\xb6\x94\xe0\xec\x2a\xc2\xd9\x55\ \x84\x6f\xd0\x40\x67\xdb\x4a\x1a\xcc\xb9\xbc\xf1\x52\x2e\xdf\x37\ \x3f\x44\xd8\xa9\xe2\x1d\x28\xc3\x37\x68\x60\xdc\xaa\xc7\x6f\x37\ \x30\x33\x51\x85\xdb\x52\xc2\xf6\x4d\x0b\x87\xb3\x70\xad\x69\x5e\ \x98\x19\x07\x09\x6f\x15\x81\xd3\xe5\xb8\x2d\x25\xd8\x8f\xaf\x61\ \xb4\xb7\x94\xee\x1f\x1e\xe7\xfd\x6d\xd7\xa4\x0f\x7f\x78\xc7\xe9\ \xd6\x4f\xee\x69\x39\xb0\xfb\xe6\xe4\x2f\xad\x0f\x13\xf7\x98\x18\ \x3a\xb1\x36\x3b\x29\x71\x8f\x09\x02\x1a\x75\x1b\x72\x12\xe7\x56\ \x9c\x22\x15\x25\xed\x37\x13\x19\x51\x19\xeb\x2b\xc5\xd6\x51\xc0\ \x68\x6f\x29\xf5\x55\xf3\x69\xf9\xf8\xee\x96\x3f\xb3\xdb\xb7\xf3\ \xa6\xe5\x0d\xe6\x5c\x88\x7c\xca\x58\x5f\x29\x31\xb7\x91\xb3\x63\ \x95\x99\x38\x22\x4d\xbc\xf6\x82\xc2\xb9\x70\x9a\x54\x14\x82\xf5\ \xc4\xdc\x46\xc6\xad\x7a\xfa\x7f\x79\x0a\xb7\xa5\x84\x77\x6a\xf3\ \xd9\x53\xb7\xe4\xc1\x73\x9a\xac\x6b\x30\xe7\xa6\x89\x1d\x61\xdc\ \xaa\x27\xea\x32\x12\xf7\x98\x88\xb9\x8d\x10\x6b\x3d\x1f\xde\x5a\ \x99\x13\x27\xe1\x86\xc8\x3e\x92\x93\xd5\x04\x87\xca\x71\x76\x15\ \xe1\xb6\x94\xf0\xc3\x17\xcb\xf9\xb0\xe1\x3a\xab\xa6\x2a\x3a\x4d\ \x55\x74\xdb\x37\x2d\x6c\xec\x6c\x5b\x09\x53\xbb\x70\x74\x16\x32\ \x6e\xd5\x33\xd1\xaf\x67\xd2\xb6\x1e\xa6\x76\x52\xb7\x21\x27\x99\ \x85\x1b\xcc\xb9\x36\x82\xf5\x70\xa6\x1d\x42\x0d\xc4\x3d\x26\x7c\ \x83\x06\xc6\xfa\x4a\x89\x8c\xa8\x58\xdb\x57\xf3\xc1\x1b\xd7\xa6\ \xf6\xbe\x7e\x6d\xc2\xd6\x51\x90\x26\xb0\x09\xbf\xdd\x80\xab\xbb\ \x18\x67\x57\x11\x23\xa7\x8a\x09\x3b\x55\x82\x43\xe5\x34\x6a\x79\ \x91\x2c\x5c\xf3\xe2\xdc\xe7\x8e\x7d\xb5\x22\x4d\xc2\x0d\xd1\x26\ \x08\xd6\x93\xf2\x55\x13\x73\x1b\xf1\xdb\x0d\x84\x1c\x15\x84\x9d\ \x2a\x91\x11\x35\xdb\x03\x4f\x4f\x09\xde\x81\x32\x86\x4f\x16\x31\ \x74\x62\x2d\x69\xbf\x99\x6f\x3e\xbb\x97\xf7\xea\xaf\x6e\x3b\x6f\ \x41\xea\x36\xe4\xcc\x10\x6b\x85\xe9\x5e\x88\x7d\x03\xa1\x1d\x24\ \xbc\x55\x84\x9d\x2a\x8e\xce\x42\x7a\x7e\x5a\x45\xdf\xb1\x27\xe9\ \xfd\x79\x15\xf6\xe3\x6b\x18\x39\x55\x8c\xa7\x27\x33\x96\x81\xd3\ \xe5\x4c\x8f\x57\xb2\xab\x26\x3f\xfd\x4e\x6d\x7e\xde\x79\xf0\xd6\ \xca\x9c\xe7\x3f\x7f\xef\xd6\x4c\xd5\x67\x4f\x42\xb4\x19\x82\xb5\ \x4c\x8f\x57\x32\x6e\xd5\xe3\xb2\x14\x67\xe7\xdb\x7e\x7c\x0d\xf6\ \xe3\x6b\xb0\x75\x14\xe0\x1b\x34\x40\xe8\x4d\x9a\xde\xbd\x85\xdd\ \x5b\x16\x1f\xfa\xdb\x4a\x8b\xc8\xc5\x6f\xbe\x7c\xf9\xab\xbf\x1e\ \x79\x04\x66\x86\xe1\x4c\x07\x44\x0e\x40\xe0\x55\xfc\xf6\xcc\x22\ \x78\x07\xca\x18\xed\x2d\xc5\xd1\x59\xc8\xe0\x6f\x05\x99\x86\x05\ \x6b\x38\x7a\xe0\x7e\x1a\xb5\xbc\x80\x88\xcc\x13\x91\x39\xb3\x9e\ \x5c\x24\x22\x97\x88\xc8\x42\x11\xb9\xaa\x51\xcb\x3b\x72\xe8\xfd\ \xdb\x20\xb4\x23\x13\xcb\xd4\x6e\xe2\x1e\x13\x53\xc3\x99\x9c\x7d\ \xb3\x99\xa7\x7c\xd5\x84\x1c\x15\x1c\xdc\x73\x2b\xdb\x37\x2d\x3c\ \xb3\x6c\xa9\xdc\x2e\x22\x79\x22\x32\x57\x44\xe6\xfc\x09\xcf\x15\ \x91\x4b\x45\xe4\x4a\x11\xb9\xc1\xfc\xac\x34\x6e\xdb\xb8\x20\xdd\ \xf1\xf5\x23\x04\x4e\x97\x93\xf2\x55\x43\xe8\x6d\x98\xda\x09\x81\ \x57\x08\x39\x2a\x68\x3b\xf8\x00\x75\x1b\x72\x68\x30\xe7\x36\xe9\ \x74\x72\x97\x88\x5c\x3f\x5b\x5c\x06\x3e\x27\x8a\x39\xb3\x2f\xf3\ \x44\x24\x7f\xc1\x7c\xb9\x7e\xf7\x96\xc5\xfd\xbb\x6a\xf2\x67\xb6\ \x6d\x5c\x90\xde\x6c\xd4\xb1\xd9\xa8\x63\xdb\xc6\x05\xec\xdc\x7c\ \x65\x6a\x4f\xdd\x12\xd7\xb2\xa5\x59\xf0\x0a\x11\x99\x2f\x22\x4a\ \x36\x8a\x0b\xfe\x56\x32\x97\xcc\x11\x91\x8b\x45\x24\xe7\x9e\x65\ \xb2\xd8\x50\x28\x77\x99\x9e\x91\x07\x9f\x5e\x29\x37\x2e\xba\x4c\ \x16\xcd\xc6\xa7\x9b\x3d\x77\xd1\x5f\x8d\x3f\x00\xaa\x6e\x0b\x3a\ \xfe\x92\xe9\xdb\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x02\xd3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x02\x65\x49\x44\x41\x54\x78\xda\xb4\ \x55\x4d\x68\x13\x51\x10\x9e\x99\xcd\x6e\x4d\xd1\x8b\x3f\x07\x11\ \xc5\x43\x6f\x6a\xfd\x49\x1a\x49\x85\xf6\x62\x0f\x16\x0f\xfe\x5c\ \x6c\x1a\xc1\x83\xd1\x0a\x42\x0f\x4a\xa1\x45\xbd\xfa\x73\xe8\xa1\ \x0a\x92\xd4\x43\x0f\x36\xa5\xa0\x3d\x48\x0f\x6a\x0c\x68\xa5\xa5\ \x31\xa9\xe2\xc5\x4b\x3d\xb7\x8a\x52\x28\x85\xc6\xd6\x7d\x6f\x9c\ \xdd\x6c\x50\x4a\xd0\x6c\x6a\x1f\xcc\xee\xc7\xee\xec\xf7\x66\xbe\ \x99\x37\x8b\xcc\x0c\x1b\xb1\xa8\x96\x8f\x22\x5d\xc3\x27\xc2\x97\ \x07\xeb\xff\x3b\xb1\x24\xd9\x8a\x60\x1e\xfb\x9b\x0f\x56\x2b\x85\ \x13\xa5\xe6\xe5\x37\xa8\x83\x45\x4d\xd0\x6b\x30\x46\x15\x53\x7c\ \x66\xb0\x63\x71\x5d\x11\x6b\x0d\xa7\x88\x83\x7d\x02\x0d\x4d\xdc\ \x2f\xf1\xec\x92\xd8\x4f\x37\xc6\x46\xb1\x92\x7f\xe0\x5f\x84\xc1\ \x1b\xb7\xf7\xec\xff\xba\x7b\x4e\x05\xb8\x17\x6d\x9a\xd4\x80\x39\ \x00\x35\x0e\x88\x7d\x84\xdc\x0f\x0c\x4f\xc5\x6d\xc9\x77\xc4\x8d\ \x5f\xf6\x26\xe4\xd6\xfd\xe1\xe1\xf9\x05\x21\xbb\x40\xc4\xf7\xd5\ \xa2\xb5\x55\x9e\xbd\x76\x74\x0c\xd4\xdb\x87\x7d\x49\x11\xb9\x94\ \x0e\x45\x13\x23\xa8\x0c\x35\x20\x84\x27\x9b\xbb\xd2\x07\xf3\xa9\ \x58\x4e\xc8\x3e\x5b\x5b\x56\xdb\x04\xff\x10\xb7\x5c\xc0\xd4\x47\ \x7d\x11\x8b\x70\x2d\x1a\x75\x5b\x21\x19\xff\x86\x0c\xa3\xab\x8a\ \xcf\x78\xaf\xb2\x04\xe4\x75\x04\x4e\x02\x53\xc8\x5f\xf1\x58\x65\ \x34\x70\xbb\x5b\x38\xe0\x69\xd9\x29\x5c\x6a\x35\x63\x42\x0a\xd7\ \x52\xc2\xf4\x49\xf0\x3e\x7f\xc5\x23\xb4\xe5\x62\xbb\x50\x96\x10\ \x78\x7d\xa9\x51\xb2\x29\x63\x25\xd8\xf0\x15\xb1\x54\xbf\x9d\x89\ \x27\xbc\x88\x43\x8c\x50\x70\x93\x47\x68\x66\xc0\x29\x0f\x37\x08\ \x9e\xf5\xa7\x31\xe3\x8b\x99\x9d\xb3\xe3\xad\xb7\xb2\xdb\x05\x9f\ \x25\x86\x8c\x9b\x3e\xc2\x71\x79\xf9\xd6\x2b\x84\xa3\x75\xbe\xa6\ \x93\x17\x4e\x3c\xbe\x26\xa1\x99\x85\x54\xe7\x9d\x43\x57\xd2\x47\ \x4c\x5b\x8f\x19\x44\xd1\x22\xc1\x77\x4b\xf3\x94\x48\x71\xf3\x5d\ \xb2\xf3\xb9\xef\x3e\x46\xa0\x0c\x20\xdd\x8d\x5c\x1c\xd9\x66\x29\ \x1e\x22\xcb\xe8\x99\x4e\xc6\xe6\x85\xf0\x00\x68\xde\x41\x80\x1f\ \xd7\x35\x2b\x9a\x12\xc3\x8f\x44\xd3\x65\x8d\xd4\x4d\x4a\xbe\x33\ \xf4\x4b\x32\x30\x8b\x0a\xee\xc9\x46\xaa\xf6\xe9\x86\xfc\x44\x14\ \xbe\x5e\x48\x76\x38\x0d\x72\x55\x7a\x7b\xb3\xb4\xcb\x50\x25\xd2\ \xaa\x66\x45\x79\xe5\x53\xf1\xdf\x3a\xa2\x6e\x90\xcb\x40\xee\xc1\ \xb9\x79\x5f\xf3\x18\x25\x67\xcf\x0c\xb1\x3a\xb1\xe0\x9f\x66\xaf\ \x2c\xbd\x9a\x7b\x3f\xf6\x0c\x4b\xcb\xf5\xad\x4a\x63\x71\x74\x32\ \xd9\xe4\x59\x9d\x33\xe4\x2a\xec\xbf\x22\xe6\xcc\x8b\xa2\x63\xc2\ \xa3\xaa\x21\x2e\x43\xe7\x54\x99\xa5\xd1\xb1\x76\x94\x80\x73\x2a\ \x7f\x82\x77\x0a\xd7\xf2\xe0\x46\xfd\x4c\x7f\x09\x30\x00\xef\x78\ \xf6\x1a\x18\x1d\xd4\xb7\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x06\x4b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x09\x84\x00\x00\x09\x84\ \x01\xaa\xe2\x63\x79\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x05\xc8\x49\x44\ \x41\x54\x38\x8d\xb5\x95\x6d\x6c\x5b\xe5\x15\xc7\xff\xcf\x73\xaf\ \xaf\xe3\xd7\xc4\xb1\x9d\x38\x76\x12\xe7\x3d\x4e\x9c\xb6\xac\x74\ \xed\xda\xb4\x34\xa5\xa2\x40\x28\x6d\xd5\xd2\x16\x90\xd6\x49\x74\ \x83\x01\x5f\x8b\xb4\xc2\x87\x49\x4c\x4c\x5b\x97\x09\xc4\xd8\x90\ \x00\x31\x4d\x53\xb5\x22\x28\xd0\x02\x25\x5d\x59\xb3\x02\xc9\x42\ \x95\x6a\x69\x8b\xd3\x36\xb8\x79\x69\x9d\x3a\xb1\x93\x5c\x3b\x7e\ \xb9\xbe\x6f\xcf\xb3\x0f\x45\x15\x63\x65\xda\x97\xfd\xa5\xf3\xe5\ \x1c\x9d\x9f\xce\x39\x1f\xce\x9f\x70\xce\xf1\xff\x90\x78\xbb\x64\ \x6b\xf4\xbe\x76\x10\xd2\x23\x42\xe8\xa4\x94\x06\x00\xe8\x9c\xb1\ \x93\x3b\x43\x9f\x4b\x94\x62\x23\xa5\xd4\x42\x80\x05\x46\x70\x49\ \x2f\x91\x53\xbf\xfc\x64\x61\xfc\xdb\x0c\xf2\xcd\x89\x5b\x5a\x76\ \x04\xa9\xa4\xbc\x4a\x05\x4b\x97\xd7\xe5\xff\xd2\x2a\xda\x0c\xdd\ \xd0\xca\x09\x28\x14\x55\xae\xde\x58\xfd\xc5\x5c\xc8\xad\xce\x59\ \xa8\x40\x1c\x0e\x8b\x5a\x52\xf5\x40\x6a\x51\x89\x32\xc6\xff\xb9\ \xc4\xf4\xc7\x5f\xec\x2f\xcc\xfd\x07\xb8\xb6\x76\xa7\xc7\xe1\x56\ \x3e\x2b\xb3\xda\x0a\x2b\x9a\xd6\x1e\x0f\x79\x23\x99\xc9\x1b\xe3\ \x11\xa7\xd5\xa5\xdc\x90\x27\x9b\xe4\xe2\x6c\xc3\x83\xc1\xfe\x85\ \x86\x40\xd9\x48\x67\x43\x79\x22\xa7\xea\xd5\xdd\x51\xdf\xec\xe5\ \xa9\x4c\xe3\x5f\x87\x93\xdb\xb3\x05\x8d\x2c\x70\x61\xd5\xcb\x27\ \x16\x72\xb7\xc0\xad\xad\xbd\x12\x95\xf8\x69\x8b\x20\xd6\x35\x05\ \x3b\xdf\x4b\xcb\xb3\xab\xea\xbd\x1d\xb1\x78\xea\x62\x8f\x48\xad\ \x9a\x4d\x74\x64\xed\x56\x47\x7e\x5b\xf8\xc8\x34\x4c\xad\xbc\xa8\ \x9a\x61\x0a\xd8\xd7\xad\xf0\x7e\x36\x3a\x2e\xaf\x6d\x0d\x39\xae\ \x0d\x8f\x65\xee\x32\x4c\x16\x67\x79\xb9\xfb\xe7\x03\xdc\xa0\x00\ \x20\x48\xec\xa5\x32\xa9\x4c\x5c\x19\x59\xff\x4a\x66\x49\x8e\x14\ \xd5\x42\x1d\x81\x24\xf5\xb4\xed\x3b\xde\xe8\xf9\xde\x65\x81\x48\ \x54\x37\x0c\x17\x63\xcc\x63\x95\x44\xac\x5f\xe1\x3d\xf3\xd3\xdd\ \x8d\x87\x19\x33\x9d\x4b\x05\x3d\x90\xca\x96\x42\x7b\x7a\xaa\x4e\ \x57\xba\xc5\x1a\xbb\xa7\xf2\x8f\x00\x40\xdb\x3b\xb7\xdc\x5f\x56\ \xe6\xf0\x6e\x5d\xf7\xf0\x6f\x93\xa9\x44\x97\x40\x05\x2c\x0f\xdf\ \x7d\x22\x3e\x77\x6e\x93\xaa\xab\x15\xd7\xe5\xd8\xf2\x36\xff\xa6\ \x89\x95\xb5\x0f\xc6\x7e\xb4\xad\xeb\xfd\xee\x3b\xfc\xe7\x47\x2e\ \x2d\xf6\x64\x32\x9a\xf7\x1f\x17\x17\x37\xed\xde\x1c\x38\x4d\xc0\ \xad\x89\x94\x12\x7c\x7a\x7b\x70\xc8\xef\xb1\xdc\xd9\xb7\xc7\xf7\ \x80\xe0\xab\x6e\xff\x1d\x01\x69\x53\xd4\x92\xca\x18\xaf\x60\x26\ \x2f\xaf\x71\x47\x52\xa2\xe0\xd2\x44\xd8\x2c\x7e\x47\x6b\xe6\xab\ \xf4\x60\x34\x54\x1e\x9d\xdf\xdc\x35\x30\x73\x6c\xe0\xea\x43\x5b\ \x37\x04\x86\x14\x55\xaf\x74\xdb\xa8\x16\xf6\x5b\xf5\xc9\x1b\xc5\ \xa0\xcb\x46\x79\x4a\x56\x2b\xae\x5c\x57\xc2\x26\x63\x61\x51\xa4\ \x62\x91\x0a\x82\xe6\xb0\xba\x8b\x39\x23\x87\xb4\x92\x6a\x8c\x25\ \xce\xf8\x38\x04\x29\xcd\x27\xa5\x55\xf5\x7b\x2f\x6a\x6d\xc7\x1a\ \x46\x43\x87\x5b\xf6\x8e\x64\xd7\xaf\x66\x76\xb5\xd6\x2b\x19\xaf\ \x1f\x4f\x6e\xb0\x8a\x14\x53\xc9\xa2\x65\x31\x6f\x94\x87\xbc\x96\ \x84\xcd\x0a\xcd\x2e\x51\xcd\xe0\x82\x20\x04\x02\x91\x47\xed\x56\ \x57\xae\xd6\xdb\x3c\x35\x9d\x8a\x6f\x58\xd3\xb4\xfd\x13\x40\x94\ \xaa\x1c\xed\x99\xfa\xaa\x0e\x39\x16\x7c\x6a\xfd\x9a\x1f\x44\x9d\ \x87\xf6\xbf\x23\x14\x19\xab\x38\x91\xfe\xb4\xa2\xc6\x2e\xa6\xf7\ \x2c\xf7\x4d\x08\x02\x17\x3d\x2e\xc2\xee\x5a\xe6\x9a\xfb\xe2\x72\ \xa1\xbe\xb3\xde\x26\x67\x0b\xa6\xa8\xa8\x2c\x4f\x39\x01\x6f\xaf\ \xef\xfa\xdb\xe8\xe4\xd0\x5e\x42\x09\x75\x96\xf9\x75\xb9\x30\x17\ \x98\xb7\x0c\xd7\x9d\x0f\xed\xdb\xbc\xeb\xde\xdd\xee\x83\x7b\x5e\ \xc3\xe0\x95\x0f\xb1\xab\xfb\x49\x1c\x78\xe4\x75\xe1\x37\xd3\x8b\ \x3b\x9f\xf9\x74\xf2\x81\xf9\xac\xe6\x4b\x2e\xe8\x3e\xaf\x93\x88\ \x8c\x31\xb1\x7f\x64\xa9\x69\x5d\xd4\x79\xbd\xa4\x71\x85\x9a\xa6\ \x59\x75\xe1\xea\xd9\xfd\xcb\xea\xd6\x7c\x60\x18\x86\xbd\x54\x2a\ \xd9\xc4\xba\x2b\xf6\x52\xe7\xe1\x8e\xe7\x7e\xf8\x7b\xba\xab\xfb\ \x29\xbc\xf1\xf7\x83\x38\x39\xf5\x32\x7e\xd5\xff\x28\x6a\xfd\x2d\ \xe8\xfb\xc9\x87\x64\x32\xe8\xf3\x1d\x29\xc9\xe1\x6a\x0f\x65\xc5\ \x92\xe1\x34\x4c\x08\xbd\xdf\x77\x4d\xbd\x7d\x26\xd3\x55\x50\x98\ \x5d\xf0\x55\xb5\x3d\xd6\x54\x1d\x19\xac\xf3\x47\xe6\x17\xf3\xa9\ \x9a\x69\xcf\xab\xf7\x7a\x3a\x67\x6a\x0e\xed\x3f\x4a\x6a\x2a\xc3\ \x78\x73\xe8\x20\x92\xea\x18\x18\x33\x50\xe4\x32\x3e\xbf\x7a\x14\ \x61\xf7\x0a\xec\xdb\xfc\x2c\x86\xe7\xce\x4b\x03\xe9\x71\x7b\x7a\ \xcc\x74\x87\x2b\xa5\x5c\x57\x83\x2d\x59\xd0\xa0\xcd\xcc\x6b\x9a\ \xe0\xab\x6a\xdf\xda\x16\x8a\x5e\x8a\x25\x07\xb7\xa8\x6d\x1f\xac\ \x59\x76\x67\xd0\x79\x68\xff\xfb\xc8\x95\x64\xbc\x35\xfa\x02\xf2\ \x2c\x05\x93\xe9\x30\x99\x01\x93\xeb\xd0\xb9\x82\xb3\x89\x63\xd0\ \x0b\x04\x4f\xf7\x1e\x42\x5a\x57\x84\x13\xe9\x21\xa1\x2c\x4b\x89\ \x92\xe5\x68\x0c\xd8\x93\xb1\xe9\x62\x56\xf0\xf9\x9a\xdd\x79\xcb\ \xf4\x23\x3c\x7a\x72\x75\xef\xc6\x6d\xb6\xe7\x1e\x7e\x13\xb1\x6b\ \xc3\x38\x15\x7f\x0d\xa6\x54\x00\xa3\x1a\x20\x30\x40\x30\x61\x40\ \x81\x81\x12\x18\x35\x30\xbd\x34\x8a\x2b\xf1\x31\xfc\xf8\x9e\xe7\ \x51\x5b\xd3\x41\xde\x9e\xe9\xb7\x98\x05\x83\xe7\x67\x98\x34\xbf\ \xa4\xff\x89\x34\x37\x6f\xf1\x05\xee\x3b\x97\x78\x62\xe7\x33\xd6\ \x1d\x6b\x9f\x00\x01\xc0\x01\x10\x00\x47\x2e\x3c\x8f\x89\xfc\x30\ \x72\x7a\x1a\x79\x5d\x86\x61\xaa\xe0\x1c\x60\x26\x47\xdf\xdd\x17\ \x60\x97\x5c\xb7\x1e\xd8\xe4\xdc\x18\x7e\xf1\x97\xc7\xd0\xf2\xe5\ \x7c\x92\x2e\x08\x11\x31\x1e\x3f\x39\xdf\xfb\xb3\xc6\x89\x81\x0b\ \xef\x76\x0c\x9c\x3f\x0a\xc6\x19\x18\x37\xf1\xe2\xe3\x1f\xc3\xd4\ \x4d\xc8\x6c\x0a\xba\x50\x84\x28\x02\x02\x17\xc0\x19\x60\xa8\x0c\ \x9c\x03\x7f\xf8\xe8\x20\x2e\x5d\x1f\xb9\x05\xa7\x84\xe4\x35\x0b\ \x7e\xfd\xd2\xa9\xc5\x25\x11\x00\xb2\x46\x62\x59\x36\x91\x68\x06\ \x40\x01\xb8\x00\x9c\xd5\xf4\x12\x16\x4b\xb3\xe0\x52\x09\x56\x51\ \x00\xa1\x04\xe0\x1c\xa6\xc1\x6f\xae\x04\x60\x56\xbe\x86\x89\xd9\ \xd8\xb3\x00\xde\xfb\x9a\x9d\x78\xe7\xcf\x7a\xfe\xd6\xa3\x1f\xec\ \xd3\x4d\x00\xe3\x00\xd0\x7d\xc0\x52\x01\x00\xaa\x5e\x02\x21\x1c\ \x82\x48\x20\x4a\x14\xa2\x95\xc2\x34\x18\xa0\x72\x50\xf1\xdf\x5c\ \x27\x39\xd8\xa7\x5f\xfe\x9f\x1c\x04\x00\x0c\x53\xc3\x6a\xff\x43\ \xa8\xcb\xae\x04\x54\xdc\x8c\xaf\xc5\xad\x80\x24\x5a\xbf\xab\xf5\ \x3b\xc1\x0a\x80\xdc\xc8\x57\xa7\x5d\x15\x4e\x1f\xbc\xf6\xda\xdb\ \x36\x9e\x8b\x0f\x20\x53\x48\x03\x40\xe6\x76\x75\x72\x3b\x33\xed\ \x3e\x60\xd9\x01\x60\x1b\x6e\xde\xfc\xbf\xe9\x22\x80\x57\x06\xfb\ \x74\xf5\xdb\x85\x7f\x01\xf6\xcb\xb9\xc0\xbf\x0a\x97\x37\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x01\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\x00\x00\ \x09\x70\x48\x59\x73\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7\x6f\ \xa8\x64\x00\x00\x00\x1a\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\ \x72\x65\x00\x50\x61\x69\x6e\x74\x2e\x4e\x45\x54\x20\x76\x33\x2e\ \x35\x2e\x31\x31\x47\xf3\x42\x37\x00\x00\x03\x70\x49\x44\x41\x54\ \x48\x4b\xd5\x94\x69\x48\x54\x51\x14\xc7\xef\x9b\x37\x8b\x96\xcb\ \x38\x6a\xa5\xe2\xe8\xa8\x59\x2a\x95\x2d\xb4\x98\xa1\x44\x96\xd9\ \xa2\xce\x92\xe3\x88\xb9\x04\x59\xb6\x97\x43\x11\x84\x66\x69\xb6\ \x08\x69\x69\x86\x86\x5a\x69\x6a\x49\x51\x14\xa9\x65\x3a\x33\x3a\ \x29\xb4\x98\x65\x85\x4b\x2e\x93\x8e\x6d\x14\x83\x2d\xe6\x78\xba\ \x6f\x78\x44\xb6\xb8\x7c\x08\xea\x0f\xbf\xc7\xe5\x9e\x73\x7e\xf7\ \x72\x3f\x3c\x34\xda\x38\xc9\xae\xb3\x6c\x22\x54\x13\x8c\x25\x55\ \x53\xd8\x12\xc5\x3c\x93\x50\x85\xcc\x54\x5a\x9d\xc5\x8d\xa8\x79\ \x6c\x16\xa9\xee\x37\x16\xde\x8a\xa3\x5b\x47\xce\xb4\xb8\x7a\x0f\ \x87\x0d\x77\x63\x4d\x64\x8a\x93\x0c\xb1\xe2\x2a\x37\xbc\xa6\xce\ \x7e\x63\xbd\xc6\x79\xd7\x83\xcf\xce\xf2\x86\x41\x97\x3d\x8d\xfa\ \xe9\x49\xcf\x60\xe6\x81\x27\xc0\x16\xde\x4e\xa5\xc7\x86\x0f\x33\ \xb0\x22\xc3\x58\xa6\x1a\xb0\x89\xa9\xd7\xbb\xc6\x35\xc0\xf4\xfd\ \x4d\xe0\x96\xf8\x14\xdc\xb0\xc8\xf3\x68\x33\x2c\xcc\x6c\x87\x15\ \x05\x2f\x61\xe9\x99\x4e\xb0\x88\x50\x03\x12\x2b\x4f\xd1\xa3\xc3\ \xc7\xce\x3f\xfb\xb1\x47\x7c\x13\xcc\x3c\xdc\x0c\xf3\xd2\xda\xc0\ \x27\xab\x1d\x96\xe5\x75\x41\x50\x71\x37\x88\x4a\xb5\xb0\xf4\xac\ \x06\xdc\x52\x9a\x61\xdc\xb6\x06\x30\xde\x78\x6f\xf4\x62\xc1\xca\ \xec\x96\x80\xc2\x1e\x58\x55\xd4\x0d\xe2\xcb\xbd\x20\xb9\xda\x0b\ \x01\x97\xb4\xe0\x99\xa3\x01\xf3\xa4\x36\x40\x09\x9d\x80\x8e\xbd\ \x06\x94\xdc\x03\x26\xf2\xc6\x31\x88\x57\x9f\x69\x09\xaf\x7c\x0f\ \x0b\xf3\x7b\xc0\x3e\xed\x15\x98\xa7\x68\x81\xdc\xdb\x3e\x88\x76\ \xb6\xea\xd1\xd6\xe7\xfd\x44\x94\xba\x93\x21\xbc\x51\x6e\x26\xba\ \xa2\x16\x1c\x6c\x1a\x95\x98\xa0\x3e\x93\xc5\xe7\x5a\x02\x8a\xb4\ \xc0\x8e\xac\xd3\x13\x21\xca\x2f\x48\x54\xf9\x81\x0c\x28\x2e\x27\ \xbd\x8f\x44\x72\x67\xef\xb0\x23\x7c\x33\xc6\xb1\x7d\xd3\xd8\x82\ \xc0\xdc\x84\xf9\xa7\x5b\x47\x7f\x63\x57\xc9\xd9\x96\x05\x27\x5b\ \x81\x58\x5e\xbc\x87\xe1\x73\xc2\x03\x39\x46\xb1\xe8\xd2\x90\x38\ \x05\xe5\x25\x78\xe5\x75\x8c\x41\x2c\xce\x37\x88\xf1\x80\x33\xbd\ \xf5\xdb\x18\xc4\xe7\xbb\xfe\x92\xb8\x40\xf3\x2f\x88\x45\xff\x9b\ \xd8\x45\x94\x37\xbc\x58\x5a\xc5\x42\xe2\x2a\xae\x63\x50\x7e\xf2\ \x98\xc4\x93\x85\xb9\x7f\x14\x3b\xc4\xa8\xf8\x46\x32\x65\xa6\x59\ \x44\xad\xca\x54\x5a\xf1\xdc\xab\xf0\xe5\x08\xe2\x60\x25\x41\x84\ \x55\x9b\x33\xa4\x4a\x1e\x5f\x78\xae\xe3\x77\xe2\x59\x72\xb5\x60\ \xfc\xda\x5a\xdd\xba\x8b\x1a\x48\x7e\xa4\x83\xc0\x52\x0d\x78\x15\ \xf5\xfc\x59\xcc\x08\xae\xe6\x18\xc9\x54\xd1\x6e\xf2\xfb\x8d\xb6\ \xb1\xf5\x1f\x78\x51\x0a\xdd\xcf\xe2\xc8\xdc\x3b\x84\x63\x8c\x22\ \xd1\xf3\x70\x1b\x04\x97\xf7\xc3\x8c\x0b\x9f\x80\x97\xfa\x0a\x26\ \x1e\x32\xf4\xed\xa6\xdb\x86\x86\xbb\xae\xd6\x7d\xfe\xc1\x27\x7d\ \xc7\x9b\xbf\xc2\x66\xb5\x0e\xbc\xf1\x2d\x7e\x16\x4b\xf6\x5f\x24\ \xf8\xd1\xaa\x78\x32\xa6\x0b\xc8\xf4\x3e\x40\xf9\x9f\x01\x5d\xfa\ \x08\x28\xb4\x16\x42\x92\xca\x05\x74\xdb\xd0\x8c\x0f\x55\xc4\xce\ \x49\xef\x86\x59\x25\x5f\xc0\x26\xa7\x0f\xc8\x63\x6f\x81\xb9\xe5\ \xe1\x3b\x72\x4d\xb5\x3d\xdd\x62\xc8\x82\xf5\x39\x8e\xcc\xd5\xa5\ \x75\x28\xe5\x45\x3f\xca\xec\x18\x20\x36\x54\x68\x78\x8b\x13\x45\ \x92\x92\x12\xc3\x3f\xe6\x97\x58\x49\xcb\xfc\x58\xbb\xb5\x3a\xe2\ \x82\x1e\xd0\x4d\xcc\x65\x3d\x98\x6c\x55\x5d\xb3\x5d\xbc\xcf\x14\ \x97\xa9\xa1\xef\x30\x2d\xa6\xb8\x23\x07\xff\x4d\x88\xef\x17\x47\ \x58\x7b\xfa\x12\x6c\x2e\xf9\x43\xfd\x7b\x18\x18\x1e\xc1\x36\x5d\ \xc4\xf4\xde\x59\x86\xb6\x97\xbd\x43\xdb\xaf\xbf\x61\x2d\x39\xd0\ \xc0\xb6\x74\x0d\xc3\xb5\xa9\x18\x5b\x0c\x17\x43\x1d\x62\x8e\xb1\ \xc2\x4c\xa2\x99\x88\xb1\xc4\x98\x61\x38\x18\xca\x67\x08\xb5\xa0\ \x8a\x4b\xf0\x32\x1a\x71\xac\xb7\x21\x8e\xd5\x66\x84\xc8\x70\xbc\ \xe7\x8f\x99\x8b\x71\xa1\x7b\x28\x81\x35\x86\x3a\x88\x7a\x22\x3e\ \xc6\x0e\x43\xd5\x2c\x30\x46\x18\xec\x43\xe8\x1b\x32\x0d\xba\x22\ \x85\x80\xd8\xf5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x05\x8c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xdd\x06\x0f\x0d\x20\x0b\xbf\xd9\x2e\xde\x00\x00\x05\x19\x49\x44\ \x41\x54\x38\xcb\xa5\x95\x4b\x6c\x9c\x57\x19\x86\x9f\x73\xf9\xff\ \x7f\xfe\xcb\x8c\xa7\x8e\xed\xda\x0d\x8a\x90\x9d\x38\xa9\x3b\x69\ \x69\x4d\x1b\x1b\xa2\x06\x15\x82\x7b\x51\x15\x56\x61\x11\x10\x34\ \x2c\xd2\xa8\x69\x17\x80\x9a\x05\x12\x0a\x15\x05\xa1\x52\x01\x51\ \x10\x02\x56\xb4\xd9\x20\x45\xd0\x92\x52\x4a\x16\x58\xd4\x71\x71\ \x23\x42\x8b\x94\x0a\xd5\xa9\x63\x5c\x5a\xc7\xf1\x25\x33\x99\x78\ \x3c\xf3\xdf\xce\x61\x11\xdb\x32\x11\x97\x05\x67\x73\xa4\x23\x7d\ \x8f\xbe\xf3\xbe\xef\xf9\x0e\xfc\x9f\xeb\x1b\xa5\x9f\x75\x7e\xad\ \x74\xa2\xe7\xe6\x73\xfd\xdf\x8a\x9e\x38\x72\xf8\x4b\xc0\xa3\xc0\ \x2e\xa0\x1b\x10\xc0\x15\xe0\x1c\xf0\xd2\x8f\x4f\xfc\xe4\x17\x99\ \xb2\x23\x05\xeb\x96\x81\x13\xff\x13\xbc\x0a\xfc\xd6\x7d\xbb\x86\ \x37\x8d\xec\xfd\x6c\x50\x6a\x2b\x4b\xc7\xd1\x80\x20\x4d\xe3\xdb\ \x6a\xd5\xea\xbe\x89\x89\x89\x11\xe0\x59\xf9\xeb\xa4\xc6\x8a\xdb\ \xb8\x19\x2c\xfe\x0d\xf4\xf8\x7d\xbb\x86\x0f\xec\x7b\x74\xdf\x2d\ \x16\xc4\xc2\xe2\x22\xb5\x5a\x1d\x6b\x0d\x9e\xeb\x50\x9f\x6c\x12\ \x68\x9f\xa8\x14\x91\xb4\x32\x7e\xf9\x85\x51\x10\x02\x91\x99\x87\ \x8c\x10\x2b\x16\xa3\x05\x32\x11\x37\x43\x1f\x7c\xf0\xe1\xc7\x46\ \x46\x1e\x8a\x2e\x4d\x4f\x33\x37\x77\x85\x2c\xb7\x28\xad\xf1\x3c\ \x8f\xa0\xe0\x52\x7d\xa7\xce\x1b\xdf\x7c\x97\xe6\x52\x0a\x80\x05\ \xb0\x16\x21\x6e\xa0\xac\xb5\x8b\xc6\x98\xfd\x6a\xe3\xf5\xfb\x7a\ \xfb\x9e\x3e\x70\xe0\x8b\x6d\x17\x2e\xbc\xc3\x3f\x3e\xf8\x90\xdc\ \x40\x6e\xc1\x0a\x89\xeb\x16\x70\x5c\x4d\xd0\xa9\xd8\xb9\xbf\x87\ \xf8\x5a\xc6\xe2\xdf\x96\x11\x42\x20\x84\xc0\x5a\x8b\x2d\xb5\xde\ \xa4\xa5\xee\xfd\xee\xb5\xc3\xef\xca\x0d\x0d\x3f\xfb\xe5\xc7\xbe\ \x52\xbe\x7c\xf9\x32\xcd\x56\x93\x52\xa9\x84\xd6\x1a\x84\x20\x37\ \x96\xd4\x18\x92\x24\xc5\x64\x19\x42\x25\x0c\x3d\xd9\x43\xd4\xed\ \xad\x17\xfb\xed\x2e\x8d\x87\xa7\x07\xbe\x53\x7b\xbc\x0e\x20\xd7\ \xba\x7d\xe0\x81\x4f\x77\x16\x3c\x4f\xd4\xaa\x35\x1c\xad\x70\x1d\ \x85\xef\xbb\x68\x29\xe8\xe8\xd8\x44\xb1\x18\x11\x46\x11\xae\xab\ \xb0\xd9\x0a\xd7\x66\xea\x2c\xcf\x27\x48\x25\x51\x9e\xa0\x79\x35\ \xa1\xaf\xb4\x23\x7a\xf2\xa9\x23\x4f\xad\xa7\x42\x08\xf1\xf9\xa1\ \xa1\x61\xb7\x5e\xaf\x23\x84\x45\x0a\x83\xc9\x33\x1c\x01\xb7\x76\ \xde\xc2\xfb\xef\x4f\x33\xf6\xc7\x51\x0c\x86\x8f\xdf\x7d\x27\x9f\ \xb8\x67\x0b\x6f\xbd\xb6\x48\xfb\x47\x0b\xec\x79\x6e\x0b\x5e\xb1\ \xc8\xe8\xd7\x2f\xe2\x4d\x6b\x11\xf6\x06\x5f\x05\x8e\x4b\x00\xa5\ \xd4\xee\x8e\x4d\x1d\xa4\x69\x8c\xa3\x24\x9a\x14\x9b\x5c\xc7\x77\ \x32\xe6\x67\x67\xf8\xeb\x5b\xe7\x6d\x6f\x6f\xdf\xa5\xdb\xb7\x0f\ \xbc\x7a\x65\xbe\x9a\xff\xe5\xc2\x87\xb4\xf5\x94\xb8\xff\xfb\xed\ \x04\xed\x2e\x5e\xe4\xf2\xc8\xcf\x07\xd9\x72\x77\x37\xf1\x4a\xba\ \x79\x5d\x8a\x2c\xcb\x43\xad\x35\x5a\x29\x5c\x6d\x71\x55\x0b\x65\ \x6b\xb8\xd4\x79\xed\xcc\xef\xe9\xee\xee\xf9\xdd\xa1\x43\x87\xfa\ \x0e\x1e\x3c\xf8\x48\x9e\x9b\xbd\x6f\x9c\x7b\x9b\xfb\x8f\xec\xc4\ \x6f\x2b\x13\x44\x65\x0a\x05\x1f\xe9\x28\x86\x1e\xbf\x83\xd4\xc6\ \x7a\x1d\x2c\xc4\x8d\x3c\x2b\xa5\xd0\x0a\xb4\x68\x22\x4d\x03\x4c\ \x4c\x14\x15\x99\x9d\x9d\xfd\xde\x9a\x49\xef\x4d\x4d\x8e\x81\xb5\ \x68\x1f\x2b\x3d\x0c\xea\x46\x72\x8c\x45\x4a\xf9\xaf\x2f\x4f\x6b\ \xa7\x95\xe7\xb9\xef\x3a\x0e\xb9\xeb\x93\xb9\xed\x38\x05\xc8\xac\ \xe6\x8e\xdb\xfb\x99\x9a\x9e\xfd\xe9\x13\x47\x0e\xef\x04\x88\xa2\ \xe2\x0f\x3f\xb5\x67\x48\xc4\xe9\x0a\x8d\x66\x8c\x61\x05\x84\x44\ \x4a\x49\x31\x89\x71\x1d\x37\x5f\x07\x7b\xae\xfb\x41\xb5\x5a\xdd\ \x16\x85\x3e\x59\x1a\x90\x79\x65\xdc\x50\x91\xa4\x39\x1f\x1b\xec\ \xa5\xbd\x6b\x76\x87\xb1\x26\xb6\x58\xf3\xc9\xdd\xc3\x6a\x47\xff\ \x66\x16\x16\xfe\x8e\xd6\x8a\x56\x1c\x23\x84\xa4\x5c\x2e\xb3\xb8\ \xb8\x88\x1f\x04\x4d\x00\x05\x30\x38\x78\x8f\x14\x52\x8e\x0c\x0c\ \x0c\x88\xdc\x58\x84\x72\x70\x3d\x1f\xa1\x7d\x1a\x89\x21\x68\xeb\ \xa2\xbf\x32\x28\xb6\x57\x06\x65\x54\x2c\x8b\xea\xd5\x2b\x98\x34\ \xc1\x71\x43\x92\xc4\x90\xe7\x39\x5d\x5d\x5d\x8c\x8d\xbd\x4e\x63\ \xa5\x71\x76\xf4\x0f\xa3\x2f\x68\x80\xe3\xc7\x4f\xfc\x48\x3b\xfa\ \xb9\xbd\x9f\xd9\xeb\x78\x05\x1f\xa1\x34\x71\x1c\x23\x6d\x8a\x36\ \x29\xf3\x57\xaf\xb1\xdc\x68\x21\xa5\x44\xd8\x8c\xc0\xb5\x84\xae\ \xc4\xda\x65\x84\x70\x29\x97\xcb\xa4\x69\xc2\xd4\xa5\x29\x2b\x85\ \xda\xbf\x6e\x1e\x80\x31\xf6\xe8\x8b\x27\x5f\xb0\x52\x69\xb4\x76\ \xd0\x8e\x87\xe3\x78\xab\x33\xc2\xa7\xdc\xd6\x46\xa9\x54\x24\x0a\ \x43\xc0\x21\x4e\x04\x8d\x46\x93\x30\x0c\xe9\xe8\xe8\xe0\x37\xa7\ \x5f\x46\x4a\xf9\xd2\xb1\x63\xc7\x96\xd6\xa5\x00\x98\x98\x78\xf3\ \xfc\x5d\x77\xdd\x29\x56\x9a\x8d\x3d\xdb\xfb\x77\xac\x47\xc5\x02\ \x71\x12\x83\x00\x47\x49\xa4\xb0\x60\x32\x4c\x6e\x28\x97\x3b\xe8\ \xec\xec\xe2\xcc\x99\x33\xcc\xcc\xcc\x54\x9f\x79\xe6\xdb\xc3\xab\ \x25\x56\xad\x8e\xce\x02\xe0\x9f\x3d\x3b\xfe\xf6\xd6\xad\x7d\x95\ \x8b\x53\x17\xb7\xf6\x6f\xdb\x46\x18\x84\xe4\x79\x86\x31\x39\x4a\ \x0a\x5c\x47\xa1\xb0\x44\x81\x47\x77\xf7\xad\x64\x59\xc6\x2b\xaf\ \x9c\x66\x6a\xea\xbd\xd6\xa9\x53\xbf\xda\xbd\xb4\xb4\x14\x03\xd9\ \x46\xb0\x5c\xdd\x9d\xb1\xd7\xc7\x46\x3f\xb2\x79\xb3\xfc\xf3\xf9\ \x73\xf7\xa6\x69\x2a\xfc\x42\x81\x28\x0c\x28\x46\x21\x61\xa1\x80\ \xef\x39\xc4\x71\x8b\x3f\x4d\x8c\xf3\xdb\xd3\xa7\x59\x5e\x5e\x3e\ \xf5\xfc\xf3\x3f\x38\xb8\xb0\xb0\x50\x07\x1a\xab\x60\xb3\x71\x1e\ \xcb\xd5\xf8\x15\x01\x1d\x04\x41\x78\xf4\xe8\xd3\xaf\x1a\x93\xf7\ \x36\x56\x1a\x3a\x8e\x63\x01\xdc\xd0\xdc\x0f\x8c\x76\xdc\xd9\x93\ \x2f\x9e\xfc\xdc\xe4\xe4\x64\x15\xa8\x01\x2d\x20\x5e\x95\xc2\x88\ \xff\xf0\xdd\xad\x99\xaa\x00\x5d\xa9\x54\xca\x95\x4a\xe5\xb6\x42\ \xa1\x10\xce\xcd\xcd\xcd\x8d\x8f\x8f\xcf\x5f\xbf\x7e\xbd\xb5\xd6\ \xdd\x9a\xae\x1b\x01\xff\x04\x9d\x04\x0e\x02\x12\xbc\x82\x6c\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x7e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x0b\x0a\x0d\x34\x15\x48\x65\x72\x06\x00\x00\x04\x0b\x49\x44\ \x41\x54\x38\xcb\xad\x95\x5d\x6c\x14\x55\x14\xc7\x7f\x33\xfb\x39\ \x9d\x6d\xbb\xd3\x65\x97\xdd\xd6\x65\x59\x3e\x96\x22\x05\xda\x92\ \x56\x8b\x1f\x58\x13\x1f\x30\x42\x34\x46\x7c\xd0\x17\xd3\xf8\x00\ \x35\x48\x55\x52\x03\xfa\x20\x46\x02\x18\x8b\x69\x6c\x1f\x44\x1f\ \x34\x8a\x92\xc8\x8b\x0f\x68\x0c\x31\x36\xc6\x88\x34\x41\x54\xac\ \x25\xb4\xb5\x36\xc5\xd6\xdd\xb6\xd3\x76\xbf\x67\x67\x77\x7c\x68\ \x77\x6c\xa9\x50\x4c\xfc\x27\x37\xe7\xe6\x9e\x73\xfe\xf7\x7f\xcf\ \x3d\x33\x57\x60\x01\x9e\x7b\xa3\xfd\xfd\x3f\x12\x95\x8f\xc6\xa6\ \xb4\x8a\x85\xeb\x92\xcd\x48\xfa\x5c\xf1\xbe\x95\xf2\x6f\x6d\x9d\ \xaf\x7e\xf6\x1d\xb7\x01\xa1\x38\xe9\xfa\xa0\xad\xf6\xec\x8f\xe1\ \x8b\xab\x23\x1b\xb3\xa1\x95\x3e\x31\x9e\x13\x9d\x55\x65\x4e\xf1\ \xcf\xb8\xc6\x54\x3a\xcb\xf4\xd5\xf3\x43\xa9\x64\xc6\x11\x56\xfa\ \xdb\xbb\x5f\x3b\xfd\xf1\x72\xc4\x96\x22\xe9\xf9\xfe\xc0\xd9\x55\ \x5b\x1e\x70\x0f\x0f\xf4\xdb\x07\x87\x87\x6d\x23\xbf\x0f\x8a\x23\ \x13\x93\xd8\x4a\x2b\x50\x9c\x76\x9c\xde\x75\xca\x74\xba\x50\x76\ \x3d\xe6\xdc\xb9\xeb\x11\xcf\xa5\x8b\xdf\xfc\x3a\x70\x2b\x62\x11\ \xe0\x87\x6b\xce\xe3\x77\xac\xb0\x0e\x27\x06\xbe\xba\xda\xe8\xbd\ \xf0\x74\x4f\xc7\x3e\xf1\xbe\x50\xef\xce\xdc\xcc\xf5\xd9\xd1\xc1\ \x2b\x46\x74\x36\x4e\x3c\x99\x40\xf1\x05\x90\x7d\x41\xc7\x2f\xb1\ \xad\x9f\xbe\xf4\xfa\x2e\x79\x59\x62\x35\x25\xad\xb3\xe4\x13\x33\ \xf7\xaf\x1f\x7d\xe8\xe8\x8b\xef\x7d\x02\x70\xec\xe0\x47\x5f\x36\ \x04\x47\x8f\x24\x54\x55\x48\xce\x4e\xa1\x65\x52\x00\xf8\x82\xeb\ \x45\xaf\xac\x8d\x4c\x68\xe1\xee\x65\x6b\xfc\xd4\xa1\x17\x3e\x0f\ \x3b\x72\x3f\xcf\xaa\x85\xc3\x0b\x9d\x0e\x49\xe0\xdb\xa9\x10\xab\ \x37\xd5\x2f\x4a\x72\xa7\xfb\x98\xf8\x6b\x9c\xca\xc2\xf4\x8d\x7c\ \xed\x9d\x6f\x77\x9d\x00\xb0\x02\x04\xcb\xe2\x5f\xa4\x26\xed\xdd\ \xc7\x8e\xbe\xb9\x64\xe7\x07\xdb\xba\x96\xac\x65\x3c\x77\x31\x3a\ \xd4\xc3\x87\x27\x17\xe9\xe0\xe5\x43\x07\x8f\x03\x27\xcc\x52\xa4\ \xc6\xed\xd7\x14\xb7\x97\x54\x6a\xee\xb8\xc9\x64\xd2\x1c\x26\x59\ \xfa\x9f\xb9\xc5\x66\x5f\x14\x37\x32\x3a\x42\x32\x99\xc4\xeb\xf5\ \xb2\xff\x40\x6b\xad\xa9\x18\x58\xeb\xf7\x07\x00\x48\x24\x13\xb8\ \x64\xd7\xbf\x2a\x2d\xc2\x28\x14\x00\x78\xec\xc8\x69\x74\x4d\xe3\ \xcc\xe1\x3d\x00\x28\x8a\x42\x2c\x16\x8b\x00\x97\xc5\xf9\xd8\xdd\ \x75\x5b\xeb\x49\xa7\xd3\x08\x08\xa6\xd2\xea\x86\x1d\x54\x37\xec\ \xa0\x5c\xf1\x02\x90\xcd\x66\xe6\x6c\x3a\xce\xba\xda\xbb\x59\x53\ \xd3\x00\x40\x89\x54\x02\xc0\x3d\x4d\xf7\x02\x6c\x36\x4b\x01\x3c\ \x5c\x59\x59\xb5\x48\xd5\xbb\xcf\x37\x33\xf0\xd3\xf7\x00\x8c\x8d\ \x0e\x81\x61\x90\xd7\x73\x64\xd2\x49\xe2\x33\x2a\x00\x43\x57\x7a\ \x79\x67\xdf\x76\x33\x27\x18\x0c\x01\xbc\x02\x20\xee\x3f\xd0\x5a\ \x2b\x49\x25\xd8\xed\x76\x3c\x1e\x8f\x19\x14\xf0\x86\xe8\x68\xd9\ \x46\x7f\x6f\x0f\x15\xde\x4a\x0a\x86\x31\x5f\x07\x83\x32\xb7\x87\ \x81\xcb\x17\xe8\x68\xd9\x46\xa8\x32\x02\x80\x2c\xcb\xf3\xe5\xf0\ \xb0\xff\x40\x6b\xad\x08\x44\x56\xfa\xfc\x00\xa8\xaa\x8a\x2c\xcb\ \xc8\xb2\x8c\x28\x8a\x84\xab\x36\xd0\xb9\xb7\xc9\x24\x17\x05\x01\ \x57\x79\x05\x03\x97\x2f\xd0\xb9\xb7\x89\x70\xd5\x06\x33\x5e\x55\ \xe7\x4e\x51\x5e\x56\x0e\x10\x11\x81\xcd\x77\x6e\xdc\x44\x2e\x97\ \x33\xac\x56\x0b\x33\x33\x33\xa8\xaa\x8a\x24\x49\xc8\xb2\x4c\x4d\ \xa4\x9e\x53\x6d\xcd\xf4\xf7\xf6\xe0\x5e\x11\x60\xb8\xef\x12\xa7\ \xda\x9a\xa9\x89\xd4\x9b\x84\xaa\xaa\x92\xcf\xeb\x24\x12\x09\x63\ \xed\x9a\xb5\x00\x4d\x62\x36\x9b\xdd\xe2\xf7\xfb\x71\xb9\x5c\x82\ \xae\xe7\x29\xcc\xdf\x78\x31\x41\x55\x55\x2a\x4a\x03\x74\x3c\xdb\ \x40\x7f\x6f\x0f\x6f\x3d\x53\x4f\x45\x69\xc0\xf4\x01\xe4\xf3\x3a\ \x08\xa0\x28\x8a\x10\x0c\xae\x22\x93\xc9\x96\x5a\x1d\x0e\xc7\xee\ \x48\x24\x62\xb6\xcb\xcd\xa0\x28\x8d\x7c\x7d\xb2\x71\xd9\xdf\x65\ \x75\x75\x35\x4e\xa7\xa3\xc5\x0a\x10\x8b\xc5\x98\x9c\x9c\xbc\x79\ \xdf\x16\x2f\xee\x36\x7c\x5e\xef\x5c\x6b\x16\x3f\x10\x34\x4d\xc3\ \xe3\xf1\x70\xee\xdc\x39\x1c\x0e\x07\xb2\xab\x84\x52\x57\x19\xa2\ \x28\x22\x49\x12\x82\x20\x20\x49\x12\x2e\x97\x0b\x55\x55\xf1\xf9\ \x7c\x44\xa3\xd1\x25\xb6\x48\x2c\x2e\xdc\x4d\xd7\x75\x2c\x16\x0b\ \x86\x61\x20\x0a\x16\xb2\xd9\x2c\x9a\xa6\x61\x18\x06\x36\x9b\xed\ \x96\xca\x6f\x84\xa9\x58\x10\x04\xd2\xe9\x34\x75\x75\xb5\xe8\x7a\ \x1e\x8b\xc5\x82\xae\xeb\x66\xa0\xdd\x6e\xe7\xbf\xc0\x0a\x10\x8d\ \x46\x0d\xbf\xdf\x3f\xff\x4c\x79\x96\x4d\x72\xbb\xdd\x00\x84\xc3\ \xe1\x25\x76\x6c\x6c\xcc\x00\x04\xe1\x89\x27\x1f\xdf\x13\x08\xf8\ \xcf\xf0\x3f\x62\x6c\x6c\x7c\xfb\xdf\xe7\x60\x9f\x53\x70\x22\xd1\ \x6a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\xf3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x06\x1d\x11\x10\x0d\x8a\x83\xfa\x75\x00\x00\x04\x80\x49\x44\ \x41\x54\x38\xcb\xb5\x94\x6d\x6c\x53\x55\x18\xc7\xff\xe7\xbe\xb4\ \xbd\xb7\xb4\x6b\x47\xbb\xb6\x6c\x44\x27\xa8\x63\x22\x73\x74\x40\ \x20\x51\x24\x08\x02\x21\x71\x46\xf0\x03\x26\x46\x33\x41\x64\x82\ \x7c\xa1\x4e\x21\x12\x11\x70\x01\x51\xc2\x07\x3f\xf8\x32\x21\x8b\ \xc6\x09\xe2\xe2\x07\x3f\x28\x94\xb1\x18\xc2\x64\x50\x12\x1c\x43\ \x10\x96\x8d\x95\x6d\x5d\x7b\x57\xfa\x7e\x7b\xef\x3d\xc7\x0f\x76\ \x49\x21\x63\x10\x13\x9f\xe4\xc9\xc9\x49\xce\xf9\x3d\xff\xf3\x3f\ \x4f\x1e\xe0\x3e\xb1\x62\xc5\x0a\x82\xff\x10\x13\x5e\x0a\x34\x6d\ \x6b\x53\x73\xd9\xd5\x84\x10\x89\x32\x4a\x08\x21\x94\x52\x9a\xb5\ \xd9\xec\xad\x7b\x77\x37\xbf\xf5\x20\x60\xa1\x78\xf3\x6e\xd3\xb6\ \x67\x32\xd9\xec\xaf\x6b\xd7\xac\x35\x95\x94\x94\x92\xbc\x66\x30\ \x83\x81\x8a\x3c\xe1\x08\x60\x4d\x26\xc6\xde\x4c\x24\x92\xaf\xd9\ \xed\xb6\xa5\x7b\x77\x37\x9f\x79\x20\xc5\x3b\x3f\xdc\x31\x2f\x1e\ \x8f\x77\x35\x6e\x7a\x87\x9c\xb8\x70\x2b\xdf\xab\x08\x39\x8b\x2c\ \x4b\x06\x85\xc0\x81\xe9\xa9\x54\x2a\xeb\x9f\x06\xcb\xd2\xda\x0a\ \xd3\xc1\x43\x07\x68\x99\xbb\xac\x6e\xc7\xf6\x9d\xa1\xfb\x2a\x8e\ \xc5\x94\x8e\x2d\x6f\x6f\x25\xed\xe7\x22\xda\xb0\x6a\x17\xd7\x2d\ \xa9\x48\x95\x4f\x95\x6f\x53\xc6\xf4\x8c\x6a\xe8\x57\xc2\x09\xed\ \xf7\xde\xd1\x87\x92\x7f\x0c\xe5\x37\x37\x6e\x35\x1d\x3c\xf4\x69\ \x27\x00\xdb\xbd\xc0\x3c\x00\xec\xf8\xe0\xfd\x80\x7f\x6e\xdd\xb2\ \x1b\x8a\x60\xdc\x48\xcb\xe2\x1b\x4b\x67\x8c\xf8\x9c\x12\xb1\x98\ \x38\x91\x52\x50\xca\xa0\xdb\x24\x51\xcf\xa8\xfa\xe5\x3e\x85\x56\ \x9a\x69\x46\xf3\x38\x2d\x64\x4e\xcd\x93\xa9\xd3\x1d\x9d\x5d\x13\ \x81\xb9\x7f\xd5\x46\xb7\xf9\xe7\xfa\xc5\xb3\xfd\x9a\xbe\xe0\x51\ \xd7\x75\x81\x27\x5a\x5e\xa7\xf9\x5c\xde\x48\x51\xc6\xd2\x00\x4b\ \x13\xb0\xb4\x92\xd4\x06\x09\x21\xa7\x7a\x22\x20\xf3\xe7\x2d\xb0\ \x44\x22\x23\x4d\x93\x5a\x21\x08\x82\x83\xe3\x45\x58\x64\xab\xb9\ \xbc\xd4\xa2\xa9\x1a\x65\x00\x0c\x81\xe7\x74\x06\xa6\x51\x8a\xdc\ \x90\x92\x0b\xc7\x12\x6a\x18\x04\xe9\x68\x06\x8b\x25\x49\x06\xcf\ \x0b\xae\x49\xc1\x84\x10\x5e\x37\x0c\xf0\x82\xc0\xc7\x33\x7a\xda\ \x2c\x72\x1c\x88\xa0\x1a\x8c\xe5\x39\x42\x72\x63\xe9\xfc\xc8\xa9\ \x4b\x91\xf3\x84\xc3\x14\x46\x01\x5e\x10\x78\x00\xe0\x38\xc2\x4f\ \x0a\xa6\x94\xea\x66\x51\x10\x45\x8e\xb1\x6b\xe1\xe4\x30\x47\x6c\ \x9c\x73\x0a\x0c\x35\x6f\x0c\x25\xb2\x7a\x7f\x67\x4f\xe4\xb2\x01\ \xc8\x3c\x23\x14\x1c\xb3\xe8\x9a\x66\xa8\xaa\xca\x53\x4a\xb5\x49\ \xc1\x1e\x8f\xe7\x7c\x38\x1c\xae\x2b\x31\x99\xc8\xd5\x9b\xd1\xd2\ \x9b\xd1\xcc\x19\xc6\x21\x42\x08\x37\xc2\x33\x44\x28\x43\x82\x07\ \xdc\x20\xcc\xaa\x8c\x46\x9e\xae\x7a\xa8\x94\x28\x4a\x4c\xf5\x7a\ \x7d\x67\xef\x05\xe6\x0a\x1e\x7f\x19\xec\x38\x39\xb4\xda\xef\xe1\ \x25\xab\xb4\xc8\x60\xd4\x06\x46\x38\x30\x26\x30\x46\xcd\x8c\x50\ \x3b\x25\x30\xe5\x72\xb9\x32\xa7\xdb\xfd\xec\xca\xa7\xdc\x5c\xcb\ \xe1\xaf\x13\xf1\xf8\x58\x70\xd2\x76\x3b\x79\x22\x18\x9a\x55\x5d\ \x15\xb0\x9a\x05\x75\xf6\x63\x95\xf2\x8d\x68\xbe\x6e\x74\x68\xd0\ \x2d\x49\xd2\x75\xf0\x04\x5a\x2e\xef\x8a\x84\x07\xb6\x38\x5d\xae\ \x57\x56\xd7\x38\x20\xa8\x31\xea\x9a\xea\x4e\x5c\xb9\xd2\xbb\xa4\ \x72\xc6\xc3\x87\x2f\xf7\xf4\xa6\x26\x04\x03\xc0\x4b\x6b\x5e\xfc\ \xed\xcf\x9e\x4b\x9b\x58\x66\x6c\x78\xdd\xaa\x45\x76\x0d\x82\x37\ \x9d\x67\xcf\x19\x8c\xbc\x20\x99\x84\x55\x35\x33\xcb\xa6\xd5\xfb\ \x5d\x38\xf2\xf9\xc7\x74\xf9\xf2\xe7\xb9\xfe\xfe\x7e\x9b\xdd\x5e\ \xa2\xdd\x4e\xc4\x1b\x1e\x99\x51\xf9\xed\xdd\xf0\x3b\x86\x50\xf3\ \xbe\x3d\x73\x06\x06\x6e\xfe\xe2\x76\xb9\x73\x0e\x47\xa9\xc9\x3f\ \xd7\xef\x98\x3e\x7d\xba\xad\xaf\xaf\xef\xf6\xb9\xee\x73\xc3\xd7\ \xfe\xfe\x4b\x52\xb3\xda\x2e\x87\xd3\xfe\x55\xe3\xa6\xcd\x08\x06\ \x83\xe0\x79\x5e\xbd\x70\xb1\x3b\xa3\x28\xca\x13\x47\xdb\x7e\x1c\ \x9a\x74\xba\x35\xef\xdb\xf3\x3a\x80\xb5\x83\x83\x83\x8b\x09\x21\ \x12\x63\x2c\x5b\x51\x51\x71\x1a\xc0\xd1\xa6\xc0\xf6\x6f\x1a\x1b\ \x1b\xf7\x12\x8e\xbd\xb7\x61\xfd\x46\x74\x75\x75\x81\x52\x6a\x5c\ \xb8\xd8\x9d\x89\xc5\x62\x55\xc7\x7e\x38\x7e\xeb\x9e\xe0\xa2\x8f\ \xe5\x0a\x67\x48\x91\x10\x06\x00\x0d\x0d\x0d\xaf\x4a\xb2\xf9\x8b\ \x0d\xeb\x37\x92\x50\x28\x04\xb3\xd9\xcc\x3a\x3a\x83\xb9\x48\x64\ \xb4\xea\xf8\xb1\x9f\x06\xc8\x5d\x20\xa1\xe0\x3b\x0f\x80\xaf\xad\ \xad\x35\xed\xdf\xbf\x7f\x96\xc7\xe3\xf1\x01\x10\xa2\xd1\x68\xac\ \xb5\xb5\xf5\x6a\x4b\x4b\x4b\x12\x00\xad\xaf\xaf\x5f\x58\x5e\xe1\ \xfb\x79\xc3\xfa\x8d\x24\x99\x4c\xc2\xe9\x74\xe2\xa3\x3d\xbb\x6e\ \x7d\xff\x5d\x5b\x39\x57\xd4\xcf\x26\x00\x62\x61\x35\xcb\xb2\x2c\ \x05\x02\x81\xd9\x3e\x9f\x6f\xbe\xcf\xe7\x7b\xd9\xe5\x72\xad\xb4\ \x5a\xad\x35\xd5\xd5\xd5\x33\x0b\x53\x6d\x4a\x7b\x7b\x7b\xe8\x7c\ \x77\x68\xd1\x81\xcf\x3e\x81\xd7\xeb\x85\xcd\x66\x83\xc3\xe1\xc8\ \x02\xe0\x8a\x9f\x28\x16\x0a\x8c\xab\xbe\x43\x7d\x91\x2d\x0c\x00\ \x05\x60\x8c\xe7\x82\x85\xf3\xa7\x55\x3d\x5e\x75\x44\x96\x65\xaf\ \x12\x1b\x5b\xd6\xd6\xd6\x76\x89\x4c\x30\xf8\xc9\x04\x40\xbe\xc8\ \xe7\x71\xf0\x78\xea\x85\x02\x74\xdc\xff\xff\x35\xfe\x01\xc0\x62\ \xff\xd0\xdd\x98\xb2\xab\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x05\x71\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\ \x0d\xd7\x01\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd5\x04\x08\x11\x06\x01\x82\xaa\xf7\x44\x00\x00\x04\xfe\x49\x44\ \x41\x54\x38\xcb\xb5\x95\x4b\x6c\x5c\xd5\x1d\xc6\x7f\xe7\x71\xef\ \xdc\x3b\x77\x3c\xbe\x09\x8e\x31\x38\xaa\xc0\x4e\x9c\x07\x03\x24\ \x31\x10\x9b\x46\xa2\xa2\x0d\x20\x10\x22\xcd\xa2\xad\x14\xa1\x40\ \x58\x44\x91\xb3\x62\x41\x16\x6c\x02\x6a\x17\xa8\x42\x40\x14\x84\ \x58\x02\x51\xd5\x4a\x51\x05\x0d\x8f\x12\x15\x22\x70\x2c\x6c\x43\ \x14\x22\xc1\x26\x30\x26\x26\x64\xf2\x18\x27\xe3\x8c\x3d\x9e\xb9\ \xaf\x73\x58\xc4\x31\x0e\xd0\x4a\x5d\x70\x36\x67\x71\xfe\xe7\x77\ \xfe\xfa\xce\x77\xbe\x03\xbf\xd0\x10\xff\x6b\x71\x68\xf7\xae\xed\ \xc0\xc3\xc0\x46\xa0\x6b\xbe\xfe\x3c\x30\x0e\xbc\xf9\xf2\xfe\x57\ \x5e\xfb\xbf\xc0\xf3\xc0\x67\xee\xda\x38\x78\xdd\xfd\x9b\xef\xcb\ \x17\xdb\x43\xe9\x38\x1a\x10\x24\x49\xc4\x74\xad\x66\x47\x47\x47\ \x5b\x1f\x7c\xf8\x9f\x4b\xc0\xd3\x3f\x77\x80\xf8\x19\xe8\xbe\xbb\ \x36\x0e\x6e\x7b\xe4\xe1\x47\x96\x58\x10\xd5\xa9\x29\xa6\xa7\xeb\ \x58\x6b\xc8\xb9\x0e\x5e\xce\x65\x49\xd8\x4e\xb1\x58\x24\x49\x33\ \xfe\xfe\x8f\xbf\x35\x4e\x9c\x38\xf1\xda\xcb\xfb\x5f\x19\x5a\xcc\ \x51\x3f\x86\x3e\xf0\xc0\x83\x8f\x6f\xd9\xb2\xb5\xfd\xf4\x99\x33\ \xa2\x5c\x9e\xa0\x36\x3d\x43\x6a\x0c\x52\x69\x1c\x47\x63\x4d\x06\ \x64\x24\x71\x84\x92\x82\x81\x81\x41\xf7\x72\xbd\xbe\xbe\x7b\xf9\ \x8d\x3d\xe3\x63\x9f\xbe\xf5\x13\xf0\xd0\xee\x5d\xdb\x7b\x7b\x7a\ \x9f\xda\xb6\xed\xd1\xf6\x2f\xbe\xf8\x92\xd3\xdf\x9d\x21\x33\x90\ \x59\xb0\x42\xe2\xba\x1e\x8e\xab\xc1\xa6\xb8\xca\x82\x4d\x01\x43\ \x9a\x26\xac\x5b\xb7\x5e\x9e\x3a\x35\x59\xea\xe9\xbd\xf9\xf4\xa7\ \xe3\x9f\x7d\x0e\x20\x17\x35\xfc\x97\xc7\x1e\x7f\x22\x3c\x7b\xf6\ \x2c\xcd\x56\x93\x62\xb1\x88\xd6\x1a\x84\x20\x33\x96\xc4\x18\xe2\ \x38\xc1\xa4\x29\x69\xdc\xc4\xa6\x4d\x30\x11\x36\x4b\x88\x5a\x4d\ \xb6\xfe\x7e\xab\xd6\x5a\xbf\x74\x4d\xc7\x43\xbb\x77\x6d\xbf\xf7\ \xde\xdf\xfe\x69\xcd\xea\x35\xba\x52\x39\x8b\xb5\x06\xa5\x24\x52\ \x49\xb2\xcc\xb0\xb4\xa3\x03\xcf\xf7\xf0\xbd\x1c\x8a\x04\x91\xce\ \xa2\xa5\x41\x09\x81\xb1\xd0\x98\x6b\x51\x2c\x86\x54\xab\x55\xe7\ \xa6\x9b\x6f\x9a\x1e\x1f\x1b\x1f\xd3\x00\x42\x88\x3f\x0e\x0c\x0c\ \xba\xf5\x7a\x1d\x21\x2c\x52\x18\x4c\x96\xe2\x08\xb8\x7e\xd9\x12\ \xbe\xfd\xf6\x1b\x86\x3f\x3a\x82\xc1\x70\xc7\xfa\xdb\xb8\x7b\xc3\ \xaf\x88\x9b\x73\x34\xd3\x8c\x56\x36\x87\x72\x03\xa4\xae\xb3\x61\ \xc3\x1d\x72\x62\x62\xe2\x49\x60\x9f\x04\x50\x4a\x6d\xea\xb8\xae\ \x83\x24\x89\x70\x94\x44\x93\x60\xe3\x19\x7c\x27\xe5\x42\x65\x92\ \x13\xc7\x8f\xd9\x9e\x9e\xde\x89\x35\xab\xd6\xbe\x7b\xfe\x42\x2d\ \x3b\xfe\x65\x85\x7c\x61\x29\x97\x67\x66\x11\x42\x20\xa5\x22\x4d\ \x33\x96\x77\x77\x13\xc5\x71\xf7\x82\xc6\x69\x9a\x05\x5a\x6b\xb4\ \x52\xb8\xda\xe2\xaa\x16\xca\x4e\xe3\x52\xe7\xdf\x87\xdf\xa7\xab\ \xeb\x86\xf7\x76\xee\xdc\xd9\xbb\x63\xc7\x8e\x87\xb2\xcc\x6c\x1e\ \x19\x3b\x4e\x5b\xd8\x89\xeb\x17\xc9\x17\x42\x3c\xcf\x07\x21\xc8\ \x79\x1e\x49\x12\xeb\x05\xb0\x10\x57\xfc\xac\x94\x42\x2b\xd0\xa2\ \x89\x34\x0d\x30\x11\x85\x42\x1b\x95\x4a\xe5\xb9\xab\x97\xf2\x75\ \xf9\xe4\x30\x58\x8b\xf6\xb1\x32\x87\x41\x5d\x71\x8e\xb1\x48\xf9\ \x83\x17\x34\x80\xd6\x4e\x2b\xcb\x32\xdf\x75\x1c\x32\xd7\x27\x75\ \x97\xe2\x78\x90\x5a\xcd\x2d\x6b\xfa\x28\x7f\x53\x79\x75\x68\xf7\ \xae\x5b\x01\x0a\x85\xb6\x17\x7f\x73\xcf\x80\x88\x92\x39\x1a\xcd\ \x08\xc3\x1c\x08\x89\x94\x92\xb6\x38\xc2\x75\xdc\x6c\x01\x9c\x73\ \xdd\xef\x6a\xb5\xda\xca\x42\xe0\x93\x26\x79\xd2\x5c\x88\x1b\x28\ \xe2\x24\x63\x5d\x7f\x0f\x4b\x3b\x2b\xab\x8d\x35\x91\xc5\x9a\x5f\ \x6f\x1a\x54\xab\xfb\xba\xa9\x56\x4f\xa1\xb5\xa2\x15\x45\x08\x21\ \x09\xc3\x90\xa9\xa9\x29\xfc\x7c\xbe\xb9\x60\xb7\xfe\xfe\x0d\x52\ \x48\x79\xff\xda\xb5\x6b\x45\x66\x2c\x42\x39\xb8\x39\x1f\xa1\x7d\ \x1a\xb1\x21\xdf\xde\x49\x5f\xa9\x5f\xac\x2a\xf5\xcb\x42\x5b\x28\ \x6a\x97\xce\x63\x92\x18\xc7\x0d\x88\x63\x43\x96\x65\x74\x76\x76\ \x32\x3c\xfc\x31\x8d\xb9\xc6\xd1\x23\x1f\x1e\x79\x5d\x03\xec\xdb\ \xb7\xff\x25\xed\xe8\xbf\x6e\xfe\xdd\x66\x27\xe7\xf9\x08\xa5\x89\ \xa2\x08\x69\x13\xb4\x49\xb8\x70\xe9\x32\xb3\x8d\x16\x52\x4a\x84\ \x4d\xc9\xbb\x96\xc0\x95\x58\x3b\x8b\x10\x2e\x61\x18\x92\x24\x31\ \xe5\x89\xb2\x95\x42\xfd\xe1\x9a\x97\x67\x8c\xdd\xf3\xc6\x81\xd7\ \xad\x54\x1a\xad\x1d\xb4\x93\xc3\x71\x72\xe4\x72\x39\xf2\x9e\x4f\ \xd8\xde\x4e\xb1\xd8\x46\x21\x08\x00\x87\x28\x16\x34\x1a\x4d\x82\ \x20\xa0\xa3\xa3\x83\x7f\x1d\x7a\x0b\x29\xe5\x9b\x7b\xf7\xee\xbd\ \x78\x4d\x56\x8c\x8e\x8e\x1d\xbb\xfd\xf6\xdb\xc4\x5c\xb3\x71\xcf\ \xaa\xbe\xd5\x0b\x56\xb1\x40\x14\x47\x20\xc0\x51\x12\x29\x2c\x98\ \x14\x93\x19\xc2\xb0\x83\x65\xcb\x3a\x39\x7c\xf8\x30\x93\x93\x93\ \xb5\x67\x9f\xfd\xf3\xe0\xfc\x16\xab\xe6\xa3\xd3\x03\xfc\xa3\x47\ \x47\x3e\x5f\xb1\xa2\xb7\xf4\x55\xf9\xab\x15\x7d\x2b\x57\x12\xe4\ \x03\xb2\x2c\xc5\x98\x0c\x25\x05\xae\xa3\x50\x58\x0a\xf9\x1c\x5d\ \x5d\xd7\x93\xa6\x29\x6f\xbf\x7d\x88\x72\xf9\xeb\xd6\xc1\x83\xff\ \xdc\x74\xf1\xe2\xc5\x08\x48\x17\x83\xe5\xfc\xec\x0c\x7f\x3c\x7c\ \x64\x79\x77\xb7\xfc\xec\xd8\xf8\x9d\x49\x92\x08\xdf\xf3\x28\x04\ \x79\xda\x0a\x01\x81\xe7\xe1\xe7\x1c\xa2\xa8\xc5\x27\xa3\x23\xbc\ \x73\xe8\x10\xb3\xb3\xb3\x07\x9f\x7f\xfe\x85\x1d\xd5\x6a\xb5\x0e\ \x34\xe6\xc1\x66\x71\xd0\xcb\x79\xfb\xb5\x01\x3a\x9f\xcf\x07\x7b\ \xf6\x3c\xf5\xae\x31\x59\x4f\x63\xae\xa1\xa3\x28\x12\xc0\x15\xcd\ \xfd\xbc\xd1\x8e\x5b\x39\xf0\xc6\x81\x2d\x27\x4f\x9e\xac\x01\xd3\ \x40\x0b\x88\xe6\xa5\x30\xff\xed\xcf\x93\x8b\xd2\x4f\x97\x4a\xa5\ \xb0\x54\x2a\xdd\xe8\x79\x5e\x70\xee\xdc\xb9\x73\x23\x23\x23\x17\ \x66\x66\x66\x5a\x57\xbb\xbb\xaa\xeb\x62\xc0\xf7\xfa\xbc\x1e\xcb\ \xc3\xf7\x5d\x2b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x03\x12\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ \x79\x71\xc9\x65\x3c\x00\x00\x02\xa4\x49\x44\x41\x54\x78\xda\xac\ \x55\x3b\x6f\x13\x41\x10\x9e\x1d\x4e\x88\xca\xb2\x0c\x12\x05\x75\ \xda\x40\x41\x5c\xb9\x22\xe0\x28\x05\xb1\x14\x84\x28\xf9\x01\xe9\ \xc2\x4b\x44\xb6\x8c\x93\x60\x47\x48\x51\xc0\xa1\x82\x02\xa5\x44\ \x08\xa4\x40\x91\x02\xb9\x8a\x29\x8c\x69\x63\x1a\x68\x2c\x21\x37\ \xd8\x9d\xdf\x8f\x65\x67\x5f\xe7\xf5\x9d\x10\x12\x39\x69\x6e\x1f\ \x37\xfb\xed\xb7\xdf\xcc\xec\x31\x00\xb8\x28\x2c\x73\xfb\xce\xad\ \x35\x38\x85\xe7\xdd\xdb\xf7\xaf\x45\xf3\x86\x89\xd7\xcb\x7a\xbd\ \xbe\x16\x8d\x46\x1d\x07\xc6\xd8\x3f\xf7\x4d\x3b\x1e\x8f\xa1\xd1\ \x68\xc0\xdc\xdc\xdc\x27\x8f\x98\x46\x22\x11\x68\xb5\x5a\xe4\x01\ \x4c\x3b\x32\xb5\x42\x2d\x12\x86\x21\x7d\xdf\x50\xb6\x88\x00\xb1\ \x58\x0c\x04\xe6\x4d\xa4\xf5\x28\x66\x08\xea\x59\xa1\x00\xdf\x6b\ \x35\xa8\x9d\x9c\x40\x21\x9f\xb7\x0b\xa7\x81\x90\x81\xed\x67\x33\ \x19\xf8\x56\xad\x42\xf5\x6b\x05\xd2\x1b\x8f\x25\x86\xe7\x79\x92\ \xbd\xe7\x9f\x0b\x60\x25\x95\x82\x0b\xcb\xcb\x72\xb8\x72\x74\x24\ \x1d\x9f\x6e\x6d\xc9\x79\x7a\x3e\x1e\x1e\xc2\x93\xcd\x9c\x3d\x09\ \xcd\xa7\x3f\x34\xe5\xb7\xed\xd5\x94\x3d\x91\x05\x56\x0c\x82\x81\ \x60\x61\x9b\x31\x75\x3a\x16\xb2\x80\x21\x53\x0c\x49\x05\x7f\x1a\ \x25\xa3\xdf\x62\x31\x19\xf5\xa5\x68\x81\xcd\x04\x28\xaa\x96\x7c\ \xb6\x57\xcf\x4b\xa3\xbe\xd1\xda\x91\x82\xc6\x1b\xe9\x34\x30\xad\ \xe1\xfc\xe5\x2b\x76\x31\x31\x35\x52\x2c\xc4\xe3\x56\xe3\xfc\xce\ \x8e\x0d\x5e\x22\x91\xd0\xa7\x9e\x91\x42\xa7\x43\x40\xd3\x6c\x6e\ \x53\x13\x67\x0e\x28\x81\xa1\x96\x50\x9e\x00\xd0\x91\xc7\xf3\x85\ \x40\x1b\x10\x57\x53\x70\x52\xca\x66\x09\x9a\xfc\xf5\x53\x14\x98\ \x19\x39\x8c\xc3\x03\x88\x0a\xc1\xc9\x5b\xb0\x80\x7a\x0d\xbd\x10\ \xe4\x86\x81\xe0\xa9\x80\x06\x03\x48\xb8\x08\xcc\x05\x47\xbd\x01\ \xb5\x88\x72\x73\x45\x20\x2c\x78\xa8\x26\xb2\xb9\x9c\x72\x12\xe3\ \xab\xf1\x05\xc5\x86\x81\x3e\x3e\x33\x3c\x2d\xbb\xfb\xeb\xeb\x4e\ \x4c\x9e\x17\x8b\x33\x52\x90\xca\x3a\x48\x0c\x4d\xa6\xa0\x53\x79\ \x14\x07\x30\x9a\xa3\x5f\x24\x9f\x2f\xdd\x55\x31\x49\x1d\xc8\x2a\ \xb6\x52\xd8\x02\x31\x1a\x82\x1f\xf5\xe9\x72\x7e\xf4\xf0\x01\x7c\ \x29\x97\xa1\x7c\x7c\x2c\x98\xde\x83\xb0\xa0\x84\xe4\xb1\x39\x22\ \x2a\xc6\x26\x95\xa6\x80\x67\xd9\x91\xbf\xcc\x73\xd1\x37\x52\x24\ \x97\x96\x66\x4b\xda\x8f\xb8\x4e\xa0\x99\x1b\x8c\x85\x96\xfc\x8b\ \xfd\xa2\xf5\xbd\x9e\x4c\x5a\x3f\x9c\x66\x2c\x6f\x39\x54\xfa\x21\ \x06\x81\x89\xd1\x8d\x5f\x07\xd2\x54\x09\xfb\x04\xcc\x95\xeb\x14\ \xc8\x60\x30\xf8\xcb\x5d\xeb\xdb\xee\xde\x9e\x0d\xe6\xb5\xc5\x45\ \x1b\x9b\xe9\x4b\xa9\xd9\x6c\x5a\xf0\x57\x95\x4a\x85\x8b\x09\xde\ \xeb\xf5\x78\xbb\xdd\xe6\x9d\x4e\x87\x77\xbb\x5d\x39\x26\xeb\xf7\ \xfb\x5c\x6c\xce\x87\xc3\x21\x1f\x8d\x46\x5c\xfc\x29\xf8\x64\x32\ \xe1\xb3\x8f\xf8\x59\xf0\x52\xa9\xc4\x05\xe6\x0f\xda\x66\x9e\xae\ \x53\xba\xf5\x4f\xe9\x9f\xf7\x53\x34\xbb\x04\x7c\x56\xd8\x39\xdd\ \x9e\xf9\x4f\xdc\x89\xb0\xa1\xb0\xee\x1f\x01\x06\x00\xa6\x8d\xeb\ \x65\x53\xa3\x8b\x75\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x04\xd5\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ \x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ \x67\x9b\xee\x3c\x1a\x00\x00\x04\x67\x49\x44\x41\x54\x38\x8d\xa5\ \x93\x7d\x68\xd5\x55\x1c\xc6\x3f\xe7\xf7\x7a\xef\xfd\xdd\xdd\x3b\ \xb7\xb6\xb9\x79\xa7\x6d\xbe\xcd\x19\xe9\x72\x58\x62\x43\x7b\x93\ \x62\x25\x46\x82\x34\xc8\x7f\xf2\x6a\x50\xa9\x11\x44\x21\xcd\x5c\ \x85\x95\x98\x53\x4a\x21\x15\x35\x19\x51\x52\x19\x68\x8a\x60\x66\ \x8a\xba\x4d\xa7\xd3\xcd\x97\x4d\x45\xd7\x72\x2f\x6d\x73\x6f\xf7\ \xde\xdd\x97\xdf\xef\xf4\x47\x57\xc9\x5a\xa0\xf8\x85\x87\x73\xe0\ \x70\x3e\xe7\xe1\xe1\x39\x62\xdd\xcb\x8a\x1f\x58\xa4\x08\xb1\x5c\ \x0a\x91\x2a\xa4\xb3\x61\x69\x95\xbd\x82\xfb\x1c\x45\x08\xde\xcd\ \x19\x53\xf8\xf1\xac\xb9\xc1\xc0\x93\xa5\xaf\x78\x3d\xbe\x11\xcb\ \x2a\xcb\xd4\x05\xf7\x0d\x56\x55\x3d\x58\x58\x3c\xdb\x0c\x5f\x3b\ \x48\xbc\xf7\x0a\x53\x1f\x9d\x63\x29\x82\x75\x95\x65\xaa\x7e\x5f\ \x60\xc7\x8e\xc7\x9c\x44\x02\x45\x35\x18\x6c\x3b\x8b\x65\x79\xc8\ \x1a\x35\xd6\x0f\x2c\xd9\xba\x52\xbc\xb0\xe3\x23\xf3\xd8\x57\x4b\ \xc4\x3d\x3f\xa2\x00\xdb\xcf\xd5\x1c\x88\xf8\xf2\x67\x63\x65\x4d\ \xa6\xbf\xa5\x86\x82\xa2\x12\x8f\x99\xc6\x1a\xc3\x95\xf2\xad\x94\ \x4c\x13\x39\xe4\xdd\xbb\x63\xc9\x8a\xee\xf6\x6b\x95\x47\xf6\x7f\ \x33\xa4\x8d\x98\x80\x99\xf6\x20\x2d\x9d\x47\x48\x1b\x9b\xee\x9a\ \xb7\x70\xb9\x3b\x3b\x77\x5c\x54\x24\x78\xf8\x5e\xc1\x42\x4a\x09\ \x40\x65\x99\x3a\x5f\xd3\xb5\xaf\xd3\x27\x7a\xdd\xbe\x0c\x8b\x19\ \x4f\x3d\x87\xcb\xf0\x72\xe6\xad\x3d\xf4\xfc\xd4\x6c\x0b\x5b\x6c\ \x2a\xb5\xed\x37\xef\xda\xf1\xad\x8d\x7f\xa2\x53\xe7\xce\x8b\xf5\ \x3d\x10\x30\x65\xd1\x8c\xc9\x44\x7e\x3f\x45\xcd\xb3\xdb\xe0\x70\ \x27\x85\x23\x03\xaa\xad\xc8\xd7\x36\x97\x8b\x85\x9b\xcb\xef\x2e\ \x6f\x05\x60\x6b\xb9\x98\x29\xa1\xae\x70\xea\xb8\x8c\x49\x53\x0b\ \x44\x6f\x6d\x13\x0d\xf3\xce\x92\xd6\xad\x13\xb0\x52\xb9\xf8\xe7\ \x0d\x52\x17\x17\x68\x39\xb9\xb9\x1b\x55\x4d\x5c\xdf\x5c\x2e\xe6\ \xdf\x55\x14\xdb\x56\x89\xbd\x52\xe8\x73\x52\xd3\xfc\x61\x4f\x63\ \xcc\xe3\xec\x08\x69\x05\x19\xa3\x18\x8a\xc7\xb8\xda\xd7\xc5\x98\ \x4f\xc6\x93\xf5\x4c\x00\x77\x4a\x31\x7d\x3d\xed\xd4\xfe\xb6\x3f\ \xdc\xd7\xd3\xd1\x18\x8f\x3b\x65\xc1\x0a\x79\xf9\x7f\xc1\x00\x5b\ \x56\x89\x00\x0e\x93\x46\x7e\xa6\x7c\x37\x21\x6d\x64\x6a\x77\x34\ \x44\xb7\x16\x25\x6f\xbd\xc4\x33\x5a\xc5\x34\x3d\xe8\x86\x85\xcb\ \xfb\x08\x9a\xa7\x88\x3f\xae\x5d\x90\xc7\x0f\xee\x09\xc7\xa2\x83\ \xab\x1d\x47\x7e\x1a\xac\x90\x89\x61\xc1\xb7\x66\xaf\xaa\xbe\x6f\ \xab\xf2\x83\x94\x59\xf9\x22\xe7\x9d\xeb\x42\x71\x49\x34\xcd\xc4\ \x34\x3d\x18\xa6\x07\x4d\x33\xd1\x35\x2f\xba\x35\x8d\xb8\xcc\xe7\ \x74\xf5\x2f\x91\x2b\x0d\x47\x7a\x63\xb1\xe8\x2a\x60\x7b\xb0\x42\ \x46\x87\x05\x03\x6c\x59\x29\xa2\xa5\x65\xaf\x1b\xa1\xae\x9d\x48\ \x27\x84\xa6\x19\x98\xa6\x85\x61\x5a\xe8\x7a\x1a\xc8\x28\x6e\xb7\ \x07\x55\x4f\x05\xb3\x88\xfe\x01\x8b\xfa\xea\x7d\xe1\xab\x17\x6a\ \xe3\x52\x3a\x6b\x1d\x87\x35\xca\x7f\xa8\x80\xa2\xd2\x1a\x1e\xec\ \x46\x35\x32\x01\x90\x52\x22\xf9\xdb\x80\xa2\x0c\xa1\x99\x01\x22\ \xa1\x28\xd2\x8e\x21\xa2\x27\xf1\xbb\xea\x79\xfc\xe9\x52\xcf\xf3\ \x65\xcb\xfc\x52\x28\x2b\x6e\xb7\xe2\xdf\x23\x1d\x76\x77\xb5\xb5\ \x38\x86\x6b\x3c\x20\x49\xc4\x13\x48\xdb\x01\x4c\xec\x84\x8d\xae\ \x86\xd0\x3d\x13\xe9\xed\xe9\xc7\x91\x06\x20\x51\x54\x2f\x97\x1b\ \xab\xa3\x9a\x42\x55\xb0\x42\x0e\x0d\x0b\x76\x1c\xbe\x6f\x3e\x7f\ \x26\xac\xbb\x27\x20\x84\x0b\x29\x1d\x62\xb1\x04\x52\x4a\x6c\x27\ \x85\x48\xa8\x17\x97\x5b\xc1\xe5\x2b\xa4\xb3\xad\x0f\x5b\x2f\xe1\ \x62\xfd\xf1\x44\xd3\xb9\xea\x96\x78\xdc\x79\x63\x58\xc7\x42\x08\ \x65\xf1\x87\xd4\x47\x42\xe1\x4b\x1d\xad\x4d\xd2\xf0\x4e\x41\x51\ \x21\x11\xb7\x89\x86\x7b\xd1\x5d\xe9\x0c\x45\x24\xe1\xde\x2b\x78\ \xfc\xf9\xb8\xfc\x25\xd4\x1e\xda\x19\x3f\xf1\xeb\x8f\x97\x7a\x7a\ \xed\x92\x60\x85\x8c\xdc\x01\x16\x42\x28\x42\x08\x1f\x90\x05\x64\ \x1f\x3e\xc9\xda\xb3\xb5\xd5\x51\xd3\x2a\x46\xd5\x33\x31\x3c\x99\ \x84\x07\x87\x88\x85\xaf\x92\x92\x31\x9d\xee\x6e\x95\x81\x7e\xc9\ \xf1\xc3\x7b\xa2\xa7\xeb\x1a\x4f\xac\xdc\x98\x58\xf0\xf6\xe7\x28\ \x42\x08\x9f\x10\x42\x28\x49\xa8\x00\xac\xa4\x52\x00\x5f\xd5\xcf\ \xdc\x68\xef\xe8\x69\xb8\x50\x77\x20\x61\xa5\xcf\xc5\x71\xe2\xb8\ \x7d\x63\xe9\xbb\x09\xaa\x91\x87\x61\x8d\x63\xff\xae\xf5\xb1\x93\ \xa7\x9a\xf6\x2d\x5d\x1d\x2f\x6f\xed\xc0\x4c\xde\xb5\x00\xeb\x76\ \xdd\x84\x10\xde\xe4\x81\x37\xa9\x94\x40\x16\x59\xef\xbd\xca\x17\ \x8f\xcd\x7a\x22\x23\x3b\x37\x53\x18\xae\x6c\xfa\xda\x1b\x69\xbd\ \xde\x6c\x5f\x3c\xdf\x12\xde\x77\xd4\xd9\xb0\xfb\x10\xc7\x80\x41\ \x60\x20\xb9\x0e\x02\x5d\x77\xf4\x58\x08\xe1\x02\xfc\x80\x27\x29\ \x77\x71\x21\xa3\x83\x2f\x89\x6d\x33\xe7\xcc\x4b\x89\x45\xda\x38\ \x53\x5d\x1b\xeb\xec\x72\x8e\xae\xaf\x92\x1b\xda\xba\xb8\x09\x44\ \x92\x0a\x03\x37\x81\x01\x29\xa5\x3d\xec\x07\x49\x46\x64\x00\x2e\ \xc0\x58\xf4\x22\x53\xa6\x3f\xc4\x0f\x71\x9b\x53\x0d\xcd\x7c\xb9\ \x69\x17\x35\x40\x1c\x88\x01\x43\x40\x14\x48\xc8\x7f\xc0\xfe\x02\ \xac\xc3\xe6\x28\xcc\x5c\x0b\x9f\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x13\x8f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x00\xaa\x00\x00\x00\xaa\ \x01\x06\x0a\x70\x4f\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x13\x0c\x49\x44\ \x41\x54\x68\x81\xb5\x99\x69\x90\x1d\xd7\x75\xdf\x7f\xe7\x76\xf7\ \x5b\xe7\xcd\x3e\x03\x60\x30\x83\xc1\x46\x60\x88\x1d\x24\x44\x80\ \x24\x40\x88\xab\xcc\xc5\xa2\x14\x51\x52\x4a\xaa\xb2\x12\x47\xa6\ \xec\x24\xa5\x4a\x62\x55\xaa\x52\xf6\xa7\xc4\x51\xca\x51\x52\x2e\ \xd3\x56\xc9\x56\x39\x76\x25\x8a\x5c\xb1\x54\xa1\xcd\x32\x29\x93\ \x92\x40\xda\x02\x09\x2e\x20\xb1\x10\x20\xf6\xc1\x3a\xc0\xcc\x60\ \x30\xdb\x7b\x6f\xde\xd6\x7d\xef\xc9\x87\xee\x59\x41\x51\x62\x52\ \xb9\x53\x77\x5e\x7f\xe8\xe5\xff\xbf\xe7\x7f\x96\x7b\xae\xa8\x2a\ \x1f\x77\xa4\xd3\xe9\x8e\x3d\x7b\xf6\x7c\xdd\x5a\xdb\x76\xf1\xe2\ \xc5\x03\xc3\xc3\xc3\x3f\x56\xd5\xea\x2f\x7a\x4e\x44\xe4\xb5\x6f\ \x35\x6f\xe8\xcc\x04\x5f\x4c\x8b\x77\xaf\xb1\xa6\xd7\x88\x14\x2a\ \x1a\x9d\x3b\x39\x5a\x7b\xfa\x8b\xff\xb1\xf8\x0b\xdf\x71\xdb\x3b\ \x3f\x2e\x81\x3d\x7b\xf6\xac\x8b\xa2\xe8\xcd\xd1\xd1\xd1\xff\xd5\ \x68\x34\x2e\xf4\xf7\xf7\x3f\x59\xad\x56\x37\xde\xb8\x71\xe3\xd9\ \xf1\xf1\xf1\x1f\x2f\x05\xfc\xf2\x37\x9b\x57\x2d\x6f\x0a\xbe\x90\ \xf3\xfc\x07\x8c\xf5\xd6\x17\x24\xe8\x69\x97\x54\xb3\xaf\x66\xee\ \xbe\x50\x1c\x6f\x4e\x8d\x3f\xbf\xff\x77\x27\x9e\xd1\x8f\x09\xc8\ \xff\x58\xe8\x63\x50\x7f\x71\xea\xd4\xa9\x6f\x6c\xdc\xb8\x71\x28\ \x0c\xc3\xff\x51\x2c\x16\x27\x8c\x31\xd9\xde\xde\xde\x1f\xae\x5a\ \xb5\xea\xdb\x8f\x6e\x1a\xfb\xde\xd7\x9f\x6a\x79\x28\x17\xa4\x1e\ \x1d\xfc\xce\x9a\x3b\xb2\xa4\x56\x76\x7a\xb9\x96\x40\x3d\xf0\x1d\ \xa8\x03\xe7\x40\x2d\xb8\x08\x80\x40\x0d\x4d\xbe\xbf\x27\xc1\x13\ \xfe\x7f\x23\xf0\xf0\xc3\x8f\xfe\xe6\xcd\x9b\x63\xa6\xcd\xdb\xfd\ \xa3\x5a\x6d\xf4\xc4\xf5\xcb\xc5\xdf\xf8\xc4\x1d\x7d\x13\x15\x6f\ \xe2\xbb\x93\x95\x70\xa0\x29\xe5\xbe\x71\x75\xa2\xef\xdf\x7e\x70\ \xae\xcf\x84\x75\x5f\x2a\xa1\x52\xa9\x43\xb5\xa1\x54\x1b\x4a\x23\ \x02\xeb\x94\x30\x52\x22\x85\xc8\x3a\x50\xe8\xce\x87\x7c\xe1\xbe\ \x7a\xfb\xbf\xfc\x74\x66\x37\xf0\xfa\xc7\xc1\x74\x9b\x84\x76\xc9\ \xae\x60\x6a\xc5\xca\x7f\x9a\x6d\xca\x7e\xbe\x29\x9f\xed\x47\x08\ \x14\x3c\x34\x4a\xd5\xdc\xe9\x4e\x4f\xd7\x96\xd2\x69\x4d\x17\xcb\ \x83\xe9\x65\xed\x3b\x50\x8c\x8c\x4e\x1e\x93\xe1\x1b\xd7\xf1\xfc\ \x0c\x5d\xdd\x05\x3a\x5a\x76\xe2\xd4\xa2\xea\x70\x1a\x81\x2a\xc8\ \xcf\x07\xa1\x4e\xc9\x54\x6f\xf1\xa5\x4f\x1e\xfd\xaf\x5f\xfb\xf6\ \xf4\x37\x3e\x12\xb0\x48\x0a\xc8\x17\x0a\x05\xaf\x54\x2a\x4d\xdd\ \x66\x81\xa9\x95\x7d\x5f\xdf\x76\xd7\xd6\xdf\x6f\x6d\x6b\xf5\x50\ \x50\x55\x9c\x2a\xe3\x93\x47\x98\x18\xef\x63\x4d\xff\xce\xd6\x91\ \x9b\x47\x51\xb3\x9a\xf6\x65\xab\x50\x67\x19\x2f\x5e\xa4\xa5\x6d\ \x8a\x46\xdd\x27\xf0\x3d\x72\xf9\x26\x54\x23\x22\x1b\xe1\x6c\x44\ \x64\x43\x9c\xb3\xa8\x2a\x1f\x26\x71\x31\x42\x85\x2c\xe5\x4a\xfa\ \x31\x11\x31\xaa\xea\x96\x80\x16\x20\x35\x30\x30\xb0\xe2\xd9\x67\ \x7f\xeb\x77\x76\xdf\xb3\xe7\x1f\x1d\x7f\xff\xc4\xd8\x73\xcf\xfd\ \x97\x47\x6e\x23\x90\xcf\xe7\x3e\xd9\xdd\xdd\xed\xa9\x0a\x4e\x15\ \x54\x29\x55\x86\xb9\x7c\xe5\x1c\xbb\x76\x7c\x09\x14\x66\xaa\x23\ \xf4\xae\xd8\x8f\xef\xa7\x50\xb5\xac\xec\xdd\xc6\xd4\xa9\x8b\x88\ \x71\x84\x91\xc1\xf3\x04\x48\x03\x1e\x6a\x0c\x62\x0c\xd6\x86\x58\ \x1b\xa1\xea\xd0\x64\x61\x16\x59\x21\x95\xe3\xd8\xa5\x8e\x75\x30\ \x96\x03\xca\x0b\x80\x67\xee\xbf\xff\xfe\xcd\x7b\x76\xef\xfb\xbd\ \xbd\xfb\xf6\xee\xdb\xb2\xf9\xce\x5c\x3a\x9d\xe2\xdc\xb9\xc1\x2a\ \x10\x2c\x22\xf0\xf8\x27\x52\xa9\x35\x7d\xbf\x76\xaf\xe7\xa5\xe2\ \x97\x2a\x58\x1b\x31\x74\xfd\x1d\x36\xac\x7b\x8c\x54\x90\x66\x62\ \xfa\x2a\xf5\x3a\x34\x35\xb5\xa3\x2e\x96\x48\xa5\x74\x0e\xdf\xf7\ \x51\x8d\xa2\x4a\xa5\xea\x7b\xc1\x55\x5c\xd4\x47\x10\x04\x38\x67\ \x40\x0c\x92\x4c\x6b\x1b\x09\x01\x87\x73\xf3\x24\x8c\x27\xcc\xd4\ \x32\x99\x55\xdd\x66\x99\x88\xcc\x00\xb9\x67\x9e\x79\xe6\x53\x5b\ \xb7\xec\xfc\x9d\xbd\xfb\xf6\x6d\x5d\xbb\x76\x55\xe0\xfb\xde\x1c\ \x2e\x11\x63\x00\x6f\x8e\x80\x88\x98\x3f\xff\xed\xa6\x87\x5e\x3b\ \x1d\xb4\xfb\x7e\x0a\x50\x54\xe1\xfa\xc8\x9b\xa8\x6d\x62\xf9\xb2\ \xb5\xa0\xca\xc4\xe4\x39\x96\x77\x6e\x4e\x56\xdf\x51\xa9\xce\xd0\ \xde\x95\xe1\xf4\xf9\xd2\xb5\x9b\x37\x6f\x9e\x05\x1a\xdb\xb6\xdc\ \xfd\x60\xbd\x3e\x9a\xcd\xe7\xd7\x62\x6d\x98\x80\x17\x8c\x80\x31\ \x42\x64\x43\x62\x91\xe8\x22\x59\xe5\xd3\x81\x79\x78\x47\xe6\x49\ \xed\xf9\x72\x76\xfb\xb6\x1d\x5f\xbb\xef\xbe\x3d\xfd\xcb\x57\x74\ \x19\x63\x6e\x77\x20\x51\x04\x30\x0b\x2d\x10\xcc\x54\xb8\xd3\x78\ \x69\xf1\x7d\x1f\x75\x70\xf5\xfa\x21\xae\x5d\xbb\xc4\xbe\xfb\x7e\ \x1d\x80\x6a\x6d\x86\xa9\xe9\x1b\xec\xbe\xfb\xc9\xe4\xc3\x8e\xb0\ \x3e\x43\x3a\x97\xc2\x39\xf7\x22\xf0\xa7\xc0\x64\xbe\xc9\xfb\x4e\ \x6d\xa6\xfc\x84\x1f\xa4\x31\x62\xb0\x2e\x04\x01\x27\x82\xd8\x98\ \x4c\x14\x35\x10\x51\x9c\x53\x54\x2d\x0e\x4b\x53\xdf\x06\xf6\x3c\ \xf8\xec\xb7\xee\xba\xe7\xbe\xa0\xad\xad\xf9\x23\xdc\x1e\x88\x49\ \xc9\x42\x02\x5e\xda\x93\x76\x35\x01\x9e\xe7\x73\x7d\xf4\x08\x17\ \x2f\x9d\x60\xff\xde\xdf\xc4\xf3\x7c\xd4\x39\xc6\x27\x4e\xd1\x94\ \xeb\x27\x15\xa4\x71\xea\x70\xce\xd1\xd5\x7d\x07\x57\xaf\x9d\xe5\ \x2b\x5f\x78\xf8\x8b\x1d\xb9\xe2\xf5\x9a\x6b\xea\xba\x32\xe6\x7d\ \xca\x37\x1d\x04\x7e\x80\x05\xc4\x09\x88\xc1\x8a\x41\x8c\x20\x11\ \x88\x40\x18\x36\xf0\x03\xc7\xc0\x40\x1f\x0f\x3f\xfc\x00\x3b\x76\ \x6e\x21\x97\xcb\xa4\x3e\x12\xf8\x1c\x7e\x91\x45\x12\x02\xf4\x8d\ \x33\x3a\x48\x73\xc0\xf8\xc4\x05\xce\x9e\x3f\xc4\xfe\xbd\x5f\x23\ \x9d\xce\x81\x2a\x75\x5b\x61\x78\xe4\x04\xdb\xb7\x7c\x09\xdf\x4f\ \x25\x04\x2c\xce\x79\x74\x76\xdc\xc3\x99\xc1\x77\xdb\xd3\xb9\xec\ \xef\x79\xae\x4e\xad\x22\xb4\x77\x6f\x4b\xa4\x69\x90\x68\x56\x42\ \x82\x75\x80\x2a\x99\xac\x32\x70\xe7\x6a\x1e\x79\x74\x3f\xeb\xd7\ \xaf\x26\x95\x0a\x7e\x19\xdc\xf3\x23\x26\xb0\x28\x91\x45\x7f\xfb\ \x56\xea\xd2\xde\x7d\x57\xf5\xc6\x95\xcb\xb2\xf7\xde\xaf\x92\xcf\ \xb7\x21\x28\xaa\xc2\xbb\xc7\xbe\x4f\x6b\xf3\x16\x5a\x5a\xba\x71\ \x56\x31\xcc\x12\xb0\xb4\xb6\xae\xa2\xb9\xb0\x92\x7a\x58\x46\xad\ \xd2\xd2\x66\x70\x2e\x4a\xf4\x2f\x08\x20\x36\x76\xdc\xa6\x82\xb0\ \x65\xeb\x00\xfb\xf7\xdf\x47\xcf\xca\x6e\x3c\xcf\xfb\xa5\xf0\x56\ \xab\x21\x63\x37\xa7\x58\xd5\xdf\x15\xe3\x4f\x0c\xe1\x07\x41\xd0\ \xbc\x69\xd3\xa6\x27\xee\xbf\xff\xfe\x87\xc2\x30\x7c\x62\x6c\xec\ \x16\x8f\x3d\xf4\x6f\x48\x05\x59\x34\xb9\xed\xc4\xa9\x97\x98\x9a\ \x9c\xe4\xf1\xc7\xbe\x1a\x6b\x5f\x5c\x6c\x01\xf1\x50\x63\xb1\xce\ \x62\x89\xc8\x98\x02\xce\x59\xac\x8d\xb0\x4e\x10\x01\xb1\x82\xba\ \x90\xe6\x56\xc7\xce\xbb\xef\x64\xf7\xee\xbb\xe8\xe8\x68\x9d\x5d\ \xc0\x5f\x38\x4a\xc5\x3a\x47\x8f\xbe\x5f\x7b\xf7\xbd\xb7\x4f\xf5\ \xf6\xae\xec\x5e\xd5\xff\xd9\xde\xc4\x00\xb1\x13\x3f\xf4\xd0\x43\ \x0f\x8c\x8c\x8c\x3c\x7d\xf2\xe4\xc9\x7f\x68\x54\x33\x2f\x7c\xf9\ \xf3\x9f\x7b\x21\x9d\xc9\x7b\x82\xa0\x08\xc7\xdf\xff\x21\x57\xae\ \x5d\xe4\xf1\x4f\x7d\x03\xdf\x04\x28\x9a\x84\xc0\x84\x84\x8d\xc3\ \x63\xec\xac\x06\x67\xa3\x58\x36\x56\x08\xb5\x4a\x57\x67\x9d\x5d\ \xbb\xb6\xb2\x75\xfb\x9d\x14\x0a\xb9\x8f\x04\x3e\x1b\x8d\xd4\xc1\ \xc4\x44\x99\x37\x0e\xbd\x59\xfc\xe0\x83\xe3\xef\xbd\xf7\xde\x5b\ \xff\xe1\xed\xb7\xdf\x3e\xf2\xdc\x1f\x7e\xe7\x67\x40\xaf\x08\x71\ \xf6\x03\xfc\x57\x5e\x79\xe5\x45\xe0\x45\x80\xae\xfc\xb6\xbb\x8d\ \x97\x56\xcf\xf8\x8c\x8c\x9e\xe6\xdc\xe0\x6b\xd4\x6b\x86\xcf\x3c\ \xf5\xbb\x18\x63\x40\x89\x81\xe3\xf0\x9c\x62\x9d\xc5\x89\xc1\x59\ \x83\x35\x02\x56\x10\x04\x31\x42\x10\x4c\xf2\xe9\xc7\xb7\xb3\xfe\ \x8e\xd5\x64\xb3\x19\x92\x55\xfb\xc8\xd5\xb6\x56\x19\xb9\x31\xce\ \xeb\xaf\xfd\x28\x3a\x79\xf6\xe2\x0b\xaf\xfe\xfd\x4f\xbe\x79\xe5\ \xca\x95\x41\xa0\xa4\xaa\xee\x8f\x9e\xfb\x93\x84\x28\x24\xca\x9c\ \xf7\x81\x42\xa1\x90\x6e\x6d\xee\xdb\x32\x36\x79\x9e\x0b\xd7\x7e\ \x4a\xb9\xdc\x60\xd7\xce\xcf\xd2\xdf\xb7\x15\x25\xbe\x5b\x01\xe3\ \x12\x0b\x18\x87\x38\x83\x73\x1e\x4e\x22\xc4\x19\x84\x08\x27\x82\ \x73\x02\x5e\x9d\x8d\x03\x6b\x49\xa5\x52\x73\xc0\x45\xe4\x43\x49\ \x84\x0d\xc7\x85\x0b\x57\x38\xf0\x93\xbf\x63\xad\x7f\x99\xf5\xbc\ \x55\xfe\xed\xff\x7e\xfe\x5f\x00\x63\x0b\xcb\x0a\x11\xa3\x4b\x9e\ \x17\x7f\xdf\xbe\x7d\xfd\xe3\xe3\xe3\xaf\xad\x59\xb3\xc6\xab\xd5\ \xc2\x5b\xd7\x87\xaf\x9a\xdd\x9f\xf8\x2c\xbd\x3d\x1b\x10\x63\x10\ \x92\x4c\x1a\xdf\x8f\x13\x45\x51\x8c\x73\x38\xb1\x38\x63\xb1\x22\ \x48\xa2\x79\xe7\xc0\x5a\x08\x93\x2c\x3b\x0b\x7a\xe1\x9c\x1d\xb5\ \x6a\xc4\xb1\x63\x27\x38\x70\xe0\x35\xce\x9e\xb9\x4a\x8f\x37\xc6\ \xbf\xfb\xea\x6a\xa6\x8b\xcb\x33\xff\xea\xb3\xd7\x36\xfd\xc1\xf3\ \xd5\xd7\x96\x8a\x6c\x7e\x31\x4c\xec\x03\xaf\xbf\xfe\xfa\x55\x60\ \xab\xaa\xce\xf4\x75\x3c\xb6\xe7\x57\x1e\xfc\xfc\xc1\x9e\x15\xab\ \x4d\x26\x63\x09\x8c\x43\xf1\x70\x6a\xb0\xce\xc7\x39\xc1\x98\x24\ \x7b\x1a\xc5\x3a\x83\xb1\x82\x60\xb0\xc2\x1c\x60\x80\xd0\xc5\xd7\ \xc6\x98\x45\xe0\x55\xa1\x5c\xaa\x71\xe8\x8d\xb7\x38\x78\xf0\x10\ \x57\xaf\x4c\x62\x4c\x06\xdf\x6b\xa5\xa3\xa9\x46\x3e\x97\x21\xa5\ \xdd\x99\xbb\xd6\x66\x9f\x06\x16\x11\x10\x91\x84\x80\x62\x24\xc9\ \xc4\xc9\x0e\x68\x06\x40\x54\x52\xc6\xf8\xde\xa6\x35\x33\x6c\xdf\ \x9c\x26\xac\xd7\x48\x67\x52\xd4\x6b\x45\x9c\xb5\xd4\x6c\x33\x23\ \x37\x85\x4b\xd7\x73\x54\xeb\x3e\x62\x0c\x4e\x04\x5c\x84\x24\x80\ \xad\x15\x04\x87\x44\x31\xf8\x59\x02\xce\xc1\xf8\xad\x22\x07\x0e\ \xbc\xc6\xbb\x87\x8f\x33\x3e\x1e\x91\x4e\x17\x68\x6d\xeb\x8d\xf3\ \x4c\xbd\x8e\x18\x03\xc6\x27\x08\x5a\xe8\x69\x4d\xef\x16\x11\x59\ \xb8\x43\x73\xce\x25\x04\x84\x38\x15\x2e\xce\xc4\x88\xf8\xe9\xe6\ \x26\x95\xf5\xab\x42\xde\x38\xec\xe3\x34\x43\xbd\x11\x50\x0b\x3b\ \xf1\x3c\xd8\xb0\xaa\xc8\xfa\xbe\x2a\x1b\xd6\x84\x9c\x1e\x4c\x73\ \xfe\x6a\x53\x9c\x69\x05\x6c\x6c\x62\x10\x05\xf1\x91\xc6\xbc\xee\ \xab\x95\x90\xbf\xfc\xcb\xbf\xe2\xf8\xf1\x0b\x84\xb5\x3c\xf9\xdc\ \x32\xba\x3b\x53\xa8\x10\x57\xa9\x51\x03\xb4\x96\xe0\xf2\x20\xaa\ \x91\x4f\xa5\x56\xb0\x64\x87\x26\x22\xea\x9c\xa3\x5e\xaf\x53\x6f\ \xd4\x95\x25\xb5\x10\x81\x6f\x9a\x9c\x7a\x9c\xbd\x64\x18\x58\x1b\ \x21\xc6\xd1\xa8\x55\x49\xa5\xa6\x48\xa7\x0c\x67\xae\x74\x72\xf4\ \x4c\x86\x7b\x77\x96\xd8\xb2\x6e\x8a\xfe\x15\x55\xde\xf9\xa0\x85\ \xa9\xa2\x1f\x03\xb7\x8a\xa0\xa0\x0e\xc1\xcc\x59\xa0\x5e\x0f\x39\ \x7f\x6e\x98\x42\xee\x0e\xd2\x6d\x59\x54\x1d\x36\xd9\x27\xe0\x1c\ \xa5\x99\x06\x63\xb7\x8a\xac\xeb\x03\xa2\x1a\x34\x4a\xb4\x64\xd2\ \x6d\x8f\xec\x0c\x3a\x81\xe1\x59\x7c\xd6\xaa\x9b\x9a\x9a\x4a\xdc\ \xe1\xf6\x62\x0e\xf1\xfc\x7c\xad\xe1\xd1\x52\x30\xd4\xeb\x8e\x83\ \xc7\x5a\xf1\x4c\x80\xf1\x7c\x9a\x73\x21\xb5\xb0\x80\xe7\x79\xbc\ \xfc\x46\x0b\x6b\x7a\x26\xd8\xb8\x2e\xe2\x81\x9d\x13\xbc\xf2\x66\ \x27\xf5\x86\x17\x5b\x20\xf6\x1a\x44\x0c\xb3\xf9\x52\x04\xd2\xe9\ \x2c\xd9\x74\x5b\x02\x3e\x44\x71\xb8\x50\x19\x1b\x9b\xa6\x5a\xad\ \xa0\x0e\x44\x14\x2a\xe3\x80\xb0\xbc\xa9\x2d\xff\xd0\x8e\x1b\x8f\ \x00\xdf\x9b\xb7\x00\x6a\x8c\xc1\x39\x47\xb2\xc7\xf3\xcc\x42\x02\ \xc6\xf3\x72\x82\x30\x59\xb4\xd4\x1b\x0e\x67\x15\xe7\x2c\x77\x6d\ \x1c\x66\xdd\xca\x31\xac\x75\xf8\xa6\xce\xfa\x95\xc3\x9c\xbd\xd2\ \xc1\xcf\xde\xc9\xa2\xa2\x3c\xb8\x6b\x2c\x8e\x58\x32\x5f\xf3\xcc\ \x95\x10\x22\x49\x10\x26\xb6\x88\xe7\x11\x86\x8e\xf1\xf1\x32\xc3\ \x37\x26\x68\x34\xe2\xca\x4e\x44\x30\xb6\x4a\x52\x67\xd3\x12\x14\ \xbc\xcd\x2b\xb3\xbf\x2a\x8b\xe2\x66\xec\x03\xc6\x78\xb3\x79\x60\ \x31\x01\x84\x7c\x18\x59\x06\xaf\x78\xf4\x74\x2b\xbb\x37\x0f\xf3\ \xc4\xfd\x43\x34\x67\x66\xc8\x04\x21\x5b\xd6\x5c\xa5\x52\x13\x3a\ \x5a\x66\x50\x17\xb1\xb1\x6f\x9c\x72\x25\x4d\x73\xb3\xcf\xd6\x75\ \x93\x98\x24\xea\x18\xcf\x80\x78\x71\xfe\x48\xbe\xaf\x0a\xa5\x62\ \x95\xa1\x6b\x13\x0c\x5d\x1b\xa7\x5c\xac\xa2\x2a\x40\x1c\xaa\x85\ \x24\x06\x27\x56\x34\x18\x5a\x32\xc1\x86\x59\x33\x8a\x88\x20\x46\ \x63\x59\x0a\xe8\xed\xd5\x28\x20\xd9\x1b\xd7\xa7\xd9\xd4\x3f\xc3\ \xf1\x93\x69\xc4\x08\x47\xce\x2c\xa3\x11\xe5\xf1\x3c\x0f\xcf\x78\ \x74\xb7\x4f\xd3\xda\x56\xa0\xb3\x65\x82\x43\x27\xba\x59\xd3\x53\ \xa2\xb9\xe0\xb3\x71\x4d\x83\x91\x5b\x15\x46\xc6\x53\x49\x7c\x48\ \x6a\x21\x89\x4b\x92\xe9\xe9\x0a\x95\xd2\xf4\x9c\x16\x58\x10\x5a\ \x49\xee\x11\xe6\x09\x00\x34\xa5\xfd\x65\x89\x23\x37\x00\xc4\x31\ \x9f\xc8\xe2\x9f\xc5\x04\x04\xc9\x21\xf0\xce\xfb\x10\xf8\x8e\x5a\ \x98\x66\xdf\xf6\x4b\x1c\xbb\xd6\xcd\xf2\xd6\x88\x0d\xeb\xca\xf4\ \x2c\xf7\x38\x71\xb2\xc0\xc0\x2a\x47\xca\x94\x79\xe7\xfd\x56\xce\ \x5f\x9a\xe6\xc1\xbb\x27\x58\xdf\x13\x70\xe4\xfd\x3c\xe5\x72\x0d\ \xf5\x2a\x09\xd6\x38\x6e\xab\x8d\x3f\x2a\x08\xa2\x32\x87\x20\xf9\ \x2e\x82\x60\x24\xde\x83\xc7\xd3\xd1\x96\xce\x34\xff\xc6\xe3\xe9\ \x8d\xc0\x09\x00\xb7\x20\x91\x19\x13\x17\x73\x4b\x24\x24\x79\x11\ \x47\xa5\x2e\x94\x2a\xf0\xc8\xee\x49\xba\x3a\x1d\x33\xa5\x88\xc1\ \x6b\x3e\x8d\xba\x65\x78\x34\xe4\xf9\x97\x33\xfc\xe0\x45\x58\xbb\ \x7c\x92\x6a\x71\x98\x93\xa7\x1c\x7f\xfc\xbd\x26\x46\x86\xa7\xd9\ \xd0\x33\x4c\xb5\xda\x40\xdd\x3c\xc0\x52\xb1\x82\xc3\x2d\xfe\xd4\ \xdc\xff\xf9\xfb\x7c\x23\xb1\x0f\xa8\x03\x55\x7a\x72\x85\xec\xae\ \xf5\xe9\xa7\x62\x09\xaa\x1a\xcf\xb8\xd9\xbc\xa2\xb1\x84\x82\x45\ \x04\x14\xcd\xa9\x2a\xce\x45\xac\xeb\x2d\xb3\x6e\x95\xe1\xf9\x57\ \x73\x71\x7b\x44\x23\x06\x87\x7c\x1a\x0d\x87\x73\x21\xc3\xb7\x52\ \x4c\x15\x95\xde\xae\x12\x4e\x23\x22\xe7\x38\x72\xda\x63\xc7\xc6\ \x6a\xd2\x79\x10\xca\xa5\x19\xa6\xa6\xa6\x28\x95\xca\xf1\xaa\x26\ \xfb\xe0\x0f\x1d\x42\x2c\xa1\x04\x3c\x38\xd2\xa4\x64\x75\x47\xf0\ \xf0\xbc\x23\x8b\x9b\x95\x9d\x89\xab\x9b\x60\x69\x5b\x25\xe5\x34\ \x02\x07\xdb\x36\x0a\x27\xcf\x45\x34\x1a\x8e\x35\x3d\x45\x96\x77\ \x2a\xc5\x92\xe1\xe0\x91\x2c\x4e\x1b\xac\x5b\x59\xa2\x90\xb3\x9c\ \xbb\x9a\xa3\xb3\xa5\xc4\x44\x31\xc5\xfa\xde\x32\x85\x5c\x83\x4c\ \xaa\x8e\x55\x9d\x83\xaa\x80\xd3\xb8\x86\x42\x65\x81\xca\x17\xad\ \x5e\xbc\xcd\xd5\xa4\xed\xa8\x8e\xa9\x46\x8a\x41\xf9\xcc\x3d\xdf\ \xfa\xcf\xdb\x0f\x3d\xf7\xdc\x77\x73\xcb\xba\x97\xf5\xc4\x42\x99\ \x8d\x6b\xf8\x4b\x32\xb1\xfa\xce\x85\x60\x94\xde\x6e\xc3\x81\x37\ \x15\xe7\x42\xd6\xad\x2c\xd1\xb7\xb2\x8d\x46\x64\x49\x9b\x09\x0a\ \x79\x4b\x5b\x77\x3f\xd7\xaf\x4f\x53\xaa\x78\x34\x65\xeb\x3c\xfb\ \xf4\x15\xd2\xd9\x80\x99\xaa\x63\x65\x67\x95\xab\x13\xf1\x3b\x8d\ \x89\x23\x8c\x3a\x47\x6c\x02\x93\xac\xf0\xc2\x49\x4c\x0e\x07\x2e\ \x06\xff\xd2\xd8\x00\xf9\xed\xcf\xf0\xd4\x93\x77\x16\x8c\x27\x7b\ \x62\x65\xb8\xf9\x3d\x43\x4c\x37\xb5\xd8\x02\x22\x81\x6a\x84\x73\ \x50\x8b\x72\x74\xb4\x56\x18\x2f\x46\xfc\xf8\xed\x02\x22\x8a\x88\ \x8f\xd0\x42\xe0\xc1\xee\xad\xc3\xdc\xff\x89\x16\xda\x9b\xcb\x0c\ \x8d\xa5\x78\xe7\x74\x27\x2b\xba\x05\xa7\x42\x73\xa1\x86\x1b\x8f\ \xe3\x4a\x1c\x85\x74\xae\xd5\x18\x7f\xdc\xcd\x3b\xeb\xec\xf2\x2b\ \x18\x89\x57\xff\x85\xb1\x4d\xac\xff\x95\x7f\x4e\x47\x57\xeb\x5c\ \xdb\x45\x55\x17\x84\x64\x9d\xcd\x03\xa9\x45\x3e\x20\xaa\x9e\x73\ \x11\xce\x45\x54\xaa\x11\xdd\x1d\xb1\x05\xac\x0d\xb1\xae\xc1\x5d\ \x1b\xa7\x79\xec\xde\x22\x56\x43\x0e\x1e\xcd\xf1\xc1\xd9\x69\xd6\ \xaf\x6a\xe0\x5c\x84\xe7\x45\x0c\x0d\xd7\x29\xcf\x44\x28\x76\x6e\ \xa5\x66\xcd\xad\x6e\xb6\xff\x13\x03\x9f\xfb\x4b\xa4\xa6\x28\x9e\ \x3a\xae\x95\xd3\xb4\xed\x78\x86\xae\x65\xed\x8b\x4a\xef\x85\xd7\ \x13\xb7\x2a\x58\x6b\x01\x9a\x96\x26\x32\xcf\xb9\x10\xe7\x42\x0e\ \x1e\x9e\x66\xfb\x40\xc0\xfe\xbb\x2a\x3c\xfd\x60\x8d\xa6\x6c\x8d\ \x74\xe0\xd8\x3a\x50\xc0\xb9\x06\xd6\x85\x5c\x1f\x0d\x69\x6b\x81\ \x15\xed\x33\x0c\xac\xae\x72\xe4\x8c\xc1\x5a\x47\x14\x59\x9c\x8d\ \x81\xcd\x56\x8f\x71\x6f\x34\xb6\x82\xe2\x12\x47\x4f\x64\xa5\xf3\ \xf1\xff\xd0\xf4\x2a\x56\xae\x5e\x7d\x1b\x70\x55\x65\x72\xbc\xc2\ \xb9\x33\x63\x5c\x1a\x9c\x20\x8a\x42\xc7\x52\x27\x16\xc1\x58\x17\ \x61\x8c\x72\x72\xd0\x67\xaa\x5c\x64\xdb\x86\x34\xe5\x8a\x43\xc4\ \x22\x22\x0c\x8d\x94\xa9\x87\x8a\xe0\x98\x2e\x45\x3c\xb0\x3b\x45\ \x5f\x77\x89\x03\x6f\x79\x54\x6a\xd0\xde\x5c\xe7\xec\x45\x9b\xc8\ \x24\x49\x64\x3a\x2f\x21\x55\x59\x00\x7e\xd6\x02\xf1\xaf\x11\x8b\ \x73\xc2\xd8\x48\x09\x67\x63\x42\xe5\x52\x9d\x52\xb1\xc6\xd4\x64\ \x85\x30\x8c\x6b\x5e\x6b\x43\x2e\x5d\x3a\x3f\x01\x5c\x5a\x1a\x85\ \x3c\xe7\x42\x40\x79\x6a\xbf\x72\xfe\x32\xfc\xe8\xa0\x20\xe2\x21\ \x62\x68\x6f\xf5\xb8\x36\x5c\xc5\x39\x0f\x41\x58\xd1\x0d\x37\x6f\ \x95\xf9\xeb\x9f\x5a\xb6\x0f\x54\xd8\xb7\x37\x42\xdb\x57\xb1\xf7\ \xf1\x16\x1a\x8d\xc6\x5c\xaf\x27\x76\xc0\xa4\x03\x97\xf4\x45\xe7\ \x66\x62\x0d\xd4\x61\xd4\xd1\xe3\x8d\x72\xee\xec\x20\xf9\xa1\x76\ \x3e\x6c\x38\x67\x79\xe3\xad\x1f\xcd\xbc\xfc\xca\x8b\x2f\x00\x87\ \x17\x13\x50\x35\xb3\x04\xee\x58\xdd\xcc\x3d\xdb\x03\x7e\x76\xb8\ \xc4\xc4\x54\x83\x0d\xab\xf3\xac\xee\xcd\xf2\xb7\xdf\x9f\x22\x9f\ \x31\xdc\xbd\xc9\xb0\x73\x73\x17\x87\xde\x1d\x25\xdb\xec\xb1\xf9\ \xbe\x07\x58\xb3\xb6\x07\xcf\xf3\x98\x8f\xd5\x66\x9e\x80\x8d\x92\ \xf0\xc8\xbc\x94\x66\x1d\x5b\x1d\x8a\x22\x58\xee\x2b\x5c\xe0\xe4\ \xe5\x9f\x40\xff\xa3\xe4\x9b\x16\x93\x18\x1e\xbd\xec\x4e\x9c\x7c\ \xab\xf4\x57\x3f\xf8\x9f\x3f\x28\x16\x8b\x7f\x0e\xdc\x5c\x12\x85\ \x9c\x1f\xe7\x01\xe5\xd4\x85\x32\xdb\x36\xe6\xb9\x67\x47\x3b\x99\ \x94\xc7\xcd\xf1\x3a\x7f\xf1\xbf\xc7\x58\xd6\xae\x7c\xe5\x73\xbd\ \x5c\xba\x5c\xe4\xc8\xc9\x9b\x8c\xd7\x1b\x7c\xe5\x9f\x7d\x9a\x8e\ \x8e\xe6\x9f\xdf\x75\x50\xb0\xc9\x91\x92\x27\x24\x72\xb2\x8b\x2d\ \xa1\x8a\xa8\x23\x10\xcb\xaf\xb5\xfe\x94\xef\x9f\xbc\xcc\x45\xe9\ \x47\x83\x02\xf5\x7a\x9d\xa9\xf2\x54\xed\xed\xf7\x8e\xff\xec\xd8\ \xb1\x23\xaf\x00\x2f\x03\x83\xaa\x1a\x7e\xa8\x84\x54\x1c\xd7\x46\ \x2a\xdc\x79\x47\x2b\xff\xe9\xdb\x57\x31\x62\x50\x62\x19\x65\xd3\ \x60\x1d\xe4\x73\x42\x57\x47\x40\xaa\x6b\x19\x6d\x6d\x4d\x73\x61\ \x6e\x69\xb8\x73\x4e\x29\x96\x66\x68\xd4\x1b\xf8\x26\x4a\xee\xb1\ \x89\x9c\xec\x22\x6b\x78\xe2\xc0\x85\xe4\x03\xe5\x1f\xf7\x9c\x65\ \xa4\xf8\x01\x23\xc5\x88\xf1\x19\xcb\xc9\x99\xd2\xb9\x63\xc7\x4a\ \x5f\x07\x26\x81\x49\x55\x0d\x61\xc9\x19\x99\xaa\xfa\x0f\xec\xb4\ \x8c\x4e\xc0\x91\xd3\x55\x9e\xdc\xef\xf8\xe4\xdd\xf0\xea\xe1\x30\ \x71\x62\x83\x75\xc2\xab\x07\x2f\x33\x36\xe5\xe8\xec\x0c\x58\xb7\ \x6d\xeb\xc2\xe7\xe7\x48\xa8\x2a\xd3\x93\x35\x6e\x5c\x9f\xe6\xd2\ \xa5\xcb\xd4\xaa\x35\xf2\x39\x8b\xaa\x59\x02\xde\xce\x39\xb8\xb8\ \x08\x9c\xc5\x08\xb4\x66\x0d\xcd\x99\x14\xab\xdb\x03\x2a\xd6\x32\ \x75\xa5\x3c\x04\x5c\x00\xdc\xc2\x7d\xf2\x62\x02\x62\xbd\x03\x87\ \xeb\xfc\xd6\xe7\x72\x64\xd3\xca\x0f\x5f\xb9\xcc\x13\xfb\xba\xd9\ \xb2\xae\x84\x2a\x18\x2f\x60\x74\xd2\xe3\x95\xd7\x2b\x4c\xcf\x18\ \xda\xc6\x23\x56\xac\x6b\x70\x73\xa4\x4c\x73\x4b\x86\x28\x74\xd4\ \x6a\x11\xd5\x6a\xc4\xd4\x44\x15\x1b\x77\x72\x39\x75\xea\x28\xd5\ \x9a\x92\xcb\xc5\x07\x22\xf3\xfa\xb7\xb8\x05\xbe\x60\x64\x49\xc1\ \x27\x4a\xc5\xab\xbb\xa3\xc5\xd2\xe4\x9f\xfd\xb4\xf2\xfb\x4b\xc1\ \xdf\x4e\xc0\x69\xc3\xb9\x90\xef\xbd\x34\xc3\x03\x77\xb7\xb1\x7d\ \x63\x9e\x17\xff\x7e\x8c\xd3\x97\xe3\x76\x61\x2e\x53\x65\xf3\xda\ \x34\x5f\x7e\xdc\xe7\x8f\x7e\x10\x72\xeb\x56\x9d\x0b\x83\x27\xc9\ \x65\x9b\xb9\x31\x54\xba\x5d\xfa\xaa\xbc\xf9\xce\x8f\x39\xf8\xfa\ \x61\x5a\x9a\xd7\x03\x8a\xba\x28\x39\xfc\x9b\x27\x31\xeb\x07\x13\ \x51\x4d\xdf\x2d\xce\xd4\xa7\xaa\xb6\x31\x55\xb5\xd5\xf1\x8a\x2d\ \xfe\xdd\xd1\xda\xeb\x2f\x1d\x6e\xfc\xb7\xc8\xf2\xde\x87\x9d\x21\ \x2f\x22\x60\x23\x3b\xe4\x5c\xc8\xf4\x8c\xe3\xa5\x83\xb7\x38\x7e\ \xb6\xc4\xc0\xda\x1c\x1f\x5c\x8c\x4f\x59\x66\xaa\x86\x89\x69\x68\ \x2d\x18\xfe\xc9\xaf\x1a\xea\x55\xc7\x8b\x6f\x9f\x46\x8c\x61\xf3\ \xc0\x3d\x73\x51\x07\x94\xab\x43\xe7\xf9\xe0\xd4\x7b\x1c\x78\xf5\ \x0d\xf2\xd9\x65\xa4\x82\x0c\x68\xdc\x96\x5c\xec\xbc\xb3\x56\x70\ \x7c\xf7\x1f\x66\xae\xff\xfb\xbf\x19\xfd\xa6\x53\xce\x24\x5a\x9f\ \x26\x3e\x2f\x2b\x92\x6c\x6a\x96\x8e\x45\xc7\xac\x6b\x7a\x1e\xff\ \x5a\x7b\x57\xf6\x8f\x83\xb4\xe7\x8b\x78\x98\x24\xfe\xc7\x33\xbe\ \x8e\x8b\x10\x33\x97\x61\x1b\x8d\x19\xa6\xa6\x2f\x71\xcf\xae\xd5\ \x88\xd7\x84\x75\x8e\x72\xa9\xc4\xa9\xd3\x67\x29\x95\x42\x5a\x9b\ \x97\xd3\xdc\xb2\x9c\xc0\xcf\x22\xa2\x73\x11\x27\x2e\x37\xe6\x49\ \x54\x67\x6a\x9c\x39\xfb\xc6\xc1\x5a\x38\xf6\xeb\xc0\x0d\x20\x4a\ \xa6\x7e\xd4\xe9\xfd\x22\x0b\x5c\x1e\x2e\xfc\x19\x4c\x6e\x32\xc6\ \x7d\x46\x3c\xe9\x32\x46\x02\xcf\x4b\x49\x10\xf8\x26\x48\xa5\xc5\ \xf3\x3d\x3c\xe3\xe3\xf9\x3e\xc6\x8b\xab\x4c\xcf\x0f\x28\x34\xf5\ \xf2\xf6\xe1\x21\x2a\x95\x69\x9c\xb3\x18\xcf\x27\x93\x2e\xb0\x7c\ \x59\x07\xe9\x74\x01\xcf\xf8\x28\x51\x52\x0f\xb9\xb9\x0e\x37\x0b\ \x2c\x50\xab\xd6\x9c\x75\xd5\x21\xe2\x08\x53\xf9\x79\x80\x3f\xd2\ \x02\x10\x1f\xf6\x01\x79\xa0\x1b\xbc\x81\xc0\x64\xfb\x3d\x3f\xbd\ \x22\xe5\xf9\x9b\x3f\xb3\x3b\xbf\x3f\x1d\x64\x0a\x93\x33\x81\x4c\ \x94\x7d\x9d\xa8\x18\x57\xaa\x19\x0d\x23\x4f\x11\x11\x11\x31\x62\ \x44\x3c\xe3\x8b\xe7\xa5\x24\x95\xca\x48\x90\x4a\x89\xef\xf9\x62\ \xbc\xb8\x6b\x1d\xab\x4c\x17\xd5\x43\xce\x29\xc3\xd7\x6e\xd4\x86\ \x6e\xbe\xf9\xaf\x81\xef\xab\xea\xed\x0e\xf5\xcb\x12\x58\x42\x24\ \x95\x58\xc9\x07\x0a\xc0\x0a\xa0\x99\xb8\x11\x57\x21\xee\x9a\x59\ \xe2\x4a\x2c\x00\x32\xc9\x33\x39\xcf\xcb\xb4\xf9\x92\xeb\xf2\x4c\ \xd0\xe9\xf9\x99\xe5\xbe\x97\x5e\xee\x99\x54\xa7\xef\x05\x2d\x22\ \x5e\x4e\x8c\x49\x1b\x31\x29\x50\xd3\x68\xd4\xaa\xe3\xc5\xb3\xcf\ \x5b\x57\xfb\x03\xe0\xa2\xaa\xda\xff\x67\x02\x1f\x42\x48\x00\x2f\ \x99\x6e\x16\xb8\xaa\xaa\xcc\x37\x2c\xcd\xff\xc5\xf4\x92\x77\xd5\ \x80\x29\x55\x8d\x7e\x59\xf0\x00\xff\x07\xa6\xd2\x82\xca\x93\x0d\ \x6f\x83\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0a\x49\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ \x01\x42\x28\x9b\x78\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x09\xc6\x49\x44\ \x41\x54\x58\x85\xa5\x97\x6d\x70\x55\xc7\x79\xc7\x7f\xcf\xee\x79\ \xbb\x57\xba\xb2\xde\x00\x19\x09\xb0\x10\x60\x2c\x84\x10\x98\x42\ \x12\x4c\x5d\xc0\x01\xbb\x53\x1b\xd2\xa4\x69\x9a\x26\x7c\x48\x1c\ \xcf\x34\xad\xdb\xb4\x9d\x71\x32\xf1\xa4\x9d\x7e\xc9\x74\xea\xb4\ \x75\x3d\xe9\xa4\xb5\xd3\x89\x63\xd2\x24\x6e\xeb\xb4\x76\x9a\x89\ \x6d\x4c\x5c\xa7\xd8\x80\x8b\x6d\x4c\x8d\x2c\x40\x12\x48\x20\x21\ \x59\x6f\xf7\x4a\xf7\xfd\x9c\xb3\xdb\x0f\xf7\xea\x62\xd5\x8d\xd3\ \x4e\x77\x66\xe7\x9c\x7b\xcf\x39\xbb\xbf\x7d\x9e\x67\x9f\xe7\xbf\ \x62\xad\xe5\xff\xdb\x44\x44\x16\x6f\x01\xa7\xda\x0d\x50\xb6\xd6\ \x9a\xf7\xfd\xf6\xe7\x01\x88\x48\x0a\xf8\x16\xb0\x13\x38\x09\xfc\ \x11\x30\xb0\xf8\xf8\xe3\xab\xf0\x7f\x73\x6f\xfd\x07\x5a\x92\xf6\ \x40\x83\x2f\xf7\xd4\x79\xb2\xde\x02\x57\xd2\xe6\xe5\x3d\x8f\xe6\ \x7e\x0d\x98\x79\x3f\x88\xff\x0d\xc0\xa7\x80\x4f\x00\x9d\x40\x3b\ \xe0\xf4\xb5\xd7\x7d\xfd\xc1\x3b\x5a\xbc\x86\x80\x03\x81\xc3\x86\ \x72\x2c\xd6\x51\xe2\xb8\x16\xb1\xc6\x50\xef\x96\x09\xbc\xbc\x79\ \xf8\x78\xe9\x0b\x7f\xfb\x6a\xe9\x5b\xd6\xda\xec\xcf\x1a\xdf\x79\ \xf7\x8f\xdb\x37\x7f\x66\x55\xec\x3a\x0f\x8a\xa8\x3b\x05\x93\xb4\ \x22\x5e\xd3\x0d\xab\xeb\x1d\xe5\xa8\x54\x7d\x1b\x5a\xb4\x0c\x5e\ \x39\xce\x9b\xe3\x85\x2f\x3e\x72\xf6\x97\xd0\xda\x05\x16\x17\x20\ \x60\x05\x2b\x20\xd6\x20\x18\xb5\xbf\xed\xe8\x7d\x30\xf6\x2f\x22\ \x92\xb3\xd6\x5a\x11\x91\x9e\x9e\x5b\xd7\x6e\xed\xdd\xb6\xe7\xc8\ \x77\x1f\x7b\x12\xc8\x2e\x01\x30\x9e\xf7\x70\xdb\x8d\x6d\x1f\x09\ \x52\x4d\x02\x8a\x72\xa9\xc0\x1b\x03\x59\x82\x54\x1b\x5d\xeb\x3f\ \x48\x39\x0c\xb9\x38\xfa\xef\x88\x80\x4e\xb5\xe2\xfb\xcd\x44\x61\ \x4c\x14\x1b\x8c\x59\x6a\xe5\xb8\x38\xc7\xb5\x62\xfb\xcd\x30\xd6\ \x00\x78\x07\x0f\x7e\x62\xfb\x0f\x9e\xfa\xd1\x9f\x6f\xe9\xdb\xb4\ \xfd\xc2\xc0\xf0\xec\x91\xef\x3e\x76\x11\x78\x65\x09\x40\x7d\xd2\ \x3d\xd0\xb8\x6c\xa5\x28\xe5\x62\x81\xb1\x6b\x6f\xd1\xd1\xbe\x99\ \xb1\xf1\x73\xb4\xb6\xae\x61\xfc\xda\x8b\x28\xa5\x10\x11\xa6\x67\ \x9f\x67\x55\xfb\x41\x3c\xbf\x1e\x15\x45\x44\x51\x8c\x31\x06\x63\ \x2a\x16\x51\x4e\xc0\xc8\x42\x93\x7b\xe8\x9e\x8f\x7d\xf2\xb7\xef\ \xff\xdd\x4f\x6e\xdc\xd8\x75\x53\x32\x11\x00\x60\xad\x75\xab\xee\ \xd4\x35\x80\x37\x7f\xbf\xa9\xd1\x71\x0e\xd7\x05\x89\x04\x82\xc2\ \x02\x13\x13\x6f\xb3\xaa\x63\x33\xe3\xe3\xe7\x48\x26\x03\x72\x85\ \xab\xf4\xf5\x6e\x0e\xc7\xae\x4d\xfc\x30\x08\x82\x5f\xcd\xe5\xdf\ \xa6\xa5\x79\x37\x61\x58\x46\xa9\x88\x30\x8c\x10\x31\x94\xc3\x22\ \x1b\x37\x36\x70\xf8\xf0\x57\xb8\xb9\x7b\xfd\x97\x3d\x77\xc9\x3a\ \xb1\xa0\xaa\xb7\xaa\xf6\xc4\x53\xa6\x15\xd1\xf8\x9e\x8f\x48\xe5\ \xf9\xd8\x78\x3f\x9b\xba\xf7\xd0\xdc\xdc\x41\x22\x91\x42\x29\x17\ \xed\x2b\xb7\x7b\xdd\x4d\x1f\x5a\x28\xc5\x04\x5e\x13\xbe\xe7\xa1\ \x44\x50\x22\x58\x5b\x64\xe7\xce\x76\x0e\x7d\x64\x17\xab\x56\xb7\ \xa1\x95\xe2\x7f\x6a\x72\xfd\x72\x1d\xe0\xfc\xd4\xb2\x79\xed\x28\ \x7c\xdf\x03\x84\xa9\xa9\x51\x1a\x52\xcb\x28\x14\xd2\x2c\x5f\xb6\ \x86\xc0\xf7\xd9\xb0\xee\x97\x19\x1c\x7a\x96\x6c\xb9\xd4\x96\x0c\ \x96\xd1\x76\xe3\x76\xac\x51\x88\xca\x71\xc7\x87\x3b\xd9\xbb\x6f\ \x1b\x2d\xad\x8d\x8b\x13\x2c\x69\xb9\x5c\x91\xd3\xa7\xff\x73\x7e\ \xd7\x6d\xb7\x36\x88\x12\xa9\x18\xe2\x5d\x00\x5f\x7b\xb5\xa7\xb0\ \x62\xad\xc2\xf3\x3c\x44\x14\xa3\x57\xce\xb2\x7e\xdd\x76\xe6\xd2\ \x63\xb4\xb5\x75\xe2\xf9\x1e\x1d\xed\x5b\xb8\x71\xc5\x26\x4a\xa5\ \x3c\x51\x6c\x51\x7a\x9e\xbd\xfb\xba\xd8\xb6\x6d\x03\xa9\x86\xfa\ \xda\xc4\xb6\xe2\x68\x2c\x90\x9e\x9b\xe7\xc7\xcf\xbe\x30\xfe\x8d\ \x6f\xfc\xf5\xf7\x7c\xd7\xcf\x3f\xfb\xfc\x0f\xbf\xa2\x44\x2d\x46\ \xec\x75\x80\x50\x6e\xf0\x3c\x47\x5b\xd7\x75\x45\x44\x31\x34\xfc\ \x1a\xfb\xef\xf8\x0c\xc7\x5e\x3c\x42\x6f\xcf\x1e\x7c\xdf\xc7\xc4\ \x86\x48\x2b\xb4\xe3\x90\x4c\xa6\xf9\xec\x7d\x87\x48\x24\x12\x88\ \x08\x8b\xc9\x50\x00\x63\x61\xec\xea\x04\xdf\x3f\xf2\x3d\xf4\xb9\ \xbf\xb1\x7f\xf5\x93\xc9\x47\xd3\x05\xfb\xd4\xfe\xfd\x07\xb7\x00\ \x48\xc5\x35\x0a\xb8\xee\x24\x37\xe1\xf8\x22\xda\x38\x8e\x43\x36\ \x3b\xcd\xc2\xc2\x0c\x5d\x5d\x5b\x99\x9a\x1e\xa5\xa3\x7d\x1d\xbe\ \xe7\xe1\xf9\x2e\x9e\xe7\xe1\x79\x2e\x7e\xe0\x90\x4c\x26\xd0\x4a\ \xa1\xb5\x46\x6b\x8d\x88\xe2\xc2\x85\x11\xbe\xf4\xc0\x9f\x71\xf8\ \x53\x0f\x70\xfa\x27\x2f\xb1\xbb\x53\xf8\x95\x9b\x9d\x66\x60\xc2\ \x55\x6e\xa1\x02\x8b\x7a\x4f\x0c\x58\xc4\x55\x5a\x1b\x47\x3b\xfa\ \x3f\x5e\xfb\x31\x1f\xd8\x79\x0f\x71\x5c\x04\x20\x95\x6a\xc4\x18\ \x43\x1c\x6b\x94\x8a\x89\xc2\x10\x0b\x68\xa5\x51\x4a\x11\x46\x31\ \x67\xde\xe8\xe7\x9b\x8f\xfe\x23\x23\x57\x66\x08\xfc\x26\x96\x2f\ \x5b\x4f\x8b\xbd\xcc\xa6\x35\xcb\xa5\x67\x68\x6e\x0b\x67\xc2\xa4\ \x31\xa1\xad\x5a\x4b\xde\x03\xa0\x8c\xf2\x41\x8c\xb5\x96\xd7\x5f\ \x7f\x8e\x07\xfe\xf0\x09\x2e\x5d\x7a\x93\xf5\xeb\xb6\xe1\xfb\x2e\ \x71\x6c\x88\xe3\x18\x15\x09\x22\x16\xb1\xa0\xb4\x62\xec\xea\x14\ \x5f\xfa\xe2\x43\xe4\xf2\x42\x5d\xb2\x99\x55\x1d\xed\x28\x71\x29\ \x17\xb3\xb8\x85\xab\xa4\x52\x0d\x74\xaf\x70\xba\x81\xba\x28\xb2\ \x64\xb3\x39\xa6\xa6\x66\xa3\x2a\x80\x53\x03\x30\xd6\x78\x88\xb2\ \xfd\x03\xaf\xb0\x7a\xf5\x26\x52\xa9\x16\xfa\x07\x4e\xd2\xbb\xf9\ \x76\x5c\xd7\x43\xeb\x98\x28\xaa\x24\x21\xc4\x12\xc7\x82\x88\x22\ \x93\x59\x20\x8e\x03\x6e\x5a\xb3\x01\xcf\xab\x23\x0a\x63\x0a\xc5\ \x22\xd3\xef\xe4\xa9\x73\x2d\x9e\xcd\xd3\xd9\xa4\x9a\x81\x1b\xa2\ \x28\x92\x4c\x26\x43\xb1\x58\xb6\x55\x00\x5d\x8b\x01\xe5\x88\x8f\ \x88\x3d\x71\xe2\x69\xf6\xec\x3a\x40\x6b\x62\x8c\xf3\x03\x2f\xd3\ \xdb\xb3\x0b\xa5\x35\x8e\xe3\xe0\xba\x0e\x8e\xab\x71\x1c\x0d\x48\ \x2d\xf8\x5c\xd7\x27\x91\xa8\xc3\x71\x1c\x0a\xc5\x90\xc9\xc9\x0c\ \xc5\x42\x19\x4c\x84\x23\xe0\x3a\xa2\x76\x77\xba\x3d\xe5\x72\xc9\ \xd5\x4a\x23\x82\xbc\x07\x20\x36\xe2\x0f\x0e\x9f\x71\x24\xbc\xc8\ \x83\x87\x8e\xa1\x67\xfe\x84\xde\xb5\x21\x1f\xdb\xf4\x08\xb7\x34\ \x3d\x8f\x10\x81\x80\x12\x85\x52\x0a\x6b\x6d\x25\xe2\x8d\x01\x2c\ \xe9\xb9\x3c\xa3\xa3\x73\x4c\x4f\x2d\xb0\x58\x16\x84\xa8\x72\x55\ \x9a\x1d\xab\xf4\xae\x52\x54\xf2\x45\x64\x31\x41\x2d\x05\x18\x1d\ \x3f\xb9\xed\xcc\xb9\xe7\x9c\x43\x77\x7d\x81\x1f\x9d\xbd\x9b\x3f\ \x7e\xbc\xcc\xad\x3b\x7f\x87\xd1\x74\x0f\x5d\x0d\xc7\xd8\xbd\xf2\ \x11\x54\x38\x43\x3e\x5f\x26\x97\x2d\x93\x2b\x54\x02\x31\x9f\x2f\ \x32\x39\xb9\xc0\xdc\x6c\x8e\x38\x8a\x97\x24\x1f\x01\xb0\x86\x96\ \x7a\x4f\xd6\xb7\xa8\x5b\xa3\x72\xc9\x17\xa5\x10\x44\xaa\xdb\xb0\ \x02\x20\x22\xbf\x35\x39\x73\xe1\xfe\xee\xf5\x77\x95\x33\xd1\x36\ \x32\x33\x27\x29\xe4\xde\xe1\xc3\xb7\x5c\xa2\x21\x3c\xc6\x33\xa7\ \xef\x24\x2a\xe5\xd8\xbb\xe6\x61\xd2\x93\x97\x19\xb9\x9c\x66\x3e\ \x53\x60\xe2\xda\x24\x83\x17\x47\xc1\x82\xad\x96\x65\x8b\x85\xaa\ \xc6\x10\x0b\xd6\xc6\x38\x4a\xd1\x5a\xa7\xd6\x66\xb3\x0b\xad\x4a\ \xa9\xc5\x5c\xbc\xc4\x02\xdf\xdc\xb1\xf9\xd3\x0f\xb4\x34\xde\x64\ \x8b\xc5\x05\xfe\xf4\xef\x9e\xe5\x2f\x3e\xdf\x84\xb5\x96\x1f\x9c\ \xfd\x3c\x03\x13\x1b\x78\xfc\xa7\x87\x89\x63\xcd\x8e\xb5\xa7\x31\ \x26\xc6\x1a\x88\x8d\xc1\x5a\xbb\xa4\x57\x32\x60\xb5\x22\x8a\x61\ \x3c\x1d\x71\x34\x71\x98\x15\x9f\x7d\xae\xee\xdb\x4f\x7c\xe7\xab\ \x5a\x2b\xa4\x92\x89\x54\x6d\x1b\x5a\x6b\xc3\xdb\xfa\xee\xf3\x11\ \x91\x17\x5e\xfc\x1a\x7d\xdd\xbb\xd9\xb1\x71\x88\xb2\x9e\x25\x13\ \xbe\x45\x29\x0c\xb8\x3c\xdd\xce\xa9\xa1\x3e\x7e\x71\xe3\x09\x9e\ \x7b\x73\x1b\x61\x39\x44\x29\x85\x31\x16\x6b\x17\x41\x0c\xa6\x06\ \x63\x28\xc4\x21\x17\x7b\x1f\x62\x47\x4f\x2f\xd6\xda\x6a\xb9\x36\ \x14\x0a\x45\x01\xf4\x92\x4c\x38\x3a\xf1\xea\x2f\x9c\x7c\xe3\x71\ \xaf\xbe\xae\x95\x8f\xdf\xb1\x9a\xa3\xfd\xfb\x78\xfa\xb5\x7d\x2c\ \x4f\x4d\xd0\xd1\x3c\x82\xab\x73\x9c\x1a\xdc\x88\xab\x22\x6e\x59\ \x39\x48\x6c\x2c\x22\x60\xab\x1a\xc0\xda\xca\xe0\x76\xb1\x5b\xcb\ \x8a\xae\x0d\x6c\xd8\xb2\xb5\x96\xa6\x8b\xc5\x90\xab\xa3\x69\xce\ \x9f\x1f\x2e\x2e\xce\xeb\x54\x63\xa0\xc3\xf7\xea\xef\xde\xd2\xfd\ \xd1\xf8\x96\x4d\x77\x3a\xab\x9b\xfe\x9e\x97\x87\xf7\x90\x29\x34\ \x32\x9b\xdd\xce\xba\xb6\x11\xd6\x34\x8f\x30\x74\xad\x89\x81\x2b\ \x01\xf9\xe2\x34\xa8\x00\x11\x85\xb1\x16\x63\x2b\x62\x44\xa4\x2a\ \x4a\xaa\x16\xc9\x66\x73\x5c\x1a\x9a\x22\x8e\x0d\xb9\x5c\x89\x42\ \x3e\x24\x9d\x99\xb5\xaf\x9c\x38\xd6\x0f\xcc\x02\x0b\x8b\x2e\xb8\ \x7a\x5b\xdf\xbd\x5f\xaf\x6b\x58\xf1\x70\x77\xfb\x45\xb6\x76\x4d\ \xd1\xdc\x74\x82\x7c\x29\x41\x9d\x5f\xa2\x18\xb9\xfc\xd3\x89\x0f\ \xa2\xdc\x59\x9c\x8d\x5f\xe6\xee\xdb\x97\xe3\x38\xba\xb6\x0d\x8d\ \x31\xc4\x26\xae\x00\x99\x18\x63\x2a\xbb\x21\x3f\x3e\xcc\xa9\xe7\ \xff\x81\xfa\x95\x5b\xb1\x58\xa6\xc6\x07\x79\xf2\x9f\x9f\x7c\xe9\ \xdc\xdb\x67\x9e\x02\x26\x81\x99\xeb\x52\x45\x08\x00\xe9\x5c\x3e\ \xce\x3b\x73\x11\x0f\x3d\x7d\x37\x4a\x09\xf7\xee\x3b\xca\x63\x2f\ \xec\x27\x99\x9c\xe6\xf7\xfe\xe0\x2e\x5c\xd7\xa9\xc9\x32\x80\x85\ \x85\x85\x9a\x7f\x45\x62\x62\x13\xd7\xf4\x61\xca\xb1\x7c\xb4\xfc\ \x97\x9c\x3d\x05\xa3\x19\x30\x45\xb1\x57\x2f\xe7\x4f\x01\xfd\xc0\ \x5b\x40\xb6\x16\x03\x62\x55\x60\x11\xf5\xe4\xf1\x3e\xc2\xb2\x21\ \x8a\xcb\xb4\x37\x8e\x73\x71\x7c\x19\xe5\xb0\xc8\x8d\x2b\xeb\x50\ \x4a\x6a\xd1\x3e\x3f\x5f\x64\x78\x70\x8a\xe3\xc7\x4f\x57\xfd\x1f\ \x13\xc7\x51\x6d\xf5\x00\x8a\x98\xd5\xc9\x3c\x77\xae\xc9\xf3\xeb\ \x1b\xf2\xec\xed\x14\x3a\x1a\x64\x12\x38\x07\x4c\x5b\x6b\xed\xf5\ \x6a\x28\x24\xad\x85\x28\x0a\x19\x9a\x6c\x23\x8e\x4a\x78\x3a\x4f\ \x26\xef\x10\x47\x11\x13\x93\x19\x06\xcf\xcf\xa2\x94\x50\x2a\x45\ \x44\x51\xc4\xeb\x6f\xbc\xc6\xd8\xd8\x34\xa2\x9a\x2a\x01\xb8\xb8\ \x15\x17\x17\x65\x42\x00\xb4\x12\x1c\xcf\xa5\xad\x41\x98\x29\x98\ \x01\x60\xde\x56\x5f\x7c\x97\x5a\xb4\xef\x44\x51\x21\x8e\xa2\x50\ \x3f\xf6\xe2\x01\x44\x62\xd2\x79\x8d\xeb\x40\x18\x85\x5c\xb9\x62\ \x78\xe6\x5f\x8f\xd2\xd4\x98\xc4\xd8\x98\x4b\xc3\x23\xf4\xbf\x3d\ \x8a\x52\x01\x41\xe0\xd5\xd4\xf0\xbb\xc6\x23\x1f\x69\x2e\xe4\xea\ \x8d\x12\x61\x24\x6d\xae\x1d\x79\xbd\xfc\xc8\xc4\x3c\x67\x80\xf2\ \x75\xcb\x57\x89\x3f\xd4\x77\xef\x0e\x25\xfa\xa7\x41\x6a\xb9\xaf\ \x1d\x1f\x51\x0e\x4a\x6b\x44\x74\x75\x38\x4b\x14\x15\x98\x9b\x1b\ \x21\x97\x9b\x02\xa9\x08\x90\x20\x68\x24\x11\x2c\x43\xa9\xa5\xca\ \xd7\x94\xd2\x44\xf3\xa7\xa6\x57\x38\x67\xee\x7d\xa6\xbf\x3c\x0c\ \x64\x81\x39\x20\x6b\xad\x8d\xde\x03\x00\xb0\x6b\xeb\xe7\x0e\x46\ \x51\xf1\xab\x08\x9d\x4a\xb4\xeb\x28\xed\x54\x32\xa6\xad\x1c\x7c\ \x50\x18\x20\x8c\x4a\x58\xd1\xb8\x4e\x80\x76\x92\x15\x48\xa9\x94\ \x67\x44\x81\x89\x89\x0a\x53\x0c\x8e\xbe\xf4\xfd\xa9\xb9\xa1\x4f\ \x53\x39\xa8\x56\xa5\xe2\xd2\xb3\xe0\xfb\x9e\x0d\x9f\xf8\x8d\xa0\ \x4b\x11\x7c\x6e\xbe\xec\xf5\x5e\x9c\x0d\x4a\x83\x73\xa9\xcc\xa5\ \x74\x7d\xbe\x64\x02\x5f\x29\xa7\x51\x2b\xa7\xc5\xd1\x5e\xb3\x76\ \xbc\x1b\xb4\x72\xeb\x94\x72\x12\x4a\x39\x6e\x1c\x87\x71\x66\x61\ \x6c\xf0\xd2\xf8\xcb\xf7\x87\x61\xf8\x6f\x3f\x73\x82\x9f\x07\x50\ \x95\x4e\x0e\xe0\x57\xff\x0a\x81\xa8\xba\x9a\xda\x87\xff\x7d\x55\ \xff\x97\xf6\x5f\x67\xb1\xa0\xb6\xf8\xfe\x85\x9a\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\xeb\x49\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x01\x00\x00\x00\x01\x00\x08\x06\x00\x00\x00\x5c\x72\xa8\x66\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x8b\x00\x00\x03\x8b\ \x01\x75\xcb\x17\xfb\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x20\x00\x49\x44\ \x41\x54\x78\x9c\xec\xbd\x77\xb8\x5c\xc7\x75\x27\xf8\x3b\x55\x37\ \x74\xce\xdd\x2f\x00\x0f\x0f\x00\x41\x00\x04\x49\x04\x82\x59\xcc\ \x94\x48\x51\xb4\xb2\x2c\x2b\x07\x5b\xb2\x25\x5b\x0e\xeb\x59\xa7\ \xd9\xf5\x78\x76\x34\xde\x19\xcb\x9f\xe5\xf1\xce\x78\xbe\xf5\x78\ \xe6\xfb\x3c\x92\x6d\x8d\xc3\xec\x7a\xfd\xad\xc6\x61\xc7\x23\x52\ \xa2\x64\x49\x54\x20\x29\x89\xa4\x48\x02\x04\xf0\x72\x7e\x9d\xc3\ \xbd\xb7\x6a\xff\xa8\xaa\x7b\x6f\xf7\x7b\x20\x01\x26\x81\x02\x0a\ \x6c\xf6\xeb\xee\xdb\xb7\x6f\xa8\xf3\x3b\xe7\xfc\x4e\x28\x92\x52\ \xe2\xd2\x38\xff\x41\x44\x74\x2e\xdb\xc9\x4b\x17\x38\x1c\x23\xd7\ \x8c\x9e\xe3\x99\xb6\x79\x1f\x93\xd5\x34\x7b\xd3\xad\x97\x25\x92\ \x09\x0b\xbf\xfb\xa7\xdf\x6a\x03\x90\x67\x79\x00\xb8\x74\xed\xcf\ \x65\xd0\xa5\x6b\x74\xee\xc3\x4c\xe0\xdf\xf8\x8d\xdf\xa0\xc7\x1f\ \x7f\x9c\x0e\x1d\x3a\x44\x0f\x3c\xf0\x40\xf8\xf9\x83\x0f\x3e\x18\ \xbf\x98\x72\xe4\xf9\xa2\x9b\x90\x67\x11\x78\xf3\xf7\x59\x1f\x3f\ \xff\xae\xa3\xd9\x1b\xae\x1c\xbf\x3c\x9f\x75\xf6\x96\x1c\x71\x3c\ \x61\xe1\x6a\x02\x8a\x8c\xc8\x25\x48\x4e\x80\xf4\x25\xad\xf9\x42\ \x9e\x6c\x7a\xfc\xeb\x0f\x3f\xbd\xfe\xf9\x5f\xfe\x3f\xbe\x34\x0f\ \x40\xc4\x1e\x12\xb8\xf8\xae\xf9\xf9\x8e\x4b\x00\x70\x6e\x83\xfe\ \xe2\x2f\xfe\x82\x7d\xf6\xb3\x9f\x75\x1f\x7d\xf4\xd1\x83\x83\xc1\ \xe0\x4a\x00\x87\x82\x20\x38\xe8\x79\x5e\x05\xc0\x52\x10\x04\xf3\ \x41\x10\xcc\x0b\x21\x66\x01\x9c\xae\x54\x2a\xdf\x98\x9d\x9d\xf5\ \xb1\x8d\x76\xfa\x61\x9d\x94\xdb\x58\x45\x67\xd3\xea\x2c\xf6\x9a\ \xbd\xeb\x9e\xfd\xa9\xfb\x5f\xb3\xfb\xd0\x58\xde\xb9\xa6\xe8\xe2\ \x4e\x87\xcb\x03\x29\xd9\x4b\x67\x65\xaf\x92\x14\x3d\x37\x21\x07\ \xe0\x32\x00\x93\x02\xa4\xf1\xd4\x23\x1b\x1e\xb3\xd0\x66\xa9\xc1\ \x12\x2b\x9e\x5c\xed\xb1\xbf\xfe\x9b\x6f\x2c\xfe\x87\x4f\x7d\xe6\ \xe1\x05\x00\x1e\x22\x20\xf8\xa1\xbd\xde\x2f\xc5\xb8\x04\x00\xcf\ \x3d\xe8\x81\x07\x1e\xe0\x7f\xf8\x87\x7f\x38\xfe\xd0\x43\x0f\xfd\ \x0b\xcb\xb2\xde\x97\x4e\xa7\xed\x44\x22\x01\xc7\x71\xe0\xba\x2e\ \xba\xdd\x2e\x88\x08\xed\x76\x1b\x42\x08\x74\xbb\x5d\xf4\x7a\x3d\ \x34\x1a\x8d\xf5\xc1\x60\xf0\x77\x00\x3e\x6f\x59\xd6\xdf\xb7\x5a\ \xad\x3a\x22\xcd\x24\xa1\xe6\xe5\xab\xfa\xe2\x9f\x83\xc0\x9b\xbf\ \x87\x04\xfe\xde\x1b\x77\xb9\xef\xba\x67\xff\xa1\xb1\x82\x7b\xb4\ \x92\x94\x77\x39\x9c\xae\x4c\x8b\x6e\xb6\x20\x3b\xb5\x94\xe8\xf2\ \xa4\xe8\x87\x82\x7e\x2e\x43\x10\xc3\x06\xcf\xfb\xcf\x88\xca\x57\ \xfe\xeb\xd7\x96\x7e\xe5\xb7\x3f\xf3\xf0\x13\x00\x7a\x00\x7c\x5c\ \x02\x81\xe7\x1c\x97\x00\xe0\xec\x83\xfd\xd1\x1f\xfd\x51\xfa\x53\ \x9f\xfa\xd4\x27\x2c\xcb\xfa\xd5\xf1\xf1\xf1\x9c\x65\x59\x10\x42\ \x20\x99\x4c\xa2\xd3\xe9\xc0\xb2\x2c\xf4\x7a\x3d\xd8\xb6\x0d\xdf\ \xf7\xc3\x2f\xb6\xdb\x6d\x48\x29\xd1\x68\x34\xd0\x6a\xb5\x50\xaf\ \xd7\xfb\xfd\x7e\xff\x41\xdf\xf7\x3f\x1d\x04\xc1\x03\x00\x02\xbc\ \x0a\x81\xe0\x3c\x04\x7e\x48\xe8\x8f\x5c\x5e\xb1\x3f\xf1\xce\xab\ \xaf\x98\x28\x25\x8f\x54\x12\xf2\x2e\xc7\x62\x47\xd2\xb2\x9f\x29\ \xc8\x76\x2d\x2d\xba\x76\x52\xf4\xc1\x94\x9c\xbe\xa8\xd1\xe6\x69\ \xf9\xb8\x18\x7b\xec\x4f\xbe\xbc\xf4\x4b\xbf\xf7\xb9\x6f\x7d\x1b\ \x40\x0b\x91\x35\x70\x09\x04\xb6\x19\x97\x00\x60\xfb\xc1\xaf\xbd\ \xf6\xda\x5b\x7b\xbd\xde\x7f\x2c\x97\xcb\x97\x15\x0a\x05\xf4\x7a\ \x3d\x04\x41\x60\xb4\x3b\x7c\xdf\x87\xef\xfb\x10\x42\x20\x91\x48\ \x80\x31\x86\x64\x32\x09\x21\x04\x72\xb9\x1c\x3c\xcf\x43\x36\x9b\ \x45\xb3\xd9\x84\xef\xfb\x58\x5b\x5b\xc3\xca\xca\x0a\x3a\x9d\xce\ \x97\x7c\xdf\xff\x4d\x0d\x04\x02\x1a\x0c\x2e\xc4\xc9\x79\x9e\x02\ \x1f\x0a\xfd\xf4\x44\xd6\xfa\xa7\x1f\x3c\x7e\xf9\x78\x39\x79\xa4\ \x9a\xc4\x5d\xae\xcd\x8e\xa7\x64\x3f\x5b\x90\x9d\x4a\x46\x74\xdd\ \xa4\xec\x81\xcb\x17\x2f\xf0\xdb\x8d\x0e\x4f\xe1\x6b\xbd\xb1\x2f\ \x7f\xf4\xd3\x5f\xfd\xd9\x13\xb3\x9b\x33\x88\x81\xc0\x85\x78\x8d\ \x7f\xd0\xe3\x12\x00\x6c\x1d\xfc\xa3\x1f\xfd\xe8\x9e\x47\x1e\x79\ \xe4\xab\xe5\x72\xb9\x6c\xdb\x36\x9a\xcd\x26\xea\xf5\x3a\x56\x56\ \x56\x50\xaf\xd7\x31\x18\x0c\x10\x04\x01\x00\x40\x4a\xd9\x64\x8c\ \x65\x18\x63\xc4\x39\x87\x6d\xdb\xc8\x64\x32\xc8\xe5\x72\xc8\xe5\ \x72\xc8\x64\x32\x60\x8c\x21\x08\x02\x74\x3a\x9d\x70\x3f\x8d\x46\ \xe3\x8b\x42\x88\x7f\x11\x04\xc1\x43\x50\x20\x10\xe8\xfd\xfd\xc0\ \x6e\xc8\xf3\x08\xbc\x79\xde\x22\xf0\x99\xa4\xcd\xff\xf7\x8f\xdf\ \xb0\x67\x6a\x3c\x73\xb4\x96\xa2\x3b\x12\x36\xbb\x21\x21\xbd\x5c\ \x1e\xed\x52\x36\xe8\xa5\x52\xb2\x0b\x4b\x06\xaf\xcc\x49\x00\x98\ \xe3\xd5\xee\x5f\x9d\x60\xff\xe9\x13\xbf\xf3\xc5\x7f\x0f\x60\x09\ \x0a\x04\x02\x5c\x02\x81\x2d\xe3\x12\x00\x0c\x0f\xfa\xfa\xd7\xbf\ \x9e\xfd\xd8\xc7\x3e\xf6\x77\x13\x13\x13\x37\x5a\x96\x85\xa5\xa5\ \x25\xac\xac\xac\x60\x7e\x7e\x1e\x83\xc1\x40\x02\xf8\x3c\x80\x87\ \x85\x10\x4f\x03\x38\x01\xa0\x01\xc0\xe2\x9c\x8f\x49\x29\xc7\x18\ \x63\x93\x44\xf4\x1a\xc6\xd8\x6d\xb6\x6d\x97\xb2\xd9\x2c\xaa\xd5\ \x2a\x0a\x85\x02\x92\xc9\x24\x3c\xcf\x43\xbb\xdd\xc6\xc6\xc6\x06\ \x66\x66\x66\x44\xbf\xdf\xff\x6d\x21\xc4\xbf\x04\xd0\x87\x26\xae\ \x5e\xc9\x49\x7a\x0e\xa1\xb9\xed\x84\x9e\x7d\xfa\x17\x6e\xde\xb9\ \x7b\x22\x7b\x4d\x35\xc5\x6e\x4f\xd8\xec\x26\x17\x7e\xa9\x88\x6e\ \x3e\x2b\xbb\x99\x94\xec\xc1\x16\xc6\xcb\x41\xf4\x2c\x63\x7f\xbf\ \x8c\x43\x10\xc3\x23\x62\xe7\xdc\x3f\xfb\xf3\x93\xbf\xfa\xf9\x87\ \x4e\x7c\x05\xc0\x0a\x22\x4e\xe0\x92\x2b\x10\x1b\x97\x00\x20\x1a\ \x04\xc0\xb9\xf6\xda\x6b\x7f\xab\x52\xa9\xfc\xbc\xeb\xba\x98\x9b\ \x9b\xc3\xcc\xcc\x0c\xd6\xd6\xd6\x20\x84\x78\x5c\x4a\xf9\x49\x00\ \x8f\xea\xed\x8d\xf9\x1e\x86\x9c\x10\x09\x89\x65\xdb\xb6\x0d\xe0\ \x18\x80\x3b\x6d\xdb\x7e\x4b\x2e\x97\x2b\x56\x2a\x15\xd4\x6a\x35\ \x58\x96\x05\xcf\xf3\xb0\xb9\xb9\x89\xd3\xa7\x4f\xa3\xd1\x68\x3c\ \xe4\xfb\xfe\x07\x01\xcc\xe2\x65\xd6\x54\x2f\x50\xe0\xe9\x37\x3f\ \x76\xfd\xc4\xc1\xe9\xfc\x35\x95\x0c\xbf\x35\x65\xb3\x5b\x6c\x12\ \xd5\x82\xec\x66\x73\xe8\xe7\xd2\xb2\x0f\x47\x7a\x6a\x0f\x5b\x84\ \x5c\x8e\xbc\x37\xfa\xfa\xe5\x19\x9b\x56\x41\x7e\xf6\x49\xfb\x73\ \x3f\xf7\x7b\x0f\xfd\x5b\x00\xa7\x01\x6c\x02\x18\xe0\x92\x15\x30\ \x34\x2e\x01\x40\x34\xec\xbb\xee\xba\xeb\xad\x9c\xf3\xcf\xa5\x52\ \x29\xb6\xb6\xb6\x86\xd9\xd9\x59\xcc\xcc\xcc\x40\x08\xf1\xc7\x00\ \xfe\x15\x22\xe2\xce\x8f\x3d\x4c\xb8\x29\xd4\x8e\x8e\xe3\xa4\x85\ \x10\x55\xc6\x58\x45\x4a\x59\x92\x52\x66\x89\xe8\x88\x6d\xdb\x6f\ \xcd\xe7\xf3\xf9\xe9\xe9\x69\x64\x32\x19\x58\x96\x85\x66\xb3\x89\ \xd9\xd9\x59\xcc\xcd\xcd\x2d\x01\xf8\x09\xdf\xf7\xff\xbb\xd9\xef\ \x4b\x31\x51\x5f\xa8\xc0\xff\xda\x07\x8f\x56\x8e\xed\xaf\x1c\xaf\ \x64\xac\x5b\x32\x0e\xbb\xcd\x26\x39\x91\x43\x3f\x55\xa0\x5e\x21\ \x2d\xfb\x70\xa5\x21\x3d\x65\x4c\x96\x9f\x4b\xe3\xbf\xb2\x40\x10\ \x10\xc7\x57\x06\x3b\x4f\xbf\xef\x53\x5f\xfd\x95\x33\x8b\x8d\x47\ \x01\x2c\x02\x68\xe3\x92\x15\x30\x34\xac\x1f\xf4\x01\x5c\x20\x83\ \x7f\xe4\x23\x1f\xd9\xd7\xe9\x74\xfe\x60\x62\x62\x82\x35\x1a\x0d\ \x2c\x2d\x2d\x61\x6e\x6e\x0e\x42\x88\x6f\x03\xf8\xd7\x50\x33\x55\ \x40\x4d\xa0\x81\x7e\xf8\x00\x44\x2e\x97\xa3\x74\x3a\x5d\x0b\x82\ \xe0\xad\xa9\x54\xea\xed\x8e\xe3\x1c\x73\x1c\x87\x49\x29\xe1\x38\ \x0e\x3a\x9d\x0e\xa4\x94\xe8\x74\x3a\x9d\x56\xab\xb5\xfa\xf8\xe3\ \x8f\xe7\x26\x26\x26\x9c\xb1\xb1\x31\xa4\xd3\x69\x54\xab\x55\xd8\ \xb6\x3d\x76\xfa\xf4\xe9\xbf\x02\xf0\xa3\x00\xfe\x06\x80\x4f\x44\ \xe7\x0d\x02\xe7\x23\xf0\x99\x4c\x86\x92\xc9\x24\xf3\x7d\x9f\x7d\ \xf8\xbe\xdd\x85\xeb\x0f\x95\xae\xa9\xa4\xad\x9b\xb2\x09\xba\x93\ \x33\xda\x95\x93\x03\xb7\x48\xad\x62\x5a\x0e\x28\x89\xb8\x86\x07\ \x40\x34\x6c\xf7\xc4\x87\x24\xb5\x21\x8d\xbc\x47\x52\x6f\x2c\xb7\ \x79\xfd\xd2\xca\x23\x97\x01\xf6\x24\x3a\xe3\x6f\xba\x75\xef\x8d\ \xff\xee\x2f\x1e\x39\x03\x65\x01\xf4\x10\x45\x60\x2e\x0d\x5c\x02\ \x00\x40\x69\x3c\xf7\x5b\xdf\xfa\xd6\x1f\xd5\x6a\xb5\x82\x94\x12\ \xf3\xf3\xf3\x98\x9b\x9b\x83\xef\xfb\x9b\x00\x7e\x11\x91\x99\xef\ \x43\xf9\xea\x7d\x00\x5e\xb9\x5c\x0e\x12\x89\xc4\x6e\xc6\xd8\xbf\ \xc9\xe7\xf3\xb7\x55\xab\x55\xcb\xb6\x6d\xb8\xae\x8b\x4e\xa7\x03\ \xce\x39\xfa\xfd\x3e\x6a\xb5\x1a\xba\xdd\x2e\x84\x10\xa9\xcd\xcd\ \xcd\xd4\x60\x30\xc0\xe2\xe2\xa2\xe8\xf5\x7a\xac\x56\xab\xa1\x54\ \x2a\x01\x00\x06\x83\x81\x35\x37\x37\xf7\x99\x20\x08\xee\x06\xf0\ \x18\x00\x8f\x88\x9e\x53\x5b\x9d\x63\xf2\x4d\xf8\xa8\x56\xab\x2c\ \x93\xc9\xf0\x37\x5c\x5f\xc9\xde\x76\xb8\x78\xa4\x94\xe1\x37\x65\ \x1d\xdc\x65\x31\xb6\x37\x83\x81\x53\x44\xaf\x98\x41\x9f\x25\xe1\ \x81\x86\xe0\x43\xbf\x90\xa3\xbf\x44\xd1\x9b\x43\x82\x1f\x13\xf4\ \x38\x18\x8c\x82\x46\x1c\x50\x5e\x62\x20\x28\xa3\xe5\xde\x72\xb0\ \x70\xc3\xbf\x03\xfe\x01\xc0\x2a\x22\x0b\xe0\x95\x63\x24\x2f\xf0\ \x71\x09\x00\x00\x7e\xf3\xcd\x37\x7f\x28\x97\xcb\x5d\x6f\xdb\x36\ \x16\x17\x17\xb1\xb2\xb2\x82\x5e\xaf\x27\x01\xfc\x32\x94\xe9\x08\ \xa8\x49\x33\x80\x12\xfe\xc1\xa1\x43\x87\x82\x66\xb3\xf9\xa1\x5c\ \x2e\xf7\xaf\xa7\xa7\xa7\xd3\xae\xeb\xa2\xd5\x6a\x21\x08\x02\xac\ \xae\xae\xa2\xd7\xeb\xa1\xdb\xed\xc2\xb2\x2c\x30\xc6\x90\xcb\xe5\ \x00\x00\x13\x13\x13\xe8\x76\xbb\x48\xa5\x52\xcc\x70\x0c\x52\x4a\ \x64\xb3\x59\xf4\xfb\x7d\xf4\xfb\xfd\xec\xca\xca\xca\xff\x65\x59\ \xd6\x1d\xae\xeb\x72\x21\x44\x1d\x8a\xc9\x06\xf0\xc2\xb2\xed\x26\ \x26\x26\xf8\xeb\x6f\xda\x95\xbc\xe7\x78\xf1\x58\x39\xcd\x6e\xc8\ \xb9\x78\xad\x45\x74\x79\x8a\x7c\xbb\xc8\x7a\xa5\x0c\x3c\x96\x86\ \x0f\x32\xb1\x78\x09\x00\x1c\xa1\xc7\x23\xcd\xee\xe3\x5a\x9d\xce\ \xf2\x59\xfc\x7d\x8c\x08\xba\xd1\xfa\xb1\xf7\x5e\x46\x20\x48\x04\ \x3d\xec\x28\x38\x53\x63\xa5\x74\x6d\x69\xbd\x3d\x0f\x60\x1d\x9a\ \x6c\x7d\x3e\x60\xbd\x58\xc6\xc5\x0e\x00\xec\xd3\x9f\xfe\x74\x25\ \x08\x82\xff\x2d\x9b\xcd\x62\x6d\x6d\x0d\x1b\x1b\x1b\xd8\xd8\xd8\ \x80\x94\xf2\x0f\x01\x7c\x11\x4a\x90\x02\xa8\x58\xf2\x00\xc0\xe0\ \xe8\xd1\xa3\xce\xea\xea\xea\x7f\xde\xbb\x77\xef\x7d\x85\x42\x01\ \xf5\x7a\x1d\xf3\xf3\xf3\x68\x36\x9b\x58\x5f\x5f\x47\xa7\xd3\x41\ \x10\x04\x90\x52\x82\x88\xc0\x18\x03\x63\x0c\xb6\x6d\xa3\x54\x2a\ \x61\x72\x72\x12\xd5\x6a\x15\x8e\xe3\x60\x65\x65\x05\x0b\x0b\x0b\ \xb0\x2c\x0b\xb5\x5a\x0d\x8e\xe3\xa0\xdf\xef\xef\xec\x74\x3a\x4f\ \x25\x12\x09\xd6\xed\x76\x61\xdb\xf6\xa3\x52\xca\xdf\x0a\x82\xe0\ \xbf\xe0\x1c\x92\x6f\x52\xa9\x14\xdd\x73\xf3\xe5\xc9\x1f\xbd\x6d\ \xe2\x48\x25\xc7\x6f\xc8\xba\xb8\xdb\xe2\xec\xca\x14\x3c\x5e\x64\ \xfd\x62\x96\x7c\x2b\x2d\x7d\xb0\x50\xea\x4c\x4c\x9e\x45\x7b\x93\ \xdb\x68\xef\x78\xad\xcd\x59\xcd\xff\xf8\xfb\xa3\xe6\xbe\xd9\xc6\ \xec\x37\x06\x16\xdb\x59\x08\x2f\x92\x23\x20\x48\x54\xed\x5e\xf6\ \xda\x43\xe3\x7b\x3f\xff\xd0\x89\x93\x00\x12\x00\x3a\xd0\x3c\xc0\ \xa5\x71\x71\x03\x00\x01\xb0\x3f\xf7\xb9\xcf\xfd\xb3\xa9\xa9\xa9\ \x4a\xbf\xdf\x47\xaf\xd7\xc3\x99\x33\x67\x20\x84\x78\x16\xc0\xbf\ \x81\x92\x08\x89\x08\x00\xbc\xeb\xae\xbb\x4e\x2e\x2d\x2d\x7d\x72\ \xef\xde\xbd\xf7\x15\x8b\x45\x2c\x2d\x2d\x61\x63\x63\x03\x0b\x0b\ \x0b\x68\x36\x9b\xd0\x4a\xe5\x29\x00\xdf\x04\xb0\xa1\x1f\x0e\x80\ \xcb\xfb\xfd\xfe\x81\x6e\xb7\x7b\xc5\xda\xda\x1a\x26\x26\x26\xb0\ \x63\xc7\x0e\x54\xab\x55\x2c\x2e\x2e\x62\x79\x79\x19\x53\x53\x53\ \xc8\xe7\xf3\xd8\xb5\x6b\x17\x1e\x7f\xfc\x71\x96\x4a\xa5\x50\xad\ \x56\xd1\x6e\xb7\x8f\x2c\x2c\x2c\xfc\xa9\x94\xf2\x56\x21\xc4\xcf\ \x61\x1b\xd2\xee\x8a\x3d\x15\xeb\x97\xdf\x77\xf8\xf0\x78\x29\x79\ \x63\x3e\x41\x77\x5b\x9c\x8e\x26\x20\xac\x22\x1b\xe4\xb2\xe4\x3b\ \x19\xf2\xc1\xb7\xd4\x27\x19\xb3\x9e\xc7\xde\xd3\xcf\x44\x31\xe1\ \x16\x5a\xf6\x29\x7a\x7d\x4e\xe6\xff\xf0\xcf\x3c\xbf\xf9\x1f\xff\ \x2c\x06\x1a\x2f\x02\x08\xc6\xed\x5e\xee\xc8\x65\xc5\x7d\x9f\x7f\ \x08\x5f\x05\x90\x84\x9a\xf3\x1e\x2e\xb9\x01\x00\x2e\x6e\x00\x60\ \xef\x7e\xf7\xbb\xaf\x76\x5d\xf7\x23\xfd\x7e\x1f\x86\xf5\xef\xf7\ \xfb\x00\xf0\x49\x28\xb5\x38\xa4\xfd\x8b\xc5\xa2\xbf\xb1\xb1\xf1\ \xba\x1d\x3b\x76\xfc\xe4\xc4\xc4\x04\x66\x67\x67\xb1\xbe\xbe\x8e\ \x93\x27\x4f\xc2\xf7\x7d\x01\xe0\x73\x00\xfe\x12\xc0\xb3\x88\x92\ \x7b\xc2\x82\x20\x29\x25\xf9\xbe\x7f\x65\xa7\xd3\xf9\xd8\xec\xec\ \xec\x3d\x42\x08\x36\x3d\x3d\x8d\x72\xb9\x8c\xc5\xc5\x45\xac\xad\ \xad\x85\x56\x40\x36\x9b\xc5\xfa\xfa\x3a\x76\xed\xda\x85\x7c\x3e\ \x0f\xce\x39\x66\x67\x67\x3f\xee\xfb\x7e\x5b\x08\xf1\x1b\xd9\x94\ \xcd\x7f\xe7\x67\x6f\x38\x38\x59\xcd\xdc\x58\x4c\xf1\xd7\xd9\x36\ \x3f\xee\x4a\xe1\x16\x98\x97\xce\x32\x3f\x91\x25\x1f\xd6\x10\x43\ \x3f\xc2\x0d\xc6\xb5\xba\x11\xda\x70\xdb\x58\x96\x9e\x71\x07\x48\ \xc6\x04\x32\x06\x18\x52\xe2\xdc\x04\x7f\x94\xf4\x1b\xfd\x1c\xe7\ \x00\x04\xe7\x0f\x02\x09\xd1\xa3\xa3\xd3\xa5\x03\x00\xb2\x00\xd2\ \x00\x6c\x28\x32\x30\x86\x5e\x17\xef\xb8\x58\x01\x80\x00\xb8\xcf\ \x3c\xf3\xcc\xa7\xa7\xa7\xa7\xad\x66\xb3\x89\xcd\xcd\x4d\x63\xfa\ \xff\x7f\x00\x1e\x82\xba\x36\x86\xf5\xf7\x00\x78\x13\x13\x13\xd5\ \x20\x08\xfe\xa0\x5c\x2e\xd3\x99\x33\x67\xb0\xbe\xbe\x8e\x13\x27\ \x4e\x20\x08\x82\x59\x00\xbf\x0e\x95\x23\x30\x64\x31\x20\xd2\x36\ \x12\x00\xb9\xae\xfb\xed\x44\x22\xf1\x7b\x8c\xb1\x3b\x96\x96\x96\ \x12\x99\x4c\x06\x85\x42\x01\x42\x88\x10\x00\x5c\xd7\x45\xa5\x52\ \xc1\x89\x13\x27\xb0\xbe\xbe\x8e\xb1\xb1\x31\x14\x8b\x45\x0c\x06\ \x03\x2c\x2c\x2c\xfc\x93\xdf\xfd\xd9\xeb\x8f\xde\x7c\x75\xed\x0a\ \x1b\x94\x2c\x30\x3f\x59\x60\x5e\x32\xc3\x3a\xb0\xb7\x30\x74\x14\ \x09\x15\x30\x32\xdd\x45\x6c\x3b\xf3\xa7\x8c\x04\x5e\xea\x6d\x46\ \x7d\xfe\xf8\xf7\x25\x62\xfb\x1f\x15\xfc\xb3\x99\xff\x66\x9b\x6d\ \x3e\xdf\x62\xfe\x8f\xfe\x4d\x11\xe0\x9c\xe3\x70\xc4\x00\x63\x79\ \xa7\x5a\xc8\x26\xf2\x9b\xcd\x5e\x12\x0a\x00\x18\x80\x80\x88\xe8\ \x62\xe7\x01\x2e\x56\x00\xb0\x6e\xbf\xfd\xf6\x77\x14\x8b\xc5\x5b\ \xfb\xfd\x3e\x1a\x8d\x06\x16\x17\x17\x11\x04\x41\x1f\xc0\x6f\x22\ \x62\xc0\x42\x00\xd8\xbf\x7f\x7f\x50\xaf\xd7\x7f\x71\xff\xfe\xfd\ \xe5\x20\x08\xd0\x68\x34\x70\xe6\xcc\x19\x04\x41\xb0\x0e\xe0\xfd\ \x00\xea\x50\xd3\xd5\x00\x46\x18\x2d\x40\x2c\x59\x28\x9b\xcd\xba\ \x8c\xb1\x5f\xab\xd5\x6a\x89\x76\xbb\x8d\xe5\xe5\x65\x94\x4a\x25\ \x78\x9e\x0a\xb3\xad\xae\xae\x22\x95\x4a\xc1\x84\x10\xcf\x9c\x39\ \x83\x44\x22\x01\xd7\x75\x91\x4a\xa5\xe0\x38\x0e\xfd\xfd\x97\x4f\ \xbf\xf6\x63\xd7\xe4\x91\x60\x23\x39\x48\xd2\x78\x05\xa3\x73\x9a\ \x62\x4f\x31\x21\x07\x62\xdb\x6a\xb5\x6b\xb6\x21\xbd\x8d\x91\x0f\ \x19\xd3\xde\xe6\x33\x32\x82\xaf\x05\x73\xd4\x65\x88\xfd\xf4\xf3\ \xbf\x8e\x03\xc1\x08\x28\xc4\xbf\x33\xf4\xfd\xe7\x97\x5d\x82\x44\ \x91\x0f\x52\x57\x5d\x56\x99\x78\xe8\x91\xd9\x67\x00\xb8\xfa\xe4\ \xc3\xf4\xeb\x8b\x79\x5c\x8c\x00\xc0\x3e\xf3\x99\xcf\x14\x7a\xbd\ \xde\xbf\xca\xe5\x72\x68\x36\x9b\x21\x81\x27\xa5\xfc\x3f\x01\xcc\ \x63\x1b\xed\x7f\xf3\xcd\x37\xe3\xc1\x07\x1f\x7c\x73\x2e\x97\xc3\ \xec\xec\x2c\x16\x16\x16\xd0\xed\x76\x01\xa5\xf9\x37\x11\x4d\x2a\ \x93\x27\x60\x00\x20\x3e\xd1\x08\xc0\xe1\x64\x32\x79\x5b\x3a\x9d\ \x86\x6d\xdb\x38\x79\xf2\x24\x56\x57\x57\xc1\x39\x47\xbb\xdd\x46\ \xab\xd5\x42\x2a\x99\x10\x0e\xf5\xc5\xd1\xbd\x39\x2c\x6d\x7a\xac\ \xdd\x6e\xb3\x44\x22\x81\x5c\x2e\x87\x7c\x3e\x8f\xbf\x7b\x64\x19\ \x4f\xce\x36\x70\x74\x3a\x8b\x21\x1e\x30\xd4\xe0\x43\x01\xf8\x91\ \xd3\xdf\x8e\x90\x8b\x6f\xab\xa5\x2c\x14\x50\x63\xe2\x6f\xe3\x22\ \xc4\xfd\x7e\xd2\xef\x0b\x00\x60\xd1\x6b\xb3\xdd\x59\xcc\x7f\x29\ \x81\x41\x40\xfa\x01\xf4\x3d\x82\x17\x10\xfa\x01\x30\xf0\xf5\xfb\ \x02\xe8\xfb\xea\x7d\x46\x12\x16\x13\xb0\x99\x84\x4d\x02\xb5\xf4\ \x00\x3b\xb2\x83\x61\x46\x74\x84\x98\x1c\x73\x06\xd9\xdd\x3b\xf2\ \x13\x0f\x3d\x32\x9b\x82\x22\x02\x39\x2e\x0d\x00\x17\x1f\x00\x10\ \x00\xeb\xf7\x7f\xff\xf7\x7f\x35\x9b\xcd\x4e\x06\x41\x80\x8d\x8d\ \x0d\x2c\x2f\x2f\x43\x08\x31\x07\xe0\x0f\x10\x52\xe1\xa1\x30\x7b\ \x00\xfc\x87\x1e\x7a\xe8\xe6\x72\xb9\xbc\xa3\xd3\xe9\xc0\xf7\x7d\ \x74\x3a\x1d\x00\x78\x10\xc0\x97\xa0\xb4\xca\x90\xc5\x60\xbe\x87\ \x98\x96\xc9\xe5\x72\x8e\xef\xfb\xb7\x67\x32\x19\x70\xce\xc3\x72\ \xe2\x67\x9e\x79\x06\x99\x04\xf9\xd3\x95\x04\x41\x12\x6a\x59\x70\ \x97\x6c\xe6\x72\xc2\x54\x36\x89\x2f\x9e\x5c\x41\xa9\x54\x42\x3a\ \x9d\x46\xa5\x52\xc1\xda\xda\x1a\x3e\xf3\xe5\x45\x1c\xde\x95\x03\ \x1b\xcd\xfb\x31\x47\x8f\x51\x30\x18\x75\x0f\x00\x21\x25\xfa\x5a\ \xf0\x06\x1e\xa1\xef\x2b\x61\xf4\x02\x89\x81\x0f\xf4\x03\x82\x17\ \x40\x0b\x63\xf4\x7a\xe0\xab\x6d\xbd\x00\xe8\xf9\x40\xd7\x23\xf4\ \x7d\x42\x4f\x3f\xfa\x81\x7a\x3d\xf0\x23\xe1\xf6\x04\xe0\x05\x04\ \x5f\xa8\xbf\x03\xa1\xfe\x16\xfa\xb0\x38\x01\x8c\x24\x18\x01\x44\ \x52\x09\xf4\x88\x20\x4b\x19\xe7\x26\xd5\x17\xd5\x3e\x08\x3b\xb2\ \x7d\x5c\x3b\xde\xc2\xdb\x0e\xac\x61\x57\xae\x0f\x02\xe9\x7d\x01\ \x69\xea\x5b\xd7\xee\xc9\xed\xfd\x63\x45\x02\xba\x50\xf3\xfe\x6c\ \xe6\xd2\xab\x7a\x9c\xad\x55\xdd\xd9\x5c\x9d\x8b\x0d\x00\xd8\x87\ \x3f\xfc\xe1\x03\x96\x65\x7d\x22\x9d\x4e\x63\x75\x75\x15\x6b\x6b\ \x6b\x71\xe2\xcf\x47\xa4\xfd\x8d\x1f\xef\xdf\x70\xc3\x0d\x62\x6e\ \x6e\xee\x6d\x85\x42\x21\xac\xf3\xd7\xdf\xf9\x6f\x7a\x7b\x43\x16\ \x9a\xef\x99\xbf\x81\x48\x02\xf9\xf5\x07\x72\xd5\xe5\x7a\x70\x9d\ \xe5\xba\xb0\x6d\x1b\xf5\x7a\x1d\x52\x4a\x64\x1c\xe0\xc8\x54\xd6\ \x12\x81\x84\x00\xd0\xef\x0b\x0c\x40\x68\x31\x06\x46\x0c\xf9\x04\ \xc3\xd2\xd2\x12\x6a\xb5\x1a\xa4\x94\x70\x5d\x17\x7f\xf6\xf0\x06\ \xa6\xa6\x1c\x78\x81\x85\x9e\x47\xe8\xf9\x52\x09\x9f\xaf\x35\xa9\ \xaf\x85\x35\x50\x82\xe7\x05\xd0\x82\xa7\x84\xc6\x17\x91\x75\xcf\ \x09\x60\x4c\x09\xa0\x11\x3c\x8a\x1f\xb9\x34\x2c\xa6\x46\x39\x09\ \x08\x49\x10\xe2\xa5\x93\x9e\x40\x02\x41\x68\x8d\x6c\x3b\x87\x9f\ \x73\x9c\xaa\x27\x30\xd3\x70\xf1\x57\x4f\x97\xb1\xaf\xd0\xc1\xc7\ \x8e\xcd\xe3\x48\xad\x0b\x9b\x03\x76\xd0\xc7\x65\x63\xf9\x29\x00\ \xc6\x02\x08\xef\xd9\x0f\x03\x0f\xf0\x1c\xad\xd7\xcc\x90\x66\x9b\ \xd1\x73\xbd\x98\x00\x80\x00\x38\xdf\xf9\xce\x77\x3e\xb5\x63\xc7\ \x0e\xa7\xd5\x6a\x61\x73\x73\x13\x4b\x4b\x4b\x60\x8c\x7f\x63\x7a\ \xea\x9a\x19\x09\x79\x8c\x88\x25\x2c\xee\x70\xdb\x76\xc9\x76\x92\ \x64\xdb\x49\x4a\xb9\x99\xa4\xe3\xac\xbd\x37\x93\xc9\xe0\xe4\xc9\ \x93\xe8\xf5\x7a\x00\x28\xb8\xe2\xe0\x9d\x37\x31\xe2\x77\x80\x64\ \x92\x33\xdb\x61\xcc\xb2\x6d\xcb\xb1\x39\xb7\x6c\x62\xdc\x61\x44\ \x2e\xe7\x48\x73\x42\x0a\x52\x3a\x1d\xbf\xcf\x9b\x83\xef\x23\x3d\ \x18\xc0\xf7\x7d\xd8\xb6\x0d\xc6\x18\x9a\x3d\x86\x47\xe7\x5d\xc4\ \x7d\x67\x73\x4f\x89\x31\x40\x26\x90\xe4\x01\x84\x10\x48\xa7\xd3\ \xc8\x64\x32\x58\x5c\x5e\xc6\x67\xbf\x4e\x48\x24\x52\x23\xa7\x69\ \x4c\x78\x19\x71\x74\x5a\x82\x65\xf8\x39\x86\xc8\xb4\x40\x02\xaa\ \xba\xf9\xfc\x05\xef\x42\x1a\x81\x54\x6e\xca\x93\xeb\x69\xfc\xd2\ \x17\x2e\xc3\xfb\x0f\xcd\xe1\xad\xfb\xd7\x90\x76\xfa\x28\x24\x90\ \xdf\x3d\x99\xaf\x9c\x9a\xaf\xa7\xa0\xc2\xb2\x26\x51\xea\x55\x29\ \xfc\xe7\xd0\x6f\xd1\x8c\xa1\xf3\x1b\x4d\x80\xba\x60\x00\xe0\xb6\ \xd7\xfc\x44\x06\xc0\x18\x08\x35\x48\x59\x23\xa2\x24\x80\x84\x94\ \x70\x01\x24\x00\x4a\xa8\x67\xb8\x44\x48\x03\x94\x02\x21\x05\x50\ \x8a\x80\x94\xfe\x3c\x69\xb6\xd1\x0f\x47\x3d\xa4\xc3\x39\xb3\x25\ \x5a\x76\x26\x93\xe1\x41\x10\xa0\xdb\xed\x62\x61\x61\x01\x42\x48\ \x5c\x75\xe8\xde\xab\x5d\x27\xf3\x97\x12\x42\x12\x98\x24\xc6\xc0\ \x99\x25\x19\xb3\xc0\x18\x47\xbb\x53\xb7\xca\xe5\x62\xc2\xb4\xfd\ \xda\xd8\xd8\x40\x31\xbf\x83\x67\x52\x95\xb7\x08\x5d\xe7\xce\x18\ \x07\x67\x36\x38\xb7\xc1\x18\x07\x63\x5c\x73\x6a\x4c\x6b\xcd\x00\ \x42\x32\x00\x0e\x3c\xaf\x0d\xc7\x71\xe0\xfb\x3e\x92\xc9\x24\x1a\ \x8d\x16\x88\x5c\x48\x29\x42\x9f\x5b\x82\x40\x4c\xdd\x4b\xc6\x39\ \xba\xdd\x3a\x92\xc9\x24\xfa\xfd\x3e\xd2\xe9\x34\x88\x08\x8d\xc6\ \x0a\xd2\xa9\x92\xde\x0e\xa1\x4a\x97\x43\x42\x6e\x5e\xeb\xbf\xc3\ \x7b\xaf\x7f\x47\x46\x7f\xc7\xbe\x12\x8e\x57\xab\x72\xf4\x04\xc3\ \x67\x1f\xdf\x81\x53\x9b\x36\x3e\x7a\x64\x1e\xa9\x54\x37\xbd\x6f\ \xaa\x34\x1e\x03\x00\x8e\x57\x21\xe2\x3d\x47\xad\x07\x43\xe4\x00\ \xc6\x41\xc0\xb8\xa6\x61\xd1\x5a\x1c\x04\x7e\x60\x00\x70\xdb\x6b\ \x7e\x7c\x0c\xa0\xfb\x89\xe8\x3e\x09\xdc\x49\x44\x65\x80\x7a\x44\ \x34\x20\x62\x5a\x05\x12\x01\x60\x44\x44\x44\x8c\x03\xe0\x04\x62\ \x32\x7e\x1d\xa4\xda\x4c\xeb\xcb\xe8\x07\x08\x08\xdf\x25\x06\xd7\ \xb5\xb1\xb8\xf2\x3d\x94\x2b\x19\x34\x1a\x0d\xcc\xcf\xcf\xa3\x5e\ \xaf\x63\x72\xfc\x2a\xe4\xb2\x93\xae\xd0\xf5\xeb\x44\x04\x62\x16\ \xb8\x16\x7e\x8b\xdb\xd8\xa8\x3f\x8d\xc9\x1d\x45\x78\x9e\x07\xc6\ \x18\xfa\xfd\x3e\x76\xef\xda\x07\xdb\x56\x42\x4b\x44\xb0\x38\x07\ \xe3\x0e\x2c\xcb\x06\xe7\x1c\x04\x0b\xc4\xa2\x83\x91\xd2\x03\xeb\ \xf9\xc8\x66\x4a\xa8\x37\xd7\x42\x96\x3f\x99\x4c\xa2\x5e\xaf\x83\ \x73\x80\x31\x47\x81\x80\xf9\x96\xde\x01\xe7\x84\x6e\x8f\xc2\xfe\ \x83\xe6\xd1\x1f\x34\xe1\xba\x0e\x18\x63\x90\x52\x86\x82\x2e\x45\ \x24\xf8\x52\x4a\x6d\x0d\xe8\xbf\xb5\x29\x20\xa4\x99\x17\x80\x14\ \x72\x08\x24\x60\xbe\x2d\x23\x4b\xe4\xd5\x08\x04\x9e\x60\xf8\xe2\ \x5c\x0d\x7b\xb3\x1b\x38\x72\x59\x27\x3d\x5d\x4b\x4d\x01\xc8\x20\ \x22\x02\x5f\x35\x00\x10\x13\xfc\xf8\x31\xb3\x6d\x1e\xe6\xbc\x8c\ \x75\x13\x77\x4b\xcd\x23\x04\x81\x57\x1c\x00\x6e\x7b\xcd\x8f\xd7\ \x00\xf6\xeb\x20\xf6\x11\x8b\x39\x3e\xe3\x76\x86\x91\x0d\xc6\x2c\ \x40\xdd\x98\x04\x00\x30\x46\x20\xc6\xb4\x4f\x4a\xca\x2f\x35\x66\ \xb1\x7e\x0d\xc4\xde\xd7\x02\x4f\x24\x21\x35\x20\x18\x00\xb0\x6d\ \x0b\xab\xeb\x4f\xa0\x58\x4a\xc1\xb6\x6d\xb4\xdb\x6d\xac\xae\xae\ \xc2\xb6\x93\x38\x72\xf8\x76\x10\xb3\x20\x45\x00\x10\xc0\x99\x05\ \xce\x2d\x58\x96\xd2\xe4\xb6\x65\xe1\xd4\xcc\x32\x1c\x67\x1f\x36\ \x36\x36\x30\x3f\x3f\x0f\xce\x2d\xec\xda\xb5\x5f\xf9\xc4\x32\x00\ \x63\x4c\x7d\x87\x39\xe0\x96\x0d\x62\x5c\x1f\x8b\x3a\x67\x29\x01\ \x3f\x60\x08\x44\x1f\x89\x44\x0a\x0b\x4b\xbd\x30\x6b\xd0\x71\x94\ \x00\x7b\x5e\x17\xa9\x54\x01\x22\x96\x83\x43\x44\xda\xf7\x26\x70\ \x66\xa3\xd7\xeb\x21\x9b\xcd\x22\x93\xc9\x28\x00\xe8\xb7\x74\xe4\ \x8f\xc2\x3b\x2e\xa4\x86\x48\xe3\xb0\x13\x41\x92\x00\x09\xb3\x3f\ \x09\x09\x01\x46\x04\x29\x99\x12\x72\x26\xd4\x77\x05\x81\x48\x83\ \x82\x34\xc7\xff\xea\x06\x02\x5f\x32\xfc\xc9\x53\xfb\x50\x4c\x3f\ \x4e\xbb\x4a\x99\x7d\x00\xf2\x50\x5c\x80\x99\xfb\x43\x1a\xf1\x42\ \x1b\xe7\x20\xf8\x5c\x3f\x6c\xa8\x73\x32\xaf\x81\xad\xa4\x34\x10\ \x81\x02\x80\x57\xd8\x02\xb8\xed\x96\x9f\x78\x3d\x11\xfb\xaf\x9c\ \x27\xb8\x6d\xa5\x5d\x22\x06\xdb\xb6\x60\xdb\x1c\xb6\x6d\xc1\xb2\ \x39\x6c\x8b\xc3\xb2\x2d\xb0\xd0\xac\x8d\x3f\xc9\x91\xd7\x08\x7d\ \x5d\xc4\x5e\xab\xcf\xd5\x33\x81\x00\xee\xa3\x35\xfb\x2c\xc6\xc6\ \x6a\x58\x5d\x5d\xc5\xf2\xf2\x32\xba\xdd\x2e\x8e\x1f\x7b\x03\x5c\ \x27\x09\x21\x7c\x08\xc6\xc0\xc0\xc0\xb8\x05\xc6\x6d\xf5\x0c\x42\ \xb3\xb5\x86\x54\xda\x45\x32\x99\x44\xb3\xd9\x44\xaf\xd7\xc3\x58\ \xed\x32\x70\xc6\x11\x04\x3e\x40\x04\x06\x0e\x46\x0c\x8c\x33\x10\ \xe3\x60\x60\x4a\xd8\x48\x1d\x0f\x11\xc0\x35\xa1\x07\x30\x58\x96\ \xea\x1d\x58\x28\x14\xa0\x73\xfd\xd1\xed\x35\x91\x4e\x17\xc1\x18\ \xdb\x92\x53\xa3\x00\x8f\x43\x08\x01\xdb\x56\x16\x86\xeb\xba\xe8\ \xf5\xdb\x20\xa9\x88\x3b\xc9\x18\x20\x24\x98\x0e\xf1\x09\x0d\x86\ \x10\x42\xb9\x21\x4c\x89\x3e\x09\x20\x32\x4d\x54\x9b\x6d\x09\x65\ \x41\x30\x26\x21\x84\xca\x7e\x26\x32\x2e\xc1\x56\x20\xb8\x40\x65\ \xe5\xac\x63\x20\x38\xbe\x3c\x93\x43\xad\x26\x27\x6c\x8b\x95\x3d\ \x5f\x64\x11\xf1\x00\x17\x5c\x2e\xc0\x73\xf8\xf7\xa3\x82\x6f\x41\ \x09\xbe\x0d\x75\x3e\x26\xc2\x61\x01\x61\x42\xda\x00\x2a\xf3\xb1\ \x87\xc8\xd7\x93\xfa\x77\x5e\x39\x00\xb8\xfd\x96\x8f\x7c\x98\xc0\ \xfe\xbd\xeb\xe6\x13\x9c\x39\x48\xa7\x13\xc8\x17\xd2\x70\x1c\x1b\ \xc3\x24\x95\x1e\x46\xb0\x87\x72\x58\x08\x52\x4f\xcc\x28\xe4\x4d\ \x20\x23\xf4\x52\x69\x7f\xf5\xb9\x12\x00\x6e\x59\x38\xf1\xec\x3f\ \xa2\x50\xc8\x63\x7d\x7d\x1d\xa6\xd6\xbf\x58\x98\xc0\xee\xe9\xab\ \xe0\x07\x81\xa6\xcd\x38\x88\x31\x65\xf6\x33\x0e\x46\x1c\x8c\x13\ \xd6\xd6\xcf\x84\xa1\x37\x53\xe6\xbb\x7f\xdf\x1e\x7d\x50\x5a\xf3\ \x32\xe5\x36\x30\xb2\x14\x10\x30\x02\x88\x81\x84\x8a\x5b\x49\xf3\ \x0b\xdc\x86\x6d\xd9\x48\xb8\x39\xb4\xdb\x6d\xe4\x72\x39\x98\x7a\ \x82\xfa\x66\x5d\x63\x97\xb1\x66\xa2\x6b\xa0\x84\xd3\x42\xab\xd5\ \x42\x3a\x9d\x46\xab\xd5\x52\x16\x40\xaf\xad\xf6\x4d\x00\xd3\x21\ \x40\x01\xd2\x40\x20\x20\xa1\xe9\x7d\x19\x5e\x2c\x80\x49\x40\x9a\ \x2c\x3e\xa6\x2e\xa4\x90\x86\x37\x04\xd3\xd5\x0f\x26\x3c\xb7\x1d\ \x10\x84\x81\xb8\x57\x09\x10\x04\x92\xe1\x3b\xeb\xe3\xb8\x23\xff\ \x6c\x7a\xb2\x9a\x9d\x3e\xbd\x50\x7f\x0a\x51\x34\xc0\xa4\x6a\x5f\ \x88\xc3\x18\x76\x2c\xf6\x1c\x17\x7c\x23\xf4\x21\x3f\x86\x28\xd1\ \xc9\x68\xff\x2e\xa2\xc4\x36\x13\x9d\x32\x6e\x41\x14\x35\x7e\x39\ \xc7\xed\xb7\x7c\xe4\x46\x80\xfd\x7e\xc2\x2d\x25\x1c\x3b\x89\xc9\ \xc9\x0a\x6a\x63\x45\xb8\x8e\xa3\xcd\x74\xa6\x84\x89\x08\xe6\x1f\ \x88\x81\x88\x21\x32\x6e\xb5\xaf\x6f\xde\x8b\x6d\xaf\x26\x32\x53\ \x02\x4c\x04\x46\x8a\x40\x63\xdc\x42\xaf\xbb\x06\xcf\x5f\x85\x65\ \x59\xe8\xf7\xfb\x98\x99\x99\x81\xef\x07\x38\x76\xf4\x5e\xe5\x2b\ \x4b\xa9\xbe\xc3\x19\x38\xe3\xa1\xef\xaf\xf6\xc5\xb1\xb1\x39\x8b\ \x44\x22\x01\x22\xd2\xad\xc1\x24\x2a\x95\x5d\x50\x17\x8f\xc0\x88\ \x81\x38\x07\x67\xfa\xf7\x19\x03\x81\x83\x19\x12\x8f\xa9\xe3\xe4\ \xcc\x02\xb7\x2c\x58\xb6\x8b\x74\xba\x84\x4e\xa7\x03\xcf\xf3\x42\ \x66\x5f\x42\x62\x30\xe8\xc4\xce\x17\xe1\x39\x02\x00\xe7\x36\xa4\ \x94\x61\xd5\x60\x22\x91\x80\x1f\x0c\x10\xf8\x1e\x94\x2b\xc4\xb4\ \x35\x62\x7e\x97\x81\xa0\xae\x47\x74\x6d\x8c\x9b\xa4\x5e\xab\x7d\ \x53\x78\xdc\x8c\xcc\x7e\x14\x88\x99\xcf\x23\x57\x0b\xe1\xdf\xea\ \xf0\xa2\xe3\xbb\xd0\x47\xc7\x77\xd1\xe9\xb1\x54\x31\x9b\xd8\x01\ \xa0\x0c\x55\x1b\x60\xc2\x81\x17\xc4\x20\x3d\x30\x4c\xea\x19\x8d\ \x6e\x43\x09\x79\x12\xaa\xa6\x21\x0b\xa0\x00\xa0\x04\x75\x3e\x35\ \xc6\xd8\xc4\x3b\xde\xf6\xc1\x3b\x7e\xe2\x43\xbf\xf0\xc6\x6c\x36\ \xbf\x53\x7f\x56\x40\xc4\x7b\x18\xf2\x33\x3c\xe7\x97\xdd\x02\xb8\ \xfd\x96\x8f\xda\x00\xfb\x13\xc7\xc9\x26\x5c\x37\x89\x89\xc9\x12\ \x6c\x8b\x45\x99\xa5\xe1\x13\x85\xda\x0c\x18\xd1\xf0\x31\xbb\x5f\ \x4a\xf3\x9e\xd6\x40\x71\xae\x13\xd0\x16\x80\x04\x03\xc1\xb1\x2d\ \x3c\xf1\xfd\xaf\xa2\x52\x2d\x85\x65\xbe\x9b\x9b\x9b\xd8\xb3\xfb\ \x08\xca\xa5\x1d\xf0\xfc\x81\xfe\x31\x02\x23\x0e\xce\x2d\x30\xce\ \xa1\xd8\x7f\x02\xb1\x00\x03\xaf\x0e\xa2\x31\x2c\x2f\x2f\xa3\xdf\ \xef\xa3\x90\xaf\x21\xe1\x24\xe0\x05\x9e\x12\x6e\x10\x38\x71\xcd\ \xfc\x6b\xd0\x8a\x5b\x21\x90\x2a\x53\x96\x01\x16\x77\xe0\xd8\x49\ \x24\xdc\x34\x06\x7d\x15\xd6\x93\x52\x22\x95\x4a\x81\x31\x86\x5e\ \xaf\x05\xd7\x4d\x45\xd6\x8e\x3e\x31\x53\x52\x0c\x00\x8c\x31\x0c\ \x06\x03\x58\x96\xba\x75\x9e\xd7\x43\x32\x99\xd1\xbf\x19\x33\xed\ \x25\x20\x18\x00\xc1\x42\x6b\x40\x5d\x15\x80\x20\x20\xa4\xd4\x60\ \x6a\x08\x42\xa8\x90\xa3\x30\xd7\x34\xda\x97\x32\xff\x0d\xff\x22\ \x5f\xb5\xfc\xc0\x72\x3b\xc3\x27\x8a\x8d\x9d\x8f\x28\x81\xc9\x40\ \x09\x44\x0f\x3f\x60\x57\x20\x26\xf4\x66\xc4\xcd\x7c\x86\xad\x66\ \x7e\x02\x8a\xc7\x48\x01\x48\x17\x8b\xe5\xd2\x07\xde\xfb\x33\xaf\ \x3b\x76\xf4\x86\x7b\x33\x99\xdc\x38\x00\xbc\xf6\xee\x37\x76\x7e\ \xe7\x77\x7f\xfd\x93\xdf\xf8\xd6\x57\x9e\x82\xf2\xff\x7b\x50\x99\ \xa9\xf1\x45\x5a\x5e\x01\x17\x80\xe8\xa7\x39\xb3\xc7\x1c\x3b\x49\ \xe3\xe3\x05\x38\xb6\xa5\xb9\xa9\xad\xfe\x3c\xc5\xe2\xd7\x91\x19\ \x0c\x48\x43\x68\x1a\x2d\x14\xf2\x5b\x14\xc5\xad\x62\xc0\x01\x10\ \x18\x23\x2c\x2d\x7f\x1f\xc9\x14\xc1\xf3\x3c\x34\x9b\x4d\x2c\x2c\ \x2c\x80\x73\x07\x47\xae\xbe\x1b\x52\x06\xea\x2b\x5a\xeb\x71\xce\ \x95\xff\xce\x54\x03\x0f\x10\x61\x65\xe5\x14\xaa\xd5\x0a\xda\xed\ \x36\x2c\xcb\x42\xa3\xd1\xc0\xee\x5d\xc7\xc2\x06\x80\x80\x12\x48\ \xa5\x4d\x95\xdb\x10\x69\x45\x02\x8c\xb0\x48\x09\x4e\x12\x92\x71\ \x58\x8e\x0b\xdb\x4e\xc2\xb6\x53\x68\xb5\x5a\x28\x95\x4a\x70\x5d\ \x17\x89\x44\x02\xbd\x7e\x0b\x79\x8c\x85\xe7\x13\x9d\xbf\x8a\x08\ \x78\xbe\x1f\xfa\xff\x46\xd8\x04\x04\xa4\x54\xe7\xab\x2e\x8d\x54\ \x68\x43\x12\x4c\x4a\x48\xa6\xe1\x50\x00\x44\x42\xa7\xed\x33\x30\ \x23\xf8\xb1\x73\x51\x20\xa0\xee\x83\x10\x42\x65\xe4\x11\x53\x96\ \xd2\x10\x39\x78\x76\x7e\x40\xbd\x7f\xe1\x01\x41\x20\x19\x36\x7b\ \x49\x4c\x14\x9d\x31\x28\x00\x28\x20\x32\x97\x7d\x22\x62\x52\xbe\ \x4c\x8b\x15\x9c\x65\x8c\x08\x7e\x5c\xeb\x8f\x9a\xfa\xc6\xb4\x8f\ \x5b\x00\xe9\x43\x57\x1c\x9d\xfa\xd1\xb7\x7f\xe8\x47\x0e\xec\xbf\ \xea\x4e\xc7\x71\xd3\x6e\x82\x21\x9b\x4d\x63\x7d\xad\x05\xdb\x76\ \x52\xf7\xbf\xe1\x9d\xaf\xff\xc6\xb7\xbe\x32\x0f\xd5\x09\xc9\x9c\ \x6b\x1c\x00\x5e\xfe\x28\x00\x03\xfd\x9c\x6d\x65\xd2\xc5\x62\x0e\ \x6e\xc2\x41\xc8\xcd\xc7\xfd\x79\x20\x86\x02\x91\xc6\x37\x56\x42\ \xa4\x11\xf5\xfb\x71\xe1\x30\xdb\x87\x16\x00\xb4\xc6\x14\x58\x58\ \xfe\x0e\xaa\xd5\x22\x36\x37\x37\xb1\xb6\xb6\x86\x56\xab\x85\x63\ \x47\xee\x85\xeb\xa6\x10\x04\x9e\x22\xc5\x48\xf9\xfd\x8c\x2c\x58\ \xdc\xd2\x44\x1e\x03\x03\xb0\xba\x76\x0a\xf9\x62\x1a\x52\x4a\x6c\ \x6e\x6e\x62\x30\x18\x60\x6c\x6c\x77\x68\xb1\xa8\x90\x21\xd7\x16\ \x00\x03\xb8\x72\x1b\x28\x76\x3a\xe6\x04\x15\x93\xcf\xe1\x58\x2e\ \x1c\x27\x89\x74\xba\x8c\x7e\x7f\x23\xb4\x00\xb2\xd9\x2c\x96\x96\ \x96\x10\x08\x1f\x16\xb7\xa3\x13\x17\x86\xb3\x51\x56\x40\xa3\xd1\ \x80\xe3\x38\x11\x00\x04\x81\xe2\x1c\xb4\xf6\x0e\x59\xfc\xf0\x4a\ \x2b\x6b\x40\x32\x25\xf8\x64\xac\x26\x02\x20\x74\xd4\x44\x43\x1a\ \xe9\x08\x81\xe2\x02\x14\x77\x20\xa4\xd4\xa0\xc0\x20\x0c\x88\xc4\ \xac\x01\x75\x9f\x5e\x1d\x44\xe1\x66\x3f\x85\xc9\x3c\xcf\x26\x5d\ \xbb\xdc\xed\x7b\x05\x28\x61\x32\x42\xf1\x8a\x59\x00\x23\xcc\xfe\ \x76\x82\x7f\x36\x8d\x9f\x06\x90\xbe\xe7\xb5\x6f\xbe\xf2\x9e\xd7\ \xbd\xe5\x2d\xbb\xa6\xf6\x5e\xcf\x18\xe3\x99\xac\x8d\xc9\x9d\x39\ \x14\x8a\x19\x74\xda\x12\x1b\xeb\x6a\xe1\xe4\x6a\x75\x7c\x37\xa2\ \xec\xc7\x78\x94\xe0\x95\xb1\x00\xee\xb8\xf5\xa7\x0e\x13\xd1\xa4\ \x6d\x25\x50\x2c\x66\x8c\xe8\x23\x22\xba\x22\xa1\x8e\x9b\xf2\x46\ \xe3\xc7\xb5\xbd\xd9\x1e\x52\x46\x02\x46\xda\x55\x88\x55\x8f\x31\ \x02\x38\xe3\x78\xe6\xd4\x57\x51\x28\x64\xe0\xfb\x3e\x9a\xcd\x26\ \x96\x96\x96\x90\xc9\x94\x71\x60\xff\x8d\x08\x44\xa0\xcd\x7e\x52\ \x7e\x32\xe3\x60\x9c\x83\xb8\x02\x02\x02\x03\xb3\x80\x46\x6b\x01\ \x53\xd3\xfb\xb1\xbc\xbc\x0c\xcf\xf3\xc0\xb9\x85\x52\x61\x32\xfa\ \xbe\xe1\x00\xb4\xf9\xcf\x35\xfb\xaf\x8e\x4b\x5b\x27\x31\x90\x13\ \x8c\x81\x73\x07\xae\x93\x44\x3e\x5b\xc3\xcc\xfc\x0c\x76\xec\x50\ \xec\x7e\xa9\x54\xc2\xca\xca\x0a\xba\x9d\x06\x72\xb9\xaa\xe2\x21\ \x40\x10\xf0\x11\x48\xa3\x7d\x81\x4c\x26\x83\x6e\xb7\x1b\xba\x04\ \x4a\x69\x29\xc0\x02\x23\x08\xc1\x60\x72\xe9\xe3\xd6\xc0\x30\x24\ \x19\xc6\x4f\xdb\x32\x42\x6d\x23\x01\x90\x64\x50\x75\x3f\x02\x12\ \x8a\xe7\x30\x39\x04\x8c\x09\xbd\xff\xc8\x1a\x00\x46\x81\xe0\xc2\ \xb5\x06\xda\x41\x02\x29\x1e\x38\x95\x62\x72\x6c\x66\xd1\x2b\x03\ \xc8\x41\xb5\x09\xf3\xa0\xda\x84\xbd\x6c\x69\xc1\xdb\x30\xfb\x71\ \xc1\x37\xa1\x3b\x0b\x61\xf2\xda\xb0\xa9\xcf\x18\xcf\x7e\xe0\xbd\ \x1f\xbf\xf5\xc6\x1b\xee\x78\x63\xa5\x32\x76\x90\x08\x28\x94\x5d\ \x4c\x4c\xe6\x91\xcd\xc6\xb3\x41\x65\xfc\x4f\x8e\xc8\xf7\x37\x7c\ \x47\x8c\x54\x7b\x99\x01\x80\x40\x6f\xb3\xac\x24\xcf\xe6\x52\x60\ \x7c\xb8\xfc\x34\xb2\xdc\x59\x2c\x74\x87\x21\x8d\xaf\x9e\xe4\x90\ \x29\x6c\x18\x28\xa3\xf5\x95\xc6\x97\xda\x42\x50\x84\x56\xbb\xb7\ \x82\x5e\x7f\x1e\x19\x3b\x83\x95\x95\x15\xcc\xcd\xcd\xa1\xdf\xef\ \xe3\xd6\x9b\xdf\xa3\xbe\xaf\x93\x63\xa0\x85\x97\x33\xae\xb4\x3f\ \xe3\xa1\x0f\xdf\x69\x6d\xc2\xb6\x81\x20\x08\xb0\xbe\xbe\x8e\x66\ \xb3\x89\x5a\x75\x2f\xc0\x38\x20\x02\x05\x46\x8c\x42\xdf\x9f\x31\ \x4b\x11\x6f\xc6\xaf\x36\x09\xf5\x1a\x08\x24\x29\xb2\xd1\xe2\x16\ \x1c\x27\x09\xc7\x4d\x81\xe0\x62\x73\x73\x13\xc5\x62\x11\xb6\x6d\ \x23\x91\x48\xa0\xdb\x6d\x20\x9f\xaf\x81\x73\x95\x8f\xe0\xfb\x0c\ \xd2\xef\x87\x5a\xd5\xf3\x3c\xd8\xb6\x1d\x13\x30\x01\xe5\xb1\x98\ \x50\x5e\x14\x09\x50\x26\xbc\x54\x6e\xbd\x11\x4e\x8a\x27\xf0\x47\ \x79\x00\x30\x79\x02\xa4\x78\x09\x32\xc0\x41\x32\x6c\x7a\x2e\x25\ \x03\x63\x52\xe7\x0f\x0c\x87\x0a\xd5\xad\xb9\xb0\xf9\x01\x29\x81\ \x34\x27\xb7\x9c\x4b\x54\x66\x16\x1b\x45\x28\x00\x70\xa1\x7c\x63\ \x1f\x50\x82\xfa\x52\x82\xc0\x36\x71\xfc\xe7\x13\x7c\xc3\xe8\xa7\ \x00\xa4\xc6\x6a\x93\xe5\xf7\xbd\xf7\xe3\x6f\x38\x7c\xd5\xb5\xf7\ \xa7\xd3\x99\x1a\xe7\x84\xea\x58\x0a\x63\xe3\x39\x24\x92\xee\xf3\ \xfd\xbc\x21\x11\xcd\xef\x8d\x72\x0d\x2f\x33\x00\x10\xbb\x92\x91\ \x6d\x67\x73\x29\xed\xaf\x23\xfc\xfd\x68\xf2\x00\x26\x2e\x1d\x12\ \x7b\xd1\x66\xca\x4a\x50\xaa\x49\x7f\x1e\xee\x5d\xff\x27\x43\x57\ \x81\x11\xc1\xb2\x18\x1e\x7d\xfa\x41\xe4\x0b\x29\x74\x3a\x1d\xac\ \xaf\xaf\x63\x65\x65\x05\x53\x3b\x0f\x61\x62\x62\x1f\x7c\x7f\x00\ \x65\x63\x28\x0b\x80\x13\x07\xe3\xb6\x0a\xe3\x31\x65\xbe\x13\x11\ \x96\x57\x4f\x98\x76\x5c\x48\x24\x12\xe8\x74\x3a\xd8\xb7\x77\x6f\ \xc4\x1b\x30\x02\x99\xf8\xbf\x01\x01\x0d\x1e\x52\xeb\xcd\xd0\xc1\ \x0e\x81\x80\xc0\x38\x60\xdb\x0e\x5c\x27\x85\x6c\xb6\x8a\x4e\xa7\ \x8e\x54\x2a\x85\x4c\x26\x83\x64\x32\x89\xf5\xf5\x75\x08\xd1\xd7\ \x42\xe4\x41\xca\x2e\x02\xe1\x69\x60\x02\x38\xe7\x61\x1d\x41\x74\ \xfd\x22\xde\x41\x4a\xa9\x16\xda\x64\xba\xd2\x4e\xaa\x12\x5a\x90\ \x50\x89\x3e\x50\xfb\x11\x61\x72\x90\x12\x6c\x30\xd3\xf6\x2b\x26\ \xf8\x21\x4e\x2a\x5b\x4d\x08\xc3\x7e\x48\x90\xb6\x10\x94\x90\x0f\ \x5b\x00\xd1\xdf\xc0\x85\x04\x04\x44\x12\x24\x24\xed\xae\xa5\xaa\ \x8f\x3c\x85\x02\x54\x52\x50\x12\xca\x47\x36\xa1\xb3\x97\xe4\x00\ \xb7\x11\xfc\xed\x42\x79\xf1\x70\x9e\x49\x63\x4f\x02\x48\x1d\x3d\ \x72\xc3\xf4\xdb\xdf\xfa\x81\xb7\xed\xbb\xec\x8a\xbb\x6d\xdb\x4e\ \x39\x0e\x61\x6c\x32\x8b\x6a\x2d\x1b\xde\xfb\xe7\x3f\x88\x6d\xb3\ \x03\x5f\x39\x00\x00\xd1\x3e\x46\x3c\x0a\xf7\xe9\x9f\x36\x93\x36\ \x6e\xe6\x6b\x9d\xae\x27\x8a\x44\x7c\x9e\x90\x16\x20\x39\xb4\x7d\ \x9c\x36\x50\x13\x94\x71\x8e\x67\x4f\x7f\x0d\x99\xac\xba\x40\xad\ \x56\x0b\x0b\x0b\x0b\x60\xcc\xc2\x8d\xd7\xbd\x19\x52\x88\xc8\xf2\ \xd0\xfe\x3b\xb3\x2c\x15\xfe\xe3\x2a\x11\x48\x69\x75\xc2\xea\xda\ \x29\x4c\x4c\xaa\x78\xfd\xfa\xfa\x3a\x3c\xcf\xc3\x58\x6d\xaf\x3a\ \x06\xb5\x07\x30\xae\xf2\xf4\x99\x0e\x4d\x92\x61\xea\xf5\x75\x16\ \x24\x95\xcf\x1d\x03\x02\x12\x1c\x16\x57\x3c\x40\x21\x3f\x86\x33\ \xb3\xb3\xa8\xd5\x6a\x20\x22\x94\xcb\x65\x15\xa9\xa8\xcf\x21\x9f\ \xcf\xc3\xb2\x2c\xf8\xbe\x0f\xcf\x1b\x0c\x85\xdb\x7c\xdf\xd7\x05\ \x49\xea\xda\x28\xa1\x36\x09\x3c\x08\x33\xfc\x58\x48\xfa\x01\x90\ \x4c\xa5\x04\x40\x40\x0a\x09\x36\x9a\x1c\xa4\x69\x41\xd2\xde\x94\ \xd0\xc2\x4c\x8a\x66\x54\x40\xc2\x18\xa4\xd0\xa8\x41\xc6\x72\x8b\ \x80\xdc\x58\x00\xea\xb8\x2e\x3c\x7e\x80\x00\x48\x01\x4c\x96\xdc\ \x02\x11\x72\x52\x22\x0f\xe5\x57\x37\xa0\x12\x66\x5e\x74\x85\xe0\ \x59\x34\x3e\x8f\x3d\x1b\xc1\xdf\x4e\xe3\xa7\xdf\xfc\xc6\x77\x1f\ \xbe\xf3\x8e\xfb\xdf\xb1\x63\x72\xea\x06\x22\xc6\x53\x69\x8e\x89\ \x1d\x39\x14\x4b\xaa\x84\xfc\x9c\x4f\x14\x80\xbe\xf2\x5b\xcc\xfe\ \xf8\x78\x59\x00\xc0\x5c\x84\x3b\x6f\xfb\x99\x9d\x8c\xdb\xb0\x6d\ \xa6\x55\x8d\x61\xb4\x63\x47\x1a\x0b\xe5\x85\xda\x1e\x91\x26\x01\ \xe2\x64\x20\x0d\x85\xfe\xe2\xae\x81\xca\xd1\xdf\xc4\xe2\xf2\xe3\ \x28\x97\x8b\x58\x5e\x5e\xc6\xfc\xfc\x3c\x3a\x9d\x0e\x6e\xbc\xfe\ \xad\x48\xa5\x73\xf0\x7d\x2f\xdc\x19\x63\x0c\x8c\xeb\xb8\x7f\x68\ \xfe\xab\xb0\x9e\x10\x3e\xfa\x83\x0d\x24\x12\x35\x2c\x2d\x2d\xa1\ \xdd\x6e\x23\x9b\x29\x21\x93\x29\xc2\xf3\x8c\xe0\x29\x8d\xcf\x48\ \x47\x0f\xb8\xf9\x3e\x42\x88\x60\xfa\x64\xe3\x40\xc0\x18\xc0\x2d\ \xe5\x06\xb8\x4e\x06\x52\x10\x9a\xcd\x26\xf2\xf9\x3c\x4c\x93\x90\ \x7e\xbf\x0f\xcb\xb2\x90\x4c\x26\xe1\xfb\x3e\x88\x14\x2b\x6f\xfc\ \x7e\x93\x97\x00\x00\x42\xae\x41\xd2\x2e\x10\x69\x8b\x00\xf1\xbb\ \xac\x84\xd4\x18\x5f\xc6\xc7\x07\x53\xf5\x02\x66\x46\x08\x86\xc8\ \x1a\x80\xc9\x0d\x8c\x42\x87\x4c\xbb\x30\x26\x54\xa8\x00\x42\xc0\ \xe4\x06\x98\x14\xe2\x51\x0b\x40\x5d\xa7\x0b\x87\x1f\x20\x92\x08\ \x04\x21\x9f\xe4\x89\x62\x36\x59\x5a\x6f\x74\x0d\x00\x18\x1f\x79\ \x74\xa9\x6f\xf7\x43\x4c\x00\x00\x20\x00\x49\x44\x41\x54\xb7\xf3\ \xd8\xf7\x73\x9a\xfa\x86\x7c\xdb\x56\xf0\x6d\xdb\xc9\xfc\xf8\x87\ \x7e\xfe\xee\x6b\xaf\xb9\xf9\xad\xc5\x62\xe5\x00\x11\x90\x2f\x38\ \x18\xdf\x91\x43\x2e\x97\x1e\x02\xff\xe7\x3d\x8e\xad\xc7\xb4\xdd\ \x71\x85\xe3\x25\x07\x00\x73\x21\xae\x3a\x74\xaf\x0d\xa0\xe4\xb8\ \x2e\x4c\x51\x8b\x31\x02\x86\xee\xfb\x88\xc6\x8f\x26\x87\x56\x45\ \xd1\x26\x43\xa1\xbf\xb0\x8a\x4d\x93\x79\xb6\xcd\xf0\xad\xc7\xfe\ \x01\x93\x93\xe3\xa8\xd7\xeb\xe8\x76\xbb\x58\x59\x59\x41\xad\xba\ \x07\x87\x0e\xde\x04\xcf\xf3\x60\xaa\xed\x98\x8e\xfb\x33\xb2\xc0\ \x98\xb2\x00\x98\x4e\x9a\x11\x20\xcc\xcf\x7f\x1f\xb5\x5a\x35\xcc\ \xd7\xaf\xd7\xeb\xd8\xbb\xfb\xb8\xca\x34\x04\xb4\x9f\x8f\x28\x61\ \x48\x27\xdd\x18\x33\x5d\x11\x93\x51\x56\xe2\x28\x10\x30\xc6\x61\ \x59\x1c\x7d\x6f\x1e\xdc\x52\x00\x50\xad\x56\xd1\x68\x34\x60\xda\ \x93\xdb\xb6\x8d\x54\x2a\x15\xae\x42\xac\xfb\x0f\x84\x29\xc9\x46\ \x78\x06\x5e\x13\x8d\xe6\xe3\xc8\xa4\x27\xe0\xda\x3b\x11\x76\xdf\ \x89\x85\x59\x8d\xd9\x1e\x9f\xd7\xc4\x48\x5b\x03\x9a\xe8\x63\x52\ \xfb\xfe\x1a\x60\xc9\x44\x15\x34\x1d\x23\x49\x5b\x03\xea\xba\x87\ \x81\x44\xcd\x41\x48\xc9\x60\xc8\x82\x51\xb7\x40\xdd\xc3\x1f\x3c\ \x3f\x40\x00\x02\x70\x14\x6d\x69\x57\x4b\xe9\xe2\x7a\xa3\x9b\x83\ \xca\x07\x30\x21\xb2\xd0\x61\x3b\xa7\xfd\x6d\x9f\xb2\x1b\xf7\xb7\ \x47\x35\xbe\x09\xe7\x25\x01\xa4\x76\x4c\xee\xaa\x7c\xf0\xfd\x9f\ \x78\xd3\x15\x07\x8f\xbc\x29\x99\x4c\xd5\xb8\x45\x28\x55\x5c\x8c\ \x4f\xe4\x90\x4a\x8d\x96\x79\x9f\xcf\x79\x9a\x6b\x1e\xcb\xe4\x1a\ \x3e\xc6\xf0\xb8\x5f\x32\x00\x18\x0d\x6d\xe4\x72\x13\x53\x04\xf2\ \x5c\xdb\x71\x4d\x51\x4b\xb4\x2d\x46\xcc\x78\xad\x39\x62\x13\x56\ \xc9\x79\x6c\xc3\x38\x78\x90\x09\x5f\x29\xd3\x9f\x38\xc3\xa9\x99\ \x6f\x23\x9b\xe5\xe1\x32\xdc\x6a\xc1\x0d\xc2\x6d\xb7\xfe\x18\x84\ \x90\xe1\x24\x33\x59\x84\x8c\x73\x4d\xb4\x45\xda\x1b\x20\x58\x8c\ \xb0\xb0\xf8\x04\x26\x26\xb3\xe8\x76\xbb\x68\xb5\x5a\xe8\xf7\xfb\ \xd8\xb5\xeb\x2a\x05\x1e\x30\x39\x94\x3c\x64\xff\x95\x35\xa1\xee\ \xbb\x21\x00\xc9\x68\x7d\xc4\xba\xee\xeb\x63\xef\x7b\xeb\xd8\x68\ \x3c\x86\xfe\xa0\x8e\x6c\x56\x55\x27\x6e\x6c\x6c\xc0\xac\x31\xb0\ \xbe\xbe\x8e\x7e\xbf\x8f\x64\x32\xa9\xbe\x2f\x04\x82\x20\x40\x10\ \x04\xe8\xf5\x7a\x20\x22\xf8\xbe\x6a\x6d\x9f\x4e\xa7\x21\x84\x87\ \x46\x73\x06\x99\x74\x17\xc9\xc4\x3e\xcd\x37\xe8\x0b\x4d\x4a\xc8\ \x43\x4e\x12\x04\x48\xa1\xc8\x55\x6d\x0d\xa8\xd4\x60\x8a\x4d\x7f\ \xb5\x8d\x6a\x8a\x6e\xac\x34\x31\x6c\x0d\x90\xd4\xf8\xcc\xa2\x7b\ \x84\x38\x39\xb8\x15\x08\x2e\x0c\xb7\x80\x50\x4c\x48\x7b\x47\x25\ \x55\xfa\xfe\x29\x18\x00\x88\xb3\xe4\xcf\xbf\x87\xed\x0b\x74\x8c\ \xc0\x6f\xe7\xe3\x1b\x26\x3e\x05\x20\x7d\xd3\x0d\x77\xec\x7e\xf3\ \x9b\xde\xfb\xce\xdd\xd3\xfb\x5e\x6b\x59\x56\xca\x71\x19\xaa\xe3\ \x29\x54\xab\x59\xb8\xee\xf3\x12\x7b\xe7\x3e\xb6\x86\x1b\x5f\x1e\ \x17\x60\xe4\x82\x30\x00\xc4\xc0\xf6\x10\xe3\x7d\xdb\xb5\x5c\x50\ \x3c\x00\xb8\xd5\x8c\x8f\x72\xe0\x87\xcd\xfe\x38\xc0\x46\x16\x42\ \xec\x73\x28\xd3\xdf\xf3\x5b\x58\x5e\xfe\x2e\xa6\x77\x4f\xe1\xcc\ \x99\x33\x58\x59\x59\x41\xab\xd5\xc2\x75\xc7\x7f\x04\xb9\x5c\x05\ \x81\xef\x85\x61\x2d\x68\xb2\x8e\x93\x49\xfb\xb5\x74\x02\x8f\x12\ \x8e\x40\x78\xe8\x0f\xd6\xc0\xb9\x2a\xd4\x69\x36\x9b\x48\xa7\x0b\ \x28\x17\x77\xc2\xf3\x7b\x4a\xae\x18\x85\xc5\x3d\xc4\x2c\x10\xf1\ \x10\x58\x88\x48\x5b\x00\x88\x2c\x00\x0d\x01\x02\x40\x7f\xb0\x8e\ \xb5\x8d\xc7\xd0\xeb\x35\x91\x4a\xa5\xc0\x39\xc7\xc6\xc6\x46\xd8\ \x1e\x2c\x97\xcb\x81\x73\x8e\x46\xa3\x81\x64\x32\x19\x92\x7e\x46\ \xf0\x3d\xcf\x0b\x17\x1e\x21\x22\x24\x93\xc9\x70\xb5\xe1\x66\x6b\ \x19\x52\x06\x48\x27\x0f\x00\xa4\x05\x50\x32\x10\x93\x51\xe0\x83\ \x94\x05\x23\x44\xd4\xf1\x37\x9e\x21\x18\x65\x68\x2a\xc1\x0e\x79\ \x17\x61\xc8\x41\xc4\x7a\x1d\xc5\x01\x46\x7d\x10\xda\x1a\xa1\xf0\ \x47\x40\xf0\x5c\xfc\x80\x39\x98\x97\x1b\x08\x08\x12\x5c\x04\xb8\ \x62\x67\xa6\xfc\x3f\xbe\x81\x14\x14\x00\xc4\xf3\x01\x14\xec\xd1\ \xd6\x0a\xc1\xb3\x68\xfc\xb8\x8f\x6f\x61\xab\xc6\x0f\x89\xbd\x77\ \xbe\xe3\xc7\x8f\xdf\x76\xcb\x3d\x3f\x36\x36\x36\x79\x23\x11\xb1\ \x54\x9a\x63\x6c\x22\x83\x62\x29\x73\xee\xc4\xde\xf9\x9c\xeb\x56\ \x0b\x60\xe8\x63\xe0\x25\x00\x80\x91\x1f\x31\x00\xc0\x89\xb1\x3d\ \x8c\x2c\x72\x6c\x5b\x97\x9e\xc6\xbf\xa3\x27\x57\x5c\xa8\x43\x8d\ \x0f\xc4\xc9\x41\xe3\xa9\x46\x93\xc6\xb8\x05\x0a\x54\x6c\xdb\xc2\ \x23\xdf\xfd\xef\xa8\x54\x4b\x58\x5b\x5b\x43\xa3\xd1\xc0\xdc\xdc\ \x1c\x4a\xc5\x1d\x38\x72\xf8\x6e\x88\xc0\xd7\xe4\x9f\x9a\x9c\x8a\ \xb5\xb7\xc0\x2c\x1b\xdc\xd2\xe9\xbb\xda\xe2\x20\x10\x66\xe6\x9f\ \x40\xa1\x50\x08\xb5\x6d\xbd\x5e\xc7\x65\x7b\xae\x43\xcc\x56\x81\ \xc9\xa7\x67\x9c\x83\x93\x61\xff\xb9\xca\xc1\x97\xd2\xb4\x28\x88\ \x01\x81\x52\x2c\x22\x68\x61\x6d\xe3\x3b\xe8\x0f\x54\x64\x41\x95\ \x11\x73\xa4\xd3\x69\x74\x3a\x1d\x8c\x8d\x8d\x61\x30\x18\x20\x9b\ \xcd\x9a\x36\xe5\x01\x11\xc9\x6e\xb7\x4b\xfd\x7e\x9f\x11\x11\xb9\ \xae\x8b\x6e\xb7\x0b\xdf\xf7\x61\x59\x16\x12\x89\x04\x2c\x4b\x59\ \x32\x44\x84\x56\x7b\x0d\x44\x27\x90\x4a\xec\xd7\x56\x92\x11\x2f\ \x75\x0d\x45\xc8\x45\x30\x1d\x1e\x14\xa1\x99\x2f\xc3\x1c\x02\xa1\ \xaa\x09\x35\x60\x08\x89\x58\xdd\x10\xa9\xf2\x61\x69\x40\x59\x03\ \x8c\x10\xb1\x8d\x4c\x63\x93\x61\xe1\xbf\x20\xf8\x01\x22\x70\x04\ \xd8\x55\xce\x65\x2c\x8b\x67\x7c\x3f\x48\x43\x09\xaa\x69\x17\xbe\ \xad\xc3\x7d\x16\x56\xdf\x6c\x1f\xd7\xf6\x16\x22\xff\x3e\x99\x48\ \x24\xb3\x3f\xf9\x91\xff\xf9\x9e\x23\x87\xaf\x7b\x47\x3e\x57\x3c\ \x40\x0c\xc8\xe5\x2d\x8c\x4d\x28\xff\xfe\x9c\x89\xbd\x73\x3e\xbf\ \xe8\x08\xb7\x49\x38\x8a\x6f\x05\xe0\x45\x02\xc0\x88\xf0\x0f\x15\ \x2f\x64\x12\xe2\x32\xe2\x2c\xe3\x38\xca\xb2\x0a\x6f\x76\xf8\xed\ \x58\xc2\x4a\x0c\x08\x8c\x98\x19\x15\x3f\x64\x21\x60\xd8\x02\xe0\ \x9c\x61\x6e\xfe\xbb\xe0\xbc\x8b\x46\x43\x62\x63\x63\x03\xa7\x4f\ \x9f\x86\xef\xfb\xb8\xeb\x8e\xf7\x03\x7a\x2a\x0b\xed\x2c\xc0\x30\ \xff\xdc\x82\xc5\x2c\x30\xb2\xc3\xea\x3d\x13\xee\x9a\x9b\x7f\x02\ \x93\x3b\x54\x52\x4e\xbb\xdd\x46\xaf\xd7\xc3\xf4\xf4\xd5\x51\xc2\ \x92\xce\xff\x57\x1c\x82\xce\x1a\xe4\xa4\x8b\x6e\x62\xd7\x59\x8a\ \x21\x20\x10\x42\x60\x65\xfd\x11\x74\x3a\x9b\x48\x24\x12\x70\x1c\ \x07\xb6\x6d\xc3\xb2\x2c\x54\xab\x55\xcc\xcd\xcd\x61\x7c\x7c\x1c\ \xa5\x52\x09\x9b\x9b\x9b\x58\x5f\x5f\xc7\xd7\xbe\xf6\xb5\x26\x80\ \x1e\x11\x71\xdb\xb6\xd3\x07\x0f\x1e\x4c\x05\x41\x80\x54\x2a\x15\ \x96\x06\xbb\xae\x1b\xae\x3f\xa8\xae\x8b\x44\xb3\xb5\x0c\xc6\x12\ \x48\xb8\xd3\xca\x45\xd2\xc7\x22\xf5\x0d\x12\xfa\x46\xa8\xf0\x20\ \x53\xd9\x7e\x3a\xe3\x4f\x00\xba\x7e\x40\xa5\x19\xab\xed\x4c\xd0\ \x4f\x80\xe9\xbd\x08\xe8\x3c\x03\x69\x00\x82\xa9\x73\x96\xa4\x89\ \x42\x19\x12\x85\x91\xf0\xff\xe0\xf9\x01\xe3\x0a\x95\x53\xe4\x4c\ \x56\x32\xf9\x33\x8b\xf5\x34\x86\xfb\x04\x52\xb4\xed\x73\xfa\xf8\ \xdb\x95\xe4\x86\x82\xbf\x77\xcf\x81\xea\x07\xde\xf7\xd3\x6f\xbb\ \x7c\xdf\xa1\xb7\xba\x6e\xa2\x6a\x59\x84\x42\xc9\x41\x6d\x3c\x8b\ \x4c\xe6\xfc\x88\xbd\x17\x3a\x68\x68\x42\x0e\x29\xe9\x17\x0f\x00\ \xdb\x98\xfd\xe1\xc5\x18\x2b\xba\xc9\xeb\x2e\x6b\x7d\xf0\x9b\xa7\ \xab\xc4\xb8\xae\xf4\x8b\x3c\x50\x00\x5a\xd0\xe5\x56\xa1\x8e\x5d\ \x7d\x25\x74\x32\xfa\x5c\x6d\xa3\xf6\xc3\x39\x41\xc8\x3e\x4e\xcf\ \x7e\x0d\xa5\x52\x01\xcd\x66\x13\x2b\x2b\x2b\xa8\xd7\xeb\xb8\xe6\ \xe8\xbd\xa8\x94\x77\xc0\xf7\x07\x4a\x33\xc9\x88\x2c\x54\x21\x3f\ \x0b\xa4\xb5\xbf\xce\xa1\xd3\x6c\xb6\x87\x5e\x7f\x15\x96\x55\x04\ \xe7\x1c\xf5\x7a\x1d\x99\x74\x11\x95\xd2\x14\x3c\x5f\x95\x53\x93\ \x06\x0a\xe2\xaa\x77\x00\x27\x0e\x8a\x55\x33\x46\x83\x85\x27\x25\ \x09\x68\xb4\x9f\x41\xb3\xb9\x02\xc7\x71\xe0\x38\x0e\x12\x89\x04\ \x6c\xdb\x86\x6d\xab\x2a\xbf\x67\x9f\x7d\x16\x2b\x2b\x2b\x3a\xd6\ \x1e\x0e\x0e\x9d\xa5\x26\xa5\xf4\x9b\xcd\x26\x1c\xc7\xc1\xfa\xfa\ \x3a\x7c\xdf\x47\x2a\x95\x42\x22\x91\x50\x3c\x86\xee\x0a\x24\x84\ \x80\x10\x02\xbd\xfe\x2a\x12\xf6\x38\x88\xb9\x90\xc4\x74\x32\xa0\ \x32\xfb\x99\x76\xb7\x84\xf6\x0b\x18\x19\x8a\x90\x74\xfd\x80\x26\ \x07\x89\x85\x89\x41\x4c\x92\x02\x0b\x2d\xf1\xd1\x77\x34\xa8\x48\ \x84\xe4\xa8\xa1\x0a\x19\xe9\xa2\xaf\x2d\xe4\x60\xdc\x32\x50\x53\ \xe8\x95\xe4\x07\x88\x08\xe3\x69\x72\xc7\x2b\x99\xc2\x99\xc5\x7a\ \x0a\xd1\x92\x61\xf1\x58\xbd\x89\x06\x9c\x97\xe0\xdf\x7d\xe7\xfd\ \x97\xbd\xe1\xbe\x1f\x7d\xf7\xce\x1d\xbb\x5f\xcf\x39\x4f\xba\x2e\ \x43\xa9\xea\xa2\x5a\xcd\x21\x99\x4a\xbe\xa4\xe7\x71\xd6\xf3\x8b\ \xce\x73\x5b\xad\x1f\x1f\x2f\x08\x00\xce\x92\xcb\x1c\x16\x2e\xfc\ \x87\x5f\x3c\xfa\xcf\x1f\x9f\x13\x15\x48\xa6\x4d\xe4\xe8\xf7\x87\ \xf2\x7c\x68\x18\x12\xe2\xe4\xa0\xfa\x58\x4d\xd4\x2d\x39\x01\x50\ \x09\x3f\xdf\x7e\xf4\xef\x91\xcd\xa6\xd1\xef\xf7\x31\x37\x37\x87\ \x95\x95\x15\xe4\xf3\x35\x5c\x77\xfc\xfe\x50\x10\xe2\x2e\x83\xa9\ \xf8\xb3\xb8\xae\xf7\x27\xae\xb4\xbf\xb6\x38\xe6\xe6\x9e\x40\xa9\ \x54\x44\xbb\xdd\xc6\xe6\xe6\x26\xea\xf5\x3a\x0e\x5c\x7e\x33\x86\ \x92\x62\x88\x22\x0e\x81\xb8\x06\x02\xae\x08\x35\xc8\x6d\x2f\xb3\ \x14\x1e\x9a\xad\x59\x30\x46\xb0\x6d\x3b\x04\x01\x43\xf8\xac\xae\ \xae\x8a\x4e\xa7\xe3\x2d\x2c\x2c\xb8\xa9\x54\x0a\xeb\xeb\xeb\xe6\ \xb8\x3d\x00\x5d\x29\x25\x05\x41\x20\x97\x97\x97\xb3\xbd\x5e\x8f\ \xda\xed\xb6\x09\x0f\x0e\x7c\xdf\xb7\x52\xa9\x14\x33\xa1\x42\x43\ \x18\x76\xbb\x2d\xb4\xed\x53\xc8\xa6\x0e\x9a\xf8\x1f\x0c\xb3\x0f\ \x5d\x1d\x68\xe8\x3b\x65\x1f\xc5\xe7\x3b\x03\x31\xa1\xcc\x7d\xa9\ \x2c\x35\x49\x32\xe2\x05\x99\x16\x54\x0d\x28\x6a\x5f\xba\x8e\x00\ \x12\x4c\x32\xb5\xbd\x6e\x38\xa2\xc8\x41\x11\xde\xbb\x38\x10\x98\ \x1b\xfe\x4a\xb8\x05\x12\x66\x5f\x84\x9c\x2d\xd8\xd5\xd3\xb9\xd2\ \xd7\xbf\x3b\x67\x84\xd7\xc6\x70\xa9\xec\xf3\x09\xbe\xf1\xf1\x93\ \x00\x92\x1f\xfa\xc0\xcf\xde\x70\xe3\xf5\xb7\xbf\xa7\x5c\xae\xdd\ \x64\xfc\xfb\xea\x58\x12\xc5\xd2\x4b\x4c\xec\x9d\xc7\xd8\xa6\xca\ \x70\x0b\x1f\xf0\x62\x5c\x80\x2d\x9a\x1f\x40\xe2\x9d\x77\xee\x9c\ \x2a\x66\x9d\x0f\x95\xa4\x67\x09\xa9\xc2\x64\x91\x6d\xcf\x74\xbb\ \xaa\xe1\x9d\x44\x66\xff\xf0\xe1\x6d\x97\x13\x00\x28\xff\x75\x61\ \xf9\x09\xb4\xbb\x4b\x28\x14\x0a\x98\x9d\x9d\xd5\xed\xbd\x07\x78\ \xe3\x1b\x3e\x04\xc6\x2d\x04\xfe\x00\x52\x06\x80\xd4\x2c\x82\x6e\ \xdb\xa5\x9a\x76\xda\x9a\xbd\xd7\xfc\x02\x00\xc6\x19\xe6\xe6\x9f\ \x40\x6d\x2c\x87\x6e\xb7\x0b\xcf\xf3\xd0\xef\xf7\x31\x3d\x7d\x64\ \x08\x44\x24\x4c\xee\xbf\xc9\xfe\xd3\x16\x00\xd3\xb5\xf4\xa6\x78\ \x27\x76\x1e\xf5\xe6\x49\xb4\x5a\xeb\x43\x5a\xdf\x00\x41\xbb\xdd\ \x16\x27\x4e\x9c\x68\x74\x3a\x9d\x41\xaf\xd7\x2b\x12\x91\xad\x81\ \xab\x0f\x60\x19\x2a\x4b\x4d\x0a\x21\x06\x9d\x4e\x27\xd1\xed\x76\ \x8b\x52\x4a\x26\xa5\xec\x6c\x6c\x6c\x2c\x3c\xfb\xec\xb3\x95\x63\ \xc7\x8e\xe5\x1d\xc7\x09\x85\xdf\xf7\x7d\xf8\xbe\x8f\x41\xbf\x01\ \xa4\x7c\xa8\x1c\x01\x65\xce\x4b\x06\x90\x88\x81\x95\x52\xd9\x0a\ \x1c\x8c\x4e\xd7\xbc\x85\x7a\x47\x84\xf8\x01\xcd\x71\x18\x4b\x42\ \x01\x8a\xf6\xf7\x89\x62\x44\xa1\x8e\x2a\x48\x65\x41\x18\x10\x50\ \x5a\x5d\x8e\x00\x41\x9c\x30\x7c\x05\xdc\x02\x7d\xce\x16\x02\x5c\ \x39\x9d\x2b\x21\xd2\xde\xf1\x5a\x79\x93\x15\x38\x1a\xce\x1b\x12\ \xfc\x6c\x26\x97\xf9\xe9\x8f\xfd\xda\xfd\x57\x1c\x3c\xfc\xae\x4c\ \x26\xb7\x9f\x31\x20\x93\xb5\x50\x9b\xc8\x20\x97\x4b\xbf\x2c\xc4\ \xde\xb9\x0d\x73\x0d\x43\xcd\xbb\xc5\xf4\x37\xe3\xa5\x04\x00\x07\ \x40\xe2\x4d\x37\x8f\xbf\xaf\x4c\x3d\x11\x08\x25\xf8\x8c\xab\xf8\ \x7a\xc4\xef\x99\xe2\x14\xfd\x32\x94\x15\xad\xed\x81\x10\x20\x22\ \xd7\x20\x82\x09\xc6\x08\xdd\xde\x3a\x9e\x7e\xe6\x01\x54\xab\xaa\ \x53\xcf\x60\x30\xc0\xc6\xc6\x06\x8e\x5c\x7d\x17\x26\xc6\x2f\x83\ \x1f\x78\x08\x44\xa0\x64\x91\x00\x02\x03\x37\x31\x7f\x6e\x81\x73\ \x06\x22\x4b\x67\xc6\xa9\x19\x18\x04\x3e\x9a\xad\x05\xec\xd9\x7b\ \x15\xe6\xe7\xe7\xb1\xb6\xb6\x86\x4c\xa6\x84\x6a\x75\x0a\x5e\xbf\ \xab\x9b\x68\xaa\x2c\x41\xae\xeb\x07\x48\xe7\x01\x90\x76\x2f\x24\ \x48\x9d\x9e\xe1\x30\xf4\xc9\x75\x7b\x6b\x60\x8c\xc1\xb2\xac\xf0\ \x61\x40\x60\x76\x76\xb6\x3f\x37\x37\xb7\x01\x80\x07\x41\xb0\x02\ \x35\xb9\x02\x00\xab\x50\x85\x2a\x6d\xfd\x3a\x21\xa5\x6c\x4b\x29\ \x4d\x3f\xbb\x36\x80\xde\x63\x8f\x3d\xb6\x34\x3e\x3e\x7e\x6c\xe7\ \xce\x9d\x49\x43\x0c\x1a\x52\xb0\xd7\xeb\xa0\x37\x58\x44\xd2\xdd\ \x85\xc8\x25\xd1\x6a\x1c\xa4\x93\x81\x24\x88\xe9\x0a\x3f\x03\xc0\ \xca\x1f\x8a\xac\x06\xa9\xfc\x7f\x73\x6b\x54\xfd\x86\x66\x56\x74\ \xd5\xa0\xd4\x1c\x82\xf2\x10\x74\x3e\x04\xa9\xe2\x21\x03\x0a\x52\ \x50\xec\x9e\x9a\xac\xc5\xb3\xf3\x03\x2f\x87\x5b\xa0\xe1\x1e\x96\ \x0c\x30\x55\x4c\xa6\x73\x69\x37\xd3\x68\xf7\x53\x88\x08\x3c\x63\ \xcd\x0a\x6c\x15\x7c\x07\x40\xf2\xca\x43\xc7\x6a\xef\x7d\xf7\x4f\ \xfd\xd8\xee\xe9\x7d\xef\x70\x1c\xb7\x62\x59\x84\x5c\xc1\x42\x6d\ \x3c\x87\x4c\x26\xf5\xd2\x13\x7b\xe7\x3b\x62\x3e\xc0\xc8\x3b\xe6\ \xef\x17\xce\x01\x6c\x43\xfc\x99\xf2\x45\x17\x40\x72\x47\xd9\x7d\ \xf7\x14\xab\xbb\xfd\xc0\x0a\xcd\x65\x73\xd9\xcd\xcf\xcb\x58\x01\ \x90\x6e\x81\x17\x59\x08\x5a\x33\x8d\x9a\xfd\xd2\xec\x85\x7c\x7c\ \xf3\x91\xff\x1b\xe3\xe3\x63\xa8\xd7\xeb\xe8\xf5\x7a\x38\x75\xea\ \x14\x32\x99\x12\x6e\x79\xcd\xdb\x20\xa5\x50\x7e\xbf\x36\x69\x09\ \x00\x74\xa6\x9e\xc5\x55\xd2\x0f\x91\x69\xde\x81\x70\xd2\xcf\x2d\ \x7c\x0f\xd5\x6a\x19\x2b\x2b\x2b\x8a\x4d\x6f\xb5\x70\xc5\x81\x5b\ \x55\x04\xc1\x10\x5e\xfa\x60\x28\x56\x44\xc4\x49\x69\x7f\x10\xa9\ \x82\x1b\x6d\xe0\x98\xb2\xe4\x20\xe8\xa1\xdf\x6f\x80\x73\x1e\x3e\ \x8c\x90\x36\x1a\x0d\xf1\x9d\xef\x7c\x67\x09\xaa\x59\x83\x29\x47\ \x15\x50\x6d\x9c\xea\x50\x4b\x8e\xb5\xa0\x5c\x01\x0e\x6d\x6e\xea\ \x6b\xef\x01\x08\x7c\xdf\xe7\xf3\xf3\xf3\x95\x9d\x3b\x77\xee\x8f\ \x0b\xbf\x21\x06\x3d\xaf\x81\x74\x82\x8c\x17\x0e\x95\xf2\x2b\x34\ \xe9\x47\x1a\xa7\x62\x02\x2b\x8d\xb6\x57\x69\xbf\x21\x1e\xe8\x16\ \x67\x61\x62\x90\x50\xf7\x4a\x77\x3d\x0b\x19\x1e\x09\x11\x05\x10\ \x25\x53\x15\x84\x12\x3a\x1c\x09\x75\x7f\xa4\x0c\x85\x78\x3b\xb7\ \xe0\xf9\xc2\x86\xe6\xfb\xea\xbd\xf3\x01\x02\xfd\x1d\xa8\x39\x38\ \x9e\x92\x89\xa9\xf1\x7c\xf1\x7b\x27\x96\x4d\x8d\xbd\xd1\xee\x9e\ \xde\x78\x28\x9c\xf7\xc6\xfb\x7f\xec\xc0\xeb\xee\x7e\xd3\xfb\xc7\ \xc7\x77\xde\xc7\x18\x4b\xb8\x09\x86\x62\xc9\x41\xa5\x96\x45\x2a\ \x95\x7a\x45\x88\xbd\xf3\x19\xdb\x44\xe8\x46\x0f\x90\x5e\xa8\x05\ \x60\x84\xdf\xa0\xa5\x03\xc0\xdd\x3f\x95\x29\x33\xc6\x8a\x59\x78\ \xe8\x07\xaa\xb2\x2e\x6a\x2d\x15\xff\x72\xdc\x22\x40\xc8\x07\xa8\ \x97\x51\xfa\xaa\x19\x52\x46\x85\x3e\x5f\x7b\xf8\x2f\x91\xcb\x25\ \xd0\x6e\xb7\xb1\xb1\xb1\x81\x67\x9e\x79\x06\xbe\x1f\xe0\x2d\x6f\ \xfc\x18\x38\x77\x54\xcc\x5f\x06\x21\x99\x46\x4c\xb1\xf5\xa6\xba\ \x8e\x59\x96\x6e\x7d\x45\xe1\x84\x62\x0c\x98\x99\xf9\x2e\xca\xd5\ \x0c\x06\x83\x01\x1a\x8d\x06\x06\x83\x01\xf6\xee\x3d\x16\x1d\xa4\ \x56\x86\xa6\x03\x30\xe9\x06\x22\x26\xaf\xc0\x24\x00\x85\xf9\x34\ \xba\xb6\xa6\xdf\xdf\x40\xaf\xdf\x0a\x17\x01\x89\x03\xc1\xfa\xfa\ \xfa\xa0\x5e\xaf\xb7\xa0\xf2\xd0\x3b\xfa\xb9\x0b\xa0\x09\x05\x00\ \x4d\x28\x4d\x6f\xd6\x18\x34\x1a\xc9\xf8\xa9\x1c\x40\xf2\xe9\xa7\ \x9f\xee\x1d\x38\x70\x60\x57\x36\x9b\x4d\x98\xdf\x30\x09\x4a\x7e\ \xd0\x07\xc8\x24\xf0\xe8\x6b\x12\xfa\xe8\xb1\x74\x60\x00\x90\x0c\ \x8c\xa4\x0a\x02\x6a\x36\x5f\x62\xd4\xf7\x37\x00\xa1\x8d\x09\x8a\ \x3a\x0d\xab\x2c\xc2\xd0\x0c\x50\x5a\x5f\xef\xd3\xf0\x03\x11\xf3\ \x10\xb5\x55\xd9\x0e\x08\xce\x16\x36\x8c\x5c\x81\x17\xea\x16\x68\ \x8e\x03\x0c\x13\x19\x24\xa6\x6a\x99\xfc\xf7\x4e\x2c\x1b\x22\x30\ \x01\x55\x15\x68\xac\x01\x07\x80\xfb\xf1\x9f\xfa\x95\x5b\xae\x39\ \x76\xd3\xfb\x8b\x85\xf2\xcd\x20\x50\x3a\xcd\x51\xaa\xb8\x28\x96\ \xb2\x61\xb2\xd6\x85\x34\x62\x06\xc0\x76\xc2\xff\xc2\x39\x80\x6d\ \xc8\xbf\x21\xff\xff\xd6\xc3\x95\xfd\x96\x0c\xfa\x00\x52\x9e\x50\ \xcb\xaf\xb1\xb0\xf7\x9c\x1a\x11\x09\x18\xf9\xa1\x71\xb3\x5f\x67\ \x61\xe8\x8d\xd5\xaf\x30\x2d\x78\xdf\x7f\xfa\x21\x80\xb5\x50\x28\ \x54\xf0\xe4\x93\x4f\x86\x8b\x7a\xde\x79\xfb\xfb\xb0\x63\x72\x1f\ \x82\xc0\x0b\x89\x30\xa5\xb9\x94\xb6\xe6\xdc\x8e\xb2\xfe\xc2\xae\ \x3d\xc6\x94\x04\xba\xdd\x4d\xf4\x06\x2b\x70\x9c\x3d\x98\x9f\x9f\ \xd7\x29\xb9\x65\xd4\x2a\xbb\x30\x18\xf4\xd4\x31\x33\x43\x88\x29\ \xb3\x9f\x33\x45\x70\x42\xf7\xe2\x33\xd6\x4b\x68\x01\x30\x75\x81\ \x06\x03\xb5\xfc\x57\x98\x31\x18\x7b\x74\xbb\x5d\x1f\x4a\xfb\xb7\ \xa1\x84\xbd\xa1\x1f\x75\xfd\x68\xeb\x47\x0f\xd1\x3a\x83\x71\xcb\ \x2b\x01\x20\xdd\x6e\xb7\x37\xba\xdd\x6e\x2b\x9f\xcf\x27\xcc\xf5\ \x36\xbf\x21\xa5\x6e\x05\xcf\x38\x48\xd7\xf2\x0b\x9d\xac\xa4\xaa\ \xa8\x55\x63\x16\x26\x4d\xee\x3f\xa2\x34\x5f\x8c\xfa\xfe\x11\x81\ \x48\x52\xea\x0a\x42\xa9\xcd\x1d\x2d\xf8\x61\x28\x10\x51\x91\x81\ \x39\x64\xfd\x7d\x10\xe9\x9c\x03\xb1\x45\x88\x5f\x5e\xb7\x20\x9c\ \x7c\x08\x20\x61\x4b\x41\xc7\x2e\xcb\x4f\xfc\xed\x3f\x22\x0d\x95\ \x10\x64\xf2\x6f\x65\xb1\x58\x4e\x7d\xe2\xe3\xff\xcb\x9b\x2e\xbf\ \xfc\xd0\x7b\x52\xc9\xf4\xe5\x8c\x01\x99\x9c\x85\x4a\x2d\x89\x5c\ \x2e\xf3\x03\x23\xf6\x9e\x6f\x8c\xda\xfa\xd8\xc2\xac\x0d\x8f\x17\ \x62\x01\xc4\xcd\x7f\x33\x11\x1d\x00\xee\x8e\x4a\x72\x6f\x42\x5b\ \xb2\x03\x69\x6b\x0b\xc0\x08\x08\x6d\xd1\xec\x46\x4a\x4c\xdf\xbc\ \xd8\xfd\x51\x1f\xeb\x3f\x18\x63\x58\x5b\x7f\x16\x0b\x4b\xdf\xc6\ \xf8\xf8\x78\x28\xa4\x2b\x2b\x2b\x38\x78\xe0\x26\x5c\x73\xf4\x1e\ \x04\xc2\x87\x90\x02\x52\x06\x30\x8b\x64\x30\xb5\xc2\x4f\x44\xfe\ \x91\x0d\xce\x98\x3e\x14\xd2\xfb\x26\x7c\xff\x99\xaf\x60\x7c\x7c\ \x1c\x8b\x8b\x8b\x10\x42\x60\x7d\x7d\x1d\x47\x8f\xdc\x0b\x21\x8d\ \x18\xa8\x83\x21\x22\xad\x5d\x15\x90\x40\xbb\x38\x2a\x24\x66\xd2\ \x9d\x69\x08\x08\xbc\xa0\x13\x9a\xac\xe6\x01\xa8\x09\xeb\xa9\x35\ \xc1\xdb\x50\x42\xbf\x01\xe5\xf3\x9b\xe7\x51\x00\x88\x2f\x33\xce\ \x10\xb9\x5d\x69\x00\x59\x29\x65\x8b\x88\x2a\xa3\xbf\x11\x04\x3e\ \x00\x1f\x0c\x96\xea\x11\x28\x99\xca\xfe\xd5\x95\x82\x14\x66\xf5\ \x69\xc4\x12\x22\xd6\x71\xc9\x6c\x10\xcd\x21\xd2\x2e\x84\x0c\xa7\ \x80\x42\x92\x30\x31\x88\x74\x04\x4d\x12\xc0\x94\xb5\x21\xf4\x7d\ \x57\xd4\x82\x76\xf3\x18\xc2\xc4\xa3\x51\x6d\x6e\x7e\xef\xa5\x73\ \x0b\xa2\x4c\x48\x29\xd5\xfa\x4f\xbe\x00\x84\xef\x63\x6f\x35\x55\ \x22\xa2\xb4\x94\xb2\x00\xa0\x74\xf5\x55\xc7\x6b\xef\x7b\xcf\xc7\ \xdf\xb2\x6b\x6a\xcf\xdb\x6d\xdb\x29\x5b\x36\x21\x97\xb7\x50\xad\ \xa5\x91\xce\xfc\x20\x89\xbd\xf3\x1f\xdb\x14\x03\x6d\x71\x03\x5e\ \x2c\x09\x38\x54\xec\xd0\xee\xfa\x22\xd0\xd7\x7e\x20\x93\x20\x98\ \x5e\x75\x64\x8e\x68\xf4\x08\x8d\x9e\x89\x56\x8f\x46\x64\x11\x10\ \x00\xce\x08\x03\xaf\x85\x47\xbf\xfb\xff\xa2\x56\xab\x60\x63\x63\ \x03\xed\x76\x1b\x67\xce\x9c\x41\xa9\x34\x89\xfb\x5e\xf7\x11\x05\ \x20\xda\xf7\x17\x12\x30\xad\xbe\x54\xb7\x1f\x0b\xdc\x52\x16\x80\ \x5a\xae\x4b\x27\x20\x69\xcb\x43\x06\x3e\x96\x96\x9e\xc0\xf8\x44\ \x15\xb6\x6d\x63\x7e\x7e\x1e\x52\x02\x57\x1f\xba\x2d\xd2\x7a\x3a\ \x44\xc9\x74\xef\x3f\xce\xb8\x22\x37\x75\x05\xa1\x02\x31\xed\xff\ \x6b\x30\x80\xae\x05\xd8\x4e\x2b\x99\x89\xca\x39\x97\x50\x3e\x7e\ \x1d\xc0\x1a\x14\xf1\x67\xc8\x3f\x03\x00\x1d\x44\x0d\x2b\x8c\x05\ \x60\xee\x9d\xa9\x23\xcf\x5a\x96\x35\x94\x40\x10\x09\x83\x62\xec\ \x89\x98\xd2\xf2\x84\xa8\x0e\x40\x4a\x5d\x0b\x60\xf8\x4a\xa9\xcc\ \x2d\x93\x26\x4c\x18\xb6\xfb\x09\x3a\xed\x57\x0b\xfe\xc8\x3d\xa3\ \x70\x83\xa8\x3e\xc0\xa0\x95\x84\x12\x56\xd5\x55\x48\xef\x3e\x1e\ \x34\xd9\x46\x9b\x9f\xab\x5b\x10\x4d\xc7\x51\xb7\x20\x2a\xff\x86\ \x8e\x40\x08\x48\xf8\x42\x62\xe0\x4b\x0c\xbc\x00\x39\x97\xa7\x2b\ \x85\x54\x75\xe7\xae\xab\xc4\x7b\xde\xf5\x93\x3f\x36\x3d\xbd\xef\ \x56\xc6\x98\xeb\x26\x18\xf2\x45\x0b\x95\x6a\x36\x4c\xd9\x7e\x55\ \x8c\x21\x13\x60\x0b\x00\x6c\xd9\xf2\xa5\xb2\x00\x6c\x00\xf6\xfc\ \x5a\xaf\x33\x00\x23\x10\xc3\x40\x5a\x1a\x00\xe2\x2e\x80\xbe\x49\ \x66\x4f\x52\x69\x14\x02\xc2\xfe\x80\xe1\x64\xd0\x37\x9f\x71\xe0\ \x2b\x5f\xfe\x33\x14\x0a\x59\x34\x1a\x0d\xac\xae\xae\xe2\xc4\x89\ \x13\xe0\xcc\xc6\xdb\xdf\xfc\x8b\xb0\x6c\x07\x41\xe0\x43\x8a\x00\ \x42\x9b\xbb\xca\xfc\x57\x02\xca\xb9\xee\xd9\x47\x3c\xd4\xfe\x2a\ \x2e\xad\x32\xe1\x9e\x3e\xf5\x4d\xe4\xf2\x69\x38\x8e\x83\xb9\xb9\ \x39\x74\x3a\x1d\x5c\xb6\xf7\x18\x52\xa9\x3c\x3c\xaf\x07\xa9\xd9\ \xef\x30\xfe\x6f\x1a\x87\x92\x15\x9a\xda\x08\xbd\x69\x7d\x71\xa4\ \x7a\x2d\x89\xe0\x38\x99\x70\x42\xc7\x1f\x00\xe0\xba\x2e\x83\x02\ \x80\x0d\x28\x00\x58\xd1\x8f\x75\x28\xab\xa0\x03\xa5\xfd\x07\xd8\ \xba\xe2\xb0\xb1\x02\x12\xb6\x6d\xfb\xb6\x6d\x27\xe2\x60\x63\x7e\ \x47\x85\x3d\x1d\xfd\x25\xa3\x9d\xb1\x45\x70\x4d\x3f\x40\xc5\x75\ \xa8\xa4\xa2\x30\x44\x43\x5b\x7d\x7f\xe3\x42\xa9\x2c\x42\xa1\x89\ \x42\x28\x37\x43\xa7\x02\x91\x16\x46\x41\x12\x14\xa6\x07\x2b\x62\ \xd0\xec\x5e\x71\x08\x8a\x1f\xc0\x59\x62\xff\x51\x34\x6b\x7b\xb7\ \xc0\x00\x74\xe4\x16\x08\xbd\xc2\x92\x62\x37\xa4\xd6\x28\x52\x0a\ \xf8\x42\xa2\xef\x4b\xf4\x3c\x89\x46\x2f\x40\x22\xb7\x27\xfd\xab\ \xbf\xfa\xc1\xd7\x4f\x4f\x1f\xac\x11\x01\xa9\x34\x47\xb1\xec\xa0\ \x50\xcc\x5c\x90\xc4\xde\x39\x0d\x63\x01\x46\x92\x34\x0a\x02\xe1\ \x49\xbd\x18\x12\x30\xce\x03\x70\x00\xd6\xcc\x72\xa7\x1d\x10\xe7\ \x70\x32\xf0\x85\xd2\xb6\x61\x8a\x6a\xf8\xbf\x88\x06\x8a\x63\x92\ \x79\xd7\x98\xfd\x04\xd5\xfd\xe6\x9b\xdf\xfe\x7f\x90\x48\xa8\x88\ \xcc\xe6\xe6\x26\xce\x9c\x39\x83\x4e\xa7\x83\xb7\xbe\xf9\x9f\xa0\ \x58\x9c\x54\x7e\xbf\x14\x08\x62\x89\x3f\xc4\x4c\xd2\x8f\xf6\xfd\ \x2d\x4b\xb7\x24\x33\x26\x27\x69\x0d\xc4\x70\xf2\xd4\xd7\x31\xbd\ \x7b\x0c\x6b\x6b\x6b\xf0\x3c\x0f\xbd\x5e\x0f\x47\xae\x7e\x2d\x86\ \x43\x92\xc6\x7c\x8f\xba\xff\xa8\x50\x22\x8f\x3e\x33\x9b\x22\x92\ \x2f\x92\x40\xc2\x2d\x0c\x01\x80\xe1\x28\x84\x10\xc8\xe7\xf3\xae\ \x6d\xdb\x1d\xcf\xf3\x36\xa1\x84\x7e\x4d\x3f\x36\xa1\x38\x01\xd3\ \xca\xd9\xc7\xd6\x3a\x75\x43\xc0\xfa\x37\xdd\x74\xd3\x1d\xb9\x5c\ \xae\x16\xdf\xb7\x79\xd8\xb6\x05\x4e\xb6\x66\xbe\x11\x26\xf6\x18\ \x23\x5e\x59\x2d\xba\x82\x51\x97\xf4\x1a\x41\x22\xfd\xa3\xaa\x9d\ \x98\x2e\xa6\x92\x04\x62\x2a\xcd\x17\x52\x6a\x01\x56\x9c\x01\x93\ \x02\x82\x91\x4e\x25\x56\xa4\xa3\x6a\x3e\x42\x7a\xe5\x22\x13\x51\ \x89\x13\x81\x06\x55\x14\xc2\x98\xdc\x80\xed\x48\x3e\xc3\xd9\x3c\ \x97\x5b\xa0\xae\xb3\xae\x7b\x08\x1b\xaa\x9a\x6e\x46\x3e\x06\x81\ \x44\xd7\x67\x68\x15\x6e\x40\x7f\xd7\xdd\x10\xc9\x1d\xf6\x1e\x46\ \xb5\x4c\x8e\xa3\x54\x76\x91\xcb\x67\x2e\x48\x62\xef\x7c\x46\x28\ \xe5\xcf\x1f\x05\x78\x49\xf2\x00\xcc\x33\x7f\x6a\xa6\xd5\x02\x63\ \x36\x9c\x34\xbc\x40\x6b\x47\xd2\x13\xc8\x7c\x83\xcc\x44\x8c\x76\ \x64\x7c\x67\xed\x1a\x02\xda\xdc\x3e\x75\xe6\x5b\x68\xb4\x4e\xa1\ \x50\x28\x60\x75\x75\x55\xad\xa0\x53\xaf\xe3\xa6\x1b\xde\x8c\x83\ \x97\x5f\x87\x40\x17\xf9\x88\x20\x00\x44\xa0\xcc\x5d\x50\xc8\xfa\ \x5b\xdc\x06\xb7\x1c\x1d\xfa\x33\xed\xba\xa2\x6b\xb0\xb4\x7c\x02\ \xdc\xf2\xe0\xba\x6e\xd8\x39\xb8\x5a\xdd\x85\xc9\xc9\xcb\xe1\x0d\ \x7a\x30\x5d\xa2\x55\xf8\x11\x5a\xfb\x6b\xf6\x5f\x83\x9b\x99\x94\ \x91\xa6\x8a\x9f\x97\x44\x32\x51\x86\xe3\xa4\x20\xc4\x00\x41\x10\ \x0c\x95\xf6\x56\xab\xd5\xe4\xd1\xa3\x47\xaf\x7a\xf8\xe1\x87\x1f\ \x87\x12\xfa\x4d\x28\xcd\x6f\xd8\xff\x01\x74\xb8\x0f\x91\xf6\x0f\ \xf1\x45\xbf\x27\x4b\xa5\xd2\x87\x5c\xd7\xb5\x4c\x95\x60\x1c\x00\ \x38\x73\x34\x01\xa8\xda\x7c\x0b\xed\xfb\x0c\xf5\x28\xd0\xa4\xa9\ \xa0\xc8\x22\x0b\xd3\x79\x43\xb7\x46\xfb\xee\x30\x59\x84\x86\x28\ \x14\xa1\x8b\xa7\xca\x85\x05\xa4\xa9\xad\x18\x2d\x37\x0e\x73\x06\ \x44\x08\xa8\x42\x77\x32\x56\xfc\x80\xf6\xe7\x43\x6b\x40\x5f\xc5\ \xe7\x75\x0b\x22\x8b\x22\xbc\xf2\x52\x84\xcf\xe6\x5a\x24\x53\x2e\ \xc6\x0f\xdd\x8f\x9d\x57\xdc\x09\x9e\xc8\x83\xd9\x84\x42\xde\x42\ \xa9\x9c\x44\x26\x9b\xbe\x60\x89\xbd\x17\x3a\x9e\xa3\x6c\x39\x1c\ \x2f\xc6\x05\x30\x7f\x87\xa9\x92\xcb\x9b\x7d\x4f\x4a\x29\x7c\x9e\ \xe0\xbe\x64\x61\xa3\x0d\xc9\xf4\x9c\x8d\x93\x7c\x71\xed\x2f\x8d\ \xa2\x55\x9a\x81\x31\x42\xa3\xb9\x88\xa7\x9e\x79\x00\x93\x93\xe3\ \x58\x59\x59\x09\x01\x60\x7a\xd7\x55\xb8\xe3\xb6\x77\x69\xa4\x17\ \x10\xda\xf4\x17\xd2\xe4\x9f\x2b\xa2\x4e\xf9\xfd\xb6\xf6\xd7\xb5\ \xf6\x8f\xfd\x2c\xe3\x84\xef\x3d\xf1\x0f\xd8\xbf\x7f\x3f\x56\x56\ \x54\x8e\xfe\xe6\xe6\x26\xee\xb9\xfb\xed\x7a\xa2\x4b\x3d\x59\xa5\ \x06\x24\xae\x56\x0d\xe6\x66\xe9\x30\x83\x7d\xf1\x88\x82\xdc\x02\ \x04\x8e\x9d\x41\x32\x91\x47\xa3\xb9\x18\x0a\xbe\xc9\xd6\xb3\x6d\ \x1b\x53\x53\x53\xfb\x9e\x7c\xf2\x49\x34\x9b\xcd\x16\x94\xd0\xb7\ \xa0\x42\x81\x7d\x28\xe1\xdf\x4e\xfb\x9b\x53\x09\xee\xbb\xef\xbe\ \x37\x14\x8b\xc5\xc3\xbe\xef\x0f\xed\x3b\x08\x14\x19\xea\x3a\x79\ \x30\x10\x84\x16\x3e\xa6\xcf\x47\x68\x93\x85\x49\x40\xea\x70\x1f\ \x33\x09\x7c\x24\xc1\x84\x0e\x15\x92\x0e\xef\x49\x13\xe2\x8c\xfb\ \x00\x88\xb2\xff\xc2\xc1\x46\x0e\xd5\x80\x47\xd4\x73\x80\x74\x31\ \x91\xa1\x1c\x4c\x93\x51\x16\xa6\x1f\x9b\xe9\xf2\x7c\x6e\x81\x21\ \xfc\x8c\xfd\x65\x84\x5e\xcf\x0d\xad\x1c\xca\xe5\x32\xae\xbf\xee\ \x5a\x5c\x7d\xd5\xd5\xaa\x82\x32\xc9\x90\x2f\x58\x28\x94\x52\x61\ \x17\xa6\x1f\xc6\x31\x92\x09\x88\x6d\x9e\x5f\xf2\x8e\x40\xe4\x7b\ \xa2\xeb\x33\x37\xe3\x07\x4c\xa7\x01\x1b\x83\x1b\x18\x92\x8c\x18\ \x77\x13\x6b\xfe\x03\xc6\xd4\x2a\xba\x5f\xfb\xc6\x9f\x63\x7c\xbc\ \x86\x8d\x8d\x0d\x34\x1a\x0d\x9c\x3a\x75\x0a\xa9\x64\x1e\x6f\x7f\ \xf3\xff\x04\x46\x0c\xbe\xf0\x21\xa5\x0f\x11\x04\x3a\xf1\x47\xed\ \x5e\xe5\xf7\xab\x6a\x3f\xd5\xec\xc3\x82\xe9\xd4\x03\x44\x5a\x62\ \x71\xf9\x24\x6c\xa7\x8f\x76\xbb\x8d\x4e\xa7\x83\xd3\xa7\x4f\x23\ \x91\xc8\xe0\xc0\x81\x9b\xd4\xc4\x91\xda\x2f\xd5\xc7\xaf\x5c\x0a\ \xb5\xef\xb0\x0b\x90\x29\x7e\x31\xc0\x76\x16\x20\xc8\xa4\xab\xd8\ \xd8\x9c\x0b\x53\x74\x3d\xcf\x0b\x93\x81\x26\x26\x26\x8a\xb7\xdd\ \x76\xdb\xc7\xbf\xf0\x85\x2f\xfc\x6c\xa7\xd3\x31\xb9\x00\xa3\x9a\ \x3f\xee\xfb\x9b\xab\x47\x77\xde\x79\xe7\xbe\x7c\x3e\xff\x5b\xc9\ \x64\x32\xd7\xeb\xf5\xe0\x79\x5e\xf8\x1b\x2a\x2b\xd0\x41\x2e\x3b\ \x0d\x10\xc1\x60\xb0\xb2\x00\x64\x98\x17\x20\xcd\xdd\x91\x80\x64\ \xa4\x7c\x75\x20\xa6\xfa\x4d\x26\x9f\x8c\x42\xf7\x7a\xb1\x10\xfd\ \x67\xd8\x75\x18\x14\xa5\x0d\x93\xfe\x2d\xd2\x1a\x5e\x98\x30\xa9\ \x3e\x99\xc8\xb2\x30\x75\x08\x0a\x08\x58\x58\xc2\x2c\xf5\x3e\xb1\ \x8d\x5b\x10\xf1\xb3\xca\x72\x88\x84\x5f\x08\xa9\x14\x42\x10\x60\ \xf7\xee\xdd\xb8\xfe\xba\x6b\x71\xd9\xde\xcb\x40\x04\xa4\x32\x5c\ \x09\xbe\xf6\xef\x5f\x35\xc4\xde\x0b\x1c\xe7\x10\x05\x78\xc1\x89\ \x40\x67\x1b\x72\xe0\x05\x1d\x8f\xb9\x19\x4f\xe8\x34\x51\x2d\x24\ \x30\x48\x6d\x0c\x81\x98\xd3\x6c\x70\x4a\x1d\xaf\x8f\x2f\x7d\xf9\ \x33\x28\x95\xb2\xa1\x70\x9e\x38\x71\x02\x41\x20\xf0\xce\xb7\xff\ \x12\x92\xe9\x9c\x12\x7a\xa3\xfd\x11\x98\xb6\x95\x51\xb1\x8f\x65\ \x2b\x0b\x80\xa9\x72\x5f\x98\xe5\xba\xa4\xca\xe8\x63\x8c\xf0\xd8\ \x77\xff\x16\x93\x3b\x2a\x68\x36\x9b\x58\x5b\x5b\xc3\xc6\xc6\x06\ \x6e\x7d\xcd\x3b\x61\x31\x0e\xcf\xf7\x95\xf6\xd7\x92\x6d\x7c\x7e\ \x16\xd6\x00\x44\x2e\x85\x72\x39\x94\x36\x3b\x1b\x10\x54\xca\x87\ \xb0\xb1\x79\x1a\xbd\x7e\x33\x14\x7e\xb5\xce\x80\xe2\x13\xa6\xa7\ \xa7\xf7\xdc\x7d\xf7\xdd\xbf\xfd\xc8\x23\x8f\x7c\x7c\x66\x66\x66\ \x15\xc3\x82\x1f\x57\xa7\xa1\xf9\x7f\xdf\x7d\xf7\xdd\x95\xcd\x66\ \xff\x6d\xb9\x5c\xde\xdb\xef\xf7\x31\x18\x0c\xe0\x79\xde\x10\x08\ \x64\xd2\x15\xd8\x56\x16\x86\x78\x95\x80\x16\x7c\xdd\x80\x35\xcc\ \xcf\xd7\x02\x26\x65\xcc\x4c\x8f\xb2\x1f\x0d\xa1\x17\x73\xd5\x63\ \x0c\x3e\xc5\x92\x87\xe2\x85\x43\xaa\x74\x58\x32\x15\xf3\x0f\x1b\ \x94\x9a\xe4\x21\x32\xae\x81\x54\xd5\x8a\xd1\x8a\xd5\xfa\x4c\x35\ \xa0\x18\xf3\xdf\x44\x1d\x86\x2e\x85\x8c\x80\x5a\x0a\x04\x81\x00\ \xe7\x84\x2b\x0f\x1e\xc2\xf5\xd7\x5d\x87\x4a\xa5\x0a\xc6\x09\xd9\ \x1c\x47\xa1\x64\x23\x9b\x7d\x15\x13\x7b\xe7\x33\x62\x24\x40\xec\ \x9d\xb8\xf2\x08\xaf\xe4\x0b\x05\x80\x38\xdf\x15\xdf\xa1\x6c\x74\ \xfc\x75\x8f\xac\x9a\x90\x2a\x59\x26\x34\x08\x59\x24\xf9\xe6\x68\ \x64\xec\x3e\x10\x54\xa3\x89\x07\xbe\xf4\x19\xb8\x09\x01\x22\x0b\ \x9b\x9b\x9b\x38\x79\xf2\x24\x9a\xcd\x26\xde\x70\xef\x4f\x61\x72\ \x72\xbf\x26\xfa\xb4\xf0\x6b\xed\x4f\xda\x9f\x55\xa5\xbe\xda\xf4\ \xd7\xd9\x76\x8a\xf8\x53\xbf\x20\xb5\x36\x5f\x58\x7c\x0a\x96\xdd\ \x87\xeb\xba\x98\x99\x99\xc1\xe6\xe6\x26\x92\x89\x8c\x5a\x30\x94\ \xa0\xe2\xff\xda\x87\x34\xec\x3f\xb1\x28\x83\x2f\x4c\x25\x56\x5b\ \x84\xd8\x66\x56\x34\x37\x4a\xd4\x00\x81\x63\x67\x51\xc8\xef\xc2\ \xdc\xc2\x63\x43\x82\x6f\x38\x04\xd7\x75\x69\x7a\x7a\xfa\x50\x2a\ \x95\xfa\xe3\x66\xb3\xf9\xd7\x4f\x3e\xf9\xe4\x27\x4f\x9e\x3c\x39\ \x18\xb9\x71\x04\x00\x77\xde\x79\xe7\x44\xa1\x50\xf8\x74\x36\x9b\ \xbd\x3d\x97\xcb\xd5\x8c\xf0\xc7\x1f\x9e\xe7\xc1\xb1\x5d\x94\xf2\ \x87\xb4\xf0\xe8\xab\x1e\x52\xf9\x32\xba\x7b\x06\x7d\xc3\xca\x3e\ \xa5\x93\x8d\xe0\x03\xa4\xc8\x3d\x42\xc8\xea\x1b\xdf\x3f\x56\x3e\ \xa4\x39\x01\x93\x24\x84\x10\x48\xb4\xc4\x23\x5c\x95\x48\x27\x0f\ \x29\xdf\xdd\x44\x25\x64\xe8\xfe\x99\xaa\x41\x95\x66\x1c\x23\x1f\ \x0d\xab\xaf\x89\x45\x65\xe2\x47\xe1\xdf\x44\x22\x81\x63\x47\x8f\ \xe0\xd8\xd1\x63\x48\xa5\x52\xb0\x6d\x42\xb6\x60\xa1\x50\x74\x91\ \xc9\xa4\x5f\xf5\xc4\xde\xf9\x8c\x68\xc2\x6c\x21\x01\x31\xf2\xf7\ \x0b\x02\x00\xb9\xcd\xb3\xb1\xc1\xc4\x33\x8b\xdd\x67\x6f\x3c\xc4\ \xf6\xfb\x82\x98\xcd\x74\x95\x5c\xcc\xdc\x0f\xff\x90\x31\x2e\x80\ \x08\x8c\x4b\xfc\x8f\x2f\xfc\x11\x2c\xbb\x07\xdb\x76\xc3\x05\x3d\ \xd6\xd6\xd6\x70\xe4\xea\x3b\x71\xed\xf1\xd7\xeb\xb8\xae\x26\x75\ \x82\x00\x81\x36\xd5\x41\x00\x47\x54\xed\xa7\xf2\xe1\xad\x58\x9f\ \xfe\xe8\xf7\x88\x11\x1e\xf9\xce\xdf\x62\x6a\xd7\x78\xd8\xee\x7b\ \x65\x65\x05\x77\xdc\xfa\x1e\x38\x96\xab\xd6\x0d\xd0\xf9\xea\x46\ \x70\x88\xc5\xdb\x87\x45\xe6\x7f\xfc\x6a\x4a\x44\xee\x05\x8b\xd5\ \xdd\x68\x6c\xc2\xe4\xf8\x75\x68\xb6\x16\xd0\x6c\xad\x0e\x09\xbf\ \x19\x42\x08\x54\x2a\x95\xa9\x72\xb9\xfc\xf1\x42\xa1\xf0\x23\xc7\ \x8f\x1f\x3f\xe9\x79\xde\x9c\x94\xf2\x34\x11\x25\x00\xec\x74\x1c\ \x67\x3a\x91\x48\xec\xc9\x66\xb3\x63\x42\x08\x74\xbb\xdd\x50\xe8\ \xe3\x40\xe0\x79\x1e\x8a\xf9\x31\x24\x53\x65\xbd\x73\x84\x76\x79\ \xa8\xc1\x89\xc2\xb5\x01\x94\x1b\xa6\x04\x94\xa4\xd6\xe0\xa4\x65\ \x95\x94\x86\x66\xc2\x34\x15\xd1\x4e\xc3\x88\x6b\x10\xf1\x03\x32\ \xbc\xcf\xa1\x95\x61\x38\x03\x75\x75\x14\xdf\x00\x53\x47\xa0\x6b\ \x0a\x74\x3b\x31\x8a\x93\x8b\x3a\x69\x07\x80\x72\x23\xb4\x55\x66\ \xa2\x29\x52\x0a\x94\xcb\x45\x1c\xbf\xe6\x38\x0e\x5d\x71\x08\x9c\ \x73\x24\x92\x0c\xb9\x82\x85\x7c\x21\x81\x74\xfa\x87\x8f\xd8\x3b\ \x9f\x71\x96\x72\xe0\xa1\xf1\x62\x5d\x80\xb8\x05\x20\x00\xc8\x67\ \x66\x5b\x33\x75\x9f\x7c\x5f\x30\xc7\x65\x26\x4c\x36\xf2\x0d\x82\ \x4a\xf7\x95\xd0\x4b\x73\x4b\x3c\xf8\xd0\x1f\xc3\x4d\x0c\xe0\x38\ \x49\xcc\xcd\xcd\x61\x75\x75\x15\xf3\xf3\xf3\xd8\x3d\x7d\x35\xde\ \xf8\x23\x3f\xad\x7d\x41\x85\xf8\x81\x0c\x10\xc8\x88\xf5\x27\x52\ \x4b\x81\x2b\xe1\x1f\x4e\xfa\x01\x22\x52\x09\x04\xcc\xcf\x3f\x09\ \x6e\xa9\xd6\xde\x1b\x1b\x1b\x58\x5c\x5c\x44\x2a\x99\xc3\x35\xc7\ \xee\x85\x6a\x92\x11\x85\x13\x99\x16\x0c\x66\xda\x7f\x99\x05\x44\ \xcd\x3a\x00\xa1\x36\xa4\xd0\xbf\x8d\x03\x41\x2c\xb9\x0e\x8c\xd9\ \x98\xda\x71\x33\x9e\x3d\xfd\x05\xf4\xfa\xad\x21\x42\x2b\x1e\x19\ \xb0\x2c\x8b\x15\x0a\x85\x69\xce\xf9\x34\x00\xbd\x48\xa7\x8a\xa8\ \x98\xed\xe2\xe6\x7e\x1c\x00\x0c\x08\xe4\xb3\x55\xd4\xaa\xc7\xb5\ \x89\x0f\x40\xc7\xdd\x23\xdf\x1c\x9a\x00\x64\x10\x4c\x17\x06\x69\ \x92\xcf\x24\xff\x11\x08\x32\x5c\x2c\x44\x42\xea\x2e\x3f\x6a\x47\ \x26\x9d\x57\xcf\x28\xad\xc8\xcd\x35\x96\x9a\x13\x50\xbe\xbf\x12\ \x6a\x25\xe4\xc3\xc7\x10\xee\x1e\x88\x7a\x08\x50\xa0\xeb\x28\x08\ \x20\x9d\x9f\x20\x45\xd8\xd8\x55\xca\x00\x81\x10\xd8\xb3\x7b\x1a\ \xc7\xaf\xb9\x06\xd3\xbb\xa6\x41\x04\xa4\x33\x1c\xb9\x82\x85\x6c\ \x2e\x89\x4c\x26\x13\xae\x9e\x7c\x71\x0e\x03\x9a\xb4\xf5\xcd\x91\ \xe7\x17\xe3\x02\x8c\x0a\xbf\x00\x10\x7c\xfd\xc9\x8d\x33\x1e\xc8\ \x12\x52\x95\xc8\x6a\x06\x20\x32\xf7\x8d\x29\xa9\x6d\x66\xce\x09\ \x5f\xfc\xf2\x67\x01\x6a\x80\x48\x35\xc8\xac\xd7\xeb\x98\x99\x99\ \xc1\xd4\xce\x83\x78\xef\xbb\xfe\x29\x2c\x6e\xc7\x4c\x7f\x01\x18\ \xe2\x4f\xc7\xa1\x43\xd2\xcf\xb2\x55\xcc\x9f\x2c\xed\xfb\x9b\x1f\ \x44\xa8\x99\xbe\xf5\xe8\x5f\x63\xef\x65\x53\x58\x5f\x5f\x07\x11\ \x61\x75\x75\x15\x77\xdd\xf1\x01\xd8\xb6\xd1\xfe\x12\xd1\x3f\xdd\ \x45\xc8\x14\x12\x19\x0e\x80\xb3\xf0\x64\xcc\x84\x36\xfd\xf4\x09\ \x26\x29\x65\xab\x45\x90\x49\x4f\x60\xc7\xe4\x75\x38\x33\xf3\x8f\ \xe8\xf5\x7a\x43\x79\x01\x86\xbd\x37\xd5\x7c\xa6\xc7\xdf\xd9\x80\ \xc2\x00\xc0\x28\x08\xe4\x32\x05\x4c\x8c\x5f\x07\xce\x5c\x75\x0e\ \x12\x43\xb1\x7f\xc0\x10\x70\xfa\xfc\xb4\x26\x1f\xca\x0b\x60\x9a\ \x69\x97\x26\x97\x1f\xda\x32\x30\xa4\x1c\x8b\x5a\x88\x0d\x71\x02\ \x14\xf5\x18\x34\xd7\x0f\x1a\x70\x84\xf6\x02\x09\x30\xcd\x44\xc2\ \xdd\x13\x01\x14\x68\x6f\x80\x41\x52\x10\x11\x2a\x50\x00\x2a\xa5\ \x5a\x04\xf5\xe0\xc1\x43\x38\x7e\xec\x1a\x94\x4a\x25\x70\x4e\xc8\ \xe4\xb4\xe0\x67\xd3\x17\x05\xb1\x77\x3e\xe3\x39\x8a\x81\x5e\x94\ \x0b\x60\x46\x5c\xf0\xc3\xc7\xe3\xa7\x1a\x6b\x7e\x10\xf8\x81\x20\ \x87\x73\x6e\xaa\x7b\x30\x8a\x45\x2a\x85\x56\xe0\xc1\x87\xfe\x18\ \xc4\x9a\x48\x25\x55\x27\x9c\xf9\xf9\x79\x3c\xfb\xec\xb3\x18\x1f\ \xdb\x8b\xf7\xbf\xe7\x9f\xc3\xb6\x13\x30\x25\xa4\x32\x10\x08\x84\ \x8f\x40\x04\x30\xf9\x84\x61\x73\x4e\xcb\x51\x20\xc0\x2c\x1d\xa7\ \x37\x7e\xaf\xfe\x4d\x46\x78\xe4\xb1\xbf\x41\xa5\x9a\x45\xaf\xd7\ \x43\xa7\xd3\xc1\x53\x4f\x3d\x85\x74\xaa\x80\x6b\xaf\xb9\x17\x80\ \x88\xd8\xff\x58\x31\x11\xd3\x3d\x04\x39\xe3\xa1\xef\x4e\x3a\xa1\ \x28\xca\xff\x57\x02\x62\xdc\x8d\x90\x40\xdb\x06\x08\x2a\xc5\xfd\ \x90\x22\xc0\xfc\xd2\x23\xe8\x76\xeb\x43\xc2\x6f\x08\xc2\x51\x8e\ \x00\xd8\x0a\x00\x66\xfb\xf8\xa3\x98\xaf\x62\xa2\x7a\x0d\x18\xcf\ \x29\x81\x96\xd0\x82\xaf\xf6\x61\x9c\x16\x53\xf6\x43\xa1\xe1\x6d\ \x82\x77\x06\xc4\x62\xb5\xff\x43\x8b\x8b\x2a\x5b\x5f\x1b\x6f\xda\ \xf7\x1f\xee\x31\x68\x92\x82\xc8\x34\x20\x21\x80\x49\x8a\x3a\x04\ \x99\x30\x41\x58\x4e\x08\x40\xaa\x65\xcb\x94\xb9\x64\xcc\x27\x45\ \x24\x0a\x11\x20\x95\x4a\xe0\xea\xab\x8e\xe3\xc8\xe1\xc3\xaa\xa9\ \x8a\xa3\xf2\xf3\xb3\x79\x1b\x99\x4c\xfa\xe2\x20\xf6\xce\x71\x84\ \x6e\x35\xb6\x00\x40\xec\x93\x70\xbc\xa0\xe5\xc1\xcf\xaa\xfd\xf5\ \x43\x34\x5a\x83\x55\x29\x69\x92\xb8\x32\x95\x47\xc3\x7f\xc4\x08\ \x9e\xdf\xc1\x3f\x7c\xe1\x3f\x22\x9b\x53\x6d\xb5\x37\x37\x37\x31\ \x33\x33\x83\x33\x67\xce\xa0\x5a\xd9\x85\x0f\xbd\xef\x93\x70\xdd\ \x94\xce\xef\x57\xa1\x9d\x40\xa8\x94\x5f\x93\xa0\xc3\xb8\x6a\xf4\ \x61\x34\x3f\xb7\x6c\xd5\xa6\x2b\xac\xd0\x03\x4c\x76\x59\xab\xbd\ \x8a\xd9\xf9\x6f\x60\x7a\x7a\x17\x16\x17\x17\xc3\x82\xa2\x1f\xb9\ \xef\x67\x60\x59\x0e\x7c\x4f\xf9\xfe\x42\xfa\x08\x5b\x5b\x85\xe9\ \xc4\xc6\xff\xb7\x62\x42\x19\xd7\xfe\x88\x01\x41\xcc\x22\xd8\x0e\ \x08\x08\xa8\x56\xae\x40\x3a\x55\xc3\xe9\xd9\x2f\x61\xb3\xbe\x10\ \x0b\xdb\x45\xda\xdf\x00\x40\x78\xd9\x34\x33\x1f\xcf\x25\x30\x8c\ \x3f\x67\x84\x6a\x79\x1a\x63\x95\x6b\x01\xe6\x28\xcb\x08\xe1\xea\ \x7d\x60\x9a\x41\x17\x04\xfd\x5a\xaf\x1b\x48\x4c\x45\xe4\xc3\x18\ \xbf\xf1\xcf\x8c\xd0\xc7\x4a\x76\x11\xb7\x24\x10\x5a\x0b\x82\x4c\ \x1d\xa4\x49\x0a\xd2\x6c\x7d\x48\xf0\xc5\x2e\x8a\x88\xed\x57\x03\ \xa6\xa9\x1d\x31\x3c\x80\x12\x7c\x89\x40\x08\x54\xca\x25\x1c\x3d\ \x7c\x35\xf6\xef\xdf\x0f\xc6\x18\x92\x29\x86\x6c\xde\x42\x36\xe7\ \x20\x9d\xbe\xb8\x88\xbd\x73\x1e\x31\x51\xa3\x61\x54\x1c\xe5\x03\ \x00\xbc\x78\x0b\xc0\xcc\x92\x20\xf6\xf0\x4e\xad\xfa\xb3\x00\x4d\ \x9a\xd2\x5b\xb5\xb5\x42\x78\xe2\x84\x76\x7b\x0d\xff\xf0\xc0\x7f\ \x42\xb9\x9c\x09\xfd\x56\x23\xfc\xc5\xc2\x38\x7e\xfc\x83\xbf\x89\ \x64\x2a\x8b\x30\xb7\x5d\x08\xc8\x20\x50\xcc\xbf\x49\xf7\x85\xee\ \xcc\x6b\xa9\x8c\x3f\x4b\x37\xe8\x84\xae\x3e\xa4\xb0\xbc\x90\x40\ \x9c\xf0\xd0\x57\xfe\x14\xe3\xe3\x2a\xe5\xf7\xf4\xe9\xd3\x58\x5c\ \x5c\xc4\xae\xa9\x43\x38\x76\xf4\x6e\x88\x40\xc7\x90\xa5\xfe\x2f\ \x01\x40\x00\x00\x20\x00\x49\x44\x41\x54\x0c\x5d\x0b\x45\xfe\x99\ \xe5\xc3\x74\x23\x51\x66\xca\x89\xc3\x80\xc6\x90\x6f\xfd\xbc\x40\ \x60\x2e\x9a\x04\x52\xa9\x0a\x0e\xec\xbb\x1f\x0b\x4b\xdf\xc6\xc6\ \xe6\x69\x34\x9a\x2b\x43\xbd\x02\x0c\xd0\x8c\x5a\x00\x71\x2b\x80\ \x33\x86\x5c\xb6\x86\x72\x71\x2f\xd2\xa9\xdd\x30\x48\xa3\x8e\x43\ \x77\xfb\x37\x82\x4f\x8a\xcd\x97\xda\xfc\x67\xd0\x19\x8c\x26\x47\ \x22\x0c\x5d\xe8\xb4\x60\x01\x80\x94\x5f\x6e\x96\x0d\x1b\x4a\x1e\ \xd2\xa1\xbc\x30\xc7\x3f\x2e\xe0\x9a\xa9\x27\x5d\x22\xac\x72\x06\ \x04\x88\xa9\xda\x01\x13\x52\x90\x42\xd5\x11\x08\xa9\x09\xa4\x40\ \x42\x22\xc0\xae\x5d\x3b\x71\xf4\xf0\x61\xec\xd8\x31\xa9\xfc\xfb\ \x2c\x47\x2e\x6f\x21\x9d\x71\x2f\x7a\x62\xef\x05\x8c\xb3\xb9\x01\ \x00\xce\x33\x0f\x40\x4a\x29\xc9\x74\x63\x50\x23\x6e\xfe\x07\xd0\ \x15\x6b\x33\x4b\x83\x25\xa6\x17\xd9\x0c\x7d\x70\x02\x38\x31\xac\ \xac\x3e\x8b\xaf\x3e\xfc\x67\xa8\xd5\xd4\xc2\x1b\xdd\x6e\x17\x67\ \xce\x9c\xc1\xdc\xdc\x1c\x2a\xe5\x9d\xf8\xf0\x07\xfe\x25\xd2\xe9\ \x3c\x20\x29\x34\xc9\x03\x11\x20\x08\xfc\xb0\xc7\x3f\xb4\x70\x72\ \x6e\xab\x74\x5f\xad\xa1\xc9\xf8\xcd\x92\x86\x38\x87\xa7\x9f\xfe\ \x2a\xdc\xc4\x00\x80\x8b\x66\xb3\x89\x7e\xbf\x0f\x29\x80\xfb\xef\ \xfb\x19\x45\x66\x85\xc2\x1f\x20\xec\x81\xa7\x0b\x7f\xc2\x7a\x02\ \x5d\x03\x40\xba\xf8\xc7\x00\x0c\x85\x7e\xed\x39\x00\x41\x68\x7a\ \x6b\xf3\x99\x39\xd8\x31\x71\x3d\xc6\x6b\x47\xb0\xb0\xf4\x08\x5a\ \xed\x65\xf4\xfa\x0d\x74\xbb\x0d\xf5\x5d\x32\x8d\x4b\xa4\xb9\xfe\ \x4a\x13\x26\x73\x48\xba\x59\x64\xd2\x3b\x91\xcf\xef\x0b\x73\x1c\ \xcc\x72\x64\xa4\x4d\x6d\xa1\xaf\x3b\xd3\xd6\x87\x24\x93\xce\xab\ \x3d\xf4\x38\x22\xe9\x02\x20\x92\xba\xaf\x8f\xf6\xcf\x09\xd0\x65\ \xc4\x14\x55\x13\x42\xb9\x3c\x6a\xe7\xa6\x73\x90\xd4\x02\xae\xdd\ \x06\x66\x96\x19\x57\xbd\x01\x02\x15\x5f\x55\xe4\xa2\x89\x1c\xe8\ \x9f\x96\x22\x00\xe7\x0c\xfb\x0f\x1c\xc0\xe1\xab\xaf\x44\x3e\x9f\ \x07\xe7\x84\x6c\x9e\x23\x9b\xe3\x48\xa5\x2f\x11\x7b\xe7\x33\xe2\ \x6a\x9e\x31\xce\x84\x08\xce\xea\x06\xbc\xd8\x30\xe0\x76\x16\x40\ \xf0\xd4\xdc\x60\x81\x11\x74\x37\x20\xf5\x9b\x9c\x33\x9c\x7c\xf6\ \x9b\x78\xf4\xbb\xff\x0d\xd3\xd3\x53\x68\x36\x9b\x58\x5d\x5d\xc5\ \xc2\xc2\x02\x96\x96\x96\xb0\x67\xf7\x61\xbc\xef\x5d\xff\x2b\x1c\ \x37\xa5\x77\xae\x27\xaa\x08\x20\x84\xaf\xb2\xbb\x8c\x69\xce\xf4\ \xd2\x5e\x96\x4a\xfa\xb1\xb8\xad\x6b\xf4\x99\xb6\x3e\x4d\x6b\x2e\ \x82\xe7\x75\xf1\xd8\xf7\x3e\x8f\xbd\x7b\xa7\x51\xaf\xd7\xc3\x8a\ \xc2\x5b\x6e\xfe\x51\xd4\xaa\xbb\x20\x02\x2f\x0a\x2d\x4a\x11\x63\ \xb6\x95\xff\xcf\x75\x08\xd0\x2c\x03\x16\xb2\xff\x5a\xe8\x15\xbf\ \x71\x3e\x40\xa0\x8e\x2b\x02\x02\x02\xe7\x09\xec\x9c\xbc\x01\x90\ \xc0\xc0\x6f\x63\xb3\x7e\x0a\xdd\xde\x06\x84\xf0\x10\xf8\x03\x80\ \x48\xa7\x35\xbb\x48\xa7\xaa\xc8\xa4\x27\x01\xe2\xe6\x00\xb4\x70\ \xeb\xe3\xd6\x82\xae\x4c\xfd\x6d\xcc\xfb\xd1\x3b\x69\x04\x3a\x3c\ \x2a\x0d\x4e\x21\x19\x18\x27\x0d\xe3\xf5\x00\x7a\x9f\x3a\x9e\xaf\ \x52\x7b\xa3\x76\xe1\x30\x49\x41\x1a\x5c\x19\x54\xdd\x81\x14\x32\ \x02\x2b\x29\x90\x48\x39\xb8\xf2\x8a\xc3\xb8\xe2\xe0\x01\xb8\xae\ \x03\xc7\x51\xf1\xfb\x4c\xd6\x42\x3a\x9d\xba\xe8\x89\xbd\x28\x0b\ \xf2\x85\x0d\xce\x39\x09\x11\xb0\x91\xb7\x43\x40\x78\x29\xa2\x00\ \xa3\x16\x80\x7f\x62\xae\xbf\xb1\x73\x3c\xea\x4a\x13\xf8\x7d\x3c\ \xf0\xe5\x3f\xc7\x66\xe3\x14\xca\xe5\x68\x05\x9f\xd3\xa7\x4f\x63\ \x63\x63\x03\x47\x0f\xdf\x85\xb7\xbd\xe5\x17\xc0\xb9\x05\x48\x9d\ \xdd\xa5\x85\x32\x10\xa6\xb8\x45\xe5\xb6\x93\x16\x4c\x8b\xd9\xa1\ \xe9\x6f\xd2\x7d\x31\x12\x75\x60\x44\xf8\xe2\x43\x9f\xc1\xee\xdd\ \x53\x18\x0c\x06\xe8\x76\xbb\x58\x58\x58\x40\xa1\x30\x86\xdb\x6f\ \x7b\x37\xc2\x1a\x77\x9d\xb0\x22\x85\x9a\xb0\xa0\x58\x0b\x71\x2b\ \xde\x4d\x28\xe2\x16\xc2\xa4\x18\xcd\x31\x44\x40\xa0\x33\xed\xb6\ \x00\x81\x76\x47\x9e\x03\x08\x24\x24\x1c\x3b\x8d\x6a\xf9\x90\x26\ \x0e\x23\x01\x57\xcf\x9a\xfa\x94\xd1\x1e\xe3\x82\x68\x10\x20\x12\ \x64\x73\x35\xb4\x79\x6f\x2c\x84\x50\xf0\xcd\xef\xeb\x84\x1a\xd2\ \x4d\x35\x4c\x5c\x3f\xcc\xd1\x8e\xd5\x21\x99\xee\x3f\x5a\xe0\x41\ \x02\x92\x28\xaa\x23\x40\x04\x33\x42\x1f\x27\x86\xce\x45\x40\xc8\ \x00\xa5\x52\x01\x57\x5d\x79\x10\x7b\xf6\x4c\x87\xfe\x7d\xae\x60\ \x21\x95\xb6\x90\x4e\x5f\x22\xf6\x44\x00\xf4\x7a\x02\xed\xd6\x00\ \x89\x94\x8f\x6c\x36\x73\xee\x5f\x8e\x5d\x37\xa6\x88\xa4\xed\xdc\ \x00\x00\x2f\x4d\x14\x40\x62\xd8\x02\xf0\xdb\xed\xfe\x80\x71\x92\ \xb6\xcd\x69\x61\xf1\x29\x7c\xf5\xe1\xbf\x44\x36\x9b\x40\xa5\x52\ \x41\xa3\xd1\x80\xe7\x79\x78\xf2\xc9\x27\xd1\x68\x34\x70\xd7\x1d\ \xef\xc1\xeb\xee\xfe\x80\xda\xa1\xf1\x5f\xb5\x39\x2e\x02\x0f\x41\ \xe0\xc3\x0f\xfc\xb0\xc7\x9f\xd2\xc8\x36\x2c\xdb\x82\x6d\x39\xda\ \xfc\x8f\xa5\xfb\xea\x23\x63\x44\xf8\xf6\x63\x7f\x0b\xb0\x4d\x04\ \x41\x06\x6b\x6b\x6b\x38\x73\xe6\x0c\x5a\xad\x16\x3e\xf0\xde\x5f\ \x86\x6d\x3b\x10\x41\x04\x2e\x26\xaf\x40\xb9\xcb\xaa\x80\x88\xf1\ \x28\xf5\x37\x62\xff\xb7\xd3\xec\x86\xe5\x06\x20\x46\x81\x40\x9b\ \xc1\xdb\x7c\x0f\xd1\xe1\xc6\x5e\xc7\xe1\x20\xd2\x00\xe6\x39\x6e\ \xb5\x93\x8e\x93\x47\x5c\xbe\xde\xdf\x90\xd6\x50\xaa\x5c\x09\xb7\ \x04\x09\x09\x43\xb8\x2b\xc1\xd7\x16\x42\xbc\x3b\x47\x18\xd7\x37\ \xf0\xa2\xc3\x7e\x61\xca\xaf\xda\x81\xca\x19\xd0\x14\x60\x98\xd4\ \x67\xe2\x33\x32\x76\xb2\x02\x22\x10\x90\x10\x98\xda\x35\x89\x2b\ \xaf\xd8\x8f\xb1\xb1\x1a\x88\x80\x4c\x96\x23\x5b\xb0\x90\x4c\xda\ \x97\x88\x3d\x00\xbe\x2f\xd1\xef\x0a\x34\x9b\x7d\xac\xaf\xb5\xd0\ \x6c\x74\xb0\x7b\x5f\xea\xfc\x00\x20\x36\x78\x3c\x66\xfd\x12\x92\ \x80\xcf\x69\x01\x0c\xbc\x20\xe0\x9c\xc9\xc7\x9f\xfa\x3c\x35\x5b\ \xcf\xa0\x54\x2a\xc1\x71\x1c\xac\xad\xad\x85\xe9\xbd\xbd\x5e\x1f\ \xef\x78\xeb\x2f\xe2\xda\xe3\xf7\x00\x9a\x28\x53\x4a\x45\x91\x5d\ \xbe\x50\xac\xbf\x10\x3e\x4c\x57\x1b\x4e\x7a\x59\x2f\xcb\x86\x65\ \x39\x6a\x41\x0e\xdd\x9a\x1b\x12\x08\xcb\x52\x09\x58\x5c\x7a\x1a\ \xa7\xce\x7c\x19\xb5\x5a\x15\xf5\x7a\x1d\xcb\xcb\xcb\x58\x58\x58\ \xc0\xe1\xab\xef\xc0\xe5\xfb\xae\x0b\x23\x09\x30\xd6\x86\xae\x9e\ \x53\x56\x04\xfb\xff\xd9\x7b\xef\x58\x4b\xb2\xfc\xbe\xef\x73\x2a\ \xde\xf0\x42\xf7\x0b\x9d\xf3\xf4\x24\xee\xec\xcc\xee\x70\x73\x20\ \x97\x0b\x8a\xa6\x08\x89\x41\x94\x08\x11\xb0\xac\x44\x58\xb4\x20\ \x5b\x96\x25\xc3\xfe\xc3\x80\x25\xc0\x10\x40\xd8\x92\x00\x43\x82\ \x41\x40\x96\x01\x19\xb4\x02\x25\x48\xe4\x8a\x5a\x92\x1b\x26\x75\ \x4f\x9e\x9d\xd9\xc9\xd3\x33\x1d\x5f\xa7\x97\xf3\x8d\x55\x75\xfc\ \xc7\x89\x55\xf7\xbe\xd4\xfd\x7a\x45\x40\x3c\xe8\xd7\xef\xdd\xaa\ \xba\xa7\x4e\x9d\x3a\xbf\xf4\xfd\x85\x43\x14\x98\x74\x62\x8d\x2d\ \x20\xd4\xde\x7f\x08\x4d\x0c\x43\x18\x01\x42\x6d\xb3\x0d\x1e\x23\ \xd8\xda\x34\x28\x45\x48\x0a\x6f\x46\x2b\x92\xb4\x34\xf1\x86\x11\ \x08\x93\x04\x23\xb4\xe9\xe3\xc5\xf4\x0b\x69\xc5\xb1\x22\x6e\x89\ \x28\xb4\x56\x10\xf8\x98\x80\x3a\xa7\xdd\x03\xae\xd8\x87\xf9\x5b\ \x62\xdd\x9b\x16\x00\x24\x50\x11\x84\xa6\x02\xb2\x8d\xf8\x95\x16\ \xee\x51\x11\x90\x4a\x3b\xc8\xf3\x82\x28\x0c\x78\xe4\xfc\x19\x1e\ \x7b\xec\x61\x46\x47\x47\x08\x23\x15\x9f\x3f\x3a\x1e\x52\xab\xfd\ \x31\xb0\x07\xd0\xeb\x4a\xba\x9d\x82\xb5\xd5\x36\x4b\x4b\xeb\xb4\ \x36\xbb\xf7\xdc\x57\x19\x03\x30\x40\xdc\xfe\x61\x00\x7e\x2b\x61\ \x00\xf5\x7a\x5d\x36\x1a\x0d\x11\xc7\x9c\xff\xe4\xfa\x7f\x10\x13\ \x13\x0d\x26\x26\x26\x90\x52\x72\xe3\xc6\x0d\x66\x67\x67\xb9\x7b\ \xf7\x2e\x23\xcd\x03\xfc\xd5\xbf\xf4\xbf\x72\xfe\xa1\xcf\x58\x4d\ \x12\x2d\xcb\x90\xb9\x96\xfe\x99\xce\x6d\xcf\x01\x5d\xdf\x4f\xa8\ \x68\xbf\x30\x4a\x2c\x38\xa7\x94\x7e\x43\x9c\x8a\x89\x74\x3b\xab\ \xbc\xf0\xe2\x3f\xe7\xc4\xc9\xc3\x76\xeb\xed\x99\x99\x19\x26\x27\ \x8f\xf3\x8b\x7f\xfa\x6f\xda\x91\x1b\xbb\x3f\x2f\x94\xeb\x0f\xad\ \x8e\x8b\x50\x79\x17\xc2\x30\xd6\xbb\x08\xab\x8d\x3f\x85\x15\x7b\ \x8e\x80\x8d\xa4\xb5\xe9\x7a\x7b\x61\x04\xde\x67\x89\x21\x5e\x3c\ \xef\x9b\x79\x26\xe9\xbd\x36\x25\xb5\xd5\xcb\xd5\x3c\xc3\x44\xda\ \x0a\xe1\xd5\xd8\xd2\x04\x69\xc0\x36\xcf\x9d\x6f\x4a\x96\x3b\x89\ \xaf\x8b\x80\x48\x3c\xc2\x17\x5e\xf0\x50\x41\x20\x85\xe3\x13\xb6\ \xaa\x30\xe6\xe5\x59\x86\x64\x74\x86\xbc\x28\x68\xd4\x53\x1e\x79\ \xf8\x2c\x0f\x3f\x7c\x56\x6d\x84\x92\x06\x8c\x8d\x87\x34\x46\x42\ \xea\xf5\xda\x7f\xf6\xc0\x9e\x94\xd0\xed\x14\x74\x3b\x05\xab\x2b\ \x2d\x96\x16\xd7\xe9\x76\xfb\x43\x2e\xbc\xf7\x7b\x04\x61\xb8\x95\ \x09\x70\x6f\x18\x40\xc5\x13\x20\x01\x39\x35\x35\x45\xb3\xd9\x14\ \x52\xca\xcf\x25\x49\xf2\xd7\xa6\xa6\x6b\x8f\x2b\x24\x37\x64\x69\ \x69\x89\xb9\xb9\x39\xee\xde\xbd\xcb\xc6\xc6\x06\x9f\xfe\xd4\xd7\ \xf9\xa5\x5f\xfc\x9b\x34\xea\xa3\xfa\xd9\xb4\x1d\x5e\x14\x3a\xcc\ \x33\x27\x2f\xfa\x5a\xfa\xe7\x7a\xed\x2b\x44\x3e\x0a\x63\xa2\x38\ \x29\x45\xe6\x59\x57\x99\xd1\x38\x45\xc1\x1f\x7c\xff\x37\x39\x38\ \x31\x42\xab\xd5\x62\x6e\x6e\x8e\xeb\xd7\xaf\x23\x44\xc8\x5f\xf8\ \xd5\xbf\x4b\x2d\x69\x58\xef\x02\x3a\x6d\xb4\x28\x0a\x2f\xf3\x2f\ \x24\x0a\x43\x2d\xfd\xb5\xfb\x4f\x6b\x05\xbe\x0e\xee\x4f\x80\x32\ \x39\xd4\xfc\x18\x49\x59\x62\x04\x12\x8b\x11\x98\x57\x60\xa4\x6b\ \x59\xaf\x57\xf3\x21\xfc\x8d\xf7\xac\x76\xe0\xc7\x15\x48\x1b\x57\ \x60\xa5\x75\xa1\xb1\x00\xff\xbb\xfa\xfe\x26\xc6\xdf\xaa\xfe\xfa\ \x3e\x78\x85\x3b\xac\x7f\x5f\x0f\xc9\xc0\x7c\x01\xe8\xe8\x3c\x59\ \xca\x24\xb4\x84\x6f\x86\xae\x07\xa4\xec\xfb\x31\x1e\x7d\xe4\x1c\ \xa7\x4e\x1e\x43\x08\x41\xa3\xa9\xfc\xf7\xf5\x46\x48\xa3\xf1\xc7\ \xc0\x5e\x51\x40\xb7\x5d\xd0\x69\xe7\xac\xac\x6c\xb2\xb4\xb4\x4e\ \xd6\xcf\xed\xf9\x76\xbb\xb5\xf6\xd6\xdb\xaf\x3e\xbf\xb1\xbe\xba\ \xf4\x27\x7e\xfa\x17\xfe\xab\xfb\xb9\x57\xe0\x07\x93\x98\x58\x30\ \x8f\x09\xdc\xb3\x09\xf0\x8d\x6f\x7c\x83\x6e\xb7\x2b\xc6\xc7\xc7\ \xc3\xcb\x97\x2f\xff\x94\x10\xe2\x7f\x9c\x9c\x9c\x7c\xaa\xd9\x6c\ \xda\x0a\x3e\x6b\x6b\x6b\xdc\xb9\x73\x87\x85\x85\x05\xe2\xb8\xc6\ \xaf\xfe\xca\xff\xcc\x67\x9e\xfa\x29\x0c\x05\x28\x57\x94\xd0\x84\ \xae\xa4\x7d\x9e\xab\xa0\x98\x22\x57\xaa\xbf\x10\xe8\x60\x1c\x2d\ \xf9\xa3\x44\x01\x7f\x81\xdb\x94\xd3\x3c\x52\x20\x04\xcf\xbd\xf0\ \x5b\xd4\x1b\x05\x23\x23\xa3\x76\xc3\xcd\xcd\xcd\x4d\x7e\xf5\x57\ \xfe\x17\xa6\xa7\x4f\x2b\xd5\x5f\x53\x6d\x2e\x55\x31\x11\xe5\x5a\ \xd4\x0b\x3a\x08\x09\x4c\x46\xa1\x41\xff\xc3\x50\xe3\x6b\xce\xc4\ \x30\xb3\x38\xc0\x08\xf4\x89\x92\x46\xe0\x81\x85\x36\x3e\x61\x88\ \xda\x5f\x12\xf8\x9e\x2a\xef\xab\xfd\x96\xf0\x35\x0f\x56\xb8\x85\ \xb0\x1b\xf8\x58\xcc\x40\x60\x63\xfc\x9d\xe4\x76\xda\xbe\x7a\x1e\ \x13\xbd\xa8\x86\x60\xa3\xfa\xf4\xdf\xd6\xad\x68\x95\x2b\xcd\x69\ \xdc\x32\x50\x7e\x19\x5d\xea\xeb\xf8\x89\x43\x3c\xfa\xc8\x59\x26\ \x27\x0f\x22\x02\x65\xdf\x8f\x8d\x47\x24\x69\xf8\xc7\xc0\x1e\xda\ \xbe\xef\x14\xb4\x5b\x19\x2b\x4b\x1b\xac\xac\x6c\x92\xe7\x6e\x3e\ \x97\x57\x16\x6f\xbf\xf2\xca\x73\xdf\xf9\xad\x7f\xf9\x9b\xcf\xb7\ \xdb\xad\x8d\x5f\xfb\x2b\x7f\xeb\x33\xf7\x74\x23\x6f\x8a\x83\x20\ \xdc\x57\x13\x40\x00\xe2\xd9\x67\x9f\x0d\x7e\xe3\x37\x7e\x63\x7a\ \x66\x66\xe6\x4f\x2d\x2c\x2c\xfc\x37\xd3\xd3\xd3\x9f\x3d\x7a\xf4\ \x28\xbd\x5e\x0f\x21\x04\xd7\xaf\x5f\xb7\xfe\xfd\x8d\x8d\x0d\x1e\ \x3e\xff\xe3\xfc\xca\x2f\xff\x6d\xc6\xc6\xa6\x6c\x27\x06\x65\x2e\ \x0a\x45\x80\x79\x51\x90\x67\x99\xf2\xf7\xcb\x4c\x67\xf9\xe9\xf2\ \x5e\xda\xe6\x8f\x35\x51\x86\x81\x46\xfd\xd1\xc4\xa5\x09\xe2\x8d\ \xb7\x7e\x8f\x95\xb5\x8f\x19\x19\x19\xe1\xea\xd5\xab\x76\xc7\xe0\ \xaf\x7d\xf9\xcf\xf0\xd4\x13\xdf\x00\x34\x60\xa1\xd3\x89\x6d\x70\ \x91\xd4\xf5\x04\xc2\x40\x4b\xff\x48\xef\x22\xa4\xe3\xff\x09\xb4\ \xda\x8c\x95\xee\x5a\xa8\xbb\x49\x61\x0b\x8d\xc0\x4c\xdc\x96\x8c\ \xc0\xe9\x77\x25\xf0\xce\x33\x0b\x94\x55\xa0\x98\x41\x95\x7e\x84\ \x08\xb4\x4b\xcd\x7c\xd7\x81\x08\x72\x08\xe1\xdb\xa8\x3d\xa9\x0a\ \x75\xd8\xf4\x5f\x69\xa2\xfa\xd0\xc0\xa0\xd2\x34\x30\xc1\x51\xa5\ \xe6\xc0\xda\x38\x14\x9c\x3a\x77\x92\x87\xcf\x9f\xa6\xd1\xa8\x13\ \x46\x82\xb1\xf1\x90\x91\xb1\x90\x24\xf9\x63\x60\x0f\xa0\xd7\x53\ \xc0\x5e\xbb\xd5\x67\x69\x69\x9d\xb5\xd5\x96\x0b\x72\x03\x6e\xde\ \xba\xfe\xc1\x33\xcf\xfe\xde\x1f\xfe\xce\xb7\xfe\xc5\x1b\xa8\x8a\ \x50\x2d\xa0\xd3\x6c\x8e\xae\xc2\x1e\x2d\x80\xca\xfa\x18\xe2\x05\ \x28\xb5\xed\x18\x80\xa8\xfc\x1d\x7c\xfe\xf3\x9f\x7f\x68\x6e\x6e\ \xee\x17\xa2\x28\xfa\xf9\x91\x91\x91\x2f\x9e\x3a\x75\x2a\x32\xea\ \xdc\xc6\xc6\x06\x1b\x1b\x1b\xac\xac\xac\x70\xf7\xee\x5d\x56\x56\ \x56\x68\x36\x0e\xf2\xcb\xbf\xf4\xdf\xf3\xc5\xcf\xff\x49\x9c\xe1\ \x6c\x02\x5b\x84\x2d\xe5\x95\x17\x8a\xf0\xb3\x42\xa1\xfe\x06\xf1\ \x0f\xbc\x60\x9f\x58\x67\xfa\x05\x7a\x73\x0f\xd5\x95\xb1\x85\x05\ \x6f\xbc\xf9\x7b\xdc\x99\x7d\x8d\x66\xb3\xc9\xfa\xfa\x3a\xeb\xeb\ \xeb\x5c\xbb\x76\x8d\x33\xa7\x9f\xe0\xe7\xfe\xe4\xaf\x6b\x75\x57\ \x5a\x0a\x2d\xb4\x3b\x4a\xd5\x13\x50\xb6\xbf\x0d\xfc\x31\x19\x85\ \xa1\xf3\xfd\x07\x7a\xdc\x52\x4f\xa3\x52\xf1\x1d\x8a\x6e\x26\x69\ \x18\x23\xb0\x9f\x71\x55\x6e\xf4\x69\x1d\xb4\xe4\x07\x08\x95\x6d\ \x0c\x1b\x6f\xe3\xf5\x5b\xa2\x73\x4b\xf8\xee\xce\xa6\x1a\x91\xd6\ \x11\x30\x49\x39\x86\x68\x85\x3d\xa9\x8b\x7f\x68\xbc\x20\x28\x74\ \x90\x9e\xd1\x3c\x6c\x5c\x7e\x80\x90\xb9\x65\x1c\x52\x16\x34\xea\ \x09\xe7\xce\x9e\xe5\xcc\x99\xe3\x44\x51\xa8\xec\xfb\x03\x21\xcd\ \x66\x48\x92\x26\xff\xd9\x03\x7b\x52\x42\xaf\x5b\xd0\xed\x48\x36\ \x37\xba\x2c\x2d\xad\xb3\xb1\xde\xb6\xe7\xf3\x3c\xcf\x3e\xfe\xe4\ \xfd\x37\x7e\xf7\x3f\xfc\x8b\xdf\x7f\xf5\xb5\x17\x3e\xc6\x11\xbe\ \xd9\x07\xa2\x37\x3a\x32\xb6\xa1\x7b\xdb\xf5\x7d\xd5\x1a\x74\xa4\ \xab\x41\x40\x73\x8a\xea\xdf\x51\xe5\xa0\xf8\xf9\x9f\xff\xf9\xda\ \x0f\x7e\xf0\x83\xe3\x52\xca\xd3\xc0\x29\xe0\x64\x18\x86\x27\x93\ \x24\xf9\x5a\xb3\xd9\x7c\xf4\xc4\x89\x13\x4c\x4e\x4e\xd2\xeb\xf5\ \x68\x36\x9b\x2c\x2f\x2f\x53\x14\x05\xb3\xb3\xb3\x2c\x2c\x2c\xb0\ \xbc\xbc\x8c\x20\xdc\x78\xfc\xd1\x9f\x4b\xff\xe4\xcf\xfc\x85\xf8\ \xf0\x91\x09\xd5\xb9\x06\xa9\xa4\x8e\x06\x33\x92\x5f\x85\xb6\x66\ \xe4\x59\x5f\xd9\xe3\x5a\x45\x57\x92\x3e\x24\x8a\x63\xa2\x20\x71\ \xa8\xbf\xce\xf2\x0b\x84\x46\xfe\x05\xfc\xe0\xad\x6f\x73\x67\xf6\ \x35\xa6\xa7\xa7\x99\x9b\x9b\x63\x71\x71\x91\x99\x99\x19\x46\x9a\ \x07\xf8\x0b\xbf\xfa\x77\x89\xc2\x48\x9b\xac\x7e\x64\x61\x6e\x6b\ \x0a\x48\x21\x75\xd9\x70\x25\xf9\xa3\xc0\xa5\x14\x1b\x66\x83\xd6\ \x00\xb4\x50\x1c\x24\xfa\x61\xc7\x30\x44\x4e\x19\xfd\x1f\xf6\xe6\ \x24\xda\x47\xaf\x53\x6d\x2d\x3c\xa0\xe3\x07\xa5\x22\x4c\x97\xb6\ \xab\x90\x7d\xbf\xb3\xb2\xa9\xe0\x30\x03\xbc\x4a\xbf\xfe\x60\x0d\ \x2f\x12\x68\x3c\xd0\x07\x0a\x29\x9c\xcd\x81\xca\xdd\x97\xb2\x60\ \x62\x62\x84\x73\x67\x4f\x70\xf4\xe8\x94\xb6\xef\x43\xc6\x0e\x84\ \xa4\xb5\x80\x7a\xbd\x4e\xb3\xd9\xfc\xcf\x1a\xd8\x2b\x0a\x05\xec\ \xf5\xba\x05\xeb\x6b\x6d\x96\x16\xd7\x69\xb7\x7b\xf6\x7c\xa7\xd3\ \xde\x7c\xfb\x9d\xd7\x2f\xfe\xab\xdf\xfe\xbf\xbf\x73\xfd\xc6\xe5\ \x3b\x28\xc2\x37\xb5\x20\x4d\x19\xf8\x3e\x90\x35\x1a\x23\xed\x61\ \xf7\xd8\x4b\xf3\x4c\x00\xd3\x86\x9a\x00\x21\x90\x3e\xf9\xe4\x93\ \x7f\x77\x63\x63\xe3\xef\x1c\x38\x70\x40\xe8\xb2\xd5\x84\x61\x68\ \xd1\xda\x38\x8e\x91\x52\xd2\xe9\xa8\x7c\xfa\x6b\xd7\xae\xd1\x6a\ \xb5\x98\x9d\x9d\x65\x7d\x7d\x9d\x3c\xcf\x17\xa4\x94\xff\xef\x67\ \x3e\xfd\x4b\xf2\xcc\xa9\x2f\xfd\xf5\x24\xa9\xc5\xd5\xdd\x5a\x94\ \x64\x34\x36\x7f\x46\x9e\x65\x64\x99\x91\xfc\x39\xc8\xc2\xd6\xde\ \x53\x51\x7e\x89\x96\xc8\x7a\x37\x1e\x5c\x7c\xbc\x08\x04\x6f\xbc\ \xf5\x6d\x6e\xdd\x7d\x85\x91\x91\x11\x56\x57\x57\xb9\x7d\xfb\x36\ \xd7\xaf\x5f\x27\x49\x1a\xfc\xd7\x7f\xf5\x1f\x30\x36\x3e\xa5\xef\ \x6d\x8a\x49\x98\x2a\xb1\x7d\xb5\x8f\x80\xb5\xa1\x75\xd6\x9f\x49\ \x29\x36\x79\xff\xc2\x93\xfe\x5a\xf4\xef\x9d\x11\x68\x45\x5b\x3a\ \x9a\x32\xc4\x27\x07\xb4\x02\x57\x3b\xcf\x86\x0f\x5b\xb7\xa3\xf9\ \xac\xaf\x0d\xdc\x38\x84\x0e\xe2\x71\x45\x48\xa4\x66\xb8\x60\x62\ \xf2\x2d\xd0\xa8\x19\x8b\xad\xc6\x67\x34\x15\x7b\x89\x62\x53\x02\ \xe5\x22\x95\x48\x8e\x1d\x9d\xe4\xdc\xb9\x63\x1c\x38\x30\x4a\x10\ \xb8\xf8\xfc\x38\x09\xf6\x15\xd8\xf3\x31\x82\xfb\xda\x06\xfc\x47\ \xdc\xf2\x4c\xd2\xe9\x48\x7a\xdd\x9c\xb5\x55\x85\xe8\xf7\x7a\x99\ \x3d\xbf\xba\xba\x3c\xff\xf2\xab\xcf\x3e\xf7\x2f\xff\xd5\x3f\x7d\ \x6e\x7d\x63\x6d\x19\x57\xf9\xd9\x6c\xfe\xd2\xc1\xed\x01\x91\x01\ \xa4\x69\xed\xde\x7d\x81\xba\x55\xdc\x80\x03\xda\x40\xa4\x3f\x84\ \xc0\xd8\xd7\xbf\xfe\xf5\xf1\x3b\x77\xee\x68\x7c\x48\xa9\x7b\x51\ \x14\xd1\x6a\xb5\x28\x8a\x82\xc5\xc5\x45\xba\xdd\x2e\x2b\x2b\x2b\ \x2c\x2d\x2d\xb1\xbe\xbe\xae\x00\xbb\xa2\x98\x91\x52\xfe\x33\xe0\ \xb7\x81\x5a\x9a\x34\x7e\x55\x10\x08\x13\x0a\x6c\xd4\xce\x42\x87\ \x81\xe6\xb2\xd0\x01\x3e\x7d\xbd\x95\x77\x66\x6b\xbb\x19\xd0\x2d\ \x8e\x62\xa2\x28\xd5\xb5\xfd\x22\xb7\xa7\x9f\xd6\xa9\x85\x80\xd7\ \xdf\xfc\x36\x37\x6e\x5e\x64\x7c\x7c\x9c\x4e\xa7\xc3\xcd\x9b\x37\ \xb9\x76\xed\x1a\x49\xd2\xe0\xd7\x7f\xed\x1f\x71\xec\xe8\x43\x76\ \x11\xa9\x6d\xbe\x4c\x64\x61\x66\x13\x6b\x14\xb1\x38\xbf\x7f\x29\ \xba\xd0\x30\x1b\x21\xca\x04\x3e\xc0\x08\x74\xae\x3c\x5b\x33\x02\ \xcf\x34\x77\xb3\xef\x81\x7f\xc6\x1d\x68\xfe\x46\x78\xf1\x06\x5a\ \xa2\x0b\x03\xfb\x5b\x2e\x52\x58\x90\x40\x6a\x4a\x2e\x79\x10\x2a\ \x36\x88\x14\x5e\xe4\x9f\x56\xe7\xcd\xe9\xc2\xe6\xdf\x6b\xe6\x23\ \x0b\x82\x48\x70\xfa\xc4\x51\xce\x9c\x3e\x42\xad\x96\x12\x45\x2a\ \x3e\x7f\x64\x2c\x22\x8a\x82\x3d\x01\x7b\xf7\x02\xfe\xed\xf6\x3b\ \xff\x29\x19\x45\xbf\xa7\x80\xbd\x6e\x37\x67\x75\x65\x93\xe5\xa5\ \x0d\xb2\xcc\x21\xfa\xb7\xef\xcc\x5c\x79\xe6\xd9\xff\xf8\xfd\xdf\ \xf9\xd6\xff\xf7\x46\x51\x14\x66\xff\x47\x43\xf8\x6d\x14\xd1\xb7\ \x71\x85\x60\x4d\x15\x68\x91\x26\xb5\x3e\xc0\xfd\x3c\xde\x36\x18\ \x80\x80\xb2\x09\x90\x27\x49\x72\x73\x6d\x4d\x6d\x65\xbd\xb9\xb9\ \x49\x51\x14\xac\xae\xaa\xcd\x2d\x5b\xad\x16\xab\xab\xab\x6c\x6e\ \x6e\x9a\x92\xd3\xef\x48\x29\x7f\x07\xf8\x16\xf0\x3e\x6a\x8b\xaa\ \x26\x10\x85\x61\x12\x08\x21\x44\xa0\xdd\x4c\x76\x85\x4a\xa9\x91\ \xfe\xbe\x93\xfa\x7a\x57\x1f\x3d\x58\x82\x20\x22\x0e\x95\xca\x1f\ \x45\x89\x05\xe2\x0c\x5a\x0d\x2a\xc9\xe8\xb5\x37\x7e\x97\x5b\x77\ \x5f\x63\x72\x72\x92\x4e\xa7\xc3\xcc\xcc\x0c\x57\xae\x5c\x21\x8e\ \x6b\xfc\xfa\xaf\xfd\x03\x8e\x1f\x7b\xd8\x7b\x34\x9d\xe0\xe2\x99\ \x1c\x36\xbe\x40\xe8\x92\x5f\x71\xa4\xee\x17\xc5\x25\xe9\x6f\x40\ \x46\x0f\xc2\x70\xd2\x7f\x47\x46\xe0\x47\xda\xb1\x85\x11\xef\x5e\ \x87\x51\xeb\x95\xb4\xd7\x1a\x87\xa6\x79\xdf\xae\x70\x76\xbf\x4e\ \xe0\x81\x41\x2f\x80\xbd\x8d\x49\x10\xaa\x9a\x13\x86\xc9\x7b\xcb\ \x41\x03\x7e\xb5\x7a\xcc\x99\xd3\xc7\x39\x7e\x7c\x8a\x30\x54\xea\ \xbd\xf1\xdf\x47\x51\xb4\x23\xb0\xf7\xa3\x46\xfa\xab\xf7\x7b\xe0\ \x0c\x41\x42\x57\x07\xee\xf4\xba\x19\x4b\x4b\x1b\xac\xae\x6c\x58\ \x26\x5a\x14\x79\xfe\xf1\x27\x1f\xbc\xfb\x1f\xfe\xe3\xbf\xfe\xde\ \x4b\x2f\x3f\xf3\x11\x4a\xbd\xdf\x4e\xe2\x1b\xa9\x6f\xa2\x69\x41\ \x05\xf1\xb9\xc2\x0c\x7b\x69\xde\x74\x04\xa2\xe4\x06\xac\x9c\x55\ \x6e\x40\xa9\x6f\xbe\x76\xe9\xd2\xa5\xe7\xde\x79\xe7\x1d\x5b\x5d\ \xc6\x6c\x32\xa1\xb5\x81\x75\x29\xe5\x0f\xa5\x94\xff\x1e\xf8\xf7\ \xc0\x15\xdd\x99\xd9\x1d\xd8\x46\x04\x06\x41\x14\x09\x21\x84\xb0\ \xc0\x5b\x61\x91\xf7\x2c\xcf\xc9\x33\x2d\xf9\xb3\x0c\x13\x3a\x1a\ \xe8\x80\x9b\x28\x8a\x89\xe2\xd4\x06\xfa\x04\x41\x64\x01\xad\x40\ \x08\x7a\xfd\x2e\x7f\xf8\xdd\xdf\x24\x2b\x16\x18\x1b\x1b\x63\x65\ \x65\x85\x3b\x77\xee\x70\xf5\xea\x55\xc2\x30\xe1\xaf\xfd\xda\x3f\ \xe4\xc4\x89\xc7\xd4\xbc\x15\xc6\xec\x90\xd6\xf7\x5f\xe8\xf8\x02\ \x93\x5b\x60\x5c\x8c\x51\x98\xb8\x5a\x82\x26\xee\x1f\xac\xf4\xf7\ \x5f\x84\x21\xe8\x5d\x33\x02\xa3\x5a\x0f\x63\x04\x46\x43\xd2\x45\ \x53\x4a\x5b\xf1\x59\xe9\xef\xfa\x30\xb8\x80\xd9\x8e\x63\xd0\xde\ \x77\xab\xc5\x62\x02\xd2\x8b\x4f\xf0\x8a\x6c\x5a\x46\x93\xab\x77\ \x7c\xe0\x60\x93\x53\xa7\xa6\x39\x34\x7d\x00\x50\x65\xb4\xc7\xc6\ \x15\x03\x48\x92\xed\x81\xbd\x3f\x4a\xee\xbd\x07\x65\x46\xc8\x42\ \xc5\xe7\xf7\xba\x92\x4e\xa7\xc7\xd2\xe2\x3a\xeb\x6b\x2d\xcb\x44\ \xbb\xdd\x4e\xe7\xed\x77\x5e\x7f\xed\xb7\xff\xed\xff\xf3\xfd\x2b\ \x57\x2f\xdd\x42\x11\xbe\xf9\x69\xe9\x1f\xb3\xe7\xc3\x30\xc2\x37\ \x34\x14\x00\x04\x41\x98\x73\x9f\xcd\x03\x01\x87\x36\xa3\x01\x14\ \x40\xef\xe5\x97\x5f\x7e\x6b\x75\x75\xf5\x5f\x49\x29\xaf\x03\x33\ \x45\x51\x5c\x03\x6e\x00\xd7\xa5\x94\xab\xfe\x17\xbd\x62\x03\x66\ \xd5\x99\x88\xc0\x22\x08\xa3\x50\x2b\x9f\xba\xa0\x87\x62\x24\x59\ \xde\xa7\xc8\x72\xf5\xbb\xc8\x30\x41\x40\x21\x5e\x88\x6f\xac\xfc\ \xfc\x6a\x4f\xbb\xc0\x4a\x3a\x01\x2c\x2c\xce\xf0\xbd\x67\x7f\x93\ \x43\x87\x0f\x20\xc4\x01\x56\x57\x57\x99\x9d\x9d\xe5\xea\xd5\xab\ \x08\x11\xf1\xeb\xbf\xf6\x0f\x39\x7d\xf2\xc7\xd4\xa0\xfc\x70\xdd\ \x42\x2a\x80\x51\x6b\x1c\x85\xae\x28\x24\x4c\xb5\xdf\x48\xd7\x13\ \x88\xf4\x46\x22\xc2\x94\xfd\x66\x40\xfa\x7b\x90\xfe\x2e\x18\x01\ \x25\xaf\x41\xf5\x7b\x03\x84\x6e\x82\x79\x84\xf6\x2c\x48\x0f\x1f\ \xf0\x62\x02\x10\x5e\x5d\x7d\x63\xff\xe3\xaa\x13\xb9\xc1\x16\x9e\ \x17\xc1\x00\x79\xca\xb6\x2f\x84\x44\xe6\x6a\xac\x87\x8e\x1e\xe0\ \xd4\xc9\x29\x46\x47\x1b\x98\x6d\xb0\x47\xc7\x43\xa2\x48\x6c\x0b\ \xec\xfd\x51\x22\xfa\xad\xda\x7e\x30\x83\x3c\x97\x74\x3b\x92\x5e\ \xb7\xa0\xb5\xa9\x10\xfd\xcd\x8d\x8e\x3d\xbf\xb6\xb6\xb2\xf2\xf2\ \xab\xcf\x5d\xfc\xd7\xff\xe6\x9f\xbd\xb0\xb2\xb2\xb4\x84\x93\xf8\ \x66\x93\x17\x83\xec\x77\x71\x1b\xbe\x54\xf7\x7d\x70\xc1\x28\x9a\ \x09\x04\xf7\x34\xbf\xe5\xea\x5b\x41\x10\xaa\x83\xe6\xa4\xfb\x5b\ \x42\xd9\x04\x90\x8b\x8b\x8b\x6b\xc0\x9f\xdf\xcd\x6d\x86\x45\x04\ \x9a\x53\x82\x30\x01\x11\xa8\xc8\x3e\x74\x01\x8b\x4c\xff\xe4\xaa\ \xea\x4e\x21\x41\xa8\xd2\xe1\x2a\xb9\xc7\x94\xf3\x8e\x5d\xa0\x8f\ \x86\xad\x55\x1d\xff\x67\x79\xf7\x83\xdf\x63\x7a\x5a\xc5\x12\xcc\ \xcf\xcf\x73\xf3\xe6\x4d\x66\x66\x66\x48\x92\x3a\x7f\xed\xaf\xfe\ \x1f\x9c\x39\xfd\x29\x40\x17\x9d\x30\x80\x58\xa1\x77\x0d\x36\xae\ \x46\xcd\x00\x4c\xf8\x70\x64\x0a\x8a\x44\x89\x4b\x2b\xb6\x66\x93\ \x51\xb5\x19\x20\xde\x7b\x61\x04\x62\x18\x38\xe0\xdb\xff\xbe\xf4\ \xd7\xfd\x1a\x45\x61\x30\x68\xd0\x25\x19\x19\x3d\x51\xf8\xb0\xbe\ \x54\x1d\xaa\x6d\xb3\x64\x69\xdb\x2d\x59\x40\x14\x09\x8e\x9e\x98\ \xe4\xf8\xf1\x49\xd2\x34\xc6\x6c\x83\xdd\x1c\x0d\x09\x43\xb1\x2d\ \xb0\xb7\x5f\x84\xbf\xd7\x7e\xee\x57\x9a\xef\x95\x19\x64\x7d\x49\ \xa7\x53\xd0\xef\x49\x36\xd6\x15\xa2\xdf\xe9\x38\x44\xff\xce\xdd\ \x9b\x37\x9f\x7d\xee\xdb\x2f\xfc\xfb\xdf\xfd\xad\xd7\xf3\x3c\x37\ \x04\x6f\x7e\x8c\xaa\xbf\x95\xc4\x1f\x46\xf8\xfe\xa0\xac\xd3\xfa\ \x7e\xda\x16\x1a\x80\x65\x04\x7b\xf6\xd7\x88\xc1\xb7\x56\xcd\x36\ \x92\x02\x99\xc8\xa2\x10\x85\xcc\xc9\x32\xcf\xe5\x56\x64\x1a\x08\ \x04\x5b\x70\x43\x6f\xe2\x61\x02\x7d\x6c\xde\xbd\x10\x28\x1b\x37\ \xe7\xf7\xbf\xf3\x4f\xe9\xe7\x77\x39\x7a\xf4\x08\x45\x51\x70\xeb\ \xd6\x2d\xae\x5f\xbf\xce\xc2\xc2\x02\x47\x0e\x9f\xe5\xaf\xfc\xa5\ \xbf\xcf\xa1\xa9\x93\xde\x80\x8c\xcf\xde\x84\x17\x6b\xa0\x31\xcf\ \xf4\x0e\xc2\xca\x9c\x10\xa1\xb2\xfb\xe3\x28\x71\xc8\xbf\xbf\x8f\ \xa0\xe7\xb9\xd8\xca\x0c\xd8\x3b\x23\x50\x31\xf6\x96\xe8\xd5\xa4\ \x5a\x74\x5f\x68\x2c\xc0\xc4\xe6\xdb\xcd\x2f\x35\x6e\x60\xbc\x09\ \x68\x62\x46\x0a\x53\x76\xd1\x62\x08\x56\x01\xd0\xee\x3f\x75\x0b\ \x65\x06\xd5\x6b\x11\xc7\x8e\x1f\xe4\xc8\xe1\x71\x82\x20\x50\xf6\ \xfd\x81\x90\x46\x53\xcd\xfb\x56\xc0\xde\xfd\x10\xfd\x83\x66\x18\ \xf7\xc2\x18\xaa\xde\x29\xbf\xf5\xba\x2a\x70\xa7\x9f\x15\xac\xad\ \x6e\xb2\xb4\xb4\x41\x5f\x23\xfa\x45\x51\x14\x9f\x5c\xfe\xe0\xd2\ \x7f\xfc\xf6\xbf\x79\xfe\xc2\x8b\xdf\xfd\x90\xb2\xb4\x37\x84\x6f\ \xc0\x3d\x23\xf5\x0d\xb8\xe7\xab\xfa\x25\xa1\x29\xf5\x40\xc4\x10\ \x2e\xb5\xe7\xa7\xf3\xba\xd8\x22\x0e\xc0\xb6\x5d\x33\x00\x6f\x60\ \xfe\x6f\x23\x2a\x23\x94\x27\x21\x00\x22\x29\xa8\x29\x89\xdb\xa3\ \xd7\xc7\x4a\x60\x33\xd7\xa6\xd4\x56\xa4\x83\x6e\xa2\xd0\xa8\xfd\ \x6a\xd3\x0d\x95\x76\x1f\x70\xe3\xe6\xfb\xbc\xfc\xca\xbf\xe6\xe0\ \x44\x9d\x20\x4a\x69\xb5\x5a\xdc\xba\x75\x8b\x2b\x57\xae\xd0\x6a\ \xb5\xf8\xdc\xd3\x3f\xc3\x9f\xff\x73\xff\x13\x49\xa2\x00\x29\x89\ \x99\x33\x1d\xb0\x52\x18\xd0\x51\xff\xe8\xd8\x03\x21\x40\x04\x21\ \xb1\x96\xfa\x2a\xbb\x30\xb6\xc4\x6f\x78\x59\x49\xfa\xef\x60\x06\ \xec\x8a\x11\xe0\xf7\xa7\x8e\xf9\x66\x80\x8b\x1a\xd4\x4c\x02\x28\ \x29\xf7\x3a\x3f\x5f\xa5\xe1\x0e\x62\x04\x80\xb5\x0d\x4c\xb0\x95\ \xd0\x45\x54\xc6\xc7\x6b\x1c\x3d\x7a\x80\x89\x89\x26\x08\x68\x6a\ \xff\x7d\x92\x06\xdb\x02\x7b\x0f\x12\xbd\xdf\xaf\x76\x3f\x20\xa0\ \xf9\x6e\x51\x68\x34\xbf\x23\xc9\xb2\x9c\xe5\xa5\x0d\x56\x96\x37\ \x6c\xa8\x6e\xaf\xd7\xed\xff\xf0\xed\xd7\xde\xfe\xb7\xff\xee\x9f\ \x3f\xff\xc9\xe5\x0f\x66\x28\x13\xbd\x4f\xf8\x46\xe2\x57\x09\x7f\ \x4b\x89\x2f\xbd\x01\x7b\x9a\x35\x42\x04\xd5\x10\xcc\x3d\x37\xcf\ \x0d\x68\x1f\xd9\x3f\xbf\x2b\x06\x50\xa9\x2e\xea\xbb\x15\xcc\xd6\ \xe0\xb1\xfe\x49\x81\x58\xe6\x45\x23\x2f\xfa\xe4\xb9\xca\x6c\xb2\ \xcf\x27\x84\xdd\x61\x57\x01\x6e\x89\x2e\xb8\x11\xdb\xd8\x7e\x11\ \x08\x56\xd7\xe6\x78\xfe\x85\xdf\x22\x97\x4b\x1c\x3d\x36\x45\xbf\ \xdf\x67\x69\x69\x89\x99\x99\x19\x66\x66\x66\x90\x12\xfe\xec\x2f\ \xfd\x0f\xfc\xc4\xd7\xff\x9c\xea\xd7\xf1\x51\xab\x22\x17\xe8\x3c\ \x7f\x9d\x52\x6c\x92\x8b\x10\x20\x08\x2d\xe1\xc7\x06\xf9\x17\x6e\ \x23\x11\xac\x74\xa8\xcc\xd8\x2e\x88\x7e\x5b\x46\x20\x4a\x96\xba\ \x65\x04\x26\x83\xde\xaf\xcc\xab\xee\x6b\xa8\x5b\x7d\xaa\xc6\x00\ \x50\x72\x0d\x62\x09\x5f\xe8\xdd\x3e\x0c\xc0\xfa\xd0\xb9\x29\x0e\ \x1d\x1e\x23\x08\x74\x19\xed\xf1\x90\x30\x12\xdb\x02\x7b\x7b\x25\ \xe2\x3f\x4a\x78\xc0\x5e\xdc\x87\xaa\xf0\x46\x4e\xaf\x5b\xd0\xeb\ \xe5\x2c\x2d\xae\xb3\xb6\xba\x69\x11\xfd\xd5\xd5\xa5\xee\xf3\x17\ \xfe\xf0\x83\xdf\xf9\xd6\xbf\xbc\xb0\xb2\xb2\x78\x03\x58\x45\xb9\ \xf2\xaa\xaa\x7e\xd5\xc6\xdf\x56\xe2\xeb\xfb\x6f\xc7\xa9\xa4\x5b\ \x81\xf7\xde\xbc\x64\xa0\x2a\x23\x00\x76\xc1\x00\x3c\xe2\x0f\x70\ \x04\x1f\x56\x3e\x27\x28\xe2\x4f\x80\xb4\xa0\xa8\xe7\x79\x86\x94\ \x39\xb2\x10\xa0\x55\x7a\x53\x5e\x2b\x8c\x7d\x7f\x7b\xac\x37\xde\ \x08\xe8\xf7\xbb\x5c\xb8\xf0\xdb\xcc\xdc\xfc\x01\x27\x4e\x1e\x27\ \xcb\x9a\x2c\x2d\x2d\xb1\xba\xba\xca\xd5\xab\x57\x59\x5a\x5a\x62\ \x7c\x6c\x8a\xbf\xf2\x17\xff\x3e\x67\xcf\x7c\x5a\x8f\xcf\x48\x41\ \x2d\x2b\x75\xfc\x02\x45\x41\x5e\x28\x6f\x43\x96\xf5\x29\xf2\x0c\ \xd0\x95\x7e\xb5\xea\x6f\x7f\x42\xb5\xe1\xa7\xd0\x9d\x19\x18\xc5\ \x80\x88\x56\xf5\x36\x93\x62\x55\x77\x7c\xa3\x5c\x9d\xda\x8a\x11\ \x98\x4b\x0d\x1e\x20\xb7\x3e\x6e\xdd\xfc\xc2\xfd\xed\x83\x85\x14\ \x8a\x39\x98\x94\x5c\xf5\x7d\x81\xdd\xcb\xcf\xa8\xfd\xc0\xc8\x68\ \xca\xa1\xc3\x63\x4c\x4c\xc5\x8c\x8c\x2a\xed\x6a\xa7\x88\xbd\xdd\ \x12\xd0\x7f\x0a\xa2\xdf\xcd\x3d\x77\xa3\x01\xf4\xfb\x5a\xcd\xef\ \x17\x74\xda\x3d\x16\x35\xa2\x6f\xda\xfa\xfc\x15\x6e\x7d\xf0\x07\ \xf2\xff\xfa\xb7\xdf\x7e\xe3\xd6\xec\xf2\x07\xc0\x5d\x60\x0e\x58\ \xc6\xf9\xf2\xb7\xb2\xf1\xfd\x1a\x19\xe5\xec\x29\xb6\x27\xfc\x21\ \x26\xf6\xde\x9a\x28\x53\xb9\xc9\x99\x61\x90\x01\xec\x1a\x03\x30\ \xc4\x6f\xdc\x7d\x31\x4e\xe5\x37\x3f\x11\x8a\x01\xd4\x80\x18\x29\ \x13\x93\xe9\xa7\x76\xd2\xd5\x84\x6f\x72\xec\x75\xb2\x4d\x10\xe8\ \x32\xdb\x81\xe0\xcd\xb7\xbe\xcb\x07\x1f\x7d\x8f\x5a\x3d\x62\x6a\ \x7a\x92\xf5\xf5\x75\xda\xed\x36\x37\x6f\xde\xe4\xee\xdd\xbb\xf4\ \x7a\x3d\x1e\x39\xff\xe3\xfc\xe5\xbf\xf8\xbf\x31\x3a\x3a\xe1\x19\ \x46\x1a\x53\xc0\x86\xb7\xa8\x12\xe2\x1a\x70\xcc\xb3\x8c\x22\xef\ \xeb\xed\xc3\x55\x99\x32\xa7\xf6\x27\x04\x16\x70\x54\xd5\x7e\x5d\ \x51\xbb\x92\xf0\x75\xf7\x32\x33\x2c\x2b\xe7\x77\x62\x04\xc2\xfe\ \x2a\x37\xcf\x4f\x4f\x05\x1f\xf4\x19\x8d\xd4\x1c\xc3\x81\x85\x1e\ \xe8\x27\x51\xa6\x81\xfe\x60\x4a\x79\x15\x40\xa3\x91\x22\x04\xba\ \xf8\x46\x8d\xd1\xd1\xd1\x2d\x23\xf6\x7e\x54\x84\xff\xa0\x19\x47\ \xd5\x8c\x16\x9e\x46\xd7\xef\xa9\x34\xdc\x3c\x97\x6c\xac\x77\x58\ \x5a\x5c\x67\x73\xb3\x63\xaf\x5d\xbc\xf9\x43\x16\x3e\xfe\x1e\x2c\ \xbf\x4f\xbd\x16\x89\x47\x8e\x36\xd3\x5b\xb3\xcb\x9b\x28\xc9\xbf\ \x08\x2c\xe0\xdc\x7a\x86\xf0\x87\xa1\xfa\x92\xd2\x8a\xd8\x51\xe2\ \x0f\x34\x03\x02\xda\x80\x34\xef\x99\x76\xdb\xb6\x28\x09\x66\x3b\ \xdb\x96\x01\x54\xec\x7e\xa3\xea\xa7\xfa\xb7\xaf\x09\x18\xe6\x60\ \xfc\x97\x71\x28\x54\x34\x9f\x08\x03\x5d\xb9\xb7\x5a\x61\x37\xa4\ \x28\x72\xde\x79\xef\x79\xde\xff\xf0\x19\x9a\x23\x11\xa7\x4e\x1f\ \x23\xcb\x32\x66\x67\x67\x59\x5d\x5d\xe5\xca\x95\x2b\xb4\xdb\x6d\ \x46\x9a\x07\xf8\xe5\x5f\xfa\xdb\x7c\xf5\x4b\x3f\xef\x38\x9a\x30\ \x36\xbf\x99\x14\x90\xb2\x50\x9b\x87\xe4\xb9\x4a\x2c\xca\xfa\x96\ \xf8\x03\x01\xe8\xe4\xa2\x38\x4a\x88\xe3\x94\xb8\xb4\x8d\x98\x93\ \xfc\x18\xc9\xea\x54\x80\x32\x11\x57\x20\xf9\x1d\x19\x81\x99\xd0\ \x81\x28\x1d\x77\xdc\xa4\xdd\x96\xbd\x06\x1e\x18\x08\x98\xdd\x7c\ \x5c\xf9\x30\xf5\x87\xa6\x7f\xc5\x02\x45\x80\x14\x85\x57\x06\xb0\ \xb0\x73\x54\xab\xd5\xee\x0b\xd5\xff\xa3\x88\x07\x6c\x07\xe6\x99\ \xf3\x52\x42\xb7\x93\xd3\xed\x14\xe4\xb9\x64\x6d\xb5\xc5\xe2\xe2\ \x1a\xdd\x8e\x32\x51\xf3\xac\xc7\xec\xe5\x17\x59\xbc\xf2\x2c\x49\ \xb6\xcc\x48\x2d\x64\xe4\x60\x83\x91\x44\xf2\xe4\xd9\x03\xa3\xcf\ \xbc\x75\xb3\x8d\xb2\xf9\x57\x81\x15\x94\xf4\x37\xc4\xef\xdb\xf8\ \xbe\xc4\xdf\x8d\x9a\xbf\xed\xa3\xe1\x31\x8f\x61\xcf\xec\x37\x73\ \x9b\xb2\xc0\x1a\x8a\x01\x94\xda\x6e\x41\x40\xdf\x04\x30\xc4\x6e\ \x88\xdf\xfc\x48\xd4\x04\xf4\xc2\x20\x89\xc3\x30\x26\x4a\x5c\xee\ \xbe\xb1\xf3\xa3\x30\x64\x76\xee\x3a\x6f\xbf\xf7\x3d\x6e\xdd\x7e\ \x8f\x13\x27\x8e\x31\x31\xa9\xd4\xd1\xc5\xc5\x45\x36\x36\x36\x6c\ \xbd\xc0\x30\x88\xf8\xe9\x6f\xfe\x97\xfc\xec\xcf\xfc\x65\x6a\xb5\ \xa6\xe5\x87\x76\x50\x26\xc4\x58\x5b\xfd\xb2\xd0\x39\xfe\x3a\xb9\ \x28\xcf\x7b\xe4\x36\x7f\x3d\x50\x85\x44\xa3\x44\xc5\x1a\x78\xd8\ \x83\x35\x93\x6c\xe0\x80\xff\xe4\x43\xd4\xff\x1d\x18\x41\x99\xe8\ \xbd\xeb\xf1\x69\x5f\x83\x75\x46\x53\x30\x65\x0a\x74\x4c\xbf\xd3\ \x1c\x8c\x64\x47\x13\xbe\x1b\x8f\x25\x7c\x6b\x06\x81\xdd\x9a\x4b\ \xdb\x0e\x85\x97\xca\x3b\x6c\x2d\xee\x77\x18\xef\x83\x0a\x0b\xde\ \x4b\x9f\x36\xfc\xbb\x80\x6e\x3b\xa7\xdb\x55\x7b\x0b\x2e\x2f\x6d\ \xb0\xb4\xb8\x46\x5f\x17\xdf\xe8\xb4\x56\xb9\x7d\xe9\x19\xd6\x6e\ \xbc\x44\x3d\xe8\x31\x51\x8b\x18\x19\x6d\x30\x52\x8b\x18\x8d\xfa\ \x34\xc3\x1e\x9f\x12\xd1\xc8\xd8\x48\x4d\xae\x6d\x74\x7a\xb8\x6c\ \xbd\x4d\x06\xd5\xfd\x92\xc4\xbf\x0f\xc2\xb7\x8f\xb1\x17\x51\x5f\ \x0e\xcb\xf1\x8f\x7b\x3e\x6d\xef\xb0\xf9\xb9\xdf\x9a\x80\x85\xf7\ \x1b\x34\x37\x8c\xe3\x5a\x18\xc5\x29\x69\x92\x6a\x35\x3f\xa2\x28\ \x32\xde\x7d\xf7\x59\x2e\x5d\x7e\x91\x20\xec\x71\xf0\xe0\x41\x1e\ \x7e\xf8\x21\xba\xdd\x2e\xfd\x7e\x9f\xdb\xb7\x6f\xb3\xb0\xb0\xc0\ \xcd\x9b\x37\x29\x8a\x82\xa7\x9e\xfc\x06\xbf\xfc\x8b\xff\x1d\x53\ \x93\xc7\xdd\x98\x05\x6e\xf1\x1b\x5f\xbf\xd4\x15\x6d\x8b\x42\x87\ \x18\xf7\xe8\xe7\x3d\x17\xf0\x53\x14\x08\xbd\xc3\x4f\x14\xc7\xc4\ \x51\x4a\x1c\xa5\x56\x2b\x41\x18\xe9\x6f\x6e\xe3\x55\xce\xf5\xe7\ \x73\x0f\x8c\x60\xa8\xca\x5f\xe1\x00\xe6\xa3\x89\xf0\x33\x99\x78\ \xc6\xf9\xeb\x2b\x0a\xea\x79\x1d\x46\xe0\x03\x08\x52\x77\x60\x0b\ \x75\xa2\x81\x41\x3d\x10\x57\xfb\x70\xf0\x25\xee\x44\x88\xfb\x45\ \xf8\x3f\x6a\xac\x20\xcf\x94\xc4\xef\xf5\x25\x59\x5f\x01\x7b\xcb\ \x4b\xeb\x16\xd1\x5f\x9c\xbb\xc1\xb5\xf7\xbe\x43\xb6\xf8\x36\xe3\ \xf5\x90\xe9\x66\xcc\x68\x5d\x11\xfe\x48\x1a\xd1\x4c\x43\x9a\x71\ \x42\x5d\x82\xa8\x27\xa3\x87\x27\x47\x92\xb5\x8d\x8e\x44\xad\x6f\ \x63\xeb\x1b\x95\xdf\x17\x19\xfb\x45\xfc\xa6\x33\x2d\xd6\xf7\x3a\ \x7f\xee\x7a\xaf\x20\xd0\x80\xfa\x0f\xbb\xd7\x00\x0c\x91\xe7\xa8\ \x07\x07\x17\xb3\x6c\xce\x83\x36\x07\xa2\x28\x8d\x92\xb4\x86\x94\ \x70\xfd\xc6\x7b\x5c\xbb\xfe\x26\x77\x66\x3f\xe4\xd0\xa1\x29\xa6\ \x0f\x8d\x12\x04\x01\xad\x56\x8b\x95\x95\x15\x3a\x9d\x0e\xd7\xaf\ \x5f\x67\x71\x71\x91\x3c\xcf\x39\x71\xfc\x11\xfe\xec\x9f\xf9\x5b\ \x3c\x72\xfe\xe9\xca\xc3\xf8\xa1\xaf\x4a\xd4\x2a\x94\x5b\xb9\xfb\ \xfc\xac\xc2\x3c\xef\x93\x15\x99\xaa\x47\x1f\xa8\xdd\x7d\x95\xe4\ \x4f\x95\xe4\x8f\x63\x9b\x63\x60\xb5\x7e\xf3\x47\x89\xe0\xd5\x0d\ \x4b\xcc\x60\x37\x8c\xa0\x7a\xce\xb3\x43\xfd\x7b\x48\x2d\xbe\x85\ \x4e\xe4\x71\xd5\x77\x3c\x02\xd7\xf7\x2c\x95\xeb\x76\x43\xb1\x1a\ \x87\xe5\x2f\x36\xf4\x10\x3b\x37\xfe\x63\xa9\x47\xda\x1f\xc2\xdf\ \xea\xba\x1f\x05\xc1\x0f\x73\xfd\xa9\xc4\x9c\x5c\x55\xde\xe9\xf6\ \x59\x9c\x5f\x63\x65\x65\xd3\x02\xc3\x1f\x7e\xf4\x2e\x1f\xfd\xe0\ \x77\xd9\x5c\xb8\xc4\xe9\xe9\x11\x4e\x4c\x35\x99\x18\x49\x19\xad\ \x47\x34\xd3\x88\x91\x5a\x48\x23\x8d\xa8\xc7\x01\xf5\x48\x92\xf6\ \x7b\x8c\x45\xc9\xc8\x23\x27\x0e\x8e\x7d\x7c\x7d\xc1\x48\x52\xbf\ \x02\xf6\x7e\xa9\xfb\xc3\x9b\xed\xef\xde\xbb\x0d\xc4\x7d\x60\x00\ \xda\x27\x69\x46\x60\x88\xdf\x70\xc2\x92\x15\x3b\x32\x32\x22\xd2\ \x34\x9d\x28\x8a\xe2\x6b\xb7\x67\x2f\x9e\x98\xb9\xbb\xc6\x7b\x1f\ \xb5\x98\x98\x38\xc8\xc8\xc8\x08\x67\xce\x9c\xa2\xd7\xeb\xb1\xbe\ \xbe\xce\xda\xda\x1a\x77\xef\xde\x65\x79\x79\x99\x56\x4b\x55\x47\ \x39\x7a\xe4\x1c\xdf\xfc\xa9\x5f\xe5\xcb\x5f\xfc\x53\x26\x7c\xd1\ \x36\xe1\x31\x01\x7f\x4e\xac\xe4\x2f\x32\x72\xa9\x23\xfd\xb2\x1e\ \x45\xa6\x77\x10\x12\x28\xe9\x1f\x9a\x40\xa3\x44\xa5\x17\x07\xb1\ \xae\x2d\x00\xaa\xca\x8e\x51\xca\xa5\xbb\x9b\x74\x84\x56\x25\x7a\ \x25\x80\xb7\x61\x04\x98\x73\x65\x63\xdf\x84\xed\x1a\x0d\xc3\xe6\ \x08\x98\x1d\xb5\x0c\xcb\xf7\xec\x7b\xcb\x0f\xc0\x6e\xb7\xa7\xa7\ \x02\x57\x54\x48\xa9\x06\xaa\x7f\x6d\x56\x14\x0a\xd3\x28\x2a\x8b\ \x67\x3f\x88\x7f\xd8\x35\xff\xa9\x54\x7f\x29\xa5\x2e\xbc\x51\x90\ \x17\x92\xf6\x66\x97\xf9\xf9\x35\x8b\xe8\x67\x59\x9f\x37\x7e\xf0\ \x0a\x17\x5e\x7c\x96\xb9\xb9\xbb\xfc\xd8\xf4\x1a\xd3\xe3\x75\xa6\ \xc7\x1b\x1c\x99\xd0\x0c\xa0\x16\x51\x4f\x43\x1a\x49\x48\x2d\x12\ \xa4\x71\x40\x12\x0a\xe2\xce\x06\x04\x88\xaf\x3f\x36\x71\xf2\xf7\ \x2e\x5a\x00\x5c\x1b\x6c\x4e\xea\xef\x3b\xe1\xdf\x4f\x13\x65\xc2\ \x14\x36\xa9\x65\xa8\x19\xb0\x6b\x0d\xa0\x40\x11\xbd\x61\x04\xc1\ \xf8\xf8\x78\x14\x04\xc1\xb1\x38\x8e\xbf\x50\xab\xd5\xbe\x39\x32\ \x32\xf2\xa5\x34\x4d\x1f\x1a\x1d\x1d\x0d\xd2\x54\xd2\x6c\x1e\x01\ \xb0\x09\x45\xb3\xb3\xb3\xb6\x46\xe0\xca\xca\x0a\x79\x9e\x13\x45\ \x09\x5f\xfc\xfc\xcf\xf1\xd5\xaf\xfc\x22\x0f\x9d\x7d\x52\x0f\xcb\ \xb3\xf1\xbd\x27\xb2\x31\x51\x42\x42\xe1\xab\xfd\x8a\xe8\xb3\x2c\ \xa3\x9f\xf7\xc8\xf3\xbe\x8d\xf6\x53\x65\xc4\xb5\xbf\x3f\x4e\x89\ \x63\x5d\x4d\x38\x08\x54\x8e\x3f\xa6\x9a\xb0\xea\xdb\x16\xdb\xa8\ \xce\x52\x45\xd2\x9a\xe3\xdb\x31\x02\xfb\xb1\xa2\x14\x98\x6b\xaa\ \x39\x02\x52\xdf\x48\x94\x00\x83\x32\x38\xa8\xa3\xa7\xb7\x0c\x17\ \x56\x7d\xab\x9d\x7a\x30\x89\x64\x46\x03\x90\xc3\x31\x00\xbf\xdd\ \x0b\x73\xd8\x4f\x33\x62\x2f\x4d\x15\xde\x50\xfe\x7b\x29\x61\x6d\ \xad\xc5\xc2\xfc\xaa\x2d\xa7\xbd\xb1\xb9\xce\x4b\x2f\x3f\xcf\xcb\ \xaf\xbc\x48\xa7\xd3\x26\x0a\x63\x6a\xb5\x06\x63\x8d\x2e\x07\x46\ \x52\xa6\x0f\xd4\x39\x34\xde\x60\x62\x24\xa1\x91\x86\xd4\x62\x45\ \xfc\x71\x28\x88\x23\x41\x24\x20\x94\x29\xa2\xe8\xf1\xd8\x89\xb1\ \x63\x51\x18\x24\x59\x5e\x24\x38\xec\x0b\x1e\x3c\xf1\x5b\xf5\x6d\ \xb7\x5e\x00\x61\xff\x53\x4d\x9b\x00\xc2\x3b\xbd\xb3\x06\xf0\xf7\ \xfe\xde\xdf\x0b\xfe\xf1\x3f\xfe\xc7\x47\x7a\xbd\xde\xc9\x89\x89\ \x89\xd3\xb5\x5a\xed\x7c\x92\x24\xa7\x80\x53\x61\x18\x1e\x0f\x82\ \xe0\x88\x94\x72\x6a\x62\x62\x22\xa8\xd5\x54\x79\x67\x80\x24\x49\ \x68\xb7\xdb\xd4\xeb\x75\x96\x97\x97\xd9\xd8\xd8\xa0\xdb\xed\xb2\ \xb0\xb0\xc0\xc6\xc6\x06\x9b\x9b\x4a\x1d\x3b\x76\xf4\x21\xbe\xf6\ \x95\x5f\xe4\x0b\x9f\xff\x59\x5d\x1d\x58\x93\x7a\x69\xb1\xb8\x48\ \x3c\x8b\xb2\xeb\xbf\x0b\x0a\x72\xa9\xa3\xfb\xb2\x3e\x45\x96\x91\ \x67\x3d\xf5\xb7\x46\xbd\x03\xa1\xcb\x89\xc5\x06\xf1\x4f\x08\xa2\ \x58\xe7\xf9\xeb\x5d\x84\xac\xe4\xc7\x52\x91\x23\xec\xf2\x71\x3b\ \x7b\x72\x8f\x8c\xc0\x30\xaf\x92\x19\x60\x62\x16\xd0\xe5\xc0\x84\ \xd7\xaf\xaf\x3b\x28\x7b\x5e\xa2\xce\x05\x18\x93\xc0\x0b\x16\x1a\ \xc0\x04\x54\x5f\xea\xb5\x97\x94\xb4\x61\x03\xb9\xdb\xae\x00\x00\ \x20\x00\x49\x44\x41\x54\xaf\x7a\xc8\xbc\xef\xee\xfc\x7e\xa9\xff\ \x7b\xf5\xeb\x9b\xc0\x9d\x7e\x4f\xed\x1a\xbd\xb2\xb4\xc1\xc2\xfc\ \x9a\x2d\xa7\x3d\x37\x77\x97\x17\x2e\x3c\xc3\x5b\x6f\xbf\x81\x04\ \xa2\x20\xa2\x5e\x6b\x12\x46\x31\xc8\x82\xf1\xe6\x26\x07\x9a\x35\ \x0e\x8e\xd4\x99\x1a\xab\x73\xa0\x11\x93\x26\x01\x49\x18\x10\x87\ \x10\x85\x10\x22\x08\x84\x24\x28\x62\x82\x7e\x9f\xd3\x07\xc2\x89\ \xa3\xd3\x63\xe3\x33\x77\x57\xea\x38\x2d\xe0\x81\x37\x2f\x59\xbb\ \xd4\xf6\x12\xf9\x28\x06\x4d\x80\x52\xab\x96\x04\x0b\x1f\x7b\xec\ \xb1\xbf\x11\x86\xe1\xff\x3e\x3d\x3d\x1d\x1d\x3f\x7e\x9c\x76\xbb\ \x4d\x9a\xa6\x6e\x9b\xaf\x3c\x27\x08\x54\x7a\x68\x96\x65\x34\x1a\ \x0d\xd6\xd6\xd6\xc8\xb2\x8c\xdb\xb7\x6f\xd3\xe9\x74\x58\x5e\x5e\ \xa6\xdd\x6e\xd3\x6a\xb5\x4c\xed\x00\x92\xa4\xc6\x17\xbf\xf0\x73\ \x7c\xed\xcb\xbf\xc8\xd9\x33\x4f\x0c\x88\xc5\x6a\xa4\xb1\x09\x80\ \x71\x0f\x09\x12\x53\xcd\x47\xfb\xf8\xf3\x3e\x59\x9e\x91\xe5\x3d\ \x32\xbd\xc7\x1f\xd2\x54\x11\x8e\x54\x51\x11\x4d\xfc\x51\xe8\x32\ \xfd\xcc\xbd\x0d\xda\x6e\x24\xa9\x9a\x74\x37\x0a\xe1\x7d\xde\x96\ \x49\x98\x51\x57\x30\x02\x1b\xa4\xa7\xd5\x75\x83\xcd\x55\x01\xbe\ \x62\xa0\x0f\x86\x68\x09\x5e\xbc\x40\x89\x81\x98\xcb\x4d\x72\x90\ \x40\x06\xea\x86\x1e\x7b\xdb\x92\xfe\xf7\x4a\xfc\xf7\x4a\xf8\xf7\ \x9b\x4b\xd0\xef\x2b\x35\x3f\xeb\x4b\xf2\xbc\x60\x69\x71\x8d\x85\ \xf9\x35\x5b\x7c\xe3\x93\xcb\x1f\xf2\xc2\x85\x67\xf9\xe4\xf2\x25\ \x9d\x56\x9e\xe8\x8a\x52\x91\xde\x47\x22\x42\xca\x8c\x91\x7a\xca\ \x68\x23\x66\xbc\x99\x32\xde\x4c\x19\xad\xc7\x5a\xe2\x4b\xc2\x40\ \x10\x06\x20\x64\xa1\xf2\x4f\xa3\x04\x91\xb5\x39\x31\x1e\x4e\x1c\ \x9a\x1c\x39\xa8\x19\x40\x0d\xa5\x05\x3c\x68\x26\x20\x2d\x97\xdf\ \xa1\xf9\x73\x2b\x2a\xc3\xaa\xe4\x02\x94\x89\x8c\x41\x06\xd0\xfc\ \xe6\x37\xbf\x99\xdc\xbe\x7d\x3b\x6a\x34\x1a\x64\x59\xc6\xe4\xe4\ \x24\x9b\x9b\x9b\xb6\x32\xd0\xd8\xd8\x18\x59\x96\xb1\xb6\xb6\x46\ \xaf\xd7\xb3\xbe\xfa\xd5\xd5\x55\x5b\x39\x48\x4a\x49\x18\xc6\x9c\ \x3b\xfb\x69\xce\x9f\xfb\x0c\xe7\xcf\x7f\x96\x33\xa7\x9f\x20\x4d\ \x6b\x6a\x80\xc2\x1f\x85\xd8\x91\xf8\x91\xaa\x9a\x8f\x2c\x0a\x9b\ \x54\x94\xf5\x33\xeb\xeb\xcf\xac\xda\x2f\x4b\x85\x44\x2d\xf1\x7b\ \xa0\x9f\x09\x6c\x74\x05\x46\xd4\x5c\x0b\x2f\x7a\xce\x97\xfe\x66\ \x68\xc3\xb4\x82\x2a\x23\x28\x4b\x7f\x47\xe9\x8e\x11\xe8\x82\x1c\ \xa0\x24\xbb\x3e\x1f\x98\xe3\x55\xe6\x60\x30\x02\x33\x65\x25\xe6\ \x50\x75\x17\x1a\x26\xa0\x92\xa1\x0a\x05\x80\xb8\x38\x09\x06\xdb\ \x5e\x88\xf9\x5e\x08\x7f\x3f\xd4\x7f\xdf\xbe\xef\xf7\x32\x16\xe6\ \xd7\x58\x5a\x5c\xb7\xdb\xa4\xbf\xf5\xf6\x1b\x5c\xb8\xf8\x0c\x73\ \x73\xb3\x44\x61\x4c\x9a\x36\x74\x1d\xc9\xd8\xba\x7a\xa3\x30\x22\ \x88\x42\xf2\xbc\x47\x23\x8d\x68\xd4\x12\x9a\xf5\x98\x46\x2d\xa2\ \x96\xc6\xc4\xa1\x72\xb4\x06\x42\xa2\xb6\x97\x55\x60\x8b\x28\x12\ \x84\x10\x8c\xa5\xd4\x3f\x7f\x7e\xe2\xf8\x1b\xef\xdd\xac\xa3\xa2\ \x5d\x0d\x03\xf0\x65\xc4\xbe\x37\x0b\x09\xdd\x1f\xf3\xac\x4a\xfe\ \x52\x67\xa5\x74\x60\xa0\xdf\x6a\xb5\x3e\x31\xae\xb8\x76\xbb\x4d\ \xbf\xdf\xa7\xd3\xe9\x20\x84\xa0\xd5\x6a\xd1\xef\xf7\xe9\xf7\xfb\ \xd6\xb6\x37\x04\x8f\xf2\x8d\xbe\x04\x5c\xfc\x89\xaf\xfc\xb7\x7f\ \xe7\xd1\x87\xbf\xd4\xfc\xf4\x53\xa7\x2d\xc1\xbb\xa2\x5a\x0c\xf9\ \xed\xff\xed\x14\x1f\xa9\x93\xe4\x95\xe4\x97\xb6\x82\x90\x95\xfa\ \x99\x73\xf5\x19\xc9\xaf\x6a\x09\xba\x40\x9f\xc8\xee\x1f\x58\x26\ \xfe\xb2\xe8\x76\x80\x9a\x39\x64\x08\x5b\x8d\x03\x47\xf0\xee\xb2\ \xf2\xf1\x8a\x19\xe0\x82\x83\xa4\x23\xc4\x21\x78\x80\x63\x34\x1e\ \xf5\x6f\x81\x11\x38\x70\xd1\xff\xa2\xd6\x07\x0c\x13\xb0\xda\x4d\ \x65\xce\x2b\xcb\x74\xb7\x44\xbe\x57\xc2\xdf\x8f\xa0\x22\x93\x98\ \xa3\xec\x7b\x55\x7c\x63\x7e\x76\xd5\x22\xfa\xed\x76\x8b\x97\x5f\ \xbd\xc0\xcb\x2f\x5f\x60\xb3\xd5\x22\x0a\x63\xea\xf5\x11\x42\x93\ \xdb\xa1\x89\xde\x6c\x20\x63\xb6\x76\xcf\x84\xa4\x96\x46\xd4\xe2\ \x90\x34\x8e\x48\xe2\x88\x38\x0a\x89\x02\x10\x66\x67\x28\xfd\xa2\ \x04\x02\x74\xa8\x74\x28\x73\x3e\xf7\xd0\x81\xd3\x28\xe9\x5f\x47\ \xd1\x4d\x00\xe4\x42\x08\xf1\xa0\x70\x80\x40\x55\x78\xd9\x1b\x87\ \xb1\xef\xdd\xf4\xb1\xfb\xcd\x41\x25\xd0\x79\xed\xb5\xd7\x5e\xff\ \xf8\xe3\x8f\x55\xa2\x84\xab\x06\xe4\x5f\x33\x0f\xdc\x04\x66\xf4\ \xcf\x55\xe0\x22\xf0\x26\x4a\x9b\x8d\xa6\xa7\x1e\xfe\x3b\x51\x5c\ \xf3\xee\xe4\xdd\xb3\xf2\xde\xfd\xb4\x5b\x43\x30\x26\x85\x55\xca\ \x5c\x8f\x23\xd7\x65\xbc\x34\xf1\x5b\x77\x5f\x6e\xfd\xdc\x46\xed\ \x0f\xa3\x98\x38\xae\x11\xeb\x3c\xff\x30\xd4\x5b\x7b\x09\xbd\xc9\ \xa5\x15\xe9\x46\xaa\x56\x8c\x7c\xef\x41\x87\x2d\xd1\x61\x9e\x3e\ \xab\x11\x58\xa6\x32\x4c\xfa\x7b\xc2\xda\x10\xb4\xd7\x59\x29\x88\ \x48\xf7\x25\x7d\xb5\xdf\x4a\x7f\x07\x0c\x1a\x30\xd0\x46\x2e\xa2\ \x70\x8d\xc2\x74\x12\x94\xc7\x69\xe7\xd9\x57\x19\xf7\x28\xc1\x1f\ \x24\x10\xa8\x0a\x6f\xe4\xf4\x7b\xea\x79\x36\xd7\xdb\xcc\xcd\xad\ \xb0\xbe\xa6\x8a\xe3\x2e\x2e\x2d\x70\xe1\xe2\x33\xfc\xe0\xcd\xd7\ \x28\x0a\xa9\x09\xbf\xe9\xe5\x74\xc4\xae\xb8\x8b\x21\xfc\x50\xbd\ \xfb\x40\x08\x90\x39\x91\xde\xfb\x21\x89\x54\x2d\x8a\x28\x10\x88\ \x40\x22\xa4\xda\xf4\xc4\x3a\xbd\x24\x20\x22\x15\x3d\x5a\xe4\x3c\ \x34\xdd\x38\xd2\xac\x27\x23\x9b\xed\xde\x8f\x14\x07\xb8\xa7\xe6\ \x93\xdb\xd6\x7b\x03\x0a\x18\x04\x01\x8b\xf7\xdf\x7f\xff\x26\xf0\ \xbb\x28\x22\xf7\x09\xfd\x26\x70\x53\x4a\x39\xb4\x52\xa9\x56\x35\ \x4c\x44\x60\xbc\x43\x16\x22\x20\x28\x33\x4e\x69\x89\xa9\x90\x39\ \x14\x3a\xa3\xcf\xd4\x11\xd0\x92\xdf\x14\x16\x31\xcc\x41\x08\x85\ \x7a\x87\xa5\x04\x9f\x58\x13\xbf\x5a\x08\x42\xdb\xc4\x81\xa7\x0d\ \x49\xf3\xbf\x91\x98\x46\xd2\x52\x21\x12\x9f\xe2\x3d\xae\x50\x8e\ \xfd\xf1\xa2\xf5\x5c\xe7\x9e\xf4\x57\x14\x6f\x7d\xfc\x1e\xf8\x38\ \x7c\x7b\x30\x1c\x83\xf2\xa4\xbe\xbd\xbd\xa7\x7a\x94\xac\x0d\xa9\ \x34\x00\x11\x08\xd4\x76\x5f\x95\x2a\x41\xde\x73\x3d\x68\xc2\xdf\ \x8b\xda\x9a\xf5\x9d\xff\x5e\x4a\xc9\xea\xca\x26\xf3\x73\xab\xb4\ \x5a\x6a\xa9\x5d\xbb\x7e\x99\x17\x2e\x3c\xc3\x47\x1f\xbd\x6f\x13\ \xb9\xd2\xd4\x65\x72\x5a\x8c\x27\x52\xc9\x65\x51\x10\x12\x84\x81\ \xca\x43\x21\x40\x0a\xb5\xf5\x59\x90\x77\x75\x01\x1a\xb3\x75\xbd\ \x5a\x3b\x81\x30\x5e\x3d\x3d\xcb\x46\xf5\x43\x42\x90\x40\xd1\xe6\ \xf8\x58\x38\x79\x74\x7a\xec\xe0\x27\x37\x16\xea\xa8\x70\x78\xe3\ \x0d\xb8\xef\xb2\x5d\x5b\x35\xb7\x14\x3c\x57\xf5\x4e\xca\x46\x65\ \xda\x83\xb2\x7d\x3d\xa0\x7a\x0f\x78\x01\xa4\x12\xa9\xbf\x70\x4f\ \x23\xd6\x5d\x80\x08\x07\x24\xad\x9e\x58\x13\xd8\x02\x46\x2a\x4a\ \xa3\xc9\xea\x6d\xa6\xb4\x8b\x4f\x4a\xe5\xdf\xd7\xc4\x9f\xdb\xbc\ \xfe\x4c\xef\x23\xa8\x88\x3f\xd0\x7b\x06\xaa\x18\x7f\x13\xea\x1b\ \xdb\xf0\x63\xab\xf6\x57\x0a\xa3\x08\x3d\xb5\x76\x3a\xb5\x1e\x2f\ \xa4\x3b\x66\xa2\x0d\x0d\xd1\x49\xa3\x5e\x0d\x63\x04\x92\x01\x50\ \x70\xa8\xf4\xd7\xfd\x0a\x8f\x80\xd1\x9f\xad\x47\x00\xaf\x98\xa8\ \x37\x5f\x7e\xe8\xb0\x9f\x0c\xe4\xdf\x53\x68\xdb\x21\x10\x28\x77\ \xa0\xb7\x60\xb6\x23\xfe\xfd\x60\x08\x3b\xf5\xe3\x9f\x97\x12\x7a\ \x3d\x15\x9f\x5f\xe4\x92\xa2\x90\x2c\x2d\xad\x33\x3f\xbb\x42\xaf\ \xa7\xaa\x36\xbf\xfb\xde\x5b\xbc\x70\xf1\x19\x6e\xdf\xbe\x4d\x14\ \xc5\xa4\xb5\xa6\x22\x76\x1d\xce\x1d\xeb\xed\xe2\xa2\x48\x55\x71\ \x0e\x03\x57\xcf\x31\xd0\xfb\x47\xf8\x9e\x97\x3c\x50\x42\x40\x15\ \x7c\x09\xf4\xd6\x6f\x46\x6e\xe9\x6d\x91\xa5\x17\x6c\x21\x04\x84\ \x11\x64\x82\x63\x63\xc1\xc4\xf1\xe9\xd1\x83\x9f\xdc\x58\x68\xa0\ \x18\xc0\xb0\x10\xdb\xfd\x6d\x43\xa8\x7d\x2f\x1e\x00\x18\xd0\x00\ \xcc\x8f\x5d\x32\xfb\xbd\x83\x83\x1c\x69\x4e\xab\x69\x0b\x55\x69\ \xae\xd2\x70\x2d\x33\xf0\xaa\xed\x48\x69\x17\x69\x21\x0b\x5b\xc4\ \xc3\xaa\xfd\xd2\x15\xf3\x50\xfb\x06\xe8\x72\xd6\x5e\x51\x11\x95\ \xdd\x97\xea\xb2\x62\xc6\xe6\x8b\x30\x4a\xc9\xd0\x45\xe9\x6b\xfd\ \x66\x2c\x16\xaf\x30\x9f\xcc\xbe\x79\x46\xc1\xd6\x0f\x69\x64\xb2\ \x09\x47\xf6\xba\x34\xe0\x9e\xef\xce\x33\x36\xbe\x89\x33\xf0\xa5\ \xbd\xef\x21\xb0\xb8\x83\xc1\x04\x3c\xfb\xdd\x60\x00\x06\xfd\x07\ \x2c\x83\x70\xd2\x1f\x44\x20\x90\x85\x40\x10\x68\x26\xe0\x1e\x78\ \x20\x22\x91\x1f\x0d\xe1\xfb\xe7\x8a\x42\x05\xee\xf4\xba\xca\x8d\ \x97\x67\x05\x0b\xf3\xab\x16\xd1\xef\x76\x3b\xbc\xfa\xda\x4b\xbc\ \xf4\xca\xf3\xac\xaf\xad\x13\x45\x09\xf5\xfa\x08\x71\x9c\x38\xe2\ \x37\x8c\xde\xd4\x70\x8c\x22\x42\x11\xea\xcc\x53\xc3\x00\xd5\x6f\ \xf3\x16\x0a\x8c\xb6\x28\x74\xc1\x19\x33\xbd\x76\xc2\x19\xb4\xb6\ \x05\x04\x31\x00\xa9\x28\xc2\xaf\x3f\x3e\x79\xfa\xb9\x37\xae\xbe\ \x81\xc2\x02\x22\x77\xd1\x83\x01\x02\x45\xb0\x73\x41\x90\x9d\xe2\ \x03\x02\x51\x52\xc5\x77\xd6\x00\xee\xa3\x09\x40\x9c\x3f\xf7\x93\ \x29\x18\x84\xda\x84\xd3\x82\x8f\xb2\xa9\x7a\x80\x92\xa2\x40\xbb\ \xee\x14\x51\x17\xb2\xd0\xbb\x03\xe5\x3a\x89\x25\x43\xc8\x4c\x57\ \x14\x92\x76\x9a\x83\x30\x74\xae\x1e\x1d\xe5\xe7\x6c\x3f\x9f\xf8\ \x75\x50\xcc\x96\xcd\x91\xae\x6f\xf3\x4b\x8f\xa2\xb5\x62\xe0\x01\ \x82\x5e\x7a\x29\xe5\xf3\x3e\x23\xf0\xf4\x75\xdb\x3f\x50\xc6\x09\ \x34\x31\xfb\x5a\x82\x1d\x99\x54\xdf\x1a\x48\x15\x36\x5a\x89\x40\ \x05\x44\x19\xa9\xae\xbf\x64\xb0\x0e\x44\x81\x28\x6d\xe6\x39\xb8\ \x38\x7e\x94\x9a\x80\xb3\xef\xd5\x78\xba\xdd\x8c\xf9\xb9\x15\x8d\ \xe8\x4b\x56\x56\x96\xb9\xf8\xe2\xb3\xbc\xf1\xe6\x2b\xf4\xb3\x9c\ \x28\x4c\xa8\xd5\x47\x89\x4d\xfe\x46\x9c\x78\xef\x5b\xc5\x73\x18\ \x66\x2f\x74\x4a\xb9\xdd\xc1\x59\x3f\xae\xd9\xf1\x18\xa9\x18\xb3\ \x89\xff\x30\x8c\xc0\x9a\x5e\x56\xf5\x37\xd2\x5f\x38\x15\x2e\x8c\ \x15\x1f\xa0\xe0\xd3\xa7\xc6\x4e\x0a\xa8\x4b\x93\xf6\xfe\xa0\x81\ \x40\x07\xda\xec\xca\x04\x10\x42\xe0\xe5\xb4\xaa\x63\xc1\x00\x03\ \x28\xbd\x98\xfb\x66\x00\xa2\x12\xbd\x53\x4b\xc7\x52\x25\x04\x85\ \x90\xd2\x14\xa8\x30\x9b\x4d\x08\x4b\xec\xc6\x72\x56\x40\x63\xc1\ \xd4\x81\x9c\x43\x13\x39\x69\x9c\x91\x26\x19\xb5\x24\x27\x10\xda\ \xd3\xa0\xc5\x5b\x81\x00\x19\xd0\x2f\x02\xfa\xfd\x80\x5e\x16\xd0\ \xeb\x47\x74\xf3\x98\x3c\x53\x88\x6e\x18\x06\x84\xa1\x24\x08\x54\ \xb4\xd8\xda\x86\xa4\x97\x89\x81\xf5\x2f\xed\x7c\xe0\x49\x7d\x4a\ \xea\x3d\x94\xcc\x6d\x8f\xc0\x86\x30\x02\xe9\xf8\x9c\xeb\xc2\x8a\ \x6e\x7b\x91\x09\xd4\x31\x61\xc1\xbe\x87\x00\xc1\x10\x4c\xc0\x99\ \x1e\x96\x85\x6a\x5e\x68\x37\xfc\xf1\xcd\x56\xdc\xb3\x63\x16\xb9\ \xe9\x7e\x1b\xf0\xef\x41\x61\x02\xfd\xbe\x92\xf6\x59\x5f\x11\x56\ \xab\xd5\x65\x6e\x76\x95\x95\x65\xb5\xed\xdd\xcd\x5b\x37\x78\xe1\ \xc2\xf7\x79\xff\x83\x77\x55\x99\xb6\x30\xa1\x51\x57\xaa\x7e\x6c\ \x33\x37\x8d\xd4\x37\xb8\x8e\x8a\xe6\x14\xba\x84\x5b\xa0\xe7\x4b\ \x08\xe1\x18\xa7\x7e\x47\x21\x02\x29\x0a\x3d\x1f\x76\xa4\x9e\x6a\ \xe4\xff\x96\xee\x9c\x91\x5c\x41\x02\x40\x20\x0b\x4e\x4f\x24\xd3\ \x93\x07\x9b\x63\x0b\xcb\x9b\x06\x08\x0c\xbc\x2f\xee\x77\x93\xc3\ \xfe\xdc\x95\x09\xe0\x5d\x12\x88\xa1\xa1\xc0\x96\x11\xdc\x17\x03\ \xf0\x88\xdf\x74\x18\x08\x11\xd4\xa5\x2c\x72\x29\xf3\x28\x97\x19\ \xa2\x70\x44\xa4\x5e\x8a\xc9\x55\x57\x52\x7d\xf2\x40\xce\x93\x8f\ \xf4\x19\xa9\xe7\x6a\x87\x60\x5d\xbf\xaf\x28\x24\x79\xe1\xd4\xed\ \x30\x0a\x08\x23\x55\xbf\x2e\x8e\x62\xe2\x38\x22\x89\x43\xe2\x18\ \xc2\x30\x23\x8a\x24\x81\xc8\xf5\x9a\x2f\x17\x50\xe8\x74\x03\x56\ \xd6\x03\xd6\x36\xd4\xef\xd9\xa5\x88\x56\xdb\x53\x9d\xec\x7f\x78\ \xc4\x5e\x9e\x36\x7f\x9a\x7d\x7d\xc1\x30\x02\xbf\x60\x47\x95\x11\ \x38\x93\x41\xf7\x54\x42\xfe\x0d\x53\xf1\x34\x05\x8b\x09\xb8\xb1\ \x48\xeb\x3a\xc0\x62\x0e\x85\x66\x2a\x46\x07\x30\x4c\x56\x1a\x29\ \xe7\x8d\xdc\x54\x4b\xd2\xef\xad\xfa\x1e\x87\xbd\xdb\xa1\xef\x7c\ \x37\xd7\x4b\xa9\x0a\x6f\xf4\xba\x2a\xff\x1e\x60\x7d\xad\xcd\xec\ \xec\x0a\x1b\xeb\x6d\xa4\x94\xbc\xff\xc1\x3b\x5c\xb8\xf8\x0c\x33\ \x33\x37\x08\xa3\x98\x34\x69\x28\xbb\xde\x12\xbe\x91\xfa\x7a\x7b\ \xb8\x30\x22\x88\x22\x22\xbd\x33\xb4\x08\x3c\x50\x57\x4b\x71\x53\ \x6c\x55\x4a\xa9\x0b\xa5\x4a\x2d\x70\xaa\x72\xb1\x34\x72\x4a\xb6\ \x57\xf5\x5c\x10\x40\x10\x41\xde\xe7\xe4\x58\x38\x39\x3d\x31\x32\ \xae\x19\x80\x01\x02\xb7\x9e\xa8\xfb\x6f\xd2\xfb\x7f\x68\xdb\xc9\ \x04\xf0\xe2\x00\xaa\x1c\x0f\xb8\x0f\x06\xe0\x11\xbf\x5f\x13\x20\ \x2c\x64\xd1\x2c\x8a\xa2\x90\x52\x55\xe3\x01\xdf\xaf\xaf\xdd\x8a\ \x85\x0a\xec\x79\xe8\x44\xc1\xa7\xce\xf7\x29\x8a\x42\xe7\x6c\x2b\ \x69\x6f\x0a\x5a\x02\x0a\xb5\x0d\x43\xc2\x30\x24\x4e\x34\xf1\x47\ \x21\x71\x1c\xa9\x92\xde\x51\x68\x33\xfe\x4c\xd0\x53\x35\xf6\xa1\ \x96\x4a\x8e\xa4\x39\x47\xa6\x0c\x60\xdb\x65\x79\x2d\xe0\xd6\x5c\ \xc4\xed\xd9\x88\xe5\xf5\xb0\x32\x2d\x2e\x48\x67\x28\x33\xb0\x34\ \xec\x71\x36\x7d\xde\xa8\xe9\x26\xb0\xc8\x2c\x2e\xdf\xaf\x5f\xd5\ \x1e\x7c\x13\xd4\x61\x02\x52\x7f\x55\x54\x87\xa6\x98\x85\x10\x36\ \x34\xd8\x99\x06\xfa\x4d\x5b\x37\xa0\x9b\x07\xf3\x0e\x76\x22\xfe\ \xfb\x21\xfc\xa2\x90\xf4\x7b\xea\x5d\x2a\xcb\x4e\xb2\xbc\xbc\xc1\ \xdc\xec\x0a\x9d\x76\x8f\x5e\xbf\xc7\x1b\x6f\xbc\xc2\x8b\x2f\x3d\ \xc7\xca\xea\x0a\xa1\xf6\xdf\xc7\x71\xaa\x89\xdf\x53\xf5\x63\x95\ \xbc\x15\x86\xda\xc6\xd7\x51\x9c\xa6\x62\xb4\xd9\x24\xd6\x6a\x52\ \x85\x02\x91\x83\x40\x9b\x98\x48\xcb\x4c\x03\x21\x28\x02\xe3\x15\ \x1d\x46\x07\xde\x31\x01\x25\x20\xd0\xe0\x00\x79\xc6\x64\x53\x8c\ \x3f\x76\xf2\xc0\xf4\x07\x97\x67\x0d\x10\xf8\x40\x19\x80\xa1\x9c\ \x3d\xc5\x56\x68\x66\x68\x8f\x6d\x1f\x09\x78\xdf\x20\xa0\xa0\x5c\ \x28\x24\xca\xb2\xee\x48\x51\x64\x32\x2f\xfa\xf4\xfa\x3d\x40\x2d\ \x64\xb5\xbf\xbd\xb6\xe5\x91\x1c\x99\x2c\x78\xf4\x4c\x46\xbf\x27\ \xed\x1e\x7d\xbe\x84\x0a\x02\xa1\x91\xfc\x90\x48\x13\x7c\x1c\xab\ \x52\x62\x71\xac\x4a\x89\x45\x51\x68\x09\xdf\x21\xdc\xdb\xd9\xfc\ \xae\x1d\x1c\x2b\x38\x38\xd6\xe3\x89\xf3\x3d\x5a\x6d\xc1\xcc\x6c\ \xcc\xe5\x99\x84\xf5\x4d\x35\x4f\xfe\x3c\x5a\x34\xde\xa8\xde\x55\ \x46\x60\x41\x00\x67\x2f\x58\xe9\x6f\x34\x7a\xa9\xa3\xfd\xcc\x1a\ \x33\x2e\x4c\x2d\xdd\x6d\x39\x53\xe9\xee\xad\x04\xbc\x36\x01\x3c\ \x0f\x80\x92\xfe\x86\xa2\x71\xe6\x81\x61\x18\x3a\x4a\x30\x30\xdc\ \xc4\xbc\xac\x6d\x88\xfd\x7e\x09\xbf\xdb\x29\xe8\xf5\x54\x40\x56\ \x5e\x14\x2c\x2d\xac\x31\x37\xb7\x4a\xbf\x97\xb1\xbe\xbe\xc6\x8b\ \x2f\x3d\xc7\x6b\xaf\xbf\x4c\xb7\xd7\x23\x8e\x12\xea\xb5\x51\x9b\ \xa0\x15\xc7\xa9\x0e\xde\x32\x25\xda\x75\x95\xe8\xc8\xed\xd0\xec\ \x4a\xc5\xeb\x67\xd5\xcf\x89\xd6\x12\x09\x21\x28\xb4\x3b\x4f\x6f\ \x49\x17\x48\x28\x02\xb3\x67\x9a\x18\xa2\xf6\x7b\x98\x81\xe5\xbe\ \x6e\x5e\xad\x2a\x17\xc6\xd0\x6f\x13\xc9\x82\xaf\x3d\x72\xf0\xec\ \xbf\x7b\x96\x97\x71\x01\x41\x02\x2d\x0f\xf7\x1b\x07\x08\x74\x55\ \xe0\x3d\x55\x39\x1e\xec\xc3\xd7\x00\x06\x98\xc0\x7e\x31\x00\x53\ \x25\x28\x29\xf2\xde\x68\x5e\xf4\x8a\x3c\xef\xd1\xef\x77\xed\x84\ \x9a\x5d\x66\x91\xd0\xac\x4b\x9e\x7c\x38\xa7\x9f\xe1\x26\x1c\x5d\ \xab\x5f\x08\x42\x2d\xd5\xa3\x28\xa2\xd5\x89\xe8\xf6\x63\x82\x5e\ \x64\xb7\x0f\x9b\x9e\x08\x48\x53\xa1\xab\xf8\x3a\x95\x3f\xcf\x05\ \x8b\x2b\x21\x0b\x2b\x21\x61\x00\xcd\x46\xc1\x48\x43\x32\x3e\x92\ \xb3\xdd\x06\x49\x8d\xba\xe4\xd1\x33\x3d\x1e\x3d\xd3\x63\x6e\x21\ \xe4\xe3\x9b\x09\xb7\xe7\x22\x4c\x31\x1d\xeb\xb2\x33\x8c\x00\x4a\ \x14\x2e\x11\x56\x72\x1b\x46\xe1\xd5\xed\xda\x02\x1c\x34\x32\xca\ \xd5\x1b\x50\x4a\x87\x3e\x5a\x2a\x0e\x68\xee\xe9\xe2\x0d\x6c\xe9\ \x42\xab\x11\x98\xfe\x3d\x13\x40\x04\x10\xe4\xde\xd7\x87\xdb\x92\ \xf7\x6a\x02\x64\x99\xa4\xd7\xc9\xe9\x6b\xfb\xbe\x9f\x65\x2c\xcc\ \x29\x44\x3f\xcf\x0b\xee\xdc\xbd\xc5\x85\x0b\xcf\xf0\xf6\xbb\x6f\ \xa9\x77\x17\xc5\x34\x1a\x63\xae\x24\x9b\x4d\xd4\x52\x1e\x1c\xbb\ \x39\x4b\xa8\x82\xba\xcc\x0e\x4d\x81\x76\x67\x08\x9f\x8e\xb5\x6a\ \x4f\x88\xb6\x85\x24\x88\x40\x99\x5b\x52\xba\x39\xf1\x35\x9f\x6d\ \x49\x41\x54\x5e\x8e\xf9\x8c\x87\x03\xe4\x3c\x76\x6c\xe4\x78\x1c\ \x85\xf5\x7e\x96\xfb\x11\x81\x0f\xa4\xc9\x7d\xc0\x16\x84\xab\x73\ \x0f\x83\x4f\x7e\x6f\x0c\xa0\x62\x57\x18\x06\x90\x00\x69\x5e\xf4\ \x47\xf2\x22\x97\x45\xd1\x27\xd3\x1a\x80\x05\xc0\xa4\x32\xa9\x7e\ \xfc\xc7\x24\x41\xa8\x17\xbf\x96\x54\xa6\x38\xa8\x08\x42\x96\x57\ \x23\x66\x97\x12\xe6\x96\x13\xb2\x4c\x21\xbe\x41\x18\xaa\xf4\x5e\ \x11\x10\x46\x21\x47\xa7\x0b\xce\x1d\x2f\x38\x7e\x38\x23\x0a\x05\ \x97\xae\x25\xbc\xf3\x71\x42\x96\x0f\xe6\x16\x34\x6a\x92\x73\x27\ \xfa\x9c\x3b\xd1\xa5\x9e\x7a\x2f\xb9\x74\x15\x80\xe4\xf0\x54\xce\ \xa1\xa9\x36\xed\x6e\xc0\x95\x99\x98\x4f\x6e\x24\x74\xfb\x46\xc3\ \x16\x56\xed\xb4\x04\x67\xbf\xaa\x6d\x78\x8f\x6e\x9d\x94\x1f\x74\ \x0d\x3a\x66\xe0\xcc\x0d\xdf\x14\x90\xc2\x01\xa7\x46\x10\xa9\x09\ \x77\xc8\xb6\xf1\x06\x54\x81\x40\xa1\x19\x92\xc2\x1d\x06\xd7\xe7\ \xbd\x12\xbf\x39\xde\xeb\x15\xf4\x3a\xb9\xb6\xef\x05\x9d\x4e\x9f\ \xf9\xb9\x55\x96\x16\xd7\x91\x52\xf2\xd1\xa5\xf7\xb9\x78\xf1\x59\ \x2e\x5f\xbd\xac\xfc\xf7\xc6\xbe\xd7\x44\x9f\xc4\xa9\x96\xfa\x5a\ \xe5\x37\xc8\x7e\x60\x90\x7d\x9d\xad\xa9\x7f\xab\x29\x11\x76\x6e\ \xd4\xe3\x4b\x2c\xc0\xe4\x69\x5c\x06\x77\x0d\xf4\xc6\xa9\xe8\xbd\ \x10\x0d\x36\xe3\xde\x79\xa0\xcd\x88\x8a\xba\x8f\x9d\x5c\x6c\x7c\ \x40\x98\x58\x66\x72\xf2\x40\x34\x75\x68\x62\x64\xfc\xd6\xdc\xaa\ \xc9\x0b\x78\x70\x40\x60\xc5\x0b\xb0\x3b\x4d\x60\xc0\x0b\x00\xc3\ \xd9\x1e\xb0\x7f\x1a\x80\x35\x01\x80\x7a\x51\x64\xd2\xec\x02\x6c\ \xd5\x36\x65\xcd\x70\xfc\x90\xe4\xc0\x28\x08\xbd\x2d\x98\xd0\xaa\ \xbe\x94\x01\xd7\xee\x44\x5c\xbd\x99\xd2\xcb\x42\xbb\x4d\x97\xb2\ \xf1\x23\x1d\xb9\x65\x32\xf9\x04\x77\xe6\x63\xee\x2e\x40\x1c\xd7\ \x68\xd6\x60\x6d\x53\x5b\x78\x15\xe2\x17\x02\xda\x5d\xc1\xfb\x97\ \x53\x3e\xb8\x9a\x72\xe2\x50\x9f\x87\x4e\xf6\x98\x3e\x38\x2c\x80\ \x4b\xd8\xff\x1b\x69\xc1\x13\xe7\xbb\x3c\x72\xa6\xc7\x87\x57\x13\ \x2e\x5d\x4b\xc9\x0b\x57\x74\x43\x59\x68\xc2\x32\x02\xb3\x64\x2c\ \xb1\x1b\x8d\xb2\x22\xe5\x4d\x86\x4f\x29\xc4\x17\x28\x25\x0a\x51\ \xea\xd0\x9a\x17\x16\x97\xb0\xeb\xd4\xab\x5a\xe4\xf5\xa5\xe2\x19\ \x4c\x3a\xb5\xd3\x3f\xaa\xe0\xe8\x6e\x88\xdf\x0f\xdc\xe9\x76\x5c\ \x7d\x3d\x01\x6c\x6e\x76\x99\x9b\x5d\x61\x75\x65\x93\x2c\xcb\x78\ \xf3\xad\xd7\xb8\xf8\xd2\x73\x2c\x2e\x2c\x28\x69\x6f\xec\xfb\x28\ \x21\x49\x6a\x4e\xe2\x9b\x24\x2d\xbd\x2b\x54\x68\x08\x3f\x0c\x10\ \x5a\xea\xdb\x67\xc2\x7f\x06\xa3\x21\xc9\x8a\xb6\x23\xb5\x4b\xb4\ \x28\x33\x56\xc0\x6d\x97\xe6\xd6\x45\x59\x28\xea\x37\x5e\x02\x02\ \x85\x7d\x4f\x00\x14\x7d\x7b\xe5\xc9\xf1\x70\x72\xf2\x60\x73\xfc\ \xd6\xdc\x6a\x83\x1f\x55\x66\xe0\x16\xf8\xcd\x96\x1e\x00\xef\xb2\ \xc0\x3d\xec\x90\x87\xde\x1f\x06\x60\x7e\x07\xea\x7e\x61\x0d\xc0\ \x9a\x1e\x52\x47\xe1\x09\x65\xa9\x3e\x76\x46\x90\x24\x7a\x37\xe0\ \x50\x71\xe1\x4b\xd7\x23\x2e\xdf\x4c\xc8\xf3\x10\x11\x86\xda\x9d\ \x67\x08\x5f\x20\x7c\x1b\xd0\x30\x14\xa3\xf6\x67\xb0\xb6\x69\x26\ \xa8\x3c\xac\xea\x67\x59\x08\x66\x66\x13\x66\x66\x13\xc6\x47\x72\ \x1e\x3a\xd9\xe3\xf4\xd1\x3e\x51\x34\x4c\xd9\x52\xdf\x49\x22\x78\ \xf2\xe1\x2e\xe7\x4f\xf5\x79\xf7\xe3\x94\x6b\xb7\x62\x4b\xd4\xaa\ \x53\xb5\x28\x7d\x24\xdf\x92\xb1\x21\x48\x4d\xc8\x42\x3a\xc6\x60\ \x09\x5a\xff\xad\x42\x85\x0d\x73\xd0\xbd\x68\xa9\x55\x92\xfe\x5a\ \x13\x71\xc7\xf4\xd7\xf5\x90\x85\x90\x04\x05\x36\x1b\x70\x2f\x6b\ \x73\x18\xf1\x2b\xfb\x5e\x17\xde\xd0\xc7\xd7\x56\x5a\xcc\xcd\xae\ \xb0\xb9\xd9\x61\x73\x73\x83\x97\x5f\x79\x81\x97\x5f\x7b\x91\x4e\ \xbb\x43\x14\xc5\xd4\xeb\xbe\x7d\x5f\x23\x31\x20\x9f\xcd\xce\x34\ \x41\x3c\x66\x37\xe6\x40\xab\xfb\xe6\xdd\x9a\xf9\xf7\x08\x5f\x33\ \x3b\x45\xec\x85\xe7\x21\xf1\x6c\x76\x3f\x32\xd2\x73\xd9\xaa\x53\ \xc3\xfc\x00\xc3\xe6\xc6\x67\xe7\x5a\xb5\xea\x2c\xdb\xcf\x23\x31\ \xb5\x2f\x3f\x3c\x71\xe2\xed\x8f\x6e\xbf\x4b\x19\x08\xdc\x77\x2d\ \x20\x08\x82\x6d\xfb\x1b\x16\x1b\x20\x0b\x49\xbb\xd5\xf5\xaf\x29\ \x4b\xc4\xf2\xdf\xf7\x0d\x02\x5a\x1e\x69\x7e\xa2\x30\x0d\x03\x11\ \xca\x48\xdb\x71\xca\x1d\xa5\xe2\xb2\xa7\x0e\x08\x0e\x1f\x52\x55\ \x4a\xc2\x20\x24\xcb\x02\x5e\x7e\x3b\x62\x61\x35\x21\x10\x82\x28\ \x8e\xb4\x39\x10\x21\x42\x15\xc7\x6d\x6c\x40\x93\xd9\x26\x44\x50\ \x52\xd4\x00\xcf\xdc\x76\x0b\xde\x27\x7e\x2b\xd7\xf5\x35\x42\xc0\ \xda\x66\xc4\x9b\x1f\x46\xbc\xf3\x89\xe4\xf4\xd1\x1e\x0f\x9d\xec\ \x31\xd6\xac\x68\x05\xd2\xf5\xd1\x48\x25\x5f\x78\xa2\xc3\xa3\x67\ \xba\xbc\x7d\xa9\xc6\xed\xf9\xc8\xd1\x97\xf4\xae\x15\x58\x64\xda\ \x95\xfe\xf2\xa4\xbb\x3d\xef\x8e\xdb\xef\x99\xd1\x5b\x0c\x41\xab\ \xbe\x1e\x7f\x12\x16\xfa\xc7\x99\x0e\xc2\x95\x22\x91\xd2\x48\x7f\ \xa3\x36\xea\x47\x91\xce\x24\x19\xd6\x86\x11\x7f\xaf\x57\xd0\xda\ \xc8\xf4\xf7\x55\x55\xdd\xb9\xb9\x15\xba\x9d\x3e\xf3\xf3\xb3\xbc\ \x70\xf1\x19\x7e\xf8\xf6\x0f\x90\x12\xa2\x30\xa6\x51\x1f\x25\x8a\ \x13\x92\xb8\x46\x9c\xa4\x24\x71\xaa\x89\x3f\x75\xae\xbd\xd0\x04\ \xf1\x98\x24\xad\x00\x93\xb0\x56\x25\x7c\x1b\x2d\xaa\x67\x49\x48\ \x65\xfe\x08\xe1\x4f\x96\x7b\x2e\x33\x47\x81\x84\x42\x04\xb8\x2d\ \xd5\x86\x44\x40\x0e\x6c\x99\xe7\xad\x2a\xd3\x3f\x02\xda\x8b\xb8\ \x60\x2a\x85\x03\x7c\xfe\xfc\x81\xd3\xbf\xa9\x40\x40\x13\x11\xf8\ \x40\x02\x82\x2c\x5f\xdf\x81\x87\xfb\x8c\x60\x71\x71\x85\x4e\xa7\ \xef\x9d\x1b\x9a\x94\x63\x8f\xed\x07\x03\xf0\x8b\x85\x8a\x24\x69\ \x06\x61\x10\xdb\xb0\x4d\xb3\xdd\x96\x08\x02\x9e\x78\x04\xea\xa9\ \xda\x05\xa8\xd3\x09\x78\xe6\xd5\x98\x76\x3f\x22\x8a\x84\x92\x00\ \x3a\x39\x23\x0c\x54\x9e\x85\x01\x7f\xa4\x27\xf1\x85\xa1\x22\xb0\ \x92\xd6\x46\xd0\x6b\xc2\x13\x03\x2f\xb5\x4c\xfc\x7e\xcb\xb2\x80\ \x2b\x37\x6b\x5c\xb9\x59\xe3\xd0\xc1\x8c\x73\x27\xba\x1c\x3b\xd4\ \x1b\x14\x9e\xfa\xb5\x8e\x8f\x48\xbe\xfe\x74\x9b\xb9\xe5\x90\xb7\ \x2f\xa5\x2c\xae\xe8\xda\x82\xbe\x27\xc0\x98\x00\xf8\x91\x7a\xfe\ \xba\xa8\xd4\x22\x30\x5c\x43\x0f\x55\x6a\x6e\x60\x6d\x5e\x6d\xc0\ \x4a\x13\xae\x6e\xa5\x99\x74\x0c\x42\x48\x1f\x77\x54\x7d\x56\x1e\ \x62\x2f\xc4\x0f\xe8\xbc\x0c\xc9\xfc\xdc\x2a\x0b\xf3\xab\xf4\xfb\ \x39\x97\x2f\x5f\xe2\x85\x8b\xdf\xe7\xe3\x4f\x3e\xf2\xf6\x58\x50\ \x92\x3e\x8e\x53\x92\x44\x49\xfc\xd8\xa8\xfc\x51\xea\xf6\x5e\xb4\ \x3b\x3f\x2b\xb7\xad\xb0\x36\xfe\x16\xaa\xad\x06\x37\x4a\xd5\x92\ \xbc\xf7\xef\x34\x24\x95\x83\x16\xa0\xbd\x23\x3a\x40\xca\x70\x5c\ \x49\x40\x6b\xb3\xc5\xd2\xe2\x32\x9c\xf4\xe7\x44\xb8\x49\x76\x89\ \x17\xee\x65\xf7\x36\xa0\xdf\x2e\xbd\xb7\x80\x82\xf3\x87\xea\x47\ \x9b\x8d\xa4\xb1\xd9\xea\xf9\x38\xc0\xfe\xb7\x3d\x30\x93\xa2\x28\ \x58\x5f\x5f\xa7\xdf\xef\x97\x8e\x07\x2e\x03\xae\xfa\x03\xdc\x23\ \x03\x18\x52\x2c\xd4\x14\x09\x2d\xd2\x64\x84\x30\x4a\x88\x93\x1a\ \x51\x9c\x12\x18\x42\x0e\x04\x47\xa6\x04\xb5\x54\x81\x3b\x17\x7e\ \x10\xd2\xcd\x22\xa2\x50\x80\x8e\xe6\x12\x41\x68\x17\x6e\x18\xc2\ \xa1\x03\x92\xa9\x83\xb9\x45\xf8\xfb\x45\xc0\xea\x9a\x60\x65\x23\ \xd4\x51\x85\xfe\xa3\x54\x9b\x21\x3c\x31\xe4\x9a\x41\x2d\x01\x60\ \x6e\x39\x66\x6e\x39\xa6\x9e\xe6\x7c\xe1\x89\x16\x53\x07\xfb\xd5\ \xaf\xe8\x09\x80\x43\x07\x73\x7e\xfa\x8b\x9b\xcc\xcc\xc6\xbc\x7d\ \x29\x65\xa3\x25\xac\x1d\xef\x22\xd0\x29\x33\x04\x4f\x3b\x70\xea\ \x80\x31\x11\xec\x7a\xd7\x05\x42\x2c\x6b\xb0\x0b\xdd\xe6\x5a\x4a\ \xa7\x5d\x54\xbd\x0d\x2a\x99\x49\xc7\xbb\xfb\xa5\x2b\xab\x33\xb0\ \x4b\x66\xd0\xef\xe7\xdc\xb9\xbd\x04\xc0\xff\xf9\x4f\x7e\x83\xdb\ \xb7\x6f\x11\xc7\x09\xb5\xb4\x49\x14\xa7\x24\x49\x4a\x12\xd7\x15\ \xe1\x27\x35\x8b\xea\x27\x49\x6a\x6d\x7c\x93\x96\x6d\x77\x60\xd2\ \x1a\x9d\x01\x2a\xad\x9c\x37\x91\xa3\xfa\xa1\x4b\x35\x1a\xa5\x22\ \x3f\x05\xea\x39\xa6\x80\xd0\xfb\xa1\x5a\xd3\xc9\x85\x3f\x4b\x01\ \x14\x05\x8b\x0b\x2b\xac\xae\xae\x12\xa0\x77\x54\x15\xb8\xdf\x76\ \x21\x54\x30\x80\x22\x83\xf6\xb2\xf7\xf2\xdd\x44\x9e\x1c\x0f\xa7\ \xa6\x0f\x8e\x8c\x6f\xb6\x96\x1a\x38\x06\xb0\xdf\x99\x81\xbe\xe2\ \xb7\x65\x2b\x8a\x82\x56\xab\x45\xa7\xd3\xd9\x22\x10\xa8\xb4\x2f\ \xc0\x40\x02\xd3\x7e\x69\x00\x99\xfe\x9c\xa7\xe9\xa8\x08\xc3\x58\ \x73\xff\x18\x83\xb6\x8a\x00\xea\x35\x88\x63\xc1\xe5\x9b\x21\xf3\ \xcb\x0a\xf4\x31\x12\x40\x09\x7b\xc1\xa9\xa3\x05\x8f\x9e\x29\x38\ \x3c\x09\xa1\x1d\x6e\x79\x51\x66\x19\x2c\xac\x44\x2c\xac\x84\xcc\ \x2d\x85\x2c\xad\x45\xe4\x66\xea\x4b\x59\x74\xc2\x32\xf9\xa9\xf1\ \x9c\xa3\xd3\x7d\x0e\x4d\x66\x24\xb1\xe4\xe2\x5b\xa3\xac\x6f\xaa\ \xea\xc3\x55\x52\xe8\x74\x43\x9e\xff\xc1\x08\x7f\xfa\x27\x57\x89\ \x23\x5f\xbf\xd7\xcd\x63\x1c\x27\x0f\xf7\x39\x7e\x28\xe3\xed\x4b\ \x29\x97\xae\xc7\xe0\x81\x83\xee\x52\x83\x09\x68\x66\x80\x59\x52\ \xa6\x1e\xa0\xa9\xfb\x67\x74\xda\x8a\xf4\xc7\x30\x01\x7f\xeb\x6f\ \x77\xda\x97\xfe\x86\x09\x60\xb4\x22\xdc\xc5\x5b\x45\x02\xda\xa7\ \xd9\x41\xd7\x9c\x9b\x9b\x23\x4d\xeb\x24\x49\x9d\x34\xad\x93\x26\ \xfa\xef\xa4\x46\x6c\x24\xbf\x2d\xbe\xaa\x37\x85\x89\x5c\x41\x0e\ \x17\x8b\x6f\x66\x46\xda\x39\x52\x6a\xbc\x4e\xf4\x92\x1a\x97\x37\ \x59\xa3\xe6\xd9\x04\x16\x47\x21\xf0\x08\x5f\x77\x62\xca\x67\x18\ \x0d\xa9\xdf\xcf\x98\xbd\xbb\x48\xa7\xdb\x2d\xbf\xb6\xd2\x8b\xf4\ \x88\x1e\x2c\x53\xa6\xb5\xe8\xa9\x18\xe5\x6f\x1d\x1b\x0b\x0f\x1e\ \x9f\x1a\x39\x78\xed\xd6\xd2\x83\x04\x02\xbd\xbb\x0a\x56\x57\x57\ \x4b\x20\xae\xa9\x88\xe4\x6f\xfc\x62\x86\x5f\xfe\x6c\x27\xbb\xa2\ \xfa\xa8\xdf\xf7\xcc\x00\x3c\x2d\xc0\xcf\x36\x09\x92\xa4\x11\x04\ \x41\x2c\xe2\x28\x26\x0c\x62\x25\x89\x50\xaa\x7d\x14\xa9\x22\x2b\ \x57\x66\x0c\x36\xa0\xc6\x22\x84\xe0\x91\xb3\x05\x4f\x9c\xef\x33\ \xd6\x2c\x0d\xdf\xeb\xda\x3d\x59\x14\xc1\x91\xa9\x8c\x23\x53\x99\ \x22\xa8\x02\x96\xd6\x42\x16\x96\x42\xe6\x57\x22\x56\xd6\x23\x6a\ \x69\xc1\x68\xa3\x60\xf2\x40\xce\x89\xc3\x7d\xed\xfe\x73\xdd\x26\ \xa1\xac\xdc\xa6\xa2\x06\xa3\x25\x35\x83\xe7\xca\xef\x46\x15\x90\ \xfc\xcc\xa3\x1d\x0e\x4f\xe6\xbc\xfa\x4e\x4a\xa7\x87\x5d\x95\x7e\ \x76\x9f\x14\x02\x51\x48\x7b\xdc\x10\xaf\xd5\x48\xaa\x66\x00\x38\ \x66\x80\xb3\x85\xed\xe6\x1f\xde\xb8\x9d\x32\xa0\x3a\x76\x8b\xa5\ \x6c\x02\xec\x36\xf2\xcf\x7d\xd7\x3d\x6b\x1c\x25\x24\x49\x9d\x5a\ \xad\x41\xad\x36\x42\xad\xd6\x50\x0c\x21\x56\xd2\x3f\xb2\xea\x7e\ \x39\x35\xd7\xa2\xfa\x25\x2d\xca\x15\x36\xb5\xae\x3c\x6f\xba\x2d\ \x03\x34\x81\x50\x9a\xbb\x49\x74\x0c\x84\x4f\xf8\x7a\x02\x4c\xc6\ \x24\x12\x36\x5a\x6d\x66\xef\x2e\x53\x14\xb9\x63\x84\x25\x8d\x4f\ \xcf\x45\x85\x19\x01\xd0\x5b\x87\xcc\x57\xfd\xcb\x2d\xa6\x08\xbf\ \xf1\x63\x53\xa7\x2f\xfe\xf0\xc6\x5b\x28\x20\xf0\xc1\x64\x06\x7a\ \x22\x3d\xcb\xb2\x61\x87\x4b\xad\xfa\xbe\x61\xa0\x26\xa0\xf9\x6d\ \x2f\xda\x8f\x6c\x40\xa3\x05\x48\xa0\x88\xc2\x24\x0a\x83\x50\x04\ \x66\xc7\x5d\xfd\x36\x45\x20\x98\x5b\x82\x56\x1b\xe6\x96\x02\xbb\ \xc8\x47\x1b\x92\x9f\xf8\x5c\xc1\x91\xc9\x61\x0f\x25\xc9\x33\xc1\ \xad\xf9\x90\x85\x15\x85\x25\x1c\x9b\xca\x99\x9e\x28\xb0\x1b\x9e\ \x48\x89\x08\x04\x93\x07\x72\x26\x0f\xe4\x3c\x4a\x6f\x60\x12\x5c\ \x53\xc7\x6f\xcf\x27\x2c\x6f\x44\x43\xaf\x33\x6f\x70\x62\xbc\x20\ \x1a\xbe\x87\xa6\xf7\x3d\x7f\xc5\x4a\x8e\x4e\xf7\xf9\x99\xaf\x66\ \xbc\xfa\x4e\x9d\xbb\x8b\xa1\xca\x40\x93\x38\xb7\x20\xe5\x45\xea\ \x1d\xf0\x16\xb0\xeb\x56\x18\x53\x40\x9a\x5b\x94\xaf\x35\xba\xb1\ \x59\xc3\xea\xa3\x00\x0d\x80\xf9\x51\x91\xaa\x9f\xf2\x1c\xef\xa8\ \x09\xf8\x44\x09\xc4\x49\x4a\xad\xd6\xa0\x5e\x1f\xa5\x51\x1f\xa5\ \x56\x6b\x5a\x8d\x40\xf9\xf3\x23\xbb\xd9\xaa\xb1\xf3\xf1\x40\x5b\ \x3b\x76\xa5\xcf\x6b\x1d\x57\x13\x7f\xc1\x10\x06\x81\x7e\x06\x69\ \x35\x04\xfc\xf9\xc0\xcc\x85\x43\x11\xa4\x14\x2c\x2c\xac\xb0\xb2\ \xb2\xee\xbd\x9f\xdd\x34\xdd\x43\x91\x7b\xaa\xff\x90\x4b\xa4\x20\ \x90\x39\x4f\x9e\x1e\x3d\x29\x84\xa8\x49\x29\x1f\x18\x10\xb8\x95\ \x09\xb0\x5d\xfc\xff\x10\x0d\xc0\x97\xfe\x03\x5a\xc0\x7d\x31\x00\ \xad\x05\x58\x5e\x0d\x88\x20\x08\x13\x44\x18\x84\x9a\xf8\xcd\xfd\ \xa5\x14\xbc\xf4\x96\x20\xb7\x2f\x5a\x70\xec\x10\xfc\xf4\x97\x72\ \xe2\xd0\x7c\xbb\x3c\xfa\xbb\x0b\x21\x2f\xbf\x13\xb3\xb1\xa9\x43\ \x36\x05\xbc\x7f\x39\x26\x0a\xe1\xf0\xa4\xe4\xc8\x74\xc6\xd1\xc9\ \x82\xf1\xd1\x7c\xf0\xc9\x87\xb4\x5e\x26\xf8\xf8\x7a\x8d\x0f\xaf\ \xd5\xed\x3c\x6c\xe5\x1c\x3a\x32\xdd\xdb\xc5\x0c\x0c\x7e\xb7\x9e\ \x4a\x7e\xf2\xc7\x5b\x7c\x70\x35\xe5\xdd\x8f\x13\x9d\x5c\xea\xa9\ \xf1\x42\x2d\x52\x1f\xc8\x76\x7e\x6d\x4d\xd8\x1e\x95\xfb\xca\x89\ \xf4\xbe\x61\xeb\x00\xe8\xfe\x34\x1d\x21\x84\x51\x9f\x75\x87\x55\ \x5e\x65\x46\xbe\x1b\x4d\xa0\xf2\x9d\x38\x4a\x49\xd3\x3a\xf5\xfa\ \x08\x8d\x86\x66\x00\x49\x9d\x38\x49\x75\x04\x5f\x34\x84\xf0\xbd\ \x0c\x48\x24\x88\xa2\x54\x74\xc5\xf2\x42\xef\xf6\x16\x27\xf1\xe6\ \x4c\xfd\x2d\x34\xe1\x2b\x8e\xe1\x2c\x2d\xd5\x49\xbf\x9f\x73\xe7\ \xce\x3c\x9d\xf6\x90\xa2\x55\x15\x8d\x73\x20\x47\xc6\x68\x7b\xad\ \x05\xc5\x8d\x2c\x87\x32\xcb\xdb\x09\x77\x81\xe4\xec\x44\x72\xf8\ \xe0\x58\x7d\x6c\x69\xb5\xe5\x17\x0a\xcd\x18\x98\xb5\xfb\x68\xbb\ \x60\x24\xc3\x5c\x81\xe5\xf3\x43\x73\x01\x6c\xbb\x6f\x0d\xc0\x70\ \x3b\xc7\x08\x82\x54\xa8\x28\x5d\x33\x02\xab\x05\x64\xb9\x53\xc3\ \xc6\x46\x24\xdf\xfc\x42\xa1\x88\xdf\x75\x66\x55\xb2\xcb\x37\x43\ \x5e\x7c\x33\x71\xfe\x6e\x8f\xed\x67\xb9\xe0\xd6\x7c\xc0\xed\x79\ \x05\x1a\x36\xea\xca\x24\x38\x3a\x95\x33\x3e\x5a\xd0\x6c\x68\xe9\ \x2d\xa1\xd5\x09\x58\xdb\x08\xb9\x39\x97\x30\x33\x9b\x52\x14\xc2\ \x0c\xcb\x57\x9e\xbd\x19\x53\xff\x1d\x9d\x2a\xa3\xa9\xdd\x5e\xc0\ \x47\xd7\x6b\xdc\xb8\x9d\x92\x24\x05\x0f\x9d\xec\xf0\xd0\x09\x7f\ \xa1\x95\xfb\x78\xfc\x5c\x97\x43\x93\x19\x2f\xbd\x55\x67\xb3\x6d\ \x16\xae\xb7\x90\x8c\x89\xc0\x60\xe6\x9f\x4b\x20\x72\x2f\x55\x11\ \xbc\x2e\xb2\x62\x5c\x5e\xd6\x62\x90\x56\xa3\x32\x22\x5b\x08\x25\ \x3d\x2d\x83\x13\x5b\x4b\xfc\xad\x5a\xf5\xf2\x38\x4e\xb4\xfd\xdf\ \x20\x4d\x1b\xd4\xd2\x26\x49\x5a\x57\x85\x58\x84\xf2\xe7\x5b\x37\ \xad\xc7\x78\x14\xe1\x6b\x6d\x88\x50\x7d\xb6\xef\xda\xd1\x9e\x62\ \x04\x52\x7f\x47\x78\x84\x8f\x93\xf8\x50\x76\x67\xea\xef\xae\xb7\ \xda\xdc\xbd\xbd\x40\x5e\x68\x61\xb0\x1b\x32\xf4\x49\x42\x0a\xe8\ \xad\x41\xd6\xd9\xd5\xdc\x9c\x3a\x10\x4d\x4d\x1e\x68\x8e\x2e\xad\ \xb6\x0c\x0e\xb0\xef\x15\x82\xa4\xf7\x86\x77\x26\xf4\x2d\xb5\xb9\ \xa1\x84\x6f\x8e\xed\x5b\x41\x10\xc3\x08\xfe\xdc\x2f\xfc\x93\x04\ \x44\x18\xe8\x00\x24\xa7\xbe\x3a\x1d\x58\x22\xf9\xf2\x93\x92\x24\ \x1e\xd6\x11\xcc\xcc\x0a\x2e\xbe\x19\xdb\xc7\x2f\xdb\xc9\xfa\x4f\ \x0f\x50\x6b\x75\x04\x57\x6f\x26\x5c\xbd\xe5\xb4\x8b\x34\x86\x42\ \x2a\xef\x81\x6f\x7f\xaa\xd3\xc2\x53\xb9\x2b\x9a\x80\xee\x7f\x75\ \x23\x64\xac\x91\xd3\xcf\xe1\xf6\x5c\xca\xbb\x97\x1b\xf4\xfa\x8a\ \x78\xfb\xad\x90\xb7\x2f\x35\x18\x69\x14\x1c\x9e\x28\x33\x0a\x27\ \x29\x04\x93\xe3\x05\xdf\xf8\x7c\x8b\xef\xbd\x52\xa7\xdb\x15\x16\ \x2c\x71\x34\x29\xf5\x1c\xc9\x8a\x35\xa0\xe1\xbe\xaa\xca\x6f\x9e\ \xbf\x22\xd9\x9d\x47\x40\x3f\x89\x74\x4f\xe4\x4b\x5a\x7b\xfb\x6d\ \xa4\x7f\xf9\x9c\xfb\x5b\x4a\x69\xeb\xef\x25\xc6\xdd\x97\xba\x94\ \x5d\xeb\xc6\xad\x4c\x85\xcd\x6a\xd4\xcc\x0e\xe9\x99\x2c\xbe\x59\ \x24\xb4\xe0\x25\x40\x68\x74\xcf\x42\x22\x25\x2d\x46\xda\x08\x5d\ \x80\x1c\xc9\xc2\xdc\x0a\x4b\xcb\x6b\x8e\x53\x78\x0f\x6b\x3c\x2f\ \xa5\x47\xaa\x0e\x12\x54\xb4\x5f\x7b\x91\xdd\xb6\xc9\xba\x18\x7b\ \xfc\xe4\xd8\xa1\x8f\xaf\xcf\x1b\x4f\xc0\xfe\x07\x04\xed\x50\x12\ \x6c\x8b\xf4\xdf\xca\xe7\x2d\x93\x81\x80\xfd\xad\x08\x64\x5a\x2a\ \x10\xa1\xf3\x8c\x3a\x8e\x6e\x73\xd7\xa5\x60\x7c\xc4\xb3\x9f\xbd\ \x36\xbb\x1c\xf0\xdc\xeb\x89\x8e\x78\x93\x76\x31\xfb\xf4\x69\x03\ \x3b\x3c\xe1\xad\x5c\x43\x0e\x25\xef\xf5\x85\x5d\x39\x8a\x5f\xf8\ \x6a\xb7\xfe\xa2\xf5\x18\x78\x12\x58\xff\xff\xfa\x7b\x63\xfc\xf0\ \x43\x55\x93\xa0\x90\x46\x63\xd0\xca\x7a\xa0\x28\xf2\xce\x7c\x32\ \x84\x01\x94\xdb\x48\x43\xf2\x13\x4f\x77\x78\xe6\xb5\x3a\xfd\xcc\ \x93\xfe\xc2\xa8\xb4\x5e\xdc\x82\xf7\x3e\x0d\x56\xe0\x22\x07\x85\ \xb5\x97\x0d\x91\x3b\xd5\xd9\xc4\x03\x48\x97\x31\x58\x59\x8a\x3b\ \x05\x02\xed\xa6\x85\x81\xca\xd0\x33\x7e\x7d\x57\x78\x35\xd4\x2a\ \x5f\xe0\xd4\x18\x69\xad\x42\x97\x22\xad\xc7\x5b\xe0\x31\x72\xc3\ \x8c\xa5\x49\x70\x1a\x24\xfc\x12\xa3\x90\x81\xd5\x28\xd6\xd7\x36\ \x98\x9d\x5d\x22\xeb\x6b\x80\xcc\x7b\xde\x0a\x1b\x28\xfd\xb2\x12\ \xd5\x9f\xa4\xcd\xf9\x0a\xa7\xd8\xbe\x05\x32\xe7\xab\x8f\x1c\x3c\ \xfd\xbb\x17\x4a\x01\x41\x5a\xbe\x3c\xb8\x52\xe1\x7e\xdb\x49\x2b\ \x00\x1b\x07\xb0\x25\x0b\x7c\x00\x01\x0c\xb2\x6e\x06\x27\x2d\x54\ \xab\x16\x83\x94\x6e\x8e\x47\xea\xf6\x7a\x3b\xbe\x5c\xc2\xf7\x5f\ \x89\xc8\x32\x2d\x01\xbc\x91\x4b\xff\x83\xff\x2d\xaf\x53\x83\x2a\ \xbb\xdb\x56\x26\xc6\x27\x06\xd0\x7c\xc5\x11\x9f\x5f\x13\x50\x00\ \xfd\x42\x61\x17\x6e\xdd\x38\x17\x96\x00\xda\x9d\xad\xb4\xbe\xf2\ \xb1\x83\xe3\x05\x5f\xf9\x4c\x87\x30\x50\xab\xde\x2c\x3e\xe3\x07\ \xb7\x97\x0b\x20\x10\xa5\x37\x24\x0c\x91\xe8\x6b\x03\x63\xcb\xda\ \x8b\xb4\x4f\x1d\xf7\xd9\xfc\xec\xc6\xce\xdf\x29\x37\xc0\xaf\xdd\ \xa8\x22\x38\x95\xfb\x56\xb9\xf6\x42\x55\x81\x57\x78\x65\xb9\x04\ \x0e\xf9\xc7\x77\xf3\x0a\x10\x26\xe2\xcf\xfc\xb8\x0c\x7d\xe1\x3f\ \x8f\xe3\xdd\x65\x7b\x5d\xcf\x43\xbf\xd7\x67\x66\x66\x96\xdb\xb7\ \x16\xec\xce\x40\x6e\xe6\xbd\x6b\xed\x3c\xf8\x6f\xc5\x9f\x6c\xdd\ \xba\xbb\x57\xfd\x4d\x0b\x28\x78\xec\xd8\xc8\xb1\x38\x0a\x8d\x09\ \xb0\xef\x99\x81\xae\x1e\xc0\xf0\x77\x63\x9a\xef\xdd\x19\x04\x01\ \x07\xca\x82\xdb\x53\xf0\x40\x18\x80\x68\xf8\x03\x91\x5a\x95\xf3\ \x49\x31\x0a\x51\x6a\x1e\xfe\x71\xc9\xcc\x9d\x80\x76\xc7\x57\x5b\ \x8d\xf6\xe0\x7d\x34\x9d\x69\x8e\xe0\x18\x41\x65\x18\x1e\xef\x91\ \xa5\x0b\xa4\x3b\x2f\x1d\xd3\xb0\x74\x28\x8d\xef\xbc\xac\x56\xfb\ \x5f\xd7\x6c\x9e\x56\x27\xa8\xac\x5e\x7f\x8e\xcb\xf3\x7d\x64\x2a\ \xe7\xf3\x4f\xf4\x06\x4c\x11\x83\x45\x58\x66\x60\x26\xcf\x5b\xf8\ \xea\xbc\xc7\x99\xec\x77\x84\xc7\x20\xbc\xe0\x9a\x00\xf7\xdd\x2d\ \xea\x23\x0c\x73\x09\x56\xcf\x97\xa6\x53\x2a\xaf\x82\xca\xeb\x30\ \x05\x58\x02\xd0\xe5\xb7\x85\x29\xbe\x2a\x02\xdc\x63\x94\x25\xad\ \xa8\xcc\x95\x7b\x2e\x37\x56\xa1\x97\xa5\xb0\x4c\xc4\x4d\x09\x52\ \x32\x37\xbb\xcc\xd5\x2b\x77\xd8\xdc\x34\x04\xeb\x9e\xbd\x3a\xe7\ \xa5\x4f\x43\x84\xa4\x10\x01\x64\x5d\xe5\xf3\xdf\x55\xf3\x99\x87\ \xe4\xcc\xc1\x68\x7a\xf2\x40\x73\x04\x15\x16\xbc\x9f\x95\x82\xcb\ \x12\xcd\x8e\x57\x6c\xfb\xde\xb6\x70\xf3\x9a\x03\x56\xe7\xf2\x1f\ \xe4\x41\x84\x30\x6a\x0d\xc0\xdc\xb3\x4c\x88\x12\xe8\x67\x92\x76\ \xa7\xaa\x99\xc0\xc7\xd7\xd5\x70\x2c\xa1\x9b\xe6\x11\xb1\x25\x7b\ \x4f\x23\x30\x84\xec\x6b\x18\xd2\x9f\x43\x9f\x09\x6d\xc1\x28\xcc\ \x66\x24\xde\x61\xc5\x08\x4c\x35\x1f\xc3\x04\x3c\x80\xa9\xd5\x09\ \x4b\xbe\xeb\x8a\x28\x83\xca\xa2\x3c\x7d\x2c\xe3\xd3\x8f\x38\x26\ \x60\xae\xa9\x6a\x04\x16\xa0\xb4\x92\x50\xf8\x24\xe3\xae\x2f\x11\ \x12\x8e\x89\x99\x63\x81\x36\x7b\xcc\xf3\x4b\xb9\xe5\x02\xda\xc9\ \x34\xb0\xdf\x35\x69\xb4\xa1\x1a\x43\xe0\xdd\x2b\xf0\x09\x31\x10\ \x8e\x51\x99\xa9\xd0\xbf\x82\xd2\xc1\xf2\xa2\xb6\xcf\xef\x31\x91\ \x20\x10\xac\xad\xb6\xf8\xe4\xe3\xdb\x2c\x2e\xad\x1b\xb9\x68\x9f\ \xb3\xfc\x20\xde\x8c\x97\xfe\xf0\xaf\xd5\x03\x28\x32\xd8\xbc\xcb\ \x50\xee\x30\xa4\xdf\x6a\x3b\x75\x20\x9a\x1e\x1f\xad\x8f\x02\x7e\ \x85\xa0\x7d\xa3\xa9\x20\x34\x05\x41\x86\x0c\x67\x07\x06\x6e\xfb\ \x18\x74\x03\x96\xcf\xdf\xef\x20\x87\xb4\x7a\xa0\x89\xa4\xa8\xea\ \xef\xd2\xa9\xf6\x2b\x1b\x65\x22\x6e\xb5\x15\xf8\x67\x0f\xea\x05\ \xab\x08\xdb\x1d\x73\xea\xbe\x6f\x5d\x94\xd5\x04\x5f\x4b\x08\x04\ \x4c\x1f\xcc\x78\xe4\x74\x87\xc3\x13\x7d\xc7\x8c\xcc\xb5\xde\xf8\ \x7c\x8d\xc0\x2c\x65\x09\x95\xaa\xc0\xe6\x3e\x90\x17\x82\x77\x2e\ \x35\x14\xd0\xe8\x37\x4b\x91\xfe\x01\xd5\x1e\x3f\xdb\xe7\xa1\x93\ \x99\x5a\xd8\x1e\x38\x69\xaf\x33\x84\x6c\x34\x02\x51\x65\x10\xde\ \x72\xf6\x5e\xa9\x63\x02\xfa\x95\x5a\x8d\xc0\x25\x04\x6d\x45\xf8\ \xdb\x2e\xa4\x0a\x43\x65\x60\x0c\x9a\x80\xed\x20\x34\x91\x9b\xa1\ \xd9\x63\xc6\x0c\xf0\x89\xde\x23\x74\x3d\x7e\x5f\x24\x09\xa1\xaa\ \x07\x5f\xbb\x3a\xcb\xcd\x9b\x65\x75\xdf\x67\x2a\x95\x27\x1a\xf2\ \x53\xe6\xcb\xea\x9e\x05\x6c\xdc\x51\x7e\xff\x1d\xdb\xf0\xf9\x19\ \x4d\xa8\x7f\xf1\xe1\x03\xc7\x71\x1a\x40\xb8\xed\x17\xf6\xd6\x4c\ \x02\xe4\xae\xd5\xff\xa1\xe7\x83\x6d\x49\x5c\x3e\x08\x10\xb0\xa6\ \xc5\x8e\x12\x9a\x96\x5b\x3b\xe1\x29\xa4\x64\x75\x15\x8e\x4e\x82\ \x22\x3c\xc1\x9d\x45\x95\x7a\xaa\x1e\xc8\x4b\xac\x95\xbe\xd0\x2d\ \x03\x7d\x52\xdf\x43\x61\x0a\x2c\x73\x12\x00\x00\x20\x00\x49\x44\ \x41\x54\xe6\xe5\x1a\x7a\x51\x54\xf0\xc4\xf9\x1e\x0f\x9f\xea\x12\ \xea\xd7\x92\xe5\x82\x6f\x3d\x7b\x90\xac\xc0\xbb\x56\x6b\x46\x46\ \x41\xb2\xf8\x80\x6f\x9c\x98\xe3\xf6\x4e\x18\x80\xee\xf2\xcd\x94\ \x2b\xb7\x12\x1a\xb5\x82\x91\x7a\xce\x68\x33\x67\x7c\x54\xff\x8c\ \x14\x94\x55\x04\xd5\xd1\x67\x1f\xeb\xb1\xbc\x16\xb2\xb4\xea\xa4\ \xa4\x17\x1a\xe8\xe4\x91\x30\x9b\x7f\x68\x86\xe8\x4b\x34\x8b\xa6\ \x8b\xd2\x18\x4d\x91\xd1\x92\x22\xb2\x45\xdb\x8d\x26\xe0\x9b\x63\ \xee\xf6\xbe\x3e\x42\x89\xf0\xd5\xbb\x32\xc5\x2b\x1c\x63\x30\x8c\ \x56\xd8\x2f\x80\x01\x6e\xdd\x79\xd7\x7d\x9e\x4b\xe6\x66\x57\x58\ \x58\x58\x29\x69\x83\x02\x6f\x4c\xfe\x51\x3b\x4d\xb2\x7a\xa6\xa2\ \x47\xeb\x5f\xed\x25\x88\xa5\xd2\x64\xee\xb1\x05\x32\xe7\xcb\xe7\ \x0f\x9c\xfe\xe7\x7f\x68\x81\xc0\xfb\x2e\x15\xee\xc5\xd6\x94\xd4\ \xe0\xbd\xa2\xff\xde\x71\x73\xc2\xff\x6d\x2f\x7e\x10\x0c\xa0\x2e\ \x02\xe1\x24\x27\x1e\x01\x4b\x77\x60\x69\x4d\xe0\xa2\x88\xbd\xf1\ \x49\x2f\x45\x56\x7f\xd7\x48\x73\x19\xa8\x0f\x02\xc3\x5f\xf4\x3c\ \xf9\x15\x73\x25\x9c\x3c\xdc\xe3\x73\x4f\x74\xa8\xa5\xea\x7e\xcb\ \x6b\x11\xb7\xe6\x62\xae\xdf\x4e\xe9\xe7\x7a\x51\x98\x05\xa3\x09\ \xdf\x54\x94\x15\x9a\x79\x1d\x9e\xec\x91\xc6\x05\x77\x17\x53\xed\ \x51\xa0\x44\x84\xfe\x2b\x90\x12\x36\xdb\x01\xad\x76\xc0\xec\x52\ \x6c\x1f\xfc\xc4\xe1\x1e\x4f\x3f\xde\x26\x0c\x3d\x0d\x05\x41\x10\ \x48\xbe\xfc\x54\x97\xef\xbe\xac\xc3\x86\x31\x4c\xcf\xb8\xff\xb0\ \x83\x94\xc2\x7d\x36\x1e\x11\x89\x8a\x7e\x94\x12\x9b\x47\x60\x98\ \x81\xc4\x63\x02\x66\xee\x3d\x13\x60\xbb\x36\x7c\x11\x49\xfb\x8c\ \x8e\x59\xe9\x7e\x4c\x11\x56\xa3\x2f\x59\x6a\x2f\x94\x99\x60\xe6\ \x54\x2f\x06\xe9\xbd\x63\x7f\xbc\x48\xa7\x09\x14\x45\xc1\xd2\xe2\ \x3a\xb3\xb3\xcb\x64\x59\x56\xf2\x08\x58\x61\x52\xa1\x6a\x51\x25\ \x7b\xc7\x33\x4b\xd7\x9a\xd1\xaa\x2c\xbf\x08\x6d\xad\xee\xa2\x0d\ \x9f\x37\x21\x0b\x1e\x39\x54\x3b\xd6\xa8\x27\xcd\x56\xbb\xd7\xe0\ \xc1\x97\x0a\x57\xf7\x1d\xe4\x0f\x03\xe7\x4c\x0b\x06\xd3\x81\xed\ \xa5\xb0\xff\x3b\x03\x01\xb2\x16\x06\x66\x80\x6e\x01\xfa\x2a\x9b\ \x04\xae\xde\x12\x7c\xe5\x29\x77\x2c\x0e\xb5\xea\x2e\x2c\x59\x3b\ \xad\x5f\xa8\x2d\xaf\xcd\x2a\x2c\x31\x15\x23\x45\x94\xf8\xe3\xf8\ \xa1\x8c\xaf\x7e\xb6\x8d\x08\x24\xd7\x6f\x25\xbc\xf5\x51\x9d\x76\ \x4f\xb9\x68\x8d\x0a\x6d\x92\x67\x6c\xe1\x0d\x43\xd9\x7a\xd5\x08\ \x21\x58\x5e\x8b\xf8\xd9\xaf\x2e\xd2\xed\x6d\x72\xe1\xcd\x03\x6c\ \xb4\x75\x80\x8b\x96\x32\xb6\x1f\xf3\x40\xde\x78\xcc\xaa\xbe\x39\ \x1b\xb3\xbe\x19\xf0\xa5\x27\x5b\x34\xea\x45\x89\x09\x34\xeb\x05\ \x5f\x78\xa2\xc7\x85\x37\x53\x7c\xd7\x17\x76\x9e\x84\xcd\x0d\x30\ \x46\x89\xfa\x67\xb8\x90\x3e\xe7\x69\x05\xee\x7a\x81\xb3\x17\x7c\ \x20\x6d\x7b\x55\x72\xe0\xb3\x77\xc8\xa5\xe8\xa2\x99\x8b\xd1\xea\ \xdc\x66\x1b\x76\xac\x9a\x6b\xdb\x00\x1f\xf7\x7a\xd4\xfb\x2b\x11\ \xa5\x3a\x91\x65\x05\x8b\x0b\xab\xcc\xcf\xaf\x6a\xc2\x1f\x98\x10\ \x33\x92\xd2\x51\xbf\xaf\xe1\xd7\x57\x5a\xd6\x85\x5e\x1f\x38\xb0\ \xf5\x35\xc3\x9a\xaf\xa2\x78\xed\xcc\x44\x3c\x3d\x31\xde\x18\x6b\ \xb5\x7b\xd5\xad\xc3\xef\xbb\x55\x56\xc5\x40\x1b\xca\x08\x2a\x77\ \xf6\xb6\xc4\x1b\xca\x08\x1e\x04\x06\x90\x5a\xf5\x1c\x53\xe2\x52\ \x5a\x29\x04\x80\x84\x8d\x16\xdc\x9a\x77\xe3\x39\x7e\x58\xd2\xac\ \x9b\xeb\xbc\x85\xaf\xbe\xee\xf5\x04\xd6\xce\xaf\xd8\xed\x53\xe3\ \x39\x5f\x7b\xba\x85\x08\x24\x9b\xed\x80\x8b\x3f\xac\xd3\xea\x08\ \x7c\x0c\xa1\x04\x16\x9a\x1b\x68\xac\xc1\x9d\x97\x74\xba\x82\xdb\ \xf3\x09\x8d\x5a\xce\xd7\x9f\x5e\x21\x34\xc5\x65\x29\x8f\xad\xe4\ \x94\xc0\x7d\x36\xe7\x56\xd6\x03\xbe\xff\x6a\x93\xb9\xc5\xa8\x32\ \xfd\x82\xa3\xd3\x39\x8f\x9e\x55\x3e\x6c\x97\x1c\xe5\x5d\x66\x6d\ \x7f\x51\x39\xe6\xf7\xe2\x11\xaf\x05\x07\xdd\x71\xa3\x2d\x55\xdb\ \xae\xe2\x01\xa4\xf7\x5c\x76\xf1\x1b\xad\x4b\x4b\x7e\x4f\xf0\x1b\ \xe1\x5c\x0d\x3e\x35\x58\x84\x1d\x9b\x70\x12\x3f\xcb\x54\xba\xf1\ \x07\xef\xcf\x70\xf7\xce\xb2\xb6\xf3\xed\x13\x0c\x37\x53\x86\x0e\ \xd6\xf4\xbf\xfd\xf5\xa2\xb7\x5e\x7a\xfe\xdd\x4c\xc3\x60\x73\x13\ \x7a\x6c\x2c\x98\x3c\x7c\xb0\x31\x86\x2b\x10\xb2\x6f\x11\x81\x72\ \x0b\x13\xa0\xda\xca\x20\x6a\xf5\xdc\x40\x32\x50\xe9\xef\x7d\x67\ \x00\x52\x05\x02\x69\xa2\x90\xba\xa8\x84\x3d\xe7\x11\xb8\xe4\xa3\ \x6b\xee\x5b\x81\x80\xcf\x3e\xaa\x00\x99\x41\x34\x5f\x7f\xa7\x30\ \x15\xe1\xf0\x16\xa7\xeb\xff\xcb\x4f\xb5\x95\xaf\x5d\x6a\x26\x4f\ \x85\x50\x3d\xca\x37\x84\x5e\xd8\x43\xee\x98\x01\x1f\x6f\xdc\x49\ \x01\xa8\xa7\x39\x0f\x9d\x68\x59\x26\x51\x05\x1d\xcd\xdf\x3e\x83\ \xf3\x69\xae\xdb\x87\x0b\x6f\xd6\xb9\x79\xb7\xaa\x70\x09\x3e\x7d\ \xbe\xc7\xf4\x84\x2d\x3f\x3c\x1c\xd4\xb1\x02\xdd\x7b\xc9\xc2\xfd\ \xa1\x49\xc5\x12\x97\x21\x44\x0b\xbc\x59\xa6\xb7\xb5\x17\x60\xc7\ \x66\xf5\x69\x35\xc6\x00\x0f\xc0\x14\xa5\xe1\xd8\xd1\x38\xc2\xf7\ \x48\x5a\x7f\xa9\xdb\xcd\xb8\x75\x73\x81\xf7\xdf\x9f\x61\x7e\x6e\ \x55\xa5\xb5\x7a\xc0\xc5\xd0\x11\x96\x96\xb0\x63\x12\x6e\x66\xb6\ \xb8\xd6\x1c\x92\x39\xde\x8b\xbb\x3f\x25\x5d\x2f\xac\x44\x14\xe1\ \x37\x1e\x9f\x38\x8d\x03\x02\x6d\x66\xa0\xb8\xa7\x89\x2e\xdd\xa3\ \x6c\xd9\xec\x04\xf8\x0d\x39\x17\x0c\x1e\x2c\x7d\xde\x7f\x13\x40\ \x92\x0a\x5d\x8b\xdd\x8b\x64\x75\x2a\xa0\x1e\x4f\x51\xc0\x95\x19\ \xc1\x57\x3f\x23\x49\x55\xd5\x65\x1e\x3b\x27\x49\xd2\x8c\x17\x5e\ \x8f\xc8\x72\x4f\xf5\xa5\x1c\xfb\x2d\x04\x9c\x38\x9c\x71\x64\xaa\ \x60\xea\x60\x41\x20\x54\x12\xce\x48\xd3\xbd\xdc\x83\xa3\x05\xa7\ \x8e\xf4\x99\x5f\x8e\x68\x77\x83\x52\x56\x9e\xaa\x93\xaa\x6d\x67\ \x7d\x5c\x8d\xcf\x53\xab\x25\xdc\x5d\x88\xe9\xf5\x05\x49\x5c\xf0\ \xc8\x99\x16\x1f\xdf\xa8\x79\x5b\x4c\x55\x16\x90\x94\xee\x59\x6d\ \xdc\xbb\xb4\x18\x86\x04\x5e\x7b\xaf\xc6\xd8\x48\x8b\xb1\xa6\xc3\ \x3e\x84\x10\x7c\xe9\xc9\x1e\xdf\x79\x31\xa5\xdd\x13\xf8\x66\x88\ \xd3\x5a\xf4\x3c\x88\x0a\xfe\x21\xcc\x1a\x11\xa5\xf1\x28\xd5\x58\ \xf8\x43\xb3\xf7\xaa\xb6\x1d\x8f\x19\x6d\xcc\xaa\x4c\xfa\x45\x9a\ \x5c\x7d\xc3\x98\x8c\x96\x62\x26\x15\x97\x01\x69\xe7\x14\x68\x6d\ \x76\x98\x9d\x5d\x66\x79\x69\xc3\xbc\x4e\xbc\xab\xbc\x39\xa4\x3c\ \xbf\xf6\x90\xbb\x76\x8b\xcb\xbc\xeb\x85\xc7\xb7\xb6\x22\x9c\xfb\ \xe1\x02\x20\x64\xc1\x8f\x9f\x1e\x3d\x25\x84\xa8\x57\x33\x03\xef\ \xab\x63\xb6\x36\x01\xf6\x82\x01\x88\xe1\x9b\x83\xda\xd3\x0f\x02\ \x03\x48\xd5\xae\xd4\xd2\x2e\x52\xf0\xd4\x79\xc0\x64\x7a\x65\x39\ \x5c\x7c\x53\xf0\xcd\x2f\x9a\xc5\x25\x38\x77\x5c\x72\x74\xb2\xcf\ \x87\xd7\x42\x2e\x5d\x0f\xd9\x68\x81\x1f\x06\xfb\xe8\xe9\x9c\x27\ \x1f\xc9\x18\x6d\x56\x1f\xbe\xfa\x6c\x92\xaf\x7d\xb6\x05\x40\xa7\ \x2b\x58\x5a\x8b\x58\x5e\x8b\x54\xdd\x80\x95\x98\x6e\x57\xed\x19\ \xef\x81\xef\x98\xa8\x3f\x03\xa5\x15\x12\x96\xd6\x22\x8e\x4c\xf6\ \x48\xa2\x82\xa9\x03\x7d\xe6\x96\x62\x47\x50\x3e\xc5\xe9\x27\x08\ \x02\xc9\x8f\x3d\xd4\xe1\xf4\xd1\x1e\x4b\xab\x21\xef\x5d\x4e\x59\ \xdb\x50\x8a\x56\x51\x08\x9e\x7f\xa3\xce\xcf\x7e\x75\xb3\x94\x6a\ \x5c\x4f\xe1\x8b\x4f\xf6\x78\xfe\x8d\xd4\xb9\x4e\xbd\x7e\x07\x4a\ \xc3\x94\x6c\x6c\x61\x19\x8d\x65\x68\x56\x1b\x10\x25\xc6\x59\x6d\ \x7b\xf1\x02\xd8\x62\x22\xea\x03\xc6\x85\x6a\x88\xdc\xbd\x6b\x69\ \x39\xa8\xc3\x69\x60\x63\xbd\xc3\xdd\x3b\xcb\xac\xad\xb6\xb0\x5c\ \x7c\x57\x20\xb9\xa8\x5c\x3a\xec\x41\xbc\xc3\x02\x2f\xdb\xb0\xc4\ \xa1\xdd\x7c\x5a\x4d\x66\x17\xb7\xdf\x71\x74\x92\x73\xd3\xe9\x91\ \xf1\x91\xda\xd8\xca\x7a\xfb\x01\xed\x19\xb8\x85\xd1\xb3\x0d\x23\ \xf0\xae\x29\xab\x4a\x15\x66\xf0\x20\xbc\x00\x49\xe0\x01\x42\x06\ \xa9\x36\xc3\x70\x6e\x41\x35\xe8\x4b\xd7\x05\x69\x22\xf8\xd2\x93\ \x52\xa1\xe5\x08\xea\x35\xf8\xec\x63\x39\x9f\x7d\x2c\xa7\xdd\x15\ \xfc\xf0\x52\xc8\x47\x57\x22\xbe\xfe\xb9\x3e\x0f\x9d\xd0\x8c\x55\ \x62\xdf\xa0\x94\x70\x6b\x2e\x64\x7d\x53\x90\x15\x01\x79\x2e\x28\ \x0a\x05\xb4\x4d\x8c\x17\x1c\x1c\x2f\x38\x36\xdd\xe7\xd8\xa1\xcc\ \x5e\xbf\xb8\x12\x31\x73\x37\xe1\xea\xed\x94\x7e\x16\x54\x00\x2b\ \x27\x6d\x55\xb8\xaf\x6a\x47\xa7\xbb\xdc\x5d\x8c\x9c\x54\xaf\x68\ \x02\x13\x63\x19\x9f\x7b\xc2\x49\xf8\x63\xd3\x19\x47\x26\x33\x3e\ \xb8\x9a\xf2\xd1\x35\xc5\x38\x3a\x5d\xc1\xc7\x37\x12\x1e\x3f\x5b\ \x4e\x37\x3e\x3c\x59\xf0\xf8\xb9\x8c\xf7\x2f\x87\xbe\x1c\xb4\x7f\ \x39\x85\xc0\xc2\x96\x25\x46\x60\xf5\x00\x21\x54\xae\x42\xee\xde\ \xb3\x6f\xb1\x6c\xd5\xb6\x54\x2d\x7d\xc2\xb3\x5d\x7a\x6a\xb7\x31\ \xe8\x85\xbb\xc4\xe4\x23\xf4\xfb\x05\xcb\x4b\xeb\x2c\xcc\xaf\xb1\ \xb9\xd9\x65\xcb\x51\x38\xc5\xc7\x1d\x18\x1c\x80\x3b\x25\x19\x42\ \x5d\xc2\x3b\x26\x4b\xd7\x0e\xeb\x75\xe8\x83\xfa\x52\x6a\x0f\xed\ \xcc\x81\x60\x7a\x74\xa4\xd6\x5c\x59\x6f\xef\x6b\x85\xa0\x61\x18\ \xc0\x76\x52\x5f\xfa\x2a\x97\x3b\xe7\x13\xbc\xcf\x00\x80\x07\xc0\ \x00\x24\xc4\x83\xc8\xbf\xef\xee\xf1\x7d\xfc\xea\x61\xee\x2e\x0c\ \xdb\xf4\x40\x90\xe7\xf0\xfe\xe5\x80\xf7\x3e\x09\xf8\xe6\x17\x7a\ \x9c\x3d\x5e\xe0\x65\xed\x90\x65\x70\x79\x26\xe2\xbd\x2b\x31\xeb\ \x1b\x81\x5b\x98\xc2\x49\x40\x3d\x09\x1c\x1c\x2f\x38\x77\xa2\xcf\ \xd9\xe3\x3d\xd2\x04\xa6\x0e\x66\xe4\x85\xe0\x93\x99\xd4\xfa\xac\ \x6d\xe9\x6e\x4f\x9c\xa8\xd8\x13\x75\xfe\xe0\x98\xd9\xeb\xd0\x48\ \x55\x69\xa5\x48\x2d\x29\xf8\x89\xcf\x6d\x10\xf9\x95\x86\x50\x2e\ \xbf\x4f\x3d\xd4\xe1\xe4\xe1\x3e\x6f\x7e\x98\x32\xbf\x1c\x32\xb7\ \x14\xf0\xf8\xd9\xca\xac\x01\x9f\x7a\xa8\xcf\x9d\x79\xc1\xd2\x6a\ \x05\x9a\x31\x22\x50\x88\x92\xdb\xcf\xad\x0e\x5f\xf2\x7b\xe9\xc5\ \x82\x7b\x46\x79\x4a\xa8\x3e\x9e\x46\x67\x5a\x50\x01\x27\xf5\x38\ \xa4\x84\x95\xe5\x4d\x16\x17\x37\x58\x59\xde\xc4\xee\x08\xb5\xd5\ \x7d\xa8\x10\xbe\xc0\x8a\xfb\x61\x22\xb4\xc4\x1a\x4b\x17\x0c\xbf\ \x47\xc9\xa4\xb0\x97\xed\x86\xc8\xab\x0c\x61\xeb\xef\x4c\x35\x83\ \xf1\xc7\x8e\x8f\x4e\xcf\xdc\x59\xde\xd7\xcc\xc0\x61\x71\x04\x3b\ \x31\x82\x01\x1d\xdf\x69\x00\xf6\x90\xff\xf3\x20\x4c\x80\xb8\x28\ \xd4\x7e\x71\x81\x4e\x6c\xf1\xdd\x6e\x25\x29\xa1\xa5\xfd\xcf\x7e\ \xad\x20\x0c\xcd\x1a\x97\xe4\x85\xe0\xa3\x6b\x82\x37\x3f\x08\x69\ \x75\x04\x67\x4f\x14\x8a\xf8\x01\x03\xc4\x5d\xbb\x13\xf2\xd2\x5b\ \x29\xdd\xbe\x21\x7a\xbc\x94\x63\xb4\xbd\x6f\xb2\x06\x25\x4b\xab\ \x01\xcb\x6b\x35\xde\xfa\xb0\xce\x89\x23\x3d\x64\x2e\xb8\x39\x97\ \x58\x49\xef\x24\xa8\x9e\x25\xfd\xfe\xeb\xa9\xab\x78\x36\xda\xc8\ \xed\xa2\x50\x52\xd9\x03\x38\x25\xf4\xfb\x10\x95\x30\x60\xf7\x92\ \xc6\x46\x72\x7e\xf2\x73\x2d\x6e\xcd\x45\x14\xc3\x7d\x57\x08\x01\ \x5f\x7a\x32\xe3\x0f\x5e\x4c\xc8\xb6\xb2\x20\x2d\x8d\x58\x0b\xb7\ \xa4\x0d\x58\xf5\x5b\x5f\xec\xc7\x01\x94\xef\xb5\x5b\x01\xa5\xef\ \x21\xab\x7e\x00\x6f\x3c\x02\x36\x37\xba\x2c\x2c\xac\xb3\xb2\xb4\ \x49\x3f\x53\x60\x9b\x1c\x46\xc8\x03\x8f\x3e\x28\xed\x4b\x44\x3b\ \x94\x7c\x06\xd8\xc6\x16\xee\x40\xaf\x7f\xbf\x4e\xe3\xbd\xca\xe6\ \x2d\x98\x87\x90\x39\x3f\xf5\xf8\xc1\x33\xdf\x79\xfd\xc6\xeb\x94\ \xf7\x0c\xe4\x5e\x03\x82\x00\xc2\x30\x2c\xb6\x3a\xb7\x15\x23\x18\ \xc0\x00\x86\xef\x0c\x64\x2f\x7a\x20\x0c\xa0\xb5\xd9\xe5\xa3\x0f\ \x67\x19\x19\xad\x71\x60\xbc\xce\xc8\x68\x8d\x20\xf0\x54\x54\x3d\ \x91\x51\x08\x3f\xf7\x35\x49\xa3\xe6\x06\x7d\xf5\x96\xe0\xc5\x1f\ \x46\x6c\x6c\x9a\x17\x25\x39\x7b\xac\x4c\x0d\xef\x5f\x89\x78\xe5\ \x6d\x5d\x4c\x40\xf8\xc0\x91\x70\xe0\x9b\x19\x8d\x3d\xae\x88\x20\ \x97\x70\xfd\x76\x8c\x51\x19\xd5\x77\x3d\x9d\xd2\x98\xa7\xba\x83\ \x46\x3d\xb7\x41\x30\x71\x5c\x90\xc4\x85\x66\x3a\xe0\xf1\x1b\xda\ \x5d\xf8\xce\x4b\xa3\x1c\x9b\xee\x71\xfc\x70\xc6\xe1\xc9\x0c\xb7\ \xaf\x83\x7b\xbe\xe3\x87\x5c\x6d\xb7\x61\x6d\xb4\x59\xf0\x99\x47\ \xfb\xbc\xfe\xfe\x0e\xaf\xc6\xe3\x5a\x25\xf5\x59\x94\x4e\x79\xf7\ \xd6\xc4\xb5\xd7\xd5\x2f\x4b\xbf\xbc\xdb\x4b\xba\xbd\x8c\x85\x85\ \x36\x2b\x2b\x6d\xba\x9d\x02\x03\x7e\xee\xdc\x84\x47\xb4\xbb\xf9\ \xc2\x2e\x70\x80\xf2\xe5\x43\x71\x80\xc1\x27\x97\x15\xce\xb1\x17\ \x3a\x75\x93\x1e\xc8\x82\x27\x8e\x37\x8f\x47\x51\xd8\xc8\xf6\x73\ \xcf\x40\x53\x6c\x07\xf5\xde\xb6\x92\xfa\x5b\xc7\x4c\x94\x34\x80\ \x01\xf5\x1f\x1e\x0c\x06\x10\x4b\xa0\xc8\x25\x6b\xab\x1d\xd6\x57\ \xbb\x04\xa1\x60\x64\xb4\xc6\xf8\x78\x9d\xd1\xd1\x54\x55\x03\x96\ \x82\xa7\x7f\x0c\xa6\x27\xc0\xcc\xe4\x3b\x97\x04\x17\xdf\x52\xe0\ \x9c\xb0\xab\x58\x70\x74\xca\x42\xef\xbc\xf6\x4e\xc4\xdb\x9f\x44\ \xfa\xe1\xf4\x0b\x14\xb2\x42\x04\x83\x2a\xb3\x0f\xc7\x0b\x4d\x35\ \x12\x73\x99\xb0\xb9\xf4\x98\xe1\x48\x68\xd6\x0b\x0e\x8e\x66\xee\ \x18\x30\xda\xcc\xe8\xe8\x68\xbf\xaa\x7a\xd9\xe9\xc1\x95\x5b\x2a\ \x34\x38\x0a\x25\x47\xa6\x32\x8e\x1f\xea\x73\x6c\x3a\x23\x8e\x1d\ \x49\x6e\xdf\x24\xe7\x4f\x66\xdc\x9e\x0f\xb8\x3d\xbf\x37\x62\xb5\ \xe8\x80\x7e\xd5\xa2\xf2\x3c\x43\xbf\xb3\x03\x43\x70\x34\xa7\x3a\ \xc9\x0b\xc9\xca\xf2\x26\xb3\x77\x7b\x64\xbd\x90\x30\x4a\x54\xb9\ \x6f\x82\x01\xa9\x3d\x1c\xe7\xdb\x5a\x2b\x1e\x3c\x53\x66\x5e\xbb\ \xbf\xde\xfb\x4e\x69\x3c\x1e\x33\xd8\xea\xb1\xab\x6a\xff\x8e\x3c\ \x41\x5d\x70\x6e\x22\x3a\x3c\x3e\x52\x1b\x5d\x5c\xd9\xac\x66\x06\ \xde\xb7\x09\x60\xc5\xc8\x0e\x52\x7f\x07\x0c\x00\xdc\xd9\x07\x6a\ \x02\x44\x08\x27\x85\x15\x33\x80\xb5\xd5\x0e\x6b\xab\x5d\xc2\x20\ \x60\x64\x34\x65\x6a\xb2\xc6\xa7\xcf\xbb\xda\x7c\x00\x3f\xbc\x64\ \x2b\x7d\x5a\xe0\xaa\x51\x83\x46\x5d\x1d\x7b\xe7\xe3\x90\xb7\x2e\ \x85\x04\x42\x3d\xa8\x51\x83\x6d\x1e\xbf\xf4\x50\x7d\x43\x0e\x9e\ \xf4\xb7\x92\xdd\x93\xf4\x58\x0e\xea\x22\x10\x4d\xf6\xdf\xe9\x63\ \x06\xb8\x72\x63\x6c\xd6\x73\xe6\x88\xca\x87\x25\x38\xe4\x40\xd5\ \xbe\xc9\x72\x98\xb9\x1b\x71\x73\x36\x22\x08\x24\xc7\x0f\x65\x9c\ \x39\xd6\xd7\x9a\x01\x0c\xbc\x29\xd3\x91\x7e\xb7\x5f\x78\x22\xe3\ \xf7\x2f\x44\x3a\x54\xb8\xda\x7c\x5b\x8a\x12\xa3\x2b\xab\xe7\x02\ \x1b\x93\x31\xac\x97\xdd\xb8\x05\xf5\x62\x2b\x0a\xc9\xc2\xfc\x3a\ \x4b\x0b\x92\x7a\x6d\x9c\x34\x1d\x25\x89\x9a\x03\xdf\xdf\xba\x19\ \x7d\x64\x0b\x44\x60\xc0\x4e\x00\x90\xc3\x29\xc8\x3f\xe8\xbb\x1a\ \xb6\xb8\xbe\x44\x01\xf6\x82\x3d\x4a\xfb\x1d\xda\xe9\x83\xe1\xa1\ \xb1\x66\x6d\x64\x71\x65\xb3\x9a\x19\xb8\xa5\x1a\x7f\xaf\x6d\x3b\ \x6d\x60\xf0\xd8\x40\x4d\xc0\x92\x26\xb0\xaf\x81\x40\x7f\xe6\x4f\ \xff\xa3\x00\xe9\xed\xc4\xad\x27\xda\xa4\xe4\x82\xa4\x28\x0a\xd6\ \xd6\x3a\x9c\x9c\x5c\x23\xec\xcd\x93\xb7\x57\x90\xfd\x0e\x45\x21\ \x59\xdb\x2c\x47\x02\x02\xb4\x3b\x6a\xb7\x97\xf9\x65\xc1\xab\xef\ \xa8\x42\x7f\x2a\x78\x47\x96\xfa\x36\x36\xaa\x09\xe2\xb1\x4c\xc4\ \x04\xf8\xe8\xcf\x36\xe0\xc7\x5c\xeb\xf5\x53\x18\x5b\x59\x42\x10\ \x14\x3c\x74\xb2\xeb\x3d\x88\x1a\x53\x12\xb9\x67\xb1\x81\x45\x52\ \x7d\xd7\x5c\x67\xfa\x46\xff\xce\x73\xb8\x71\x27\xe2\xf9\x37\x6a\ \x7c\xfb\x42\x83\x85\x95\xd0\xeb\x73\xf8\xe2\xaa\x25\x05\x9f\x7b\ \x22\xaf\x9c\xdd\x66\x21\x1a\x24\xde\x7c\x34\x04\xb7\xbd\x10\xdd\ \xb1\x99\xaf\xe5\x79\x41\xa7\xdd\xd7\x43\x1e\xaa\x4d\x6e\x35\x30\ \xac\x5d\xb2\xcd\x15\xbb\xbd\xd6\x5d\xbf\x97\x31\x6c\xd7\x0c\xd3\ \xdd\x8d\x19\xb0\xf5\xb5\x8d\x88\xf4\x6b\x8f\x1e\x38\x86\x8b\x08\ \xbc\xef\xcc\xc0\x1d\xdc\x7b\x5b\x05\xfe\x54\x3f\x6f\xa5\xfe\x0b\ \xd8\xf7\x48\x40\x99\x4a\x6f\x92\x86\xf1\x7a\x43\xb0\xc7\x0f\x69\ \x62\xc9\xba\xe4\x9d\x55\xd6\x17\xe6\xb8\xf2\xc9\x12\xb3\x77\xd6\ \x58\x5b\xed\xe8\x3d\xe7\x15\x91\x2d\x2c\x09\xbe\xf7\x72\x40\x5e\ \xf8\xc4\x07\xb2\x90\xa5\x3e\x4d\x1a\xb0\xcf\x04\x90\x52\xd5\x9a\ \xf3\x23\xfd\x74\x3f\xf6\x7b\x7e\xbf\x9a\x11\x3c\xf5\x48\x9b\x66\ \xbd\xca\xbc\x25\xc7\xa6\x7b\x1c\x9e\xec\x2b\x85\x57\x2a\xe6\x64\ \x65\xbf\xe5\x07\x8e\xf9\xa8\xe3\xa6\x7f\xd8\x68\x09\xbe\xff\x4a\ \x8d\xf7\x3e\x89\x71\x7b\x3a\x0c\x67\x04\x27\x0e\xe5\x9c\x3b\x31\ \x4c\x80\x0c\x5b\x18\x95\x63\xc2\x98\x3a\xc2\x9e\x1d\xf0\xf1\xef\ \xc6\xfe\x96\xdb\x5c\x2b\x2a\x9e\x01\x77\x6b\xb6\x25\xd0\x81\xc3\ \x83\xd7\x8a\x2d\xaf\x1d\x7e\x50\x0c\x39\x5c\x1d\x87\x15\x85\x3b\ \x69\x01\x7b\xd1\x10\xf4\xb5\x82\x82\xaf\x9c\x1f\x3b\x83\x63\x00\ \x76\xcb\xb0\x7b\x8d\x08\xf4\x0a\xee\x6e\x69\xaa\xed\xd4\xb5\x3e\ \xbf\x25\x0e\xb0\xbf\x26\x80\x24\x41\x54\x94\x66\x6d\x97\x48\x70\ \x1b\x57\x00\xd7\x6e\xc1\x97\x9f\x72\x5f\x5d\x5e\x83\x76\xab\x47\ \xbb\xd5\x47\x2c\xa8\x4d\x19\xd2\x34\xa6\x39\x92\xf0\x2f\xbe\x95\ \x10\x44\x82\x24\x0d\x8c\xc2\xef\x34\xbf\x42\x7f\x28\x65\xcd\x09\ \xcb\x7e\x94\x6b\xc4\xb8\xee\xa4\x7b\xfb\x46\x83\xae\xd8\xc9\x42\ \xc0\xa1\xc9\x8c\x47\xcf\x18\xe9\x5f\x9e\xe0\x43\x93\x19\x87\x26\ \x37\xc8\x32\xc1\xf5\xbb\x09\xef\x5c\x4a\xe9\xf4\xdc\x02\xb3\xcf\ \x6e\xa3\xe1\xa4\xed\xde\x8f\xaa\x7b\xe7\xe3\x98\xcd\x8e\xe0\x0b\ \x9f\xda\xbe\xfc\xf8\xd3\x8f\x67\xcc\x2d\xc6\x2a\x20\x4a\xf7\xb4\ \xed\xd2\xac\xe8\xc0\x02\x4a\x8c\xd1\x1e\xdf\xcd\x9a\x94\xfe\xdd\ \xf4\xf3\x94\x46\x60\x0d\xb0\xaa\xed\x41\x95\x80\xf6\x62\xf9\x6f\ \xd5\x5c\x6d\x83\x5d\x5c\xef\x81\xcd\x3b\xb7\x3d\x4a\xfd\xa1\xbc\ \xb0\xe0\xd1\x23\xb5\x63\xf5\x5a\xdc\x6c\x77\xfa\x3e\x10\x78\xcf\ \x38\x80\x74\x12\x44\xdd\x63\x1b\x0c\x60\x9b\x6a\xc1\x55\xc2\x2f\ \x7d\xde\x57\x06\x20\x91\xa9\x80\x1c\x64\x68\x6d\x6e\x84\x97\x0e\ \x8a\x75\x07\xbe\xfc\x76\xc1\xd8\x08\xfc\x17\x5f\x15\x44\xa1\xe0\ \xfb\xaf\x4a\xaf\x1f\x25\xbd\xba\xdd\x8c\x5e\x2f\x67\x79\xa9\x0d\ \x08\x92\x24\xa4\xd1\x4c\x68\xea\x9f\x5a\x3d\xd2\x04\x0f\x25\xeb\ \x4f\x53\xb6\xb1\x37\x25\x3a\x41\x45\x0b\xe2\x61\x58\x80\x45\xfd\ \x53\xc9\x57\x9e\x6a\x51\xca\xba\x1b\x42\x2b\x51\x04\x0f\x9d\xe8\ \x72\xfa\x48\x8f\xb7\x3f\xae\xf1\xd1\x35\xe5\x59\x30\xf8\x47\x75\ \xd1\x58\x66\xe3\xc5\x0e\x5c\x9e\x09\x19\x6f\x46\x3c\x7a\xa6\x5a\ \x4e\xde\xdd\x30\x0e\xe1\xcb\x4f\x65\x7c\xf7\xe5\x68\x17\x80\xf9\ \xa0\x16\x90\xe7\x05\x79\x16\x94\x7b\xdf\x65\x48\xb0\xdf\x7c\x13\ \x07\xcc\x22\x1c\x36\xa0\xdd\xae\x77\xe7\x22\x1e\x60\x58\x43\xfb\ \x64\xcb\x33\x83\xac\xa6\x72\x6d\xe9\xd1\x76\x23\xf5\x87\x13\xf9\ \x90\x2f\x94\xda\xb9\x89\xf0\xd0\x48\xa3\x66\x18\x80\xbf\x75\xf8\ \x3d\xb5\x42\xab\xb8\xd5\x3b\x0d\x23\x78\x97\x10\x56\xbd\x76\x28\ \x06\x60\xdb\x7e\x83\x80\x29\x4a\x26\x87\x76\x12\xad\xf4\x2f\xdb\ \x76\x79\x21\xf9\xfd\x0b\x05\x2f\xbf\xad\xd4\x9b\x95\x35\xa1\xe9\ \x47\x4b\x2b\x61\xa4\x97\x79\x38\x49\xaf\x97\xd3\xef\x77\x58\x5d\ \xe9\x02\x82\x30\x14\x34\x9a\x09\x69\x1a\x51\xab\x45\xa4\xb5\x88\ \x34\x8d\x48\xe2\xd0\x1a\x37\x46\xeb\x30\xf5\xf4\x4d\x21\x0f\x3b\ \x25\x60\xd7\x75\xbd\x06\x3f\xfd\xa5\x4d\x4f\xf5\x37\xfa\xef\xb0\ \xc9\x55\xe7\xa2\x08\x9e\x7e\xbc\x4d\x12\x15\xbc\xf3\x49\xaa\xf9\ \x45\xc5\x67\x2e\x4c\x25\x5c\x9f\xa1\xab\xbf\xdf\xfc\x30\x62\xb4\ \x59\x70\x74\x3a\xf7\xba\x2f\xbf\xdc\xa9\x03\x92\xa7\x1e\xcd\x79\ \xf3\x03\xcf\x62\xab\xac\x0a\x29\xa1\xdd\xea\xb3\xb9\xd9\x67\x73\ \xb3\xc3\xc6\x7a\x97\xf5\x8d\x36\xad\xcd\x16\x3f\xf1\x93\xc7\x34\ \xe3\xd9\xbd\x1a\x29\x44\x79\xef\x81\x9d\xcd\x85\x92\xde\xb7\x43\ \xdb\x3d\x93\x70\x7d\xef\xd4\x85\xbb\x76\xab\xde\x8d\x63\xd0\x06\ \xcc\x54\x89\x7e\xa0\x55\x19\xc2\x16\xd7\xe8\x73\x47\x47\xc3\xa9\ \x23\x07\xea\x63\xf3\x4b\xeb\x3e\x10\x78\xcf\x0c\x60\xbb\xf8\x81\ \xdd\x02\x81\x95\x40\xa0\x81\xdf\xfb\xcc\x00\x64\x8a\x0c\x72\x90\ \xb1\x99\x6e\x63\x81\x9a\xbf\x8d\x16\x80\x5e\x60\x2b\x6b\xd2\x08\ \x4e\x4d\xf8\xe6\xe5\x38\xc9\xeb\x98\x00\x3a\xb8\x47\x1d\xcf\x73\ \xd8\x58\xeb\xb2\x21\xd4\x76\x60\x26\x1e\x5d\x04\x01\xb5\x24\x22\ \x49\x23\xd2\x5a\x48\x2d\xd5\xcc\xa1\x16\x12\x47\x3a\x7f\x5d\x2a\ \xb3\xc0\xec\xd9\x97\xc6\x05\x3f\xfd\xc5\x36\x63\x23\x2a\x1d\x35\ \xcb\x05\x1f\x5e\x4d\xb8\x7e\x27\xa6\xd3\x13\x8c\x35\x0a\xce\x1e\ \xef\x73\xea\x68\x46\x92\xf8\x13\xaf\xfe\x7e\xe2\xe1\x2e\xbd\x0c\ \x3e\xbc\x9a\x78\x66\x80\xaf\x0d\x58\xd9\xe9\xad\x55\x75\xee\xe2\ \x5b\x31\x3f\xf3\xe5\x82\xb1\xa6\x3b\x57\x5d\x35\x8f\x9f\xcd\x59\ \x5c\x81\x2b\x37\xa1\xd7\xcd\xe8\x76\x33\x5a\xad\x3e\x9b\x1b\x3d\ \x36\x37\xbb\x6c\x6e\xf6\x28\x72\x8d\x9b\x20\x91\x45\x81\x94\x6a\ \x93\x0c\x3f\x88\x67\xcf\x6f\xd4\x71\x80\x21\xe7\xca\xcd\x06\xe3\ \xde\xab\xd2\x5b\xfa\x9e\xfb\xb0\x7d\x77\x9e\xa4\xd8\x75\xff\xf7\ \xab\x05\x0c\x3f\x17\x09\x19\xfc\xcc\x13\x07\xcf\xbe\x73\x65\xee\ \x7d\x2a\x40\xa0\x26\xd8\x3d\xcd\x4a\x1c\xab\x85\x66\xb2\x2a\xb7\ \x75\xff\x6d\xd1\x44\x19\x15\x1c\xd0\x02\xf6\x5d\x03\x90\xc8\xc2\ \x27\x52\x9f\x78\x07\xf1\x00\x3d\x26\x49\xa9\xb8\x86\x2d\xd4\x21\ \x61\x70\x8b\x28\x35\x11\x8d\x3a\x7c\xf9\xc9\x8c\xd3\x47\xe1\xd9\ \xd7\x42\xae\xdd\x09\xad\xa6\x21\x8b\x82\x76\xa7\x4f\xa7\x93\xc1\ \x2a\x3c\x76\x2e\xe7\xfc\x91\x9c\x38\x96\x6c\x76\x42\xd6\xdb\x31\ \x8b\xab\x29\x6b\xad\x94\x30\x12\xd4\x6b\x01\x7f\xf6\x4f\xb4\x19\ \x6f\x4a\x64\x2e\x98\x5b\x8e\xb9\xf0\x66\x9d\xcd\x4e\xa4\x87\x28\ \x68\xb7\x43\x66\x97\x42\x5e\x7d\x17\x9e\x78\xb8\xc7\xa7\x1f\xee\ \x56\x7c\xc9\x92\xa7\x1f\xeb\xd0\xed\x09\xae\xde\x8a\x2a\xeb\xac\ \xbc\x7f\x9f\xdd\xe5\x08\x28\x90\xf4\x7a\xf0\xef\xbe\x1b\x71\x70\ \xa4\xcf\xa3\x67\x7a\x9c\x3b\xd6\x23\x14\x39\xb2\xc8\x41\xea\xdf\ \x45\xce\x53\x27\x72\x9e\xf9\x5e\xc8\x9d\x05\xb5\x92\xdd\x8b\xaf\ \x02\xae\x12\xff\xf6\xc5\x56\xda\xfa\x6e\x5a\x49\x03\x70\x5e\x93\ \x61\x62\x6d\x18\xa1\x0e\xc6\x02\xec\x92\x3b\xec\x70\x99\xb0\xa3\ \x90\x95\x63\x3b\x74\x5b\x7a\x69\x92\x9d\x03\x81\xb6\xeb\xb1\xcc\ \x2c\x02\x72\x9e\x3e\xd3\x1c\xba\x67\xe0\x0e\xc3\x1a\xde\xfb\x90\ \x38\x80\x9d\x82\x81\xaa\xef\x65\x1b\x37\xe0\xfe\x63\x00\x20\x53\ \xa1\xf5\x5c\x9f\x78\x9d\x29\x20\x2c\xe1\x4b\xfc\xaa\x3c\x60\x37\ \xe9\x18\x30\x01\x44\x89\x09\x4c\x1f\x94\xfc\xe4\xe7\x0a\xbe\xf0\ \xa4\x24\xd5\xa3\x6f\x77\xe1\xda\xed\x80\x2a\x73\x51\xbf\x04\x1f\ \x5e\x09\x09\x03\xc9\x57\x3e\x93\xf1\x95\xd3\x6d\x84\xe8\x00\xeb\ \xdc\xb8\x13\xf1\xc1\x95\x88\xcf\x3c\xda\x67\xaa\x91\x93\x6f\xc2\ \x77\x5f\xae\xf1\xbd\x57\x1a\x14\x45\x07\x21\x84\xaa\x81\x1f\x0a\ \xc2\x48\x10\x85\x01\x61\x14\x70\xfd\x5a\xc0\x7b\x1f\x14\xfc\xa9\ \xaf\x6f\xaa\x4a\x3f\xf6\x21\xe1\x73\xe7\x57\xb8\x71\xad\xc9\x27\ \x33\x91\xae\x85\xa0\x9f\x87\xc2\xb9\x2f\x25\xc8\xa2\xa0\x9f\x4b\ \xfa\xbd\x8c\x7e\x3f\xd7\xd7\x48\xbe\x8b\x64\xa4\x26\xf9\xc6\x17\ \x7a\x7c\xfd\xe9\xac\x94\x35\x98\x86\xf0\x2b\x3f\x9b\xf3\x7f\xfe\ \x96\x8f\x07\x94\xd4\x8b\x81\xbf\xd5\x1c\x3a\x40\xb4\xda\x76\x1b\ \x08\x34\x2c\x9c\x78\xef\x6d\x18\xd9\xfa\x67\x86\x7f\xba\x87\x5b\ \x0c\xb9\xa3\x69\xdb\xa9\xf3\x6c\x73\xae\xfa\xbd\x61\x5a\x80\xe4\ \x91\xe9\xf8\x48\xb3\x9e\x8c\x6e\xb4\xba\xf7\xbd\x67\xa0\x94\xc5\ \xc0\x77\x76\x64\x02\x95\xd7\x19\x94\xbd\x00\x50\xbe\x62\x7f\x4d\ \x00\x29\x49\x85\x10\xb6\xf6\xd5\xe0\x6e\x3c\x65\x13\x40\x7f\xcb\ \x33\x15\x34\x93\xd0\x9d\x39\x13\x40\x31\x81\xb3\x27\x24\x7f\xfd\ \x57\x0a\xe2\x18\xdb\xa3\x00\xd6\x5b\x8e\xa1\x38\x46\xa3\xef\xa7\ \xfb\x78\xef\x93\x88\xf7\x3e\x89\x99\x18\x4f\xf9\xe2\x93\x7d\xbe\ \xf8\xe9\x1e\xa7\x8e\x66\x9c\x3a\xea\x42\x73\xff\xe0\x62\x8d\xef\ \xbd\x52\xc7\x97\xa0\x32\xcb\xc9\x32\xa0\x0b\xfe\xdc\xcd\xcf\xc1\ \x87\x1f\x85\xfc\x8d\x3f\xbf\xce\x81\xb1\xb2\xab\xee\x9b\x4f\xb7\ \x78\xfd\xad\x71\x2f\x91\xc8\xfb\x5f\xba\x67\x56\x9f\xcd\x5f\x8e\ \x90\x37\xda\xf0\xad\xe7\x12\x2e\xbe\xf5\xff\x93\xf7\xde\xf1\x72\ \x1c\xd7\x99\xe8\x57\x9d\x66\xe6\x46\x5c\xe0\x02\xb8\x20\x02\x41\ \x00\x24\x48\x10\xcc\x99\xa2\xc4\xa0\x60\x8a\x22\x95\x2c\xc9\xb2\ \x1c\x24\xdb\x5a\xa7\xdd\xd5\xbe\x67\x3f\x87\xdf\xee\x73\x78\x3f\ \xcb\xb6\xac\xe7\xb0\x5e\xaf\xd6\xb6\xe4\x95\x95\x83\xad\x48\x65\ \x51\xa4\x98\x13\x18\x40\x82\x44\xce\xf1\xe6\x34\x39\x74\xd7\xfb\ \xa3\xaa\xba\x4e\x55\x77\xcf\x9d\x0b\x0c\x40\xea\xa9\x80\xbe\xd3\ \x5d\x5d\x5d\x55\x5d\x5d\xdf\x77\x4e\x9d\x4a\x1e\xde\xf9\xfa\x06\ \xb6\x6c\xd0\xf1\xaf\x3f\x8f\xe3\xda\x2d\x21\xb6\xbd\x4c\x7b\x70\ \x79\xf6\x19\x67\xb2\x1b\x14\x09\xb7\xf0\x5a\x00\x24\x9a\x04\xc1\ \x9c\x31\x1b\x64\xb8\x14\xf0\xa7\xf2\x41\x07\x24\xc1\x60\x48\xf8\ \x74\xaa\x6b\x47\x08\x29\xa0\x4f\x0b\x43\xdc\xfa\x21\x7f\xa4\xa7\ \x90\xeb\x29\x55\xea\x67\xbc\x67\x20\x8f\xd2\x29\xb7\xfd\x88\xc0\ \x4c\x1b\x40\xaa\x06\xd0\xf5\x71\x00\x5a\x1d\x35\x0f\x2a\xb1\xe2\ \x81\x3a\x84\x45\xe9\x60\x21\xdd\xaf\xae\x9f\x5f\xbd\x02\xf8\x8d\ \x77\x29\xf0\x23\xf6\xff\xd6\x43\x2e\xbe\xf3\xb0\x9b\x1a\x47\x32\ \x4e\x8e\xe9\x39\x86\xef\x3d\x9a\xc3\x47\x3e\xd9\x87\x3d\x87\x35\ \xff\x15\xcb\x0e\x9e\x78\x31\x20\x79\x06\xe2\x01\x46\xf6\x21\xff\ \xcd\x97\x81\xcf\x7e\xbb\x0f\xa1\xa5\xe0\x2d\xe9\x8f\x70\xd3\x15\ \x35\x95\x23\x9d\x8f\x38\x2f\x32\xff\x36\xf8\x61\xde\x9f\x9e\x05\ \x3e\xf9\xf5\x00\x7b\xd5\x7e\x09\x32\xd4\x3d\xb7\x45\x08\x7c\x1b\ \xea\xd9\x95\xd3\x1e\x5c\x15\xdf\x5d\x40\xa4\x1b\xb9\x89\x59\x44\ \x0f\xa4\xea\x3e\x09\xb0\x36\x57\x9d\xdd\x69\x17\xce\x61\xb4\x9c\ \xd3\x7e\xe5\x79\x3b\xd0\x2f\x40\x16\x4b\x0b\xe8\xbf\x7c\x6d\xdf\ \x0a\x88\xbd\x02\xec\x99\x81\x8b\x72\xaa\x17\x20\xeb\xc1\x4e\x34\ \xba\x8c\xb9\x00\x71\xa0\x6e\x2f\x09\x96\x23\xe3\x62\x00\x98\x20\ \x36\x2a\x1c\x05\x26\x05\x42\x0a\x09\x8c\x0c\x73\xfc\xf6\x7b\x23\ \xe4\x73\x66\x62\xdf\x7c\xc0\xc5\xfd\x4f\xa9\x2d\xc8\x48\xe5\xb4\ \xdb\xc6\x29\xa4\x50\xab\x01\x5f\xb9\x2f\x2f\x37\xa4\x14\x93\x70\ \x7e\xe9\xee\x8a\x01\x70\x9b\xc4\xe2\x43\x8f\xf8\xc1\xb1\x51\x17\ \xdf\x7a\xb0\x27\x51\x10\x77\xdc\x50\x13\xc6\x42\x6e\x56\x28\x3a\ \x40\x49\x5f\xcb\xfb\x5c\x87\x52\x2e\x8c\x38\xbe\xf0\x5d\xcf\x58\ \x28\xa4\xbf\x97\xe3\x67\x6e\x26\x62\x9d\x90\xab\xe9\x94\xad\x20\ \x91\xbd\x4c\x67\x93\x42\xb3\x19\xa6\xfa\x2f\x5e\xa4\x9d\x96\x10\ \x4c\xc6\x92\x56\xe9\x53\x7d\x58\xc2\x2b\xee\x29\x8b\x8d\x4d\xf2\ \x37\xfe\x31\xbf\x45\xec\x16\xa1\x21\x30\x44\xb8\xe3\xe2\x81\xf5\ \x10\xd2\xdf\x98\x18\x74\x26\x4b\x84\x65\x0d\x06\x4a\x00\x3e\x71\ \xdf\xb1\x6f\x1b\x36\x81\xb3\xa0\x01\x00\x1a\xec\x0a\xc4\x80\x49\ \x02\xb2\xda\xa7\x92\x80\xe9\x1f\xf8\xc0\x07\x7f\x16\xe8\xb5\x56\ \x70\xfe\xc1\x63\x0c\x3f\xde\x46\x9b\x11\x3c\x99\x0e\x49\x2b\x41\ \x12\xe0\x98\x99\x03\xc6\x67\x58\xfc\xcc\xc6\xb5\x2d\x6c\x5c\xdb\ \x8c\xc1\x6d\x0c\x23\x46\x36\x31\x3c\xf6\x42\x80\xbd\x87\xcd\xd6\ \x54\x6f\x81\xe3\xd6\xab\x6b\x3a\x3f\xfa\xad\xdb\x80\xdf\xd2\x3e\ \xe4\xdd\xb9\x12\xf0\xf2\x01\x3d\x4f\x02\x00\x6e\xb9\x9a\xa3\x90\ \xd7\xd7\xfa\x13\x24\x65\xb3\x6a\xbf\xdb\xed\xc7\x85\x2a\x14\xe7\ \x1c\x73\xb3\xe5\x44\x7c\xf1\xf5\x62\x15\x80\xb6\xd5\xbf\x13\x6c\ \x74\x1e\x26\x11\x72\xc1\x0c\x67\x6b\x50\x8b\xd1\x10\x58\x14\xe1\ \xf2\xb5\x3d\xab\x3d\xd7\xe9\x81\x20\x00\x3f\x2d\x3b\x9d\xb8\x28\ \x4a\x8e\x03\x58\x90\x04\x6c\xde\x3b\x97\x4d\x00\xce\x35\x01\x98\ \x24\x60\x36\x01\x0c\x55\x58\xfe\xe1\x09\x7f\x71\xfe\x96\xd7\x01\ \xcb\x87\xcc\x74\x1e\x7a\x86\xe1\x7b\x8f\x6a\x4b\x78\x32\x1d\x9b\ \x58\xac\x6b\x42\x04\xc7\xc7\x1c\x82\x65\x8e\x9f\xb9\xb9\x66\x82\ \x9c\x27\x0f\xbb\x49\x00\xce\xf1\xe4\x8e\x20\x51\x1e\x37\x5e\xd1\ \x80\x18\x00\x65\xc5\xa5\xdf\x12\x26\xf8\xe3\x82\x54\xd4\x19\xdf\ \x7f\x7c\xbb\xf9\x65\x03\x9f\xe3\xe6\x2b\x4d\x55\x5c\xc7\x60\x6a\ \x06\x69\x1a\x40\x27\xd2\x64\xf4\xd4\x14\xaa\x95\xba\x8c\x83\x90\ \x53\x7c\x9d\x11\xf9\xab\xd2\x29\x53\xa0\xc8\x6f\x7c\x7e\x5a\x5a\ \x40\xfb\x7b\x1b\x97\x79\xab\x7a\x0a\x41\x2f\xce\x70\xcf\x40\x45\ \x00\xb6\x5b\x8c\x31\xf7\x5c\x37\x01\x02\x06\x73\x4f\x1d\x0a\x26\ \x4e\x2b\xbf\x21\xfd\x49\x58\x42\x02\x1b\xd7\x00\xb7\x5d\x67\xbe\ \xd8\xd3\x3b\x80\xaf\xdf\x8f\x58\x3a\xc7\x95\xdf\x6e\x6a\xd8\x4d\ \x82\x34\xdb\x00\xe7\x38\x39\x6e\x16\xc1\x05\xab\x43\xf4\xe5\x23\ \x12\xd2\x6e\xf3\xa6\x1f\x3b\x0f\x78\xa8\x54\xf5\x7b\x03\x3c\x1e\ \xe0\x63\x03\xdf\x24\x04\x80\x96\x91\x09\x7e\x5d\x8a\xbb\x0f\x39\ \x98\x9e\x33\x0b\xfb\x75\xd7\x44\x64\x63\x1b\x13\xa0\xf4\x3c\xb2\ \x6c\x00\x0b\x55\xa0\x46\xa3\x81\xb9\xb9\x39\xb9\x7e\x9f\x8c\x2d\ \x8a\x12\x04\xc3\xad\xdf\x05\xdd\x19\x71\x45\x4a\x05\x4f\x78\x75\ \x88\x31\x9e\x75\x61\x4b\x77\x7a\xde\xee\x9e\xe9\xce\x5f\xe2\xae\ \xe8\x15\x04\x70\x46\x7b\x06\x06\x41\x10\x01\xe9\x6f\xd5\x69\x6b\ \xc2\x5a\x12\x4c\xfd\xc6\xe7\x67\x63\x32\x10\x03\x35\x04\xd8\x15\ \x9c\x56\xef\x36\x24\x10\xf8\xc0\x2f\xdc\xed\x80\xbe\xe7\x89\x31\ \xe0\x8b\xdf\x55\x33\xef\x00\x18\x24\x60\x69\x02\x48\x6a\x03\x69\ \x44\x10\xa6\xcc\xb5\xc9\xe5\x33\x24\x7f\x9b\x7f\xad\x90\xe3\xd9\ \x5d\x3e\xe2\x8a\x22\x8f\xcd\xe7\xcb\x75\x08\x09\x8d\xd0\xca\x94\ \xae\xf6\xeb\x70\xfa\x55\x39\x9e\x7c\xc1\xfc\x5c\x83\x7d\xc0\x55\ \x97\x44\xfa\x09\x53\xf0\x8b\x41\x4e\x2a\x0e\x2e\x2a\x4d\x18\x86\ \x99\x06\xc1\x66\xb3\x89\xb9\xb9\x39\x94\x4a\xa5\x44\x38\x4e\xc2\ \x29\x67\x4f\x04\x6a\x8f\xef\xb3\xac\x29\x74\x00\x88\x58\x0c\x32\ \x9e\x52\x60\x69\xd2\x3d\x0d\xf4\xf6\xbd\x64\xb8\xbc\xcb\x83\x37\ \x5c\x32\xb8\x16\x7a\x62\x50\xbc\x54\x78\xa7\xaf\x03\x98\x1a\x40\ \x87\x06\xbf\x76\x36\x00\x5b\x0b\x00\x70\x16\x8c\x80\x71\x9c\x14\ \x9c\x71\x59\xd9\x20\x05\x39\x37\x41\x71\xcf\xeb\x18\x96\x0f\xe9\ \xbc\x86\x11\xf0\xb9\x6f\xf3\x78\x46\x20\x95\xa2\x86\xd1\x2f\xd1\ \x24\xd0\xa0\xa7\x04\xa3\xfc\x7c\x2f\xf9\x71\x0b\xb9\xd0\x00\x37\ \x95\xce\xed\x8e\x5d\x07\xbd\x44\x5d\x19\x19\x0e\x2d\xe0\x53\x32\ \x51\xef\xaf\xca\x8b\x5c\x5b\x04\x06\x00\x4f\xbe\xc8\x10\x46\xe6\ \x27\xbe\xfd\x7a\x33\x8c\xce\x2b\x08\x79\x68\xe9\x5d\x2c\x16\x51\ \x2a\x95\x50\xab\xd5\x50\xab\xd5\x50\x2e\x97\x31\x37\x37\x87\xe9\ \xe9\x69\x14\x8b\x45\x84\x76\x97\x86\x8a\x95\x96\x63\xa2\x19\x13\ \x87\x4a\x7d\xf6\x55\xe3\x8c\xe5\x8a\xac\xf3\x44\xd6\x79\x9b\x70\ \x69\xf1\x90\x7b\x3c\xc2\xcd\x1b\xfb\xd7\x01\x89\x3d\x03\x17\x65\ \x08\x8c\xa2\xd0\x48\xad\x93\x47\x33\x7a\x01\x14\xce\xcf\xae\x11\ \x90\x0b\x23\x20\xe3\x46\xa5\x26\x40\x55\xa1\xda\xb6\xd9\x81\x75\ \xab\x80\xdb\xae\x53\x73\xe6\x85\xfb\xe1\x63\x21\x8e\x8f\x47\x71\ \x1c\x76\x3b\x99\xc6\x29\x92\x36\x41\x9f\xd0\x06\x64\x1c\x81\x45\ \x00\x1c\x40\xb9\xc2\x0c\x92\xe8\xf4\x5f\x2b\x4c\x02\x60\x6a\x96\ \xc4\x95\x00\x7e\x27\xe0\x57\x41\x44\xb7\xe3\x0b\xbb\xcd\xf8\xd7\ \xac\x04\x56\xad\x20\x51\xd1\xaf\x01\x69\xf8\xb3\xc6\x01\x34\x9b\ \x4d\x54\x2a\x15\x54\x2a\x15\xd4\xeb\x75\x84\x61\xb8\xf0\x80\x20\ \x62\x94\x8c\x53\x92\x1e\x4c\x8d\xba\xa2\x85\x18\x3f\xd7\x36\xda\ \x73\xe8\x52\x26\x2e\x1b\x65\x6c\x91\x28\xbd\x97\x08\x87\xf4\x70\ \x71\x4a\x1c\x5b\x46\x82\xd5\x81\xef\x51\x43\x60\x57\x76\x0c\x4a\ \x93\xfa\x56\xe2\xf6\x7d\x5b\xf5\x37\xb4\x80\xee\x6a\x00\xc2\x08\ \xe8\x66\x36\x01\x2c\x49\x9d\x45\x02\xf7\xdc\xea\x81\x39\x3a\xec\ \x89\x71\x8e\xef\x3f\x16\x19\x20\xd2\x24\x40\xe3\x49\xb9\xe6\xf6\ \xb5\x4a\x4b\xa4\xa6\xd3\x11\x6e\xd7\x41\x07\x53\x73\x1a\xf6\xa9\ \xd2\x1e\xed\x0e\xd3\x8d\x4f\x3b\x20\xb1\x99\xe1\x78\x32\xcf\x49\ \xf0\x9b\x1a\xce\xc3\xcf\x26\x3f\xd9\xc6\xd5\x56\x25\xe6\x80\xea\ \x02\x94\xc9\xc4\xa9\xa7\xaa\x8d\x1d\xf8\x69\x75\xc2\xf2\x4e\xe4\ \xa6\x1d\xe2\x4f\xf7\x5e\x37\x5c\x1a\xb8\x4f\x13\xe8\x29\xa0\xb7\ \xc3\x6d\x58\xe6\x8d\x14\xf2\x7e\x01\x82\x00\x4e\x6b\xcf\xc0\x30\ \x4c\x37\x02\xda\x2e\x7d\xd5\x2f\xe1\xc8\x82\x20\xea\xe6\xd9\x1c\ \x08\xa4\x9a\x00\x36\x50\x35\x09\x18\xed\xca\x14\x12\xd8\xb4\x8e\ \x61\xcb\x46\x9d\xad\x30\x02\x3e\x7b\x6f\x0b\x61\x94\x8c\x4f\x69\ \x0c\x89\x05\x40\xda\x68\x03\x36\x31\xfc\xe8\x49\x17\x2f\xee\x73\ \x10\x72\xe0\xe8\xa8\x83\x2f\x7e\x27\x30\x40\x9e\xfa\xaf\x5d\x53\ \xc0\x72\xa3\x93\x74\x52\xb2\x0d\x7c\x68\x3f\xf2\x2e\x76\x5e\x41\ \xc2\x1d\x3a\xc9\x51\xac\x98\x1f\x79\xfd\x1a\xd9\x23\xa2\x4b\x56\ \x9f\xab\xb4\x78\x07\xd2\xc3\xf2\xa3\xaf\x93\x66\x0f\xa0\x44\x6a\ \xa6\x7a\xb6\xc1\x7c\x7a\x8e\xa5\xe6\xef\x4c\x80\x9e\xf2\x8c\xfc\ \x1d\xe9\x77\x96\xad\x5e\x9a\x1f\x84\x69\x08\x5c\x9c\x0d\x20\x6c\ \x71\x95\x73\xe3\x3d\xda\x7c\xb7\xa4\x0d\x80\x29\xef\x34\x12\xe8\ \xfe\x7a\x00\x00\x97\xdb\x7b\xe8\xea\x2d\xc6\x5d\xb0\x78\xc2\x8f\ \xa8\x8c\x22\x2f\xe6\xc4\x21\x86\x7b\x6e\xf3\x8d\x38\x7f\xf8\x58\ \x88\x63\x63\x11\xd4\x4c\x33\xba\x6c\xb7\xd2\x3c\xe3\x71\x1d\x8c\ \x2c\x95\x2d\x6f\xc4\x23\x05\x54\x51\x92\x12\xe2\x5c\x6c\xd4\xf1\ \xaf\x5f\xf7\xe0\x38\x30\x97\xeb\xe6\x56\x61\xda\x02\x31\xe5\xfd\ \xfb\x7a\x4c\xdf\xd9\x22\x13\x0b\x7b\x26\xc0\x93\xac\x80\xb6\xd4\ \x17\x7e\xd6\xb5\xac\x6c\x73\x45\xa0\x9f\x8c\x3d\xda\xb0\x9a\x90\ \x09\xad\x98\xe4\x3d\xed\x0c\x77\x42\x06\xd4\xd9\x79\x49\x97\x94\ \x59\x3e\xe6\xdd\x73\x4d\x0f\x49\x50\x90\x6e\xc0\xb8\xf9\xb2\x90\ \xe4\xb7\x81\x6e\x3d\x63\x11\x87\xcb\x22\xf6\xe6\x4b\x07\x2e\xd8\ \x79\x64\x66\x37\xf4\x80\x20\x91\x7c\x87\x33\x03\xe7\x4b\x73\x99\ \xf7\x32\x17\x01\xb1\x9b\x00\xce\xb9\x5c\x0f\x80\xf3\x02\xb8\x28\ \xd1\xc4\x42\x20\x40\x06\x09\xe8\xf3\x4b\x36\xb8\xb8\x70\xad\x13\ \x7f\x97\x5a\x1d\xf8\xe1\xe3\x4d\x50\xee\x4e\x1f\xef\x2f\x81\xaf\ \xbe\x03\x23\xa4\x40\xaf\x91\x41\x04\x10\x9a\x46\xcc\x95\xc4\xdf\ \xbe\x68\x07\x93\xdb\xae\x6d\x1a\xd7\x2f\xee\x75\x52\x80\x63\x45\ \xc8\x6d\x48\xb4\x07\x3f\xc0\x91\x0f\xcc\xb8\x96\x2d\x61\xe8\xef\ \xe5\x28\x96\xe2\x90\xf2\x51\xa1\xb1\xd0\x65\xcb\x3a\xed\x43\x4e\ \x5f\x3e\xcc\x96\xf4\xd6\xbb\x2c\xe8\xb7\x90\x6b\xf7\xcc\x99\xd3\ \x06\x23\xfc\xde\x16\xdc\x36\x21\x74\xf2\x8c\xf5\x0d\x59\xc4\x71\ \xed\xf9\x3d\x74\x66\xa0\xea\x0a\x34\xac\xac\x19\x46\x41\x06\x80\ \x15\x8b\x8a\x00\x78\xe6\x74\xe0\x64\xf7\x6e\x22\x4c\x6a\xf7\x9f\ \x3a\xba\x3d\x1d\xb8\x27\x5e\xeb\x5d\x49\x67\xb9\x4c\x6f\x36\x09\ \x48\xc9\xce\x81\xb7\x52\xe9\xcf\x81\xa7\x76\xb4\x50\x6f\x8a\x8b\ \x58\x63\x00\xcf\x90\xfe\xfa\xcd\x6c\x6d\x40\x7d\x2b\x5b\xfa\xc3\ \xf6\x8b\xff\x24\xc9\xc0\x08\x93\xe2\x36\xaf\x8f\xb0\x6e\x95\x79\ \xf7\xc5\xbd\x0e\xec\x8a\x41\xf3\x93\xae\x09\xa4\xf8\x91\xca\x36\ \xbc\x84\x63\xd8\x1a\x18\x05\x00\x1b\x56\x03\x2f\xec\xa1\x95\x91\ \x6a\x00\xe9\x4d\x00\xa0\x73\x4d\x40\xcd\x62\x34\x5f\xc0\xb4\x6c\ \xd0\xcd\xb9\x68\xfe\x53\x62\xeb\xc0\xe7\xec\x38\x66\xf7\x04\xd0\ \x35\xe1\x52\x81\x4e\xfc\x12\x8e\xa7\x04\xd1\x1e\x9b\x57\xf8\xe7\ \xe5\x02\xaf\xa7\x56\x6f\xc6\x76\x80\x8d\x1b\x36\x47\xff\xcf\x1f\ \xff\xc3\xfa\xaf\x7c\xe9\x91\xab\x01\x5c\xf5\xef\x5f\x7c\x78\x0b\ \x04\x29\xd4\x00\x54\x01\xd4\x38\xe7\x35\xce\x79\x2d\xe2\x91\x4d\ \x16\xe9\x52\xdf\x0a\x93\x71\x6d\x13\x00\x80\xae\x37\x01\x50\x50\ \x12\xcd\x00\x69\x07\x24\xb0\x6e\x95\x83\xf5\xe7\xb9\x46\x7c\x0f\ \x3d\xa3\x25\xaa\xe4\x14\x12\xa7\x3e\x87\x71\x9d\xa1\x0d\x20\x03\ \xf4\xa4\x3c\xb3\xc8\x00\x20\x64\x92\x82\x0f\xcf\x65\x78\xf3\x2d\ \x66\xf7\x59\xb1\x02\x1c\x3c\x61\x36\x29\x92\xa0\x37\xaf\xd3\xd4\ \x6c\x6e\x64\x92\xe3\x6d\x77\x24\xd3\x07\x80\x0b\x56\x03\x2f\xec\ \x21\xd2\x59\x15\x12\xb7\xc1\x2b\x5f\xa3\x63\xa9\x4f\xcf\x09\xe0\ \x69\xaf\x40\xda\x07\xb1\xde\xaf\x73\x80\xf3\x94\xb3\xee\xb8\xf8\ \xed\x8c\x36\x51\x9b\xf3\x8e\x24\x3f\x32\x9f\xb9\x60\xc8\x5d\xb5\ \x75\xeb\x55\x6b\x5e\x73\xd3\x9d\xe7\x5f\xba\xe5\xca\x5f\x18\x1c\ \x1c\xba\xc8\x75\xbd\xcb\x00\x0c\xb6\xcd\xa7\xfc\x0e\xae\x5a\x4f\ \x84\x9b\xf7\x6c\xa9\x6f\x5e\x27\xe2\x4a\x05\xbe\x3a\xef\xf6\x7a\ \x00\x79\x2a\xb5\x16\x43\x02\x17\x6f\x30\xc1\x7f\x74\x34\xc2\xa9\ \x09\xb1\x21\x48\xac\x25\xd8\xf1\x90\x35\xfb\x54\x1d\xec\xef\x65\ \xf8\xf9\xbb\x18\x8a\x65\x60\x6c\x12\x18\x9d\x02\xc6\xa6\x80\x99\ \xa2\xfe\x38\x71\x79\x31\xb3\x44\xb2\xc8\x40\xbc\x8f\x7d\x22\x22\ \xe8\xef\xe5\xf8\xb5\x77\x34\xb1\x6e\x95\xa9\x18\xbf\xb0\xc7\x45\ \xc6\x48\xce\x38\x92\xc0\x07\x06\xfb\x22\x8c\x4f\x33\xc3\x5f\x95\ \x9f\x59\xd1\x38\xae\xb8\x98\xe3\xf2\x8b\xd2\x25\xf4\x05\x6b\xc8\ \x42\x64\x96\x16\xc1\x23\x42\x0c\x58\x8c\x26\xa0\xfd\x52\x5b\xee\ \xb4\x67\x80\x01\x1c\xca\x56\x63\x67\x23\x49\x40\xed\xe1\xdd\xa1\ \xe6\x60\xbc\x66\x76\x7c\x1a\xd6\xe2\xaf\xd6\x94\x55\xc6\x09\xf0\ \xdb\x91\x43\x47\x84\xc0\x11\x32\x0f\xc7\xfd\x2b\x70\xa8\xef\xe6\ \xde\x3f\xfc\xbd\x8d\xbf\xaf\x9e\x2a\xf4\xf8\xe8\x1f\xc8\x23\x9f\ \xf7\xe0\x07\x1e\x7c\xdf\x81\x1f\xb8\x70\x5d\x07\x51\xc4\xc5\x11\ \x46\x68\xb5\x22\x54\x2b\x0d\xb9\xda\x53\xfb\x45\x63\x17\x72\x2c\ \xd9\xd3\x6f\x90\x40\xb7\x57\x05\x16\x53\x76\x64\xa3\x7e\x31\x24\ \x70\xc9\x7a\x0f\xd2\x72\x00\x00\x38\x7c\x42\xec\x2f\x47\xa2\x93\ \x49\xb4\x93\xfe\xc0\x7c\x39\xc2\xa9\x09\x07\x6f\xba\xd9\x7c\xf1\ \x46\x13\x18\x9f\x06\xc6\x26\x39\xc6\xa6\x80\xb1\x69\x31\x35\x78\ \x7a\x4e\x87\x9e\xdf\xf5\x00\x00\x20\x00\x49\x44\x41\x54\xcc\xbf\ \xb7\x21\xd1\x8e\x0c\x94\x3b\x7f\x55\x84\x5f\x79\x47\x88\xc1\xbe\ \xe4\xbd\xe7\xe2\xfe\xfa\xf4\x8a\xc9\x39\x47\xbd\x01\xbc\xf7\xcd\ \x11\x4e\x8c\x31\x7c\xff\x31\x86\x72\x55\x84\xd7\xf5\x49\x57\xaa\ \xe1\x21\xe0\x03\xf7\x64\x5b\x20\x56\x2c\x25\x06\x95\x38\x16\x51\ \x39\x23\xa2\x01\x2c\xae\x27\x80\x10\x52\x1a\x99\x31\x33\x0c\xc9\ \x7d\x8a\xe3\x89\x53\x4d\x72\xc9\x20\x59\x8f\x9e\x89\x63\x46\x7a\ \x16\x70\x3b\x39\x37\x32\x63\xf9\x71\x60\xce\x59\x85\x43\xc1\x8d\ \x38\xea\x5f\x8b\x26\x2b\x20\x08\x5c\xac\x5a\xde\x87\x81\x81\x3c\ \xfa\x07\xf3\xf0\x3c\x27\xa1\xc2\x67\x8d\xca\x1c\x5c\x92\xcf\x0c\ \xb3\x90\x16\x60\x85\xb5\x0d\x7f\x67\xcf\x08\xc8\xa5\x06\xa0\x81\ \xdf\x19\x09\xb8\x1e\xb0\x71\x9d\x9e\xd3\xcf\xc0\x70\x74\x34\x4c\ \xf4\x10\xb0\x58\xda\x0b\xd6\x36\x9b\x04\x5a\x1b\x28\x55\x92\x85\ \x11\xf8\x62\xd0\xcc\x9a\x95\x66\x8e\x01\x8e\x46\x13\x98\x9e\x83\ \x20\x84\x79\xf1\x3b\x5f\x12\x00\xad\x37\x80\x7a\x93\xa1\x5e\x67\ \xa8\x35\x39\x96\x2f\x01\xb6\x6c\xe4\xd8\xb2\x91\x63\xe5\xb2\xf4\ \x42\x9f\x2d\x32\x1c\x3a\xae\xd5\xff\xf4\x8f\x23\xfc\x1e\xdf\xce\ \xf0\x8b\x77\x47\xb8\x6e\x2b\xf0\xc3\x27\x1c\x3c\xfc\x0c\xd0\x6c\ \xe9\x4a\xc6\x01\x0c\xf4\x01\xbf\xfb\x7e\xc0\x71\x53\xa2\x91\xae\ \xb7\x20\xda\xb7\x49\x6d\x5f\x78\x74\xa7\x1b\x90\x74\xbd\x12\x30\ \xc5\xdf\xd2\x7a\xb7\xac\x77\x5e\xd8\xaf\x8d\xf7\x19\x8f\x2c\xb2\ \x49\xc0\xb6\x01\xd8\x52\xbd\x8d\xb4\x97\xe7\x55\x36\x88\x1d\xf9\ \xbb\x70\xcc\xbf\x1a\x00\xc3\xe0\x92\x02\x46\x56\x0d\x60\x68\x59\ \x72\x9a\xb8\xed\x3a\x35\xee\x75\xfe\xde\x89\x6f\x9c\xa9\xfe\x03\ \x67\xa3\x09\x20\x0b\x45\x4b\xea\x34\x12\x90\xa1\xa5\x0a\xbe\x7a\ \x85\x03\x9f\xe4\x84\x83\xe3\xe8\x49\x3d\x0f\x9d\x4a\x7f\x74\xa0\ \x0d\x5c\xb0\x66\x71\xb9\x0e\x7c\x60\x64\x18\x18\x19\x4e\x63\xf7\ \xc5\xbb\xe7\x77\xb3\x14\xf5\x3f\xbd\xf2\x3f\xb7\x1b\x78\xe3\x4d\ \xc0\xca\x65\xc0\x5b\x6f\x8b\x70\xd7\x2d\x1c\x2f\x1f\x60\x78\x70\ \x1b\x70\x6c\x0c\xb8\xe2\x42\x8e\xf7\xbd\x85\xc1\x25\xe0\x1f\x9f\ \xe6\x38\x39\xce\x71\xe5\xc5\x5a\xcb\x61\x8c\xa3\x37\xcf\x50\xac\ \x90\x25\xca\x64\x3b\x5d\x8f\x93\x00\x09\xdf\x59\x6f\x00\xcd\x3d\ \x37\xae\xc8\x29\x53\xe0\x60\xd6\x13\xe9\xf1\xb4\xf3\x4d\x4d\xa3\ \xc3\x58\x16\x7a\x46\xbf\x9e\x2d\xbd\xc9\x77\x4f\x68\x08\x59\xe7\ \x1c\x21\x5c\xec\xf5\xef\xc0\xde\xe0\x76\x84\x4e\x80\x95\x23\x03\ \x58\xb5\x7a\x10\x85\x82\xd9\x95\xbd\x10\x98\x3b\x35\xee\xb5\x6f\ \xfb\x9b\x5d\xea\xd4\xdf\x8e\x8a\xfe\x76\xbb\x09\x90\x8f\x09\x92\ \xb5\x23\x01\x62\xa8\x63\x80\xeb\x24\x2b\xde\x7c\x59\x1b\xd5\x6c\ \xe3\x9d\x69\x10\x34\xb5\x81\xe1\x21\x86\x2b\x2f\x52\xc3\x88\xcd\ \x78\x8b\x65\xa0\x58\xe6\x70\x5c\x06\xd7\xe1\x70\x99\x00\x96\xeb\ \x88\xad\xcc\xf3\x39\xc8\x7d\xfb\xce\xcc\x1d\x3c\xa6\x0a\x81\x3a\ \x0e\xc3\x57\x9e\x84\x2d\x8e\xcf\xdc\xcb\xf0\x3b\xef\xe7\x70\x1d\ \xc0\xf3\x18\xae\xd8\x0c\x5c\xb1\x39\x29\xb5\x39\xe7\xb8\xf7\x41\ \xe0\x47\x4f\x84\x70\x1c\xe0\xef\x7e\x9f\xc1\x51\x1b\x1e\x00\xe8\ \xeb\xe5\x28\x56\x64\xe4\x5c\xa7\x18\x45\xa6\x5a\xb0\x58\x4d\x00\ \x00\xb8\xda\xc6\x48\x30\x8a\xf9\x12\xc6\x3b\x32\x99\xd7\x38\x70\ \x52\x23\x49\x75\xd9\xda\xc1\x42\x74\xdc\xb9\x6c\xd4\xe5\xc0\xc0\ \x65\x8f\x80\x2a\x3f\xfa\x4e\x0b\x9f\x8f\xba\x17\xe3\xf9\xdc\xdb\ \x51\x61\x43\xe8\x1f\xc8\x63\xc3\x85\xcb\xd1\xdb\x1b\x74\x24\xa9\ \x4f\x07\xf0\xa7\xeb\x52\x16\x05\x35\x5c\xf7\x07\x02\x31\xd5\x04\ \x60\x1d\x93\x40\xda\x9e\xd2\xf9\x1c\x03\x9f\x8f\x00\x63\x70\x0f\ \x59\x20\x54\xfe\xb1\xb5\x81\x37\xde\xe4\x80\x39\x1c\x95\x2a\xf0\ \xf2\xfe\x08\xc7\xc7\xc5\x50\xe2\x13\xe3\x1c\xc5\x72\xbc\x63\x1e\ \x29\x0a\x6d\xb6\xf2\x5c\xb1\x5b\xb1\xd0\x06\x98\xf8\x5d\x26\xfc\ \xbc\x36\xea\xb7\xed\x4e\x8c\x93\x6a\x6f\xbc\x5a\x7a\x25\x3f\x3e\ \x06\xdc\xfb\x63\xe0\x1d\xaf\x37\xef\xd8\xb8\xfc\xd2\xf7\x38\x1e\ \xdf\x2e\x80\x18\x46\x1c\x8d\x16\x8c\x31\x01\x7d\x3d\x32\x0d\x4e\ \x61\xc7\xe2\x6e\x40\x11\xe7\x22\xc0\x4f\x05\xbd\x31\x3a\x52\xdf\ \xb4\x64\x29\x19\xb1\x41\x6f\xb4\xd7\x86\xda\x4b\xfd\xc5\x4a\xfb\ \x85\x80\xc5\xa1\x17\xab\xb5\x34\x19\x4b\xb5\x4f\x3f\x07\x76\x06\ \x6f\xc4\x2e\xff\x0e\xf8\xbe\x87\x4d\x17\x2c\xc3\x8a\x91\x7e\x12\ \x7f\x67\x12\xfe\x74\xd4\xfc\x4e\xb5\x00\xeb\x99\x34\xe0\x9f\xb5\ \x26\x40\x4e\x88\xad\x34\x8b\x3d\x4c\x12\x80\x6e\x02\xa4\x55\x9a\ \x20\x00\xe2\xca\x6c\x75\xe5\xe9\xd1\x8d\xdc\xd0\x06\x06\xfa\x1d\ \x0c\x0d\x30\x7c\xf2\xeb\x4d\xbc\xb0\x87\xcb\x45\x39\x09\xc4\x6d\ \xc3\xa1\x8a\x53\xde\x6e\x86\xc0\xa9\x09\xe0\xd4\x84\x96\xaa\x00\ \xe0\xb8\x0c\x17\x9d\x0f\xdc\x7c\x05\x70\xd9\x45\x80\xbb\x80\x96\ \xe0\x7b\xbc\x4d\x3d\x4c\xab\xee\x1c\x3f\x7e\x1a\x28\x96\x19\xde\ \xfb\x66\xd1\x24\xb1\x5d\xb1\x2c\x76\x53\xa2\xb0\x9b\x9e\x05\xce\ \x5b\xa1\xc3\xf4\xf7\xc0\x02\xbf\x04\xac\xac\xc4\x0b\x81\x3f\x21\ \xf5\xd3\xce\x53\xc1\xa1\x88\x3c\xed\x49\xcb\x2f\xfe\xe1\xed\x12\ \xe8\x50\x6b\xc8\x72\x69\xa6\x48\x6e\x65\x2f\xe3\x1d\xda\x9c\x37\ \x59\x0e\xdb\x82\x77\xe3\x94\x7b\x09\x06\x06\x0b\xb8\xf8\xd2\x11\ \xf8\xbe\x7b\x5a\x80\x4f\x73\x67\xd6\xf6\xcf\x8e\xb3\xdd\xed\x6e\ \x13\x40\xa0\x55\x2a\x25\x95\x6d\x12\x20\x75\x45\xf6\x02\xa4\xb9\ \x7c\x20\x3e\xa3\x32\x34\x4b\xfe\x10\xf1\xc6\xd2\x0c\x71\x3a\xe0\ \x40\xb5\x16\xe1\x7f\x7e\xb1\xae\x62\x87\xda\x28\x24\x01\x7a\xea\ \x17\x47\x60\xfa\xc7\xf7\x20\xb6\x37\xdf\x7d\x50\x1c\x7d\x3d\xc0\ \xf5\x97\x31\xdc\x7c\x25\xb0\x62\x69\x7a\x29\xdc\xf5\x5a\x8e\x4f\ \x7e\x9d\xe4\x2d\xe1\xd2\x08\x82\xe3\x99\x97\x39\x4e\x4e\x00\xbf\ \xf9\x1e\x86\x25\xfd\xe6\x87\x7b\xf2\xc5\x08\x7a\x6e\x88\x78\xbe\ \x5a\x37\x50\x87\xbe\x02\xdd\x93\x48\x83\x9f\x6a\x00\xf1\xbb\x75\ \x34\x00\x88\x50\x94\xe8\x4b\x94\x3e\x84\x20\x0d\xe0\xda\xea\x7f\ \x06\xc6\xdb\xf8\x64\x7b\xa7\x51\xc2\x22\xc1\x61\xb0\x3e\x39\x69\ \x0b\x7c\x71\x5d\x64\xc3\x78\x22\xf8\x25\x14\x9d\x61\xac\x58\xd9\ \x8f\x4d\x9b\x57\xe8\xf1\xf7\x67\x51\xea\x9f\xa9\x73\xb2\x67\x03\ \x32\xa0\xeb\x4b\x82\x41\xc0\xd6\x50\x17\x75\xa1\x26\xce\xc1\xa1\ \x34\x06\xdb\xe5\x7d\x11\x21\xad\xd0\x69\xb3\xfd\x40\xae\xeb\x0d\ \x19\x1f\x49\xbb\xdd\x6a\x40\xd4\xcf\xf0\x4f\xb9\xa7\xd2\x2d\x55\ \x38\x1e\x78\x8a\xe3\xcf\x3f\x2e\x7e\xd3\xdc\x15\x9b\x81\xb5\x23\ \x24\xed\xc4\x01\x23\xdf\x3a\x76\xd1\x54\x79\x7c\x7b\x32\xde\x27\ \x5e\x50\x6d\x70\x1e\x4b\xf9\x9a\xd5\x45\xdc\xd7\x1b\x7f\x09\x50\ \xc9\x1f\xaf\xc4\x14\x13\xe7\x69\xd8\x00\x8c\x76\xbf\xce\x03\x28\ \x09\x27\x00\x69\x13\x5d\x5a\x79\xf1\xb6\x67\x0b\x63\x3c\x2b\x40\ \xd2\x9f\x19\xf7\x3a\x03\x3e\x38\x47\x99\x0d\xe1\xe1\xdc\x07\x51\ \x74\x86\xb1\x7e\xc3\x32\x5c\x74\xc9\xc8\x69\x95\x61\x27\x6e\xb1\ \x5a\x5a\xfa\x4c\xce\xc4\xfd\xcc\x8c\x9c\xa5\x45\x41\x91\x42\x02\ \x14\x94\xd0\xe7\x40\x3c\xa6\x9f\xba\x5c\x4e\x4a\x19\x6e\x01\x9f\ \x5b\x71\x73\x1d\x5f\x1a\xe8\xdb\x11\x01\x6f\x03\xf8\x04\x68\xad\ \xfb\x11\xe7\xf8\xfa\x03\x1c\xff\xf6\x03\x4e\xb6\xf9\xd6\xee\x9e\ \x5b\x75\x9e\x92\x60\xe7\xc6\x55\x4c\x84\x1c\x00\xe7\xd8\x73\xc8\ \x2c\x8f\x62\x99\x63\x7c\x2a\x8a\x09\x51\x91\x62\xbd\x6e\x86\x13\ \x04\x40\xc1\x0f\xa1\xd5\x10\xf0\x2e\xa6\xe2\xda\xdd\x80\xe9\x50\ \x5b\x08\xe4\x5c\xfb\x19\xe4\x4f\x43\xb7\x27\x06\x9a\x87\xd4\xdb\ \x9c\xc4\x92\x95\x17\x8e\x58\xdd\x63\x34\x5f\x06\xd8\x93\x79\xae\ \xb3\x1e\x3c\x9a\xfb\x00\x6a\x4c\x48\xfd\x35\xeb\x84\xda\x77\xba\ \x80\x5f\xec\x24\xac\xd3\x73\x3a\xce\x85\x36\x07\xed\x32\x01\x44\ \x01\xed\x72\xa2\xd3\x6e\x39\x92\xc0\x8d\x41\x9a\x52\x06\x39\x5f\ \x43\x26\x26\x02\x98\xcf\x27\xae\xd3\x40\x6f\x83\x2f\x8d\x1c\x6c\ \xc0\x5b\x60\x4f\x25\x04\x19\xee\x91\xe7\x22\x7c\xfc\xab\x11\x1a\ \xe6\x3c\x20\x6c\xbe\x80\x61\xf3\x05\xe9\x5a\x84\xa1\x09\xa4\xa4\ \x79\xf8\x64\x24\xb4\x19\x51\x8a\x18\x9f\x56\x15\x5c\xfb\x01\x1c\ \xb5\x38\x8c\x2c\x33\x8f\x49\xc2\x54\x61\xe4\x57\x21\xca\xc3\x42\ \xae\xed\x5c\x00\x02\x64\x5d\x2e\xe4\x1b\xc5\x69\xe8\x2f\x17\x3f\ \x9f\x8c\xd0\xba\xc9\x53\x42\xa5\x91\x4e\x07\x2f\x91\x88\x57\x38\ \x66\xbd\x43\x7c\x62\x6b\x37\x32\x7f\x2d\xf8\x78\x2c\xf8\x65\x94\ \xd8\x32\xac\x59\xb7\x14\x23\xab\xcc\x11\xbc\x67\x32\xb7\xe2\x5c\ \x39\x6b\xb2\x11\xb3\x7e\xbb\xbe\x2a\xb0\x67\x82\x15\x88\xc1\x4e\ \x81\x1f\xf3\xbe\x08\x6b\x57\x64\x00\x18\x59\xee\x18\xc0\x90\x09\ \xb4\xd5\x06\xec\xb4\xd2\x88\x21\x41\x04\x1d\x34\x05\x52\x09\x81\ \x84\x7b\x79\x5f\x84\x7f\xfd\x46\x72\x29\xad\xb7\xdd\xee\xc8\x9e\ \x8e\x76\x71\x9a\x67\x00\x10\x86\x1c\x07\x8e\xe9\xeb\xf1\x69\x93\ \xec\x14\x71\xd4\xea\x89\x2f\x10\x97\xac\x2e\x7b\x88\xf6\x7b\x8a\ \x5b\x4c\x65\xa5\x5a\x84\x4a\x25\x19\xda\xfa\x8e\x06\xe3\xa4\x01\ \x37\xc5\x8f\xdb\xbe\xed\x9f\x4b\x3b\xcb\x7e\x5a\x45\x4e\xbe\x1f\ \xc8\x75\xfc\x00\x07\xc0\xf0\xa4\xff\x5e\xcc\x38\xab\x31\xbc\xbc\ \x0f\x17\x6c\x1c\x7e\x55\xa9\xf9\xa7\x99\x16\xd5\x00\x18\xd0\xfd\ \x45\x41\xbd\x78\xe7\xb7\xd4\xf6\x3a\xc8\xb9\xae\xfa\x95\xaa\x1e\ \xf6\xab\xdc\xe5\x17\x05\x06\x18\x6d\x00\x2c\x46\x1b\x30\xfc\x8c\ \xb4\x61\x92\x41\x1a\xd8\xdb\x82\x57\xff\xdb\xb1\x2f\xc2\xf3\xbb\ \x4c\xa0\xad\x59\xc9\x70\xf9\xe6\xb4\xd0\xd6\xfb\x24\x48\x07\x28\ \x93\xd1\x8c\x42\x03\xd0\xc0\x57\x4f\xcf\x97\x49\x7a\xdc\x3e\x11\ \xe0\x67\xe0\x7a\x18\x2f\x29\xe2\x4e\x2a\x99\xdd\x04\xd0\x71\x68\ \x9a\x31\x08\xdd\xba\x17\xe7\x83\x3c\xc7\x8d\x3b\xe9\xe1\xb3\xdf\ \x29\xf9\x1c\x52\xee\x64\xf9\x27\x47\x38\x13\x12\xa0\xf5\x85\x03\ \x87\xdc\xab\x30\xe6\x5e\x88\xde\xbe\x1c\x36\x6f\x59\x15\xc7\x74\ \x3a\x52\xff\x6c\x6b\x01\x34\xfe\x56\x2b\x32\x9a\x4a\x7e\x10\xd8\ \x3b\x13\x9d\x3d\x23\x20\x00\x4f\xdb\xa1\x25\x70\x09\xe3\x26\x9b\ \x00\xe2\x5e\xa5\x6a\x6e\xb0\x09\x00\xcb\x87\x5c\x8c\x0c\x3b\x1a\ \x28\xdc\x02\x4e\x42\x1b\xe8\x90\x08\x2c\xc0\x0f\x2f\x61\x49\x7f\ \xe3\x19\x0b\xc0\x69\x4d\x01\x79\x7c\xe5\xbe\x50\x5a\xe6\xf5\x7b\ \x6c\x3e\x9f\xe9\xb8\x32\x9f\x4d\x92\x04\x5d\x0d\x6a\x7c\x9a\xb6\ \xff\x75\x79\x8e\x4e\x46\x34\x9b\xa4\x0c\x53\xca\x9a\x04\xeb\xbc\ \xc2\x12\x58\xc6\x44\x4c\x00\x98\x29\xe1\xdb\xdd\x83\x79\x8f\xa7\ \xdc\x4f\x01\x72\x7a\xfb\x3f\x9d\x04\xb2\x68\x80\x71\x45\x02\x3c\ \x69\x10\x24\x79\xa9\xb3\x5e\xec\xf0\x7e\x06\x00\xb0\xe9\xa2\x95\ \x70\x9c\x73\x0b\xe8\x33\x71\xa5\xa2\xa9\x16\x0e\xf4\x0f\xe6\x1c\ \xc7\x51\xeb\x11\x32\x08\xcc\xc7\xd7\x5d\x23\x80\x9f\x79\xfd\xef\ \xbb\x9c\xf3\xe4\x72\x60\x89\xca\x08\x7d\x2e\xc3\x56\xea\x11\x31\ \xa4\xe9\xcf\x77\xd9\xa6\xc0\x00\x07\xd5\x06\x6c\x62\xa0\x20\xd3\ \x06\x2b\x25\x99\xd2\x89\x60\xdd\x2a\x86\x3f\xf9\xed\x80\x2c\x40\ \x6a\x02\x3d\x9d\x10\xb2\xe4\x39\xc7\x6c\x31\xc2\x37\x1f\x08\xc9\ \x7b\x70\xac\x1b\x61\x44\xb0\x64\xff\xa3\xcf\x00\xdc\x58\xfd\xf7\ \xc4\x98\x09\x7c\xf9\x52\x18\x9d\x4c\x02\x47\x64\x97\xc6\x07\xc4\ \xf4\xca\x17\x39\x16\x80\x62\x2e\x4d\x5d\xa6\x69\x18\x4d\x3b\x2b\ \x82\x8e\x40\x9e\x7c\x36\x85\x06\x12\x3e\xe0\xf6\x73\x19\xe1\xc0\ \xa1\xa6\x47\x2b\x12\xc8\x92\xfe\x2f\x78\x6f\x46\x93\x15\x30\xbc\ \xbc\x1f\x83\x4b\x0a\x5d\x31\xee\x9d\x0b\x2d\x21\x0c\x39\x8e\x1d\ \x9e\x35\xfc\x1c\xc7\x65\xcb\x87\x47\xd4\x26\xa5\x0a\xf8\xf1\x79\ \xd7\x08\x80\xc7\x1b\x83\x8a\x2b\x55\xe1\x29\x08\x53\x09\x01\x40\ \x18\x46\x38\x78\xbc\x69\xc4\x06\x70\x5c\xbe\x99\x34\x03\x8c\xb8\ \x09\x81\xc4\xa0\xa7\x55\x86\x12\x81\x99\x2e\x25\x83\x28\x12\xc3\ \x81\xdf\xf3\xa6\x00\xef\xb9\xd3\x97\xf3\x11\x32\xc0\x6e\x13\x82\ \x45\x0a\xea\x78\xf4\xf9\x10\x87\x8e\xeb\x0a\x78\xde\x4a\x06\xe6\ \xa4\x83\x9c\x92\x16\x3d\x38\xe7\xc8\xc9\x8d\x86\x6a\x75\x60\x62\ \x86\x34\x91\xc8\x7b\x4d\xcc\x84\xc6\xbe\x06\x14\x0a\xaa\xf7\x87\ \x73\x9e\xda\x04\x10\x61\x3a\x1f\x08\xa4\x89\x56\x5d\xda\xef\x44\ \x9e\xa2\xc4\x61\x43\xda\xc8\x8a\x05\xde\x54\xcd\x20\x9b\x38\xd2\ \x89\x26\x35\xf7\x26\x81\xd2\xb8\xad\xa6\xcd\xb8\x73\x01\x8e\xb9\ \x97\x81\x39\x0c\x1b\x36\x2d\x8f\x9f\x7f\x25\xd5\xfa\x4e\x5c\xb3\ \x11\xe2\xc0\xde\x49\x34\x1a\x49\x5b\xd4\xaa\x91\x35\xbd\xd0\xa0\ \x57\x2b\x13\x31\x74\x67\xe4\xbb\x74\x9c\x07\x0a\x89\xe9\xd2\x99\ \x92\x00\x12\x52\x79\xfb\x9e\x5a\x22\xca\x0b\xcf\xf7\x51\xc8\xab\ \x8a\xa3\xe3\x33\xaf\x61\xa6\x97\xa9\x11\x58\xc0\xe6\x9c\x58\xda\ \x81\xdb\xae\xf1\xf0\xe1\xff\x9c\xc7\x1b\x6e\xf4\xd0\x5b\x40\xc2\ \x2e\x00\x23\xa5\x6c\x52\xe0\x11\xc7\x0f\x1f\xd7\x5b\x8e\xfb\x1e\ \xb0\x6a\x18\x24\x0c\xcc\xf0\xe4\x9d\x48\xe9\x60\xe3\x5a\x51\x01\ \x8e\x8d\x46\xe0\x11\x21\x2f\x12\x2a\x8a\xb8\x24\x07\xe3\x43\xe8\ \x1c\x72\x0e\x45\x02\x0b\xb9\x85\x2a\xb8\xde\xa9\x5a\x83\x38\x6e\ \x28\x70\x72\x4e\xf2\xa0\x3d\x2c\x82\x48\xdc\xb3\xef\x5b\x6f\x44\ \xf2\xcf\x33\xc2\x24\xfc\xa8\x40\x30\xf2\x9b\x42\x02\xc4\x6f\xbf\ \x7b\x03\x00\x60\xc5\xca\x01\xe4\x0b\x29\x43\x32\x5f\x85\x6e\x6e\ \xb6\x86\x9d\x2f\x8d\xa1\x38\x9f\xb0\x0a\x03\x00\x86\x87\x57\x2a\ \x0d\xc0\x83\x26\x00\x17\xdd\x35\x02\xf2\x1c\xe7\x3c\x34\x81\x8f\ \xb8\x92\x53\xe0\xd9\x52\x19\xe0\x78\x61\x77\x25\x11\xa3\xeb\x00\ \x77\xdd\x22\xc6\xb7\x1a\xc0\xb7\xaf\x17\xb2\x0f\xc8\x8f\x6b\xfb\ \xd5\x1b\xa6\xd1\xae\xbf\x87\xe1\x9d\xaf\x0f\xf0\x91\xff\x33\x8f\ \xdf\xfe\xb9\x9c\x90\xdc\x6d\x9a\x02\x06\xd8\xc8\xd5\x8e\xfd\x21\ \xe6\x4b\x3a\xde\x75\xab\x18\xc9\xb1\x19\x36\x2d\xbe\x0b\x56\x33\ \x0c\xf5\x8b\xa6\xc3\xd1\xd1\x30\x09\xaa\xb8\xec\x60\x35\x03\x08\ \xd1\x92\x0a\xae\xc0\x4b\x43\x76\x24\x61\xc8\x03\x89\xde\x9b\xf8\ \x4d\xe8\xa6\x03\xaa\x8c\x40\xc2\x91\x73\x03\x8f\x56\x9e\x38\xec\ \xd0\xe9\x99\xe1\xd6\xb5\x15\x26\xf3\x39\x00\x2c\xd1\x04\x88\x5f\ \x0e\x00\x47\x9d\xf5\x60\xd4\xdd\x0c\x00\x58\x36\x9c\x5c\xe4\xe1\ \x95\x50\xeb\xdb\x39\xce\x81\xe3\x47\x67\xb1\x6f\xf7\x04\x5a\xcd\ \xf4\x9e\x1e\x00\x98\x9d\x9b\x0e\xa1\x41\xaf\x0e\x07\xdd\xd4\x00\ \xb8\x58\xfa\x38\x8a\x3f\xab\x05\x4a\xa3\x5d\x2e\x55\x76\x5a\x91\ \x4f\x8c\x37\xf1\xd4\x8b\xd5\x44\xbc\x6f\x7a\x4d\x2f\xd6\xae\xf4\ \x74\x58\x02\x7a\x90\xf8\x29\x11\x80\xf8\xb5\xd3\x08\x6a\x8d\xf4\ \x42\x73\x19\x43\x4f\x01\x72\x4a\xaf\x49\x38\x46\x33\x22\x83\x14\ \xa2\x88\xe3\xe9\x97\xb4\x16\xb0\x76\x15\x4b\x84\x49\x80\x86\xc4\ \xfb\x96\xd7\x69\xc9\x73\xf4\x54\x64\x3c\xa3\x06\x3e\x29\x40\x4e\ \xcd\xea\x77\x68\xb6\x94\x3f\xe2\xf8\x39\x78\xbc\x05\xba\xba\xd5\ \x69\xc5\xb5\x55\x7e\x70\x1a\xbf\x0a\x91\x34\x18\x9a\x60\x4d\xf1\ \xcf\xbc\x67\x3f\x67\xc3\xd9\xba\xa6\xc4\xb6\x00\x31\x00\x64\xc0\ \x29\x8d\x9f\xd8\x01\x8e\x38\x57\x80\xc3\x01\x63\x0c\x43\x4b\x7b\ \x5f\xd5\xc6\xbe\x4a\xb9\x89\xdd\x2f\x8f\x61\xf4\x64\x71\xc1\xb0\ \x47\x8f\x1d\xac\x40\x6f\x53\x6e\x90\x40\x37\x9b\x00\x39\x0e\x44\ \x09\x35\x1d\x44\xd2\x65\x48\x7f\x75\xfe\xe9\x7b\x67\x30\x69\xa9\ \xb4\xae\x03\xbc\xff\x6d\x83\x92\xbd\x29\x18\x61\x80\xde\x4e\xa3\ \x13\x22\xa8\xd6\x38\x9a\x21\xd1\x56\x88\x7b\x7e\x57\x2b\xd1\x4c\ \xb1\x8f\x34\x52\x50\xc7\xfe\xa3\x61\x1c\x74\xdd\x88\x93\x1a\x26\ \x06\x33\xc9\xef\x3d\xb7\x7a\xd8\x22\x97\x47\xab\x36\x38\x5e\xde\ \xdf\x82\x22\xc9\xb4\xbc\x34\x5b\x3a\x1f\xa5\x72\x94\xc8\x9f\x78\ \xd5\xec\x91\x40\x9d\x4a\x2d\xce\x2d\x49\x1f\x47\x47\x41\x4d\x08\ \x03\xd6\x39\xa7\xfe\x04\xb8\xc6\x5f\xfb\x49\x93\x70\xb2\xc2\xa7\ \x64\xb6\x8d\x9f\xfa\xfe\xe4\x5c\xc6\x71\xc4\xbd\x1a\x00\x30\xb8\ \xa4\x00\xcf\xeb\x76\x07\x59\x77\x34\x82\xe2\x7c\x1d\x7b\x77\x8d\ \x63\xe7\x8e\x51\x94\x4b\x0b\x2f\x17\xd6\x68\xd4\xc3\xf1\xf1\x53\ \x4d\x68\xf0\xd3\x66\x40\x17\x09\x40\xcc\x04\x8c\x38\x29\x5c\x5b\ \x45\x57\x05\x6f\x93\x80\xba\xae\xd6\x42\xfc\xaf\x2f\x4f\xa1\x5a\ \x33\x25\xf3\xfa\xd5\x1e\xde\x70\x43\x8f\x04\x1b\x2c\x22\xe0\xf0\ \x5d\x8e\xb7\xdd\x5e\xc0\xaf\xbe\xb3\x0f\x77\xdf\x56\x30\xe6\x11\ \x24\xc8\xc1\x02\xdc\x7c\x49\x6d\xae\x49\xc3\x02\xcf\xed\x6a\x9a\ \x79\xb4\x8e\x2c\x52\x50\xc7\xc9\x09\xfd\x0e\xab\x97\xab\x69\xcc\ \x59\x87\xc8\xc1\x9d\xaf\xf1\x71\xd7\x6b\xf5\x36\xe3\xf7\x3d\xde\ \x44\xa9\x12\x91\xf4\x60\x3c\xc3\x25\x01\x28\x57\xae\x6a\x7f\xa3\ \x9c\x94\x5e\xc6\x17\x59\x09\x0d\x6c\x13\x0d\x0e\x04\x98\x2a\x0d\ \x22\x81\x35\x2f\x18\x50\xd6\xd7\x6d\x88\x23\xf9\x1c\xb9\xe6\xd6\ \x75\x5a\x46\xcd\x5c\x68\xac\x03\x00\xd3\xc3\x80\x99\x52\xca\x64\ \xbd\xa8\xa1\x07\xf3\x8e\x98\x5a\xe9\xfb\x7a\xee\xf7\xab\x65\x64\ \xdf\xcc\x74\x15\xbb\x5e\x1a\xc3\xee\x97\xc7\x30\x37\x9b\xb4\x97\ \x65\xb9\xa9\xa9\xf1\x1a\x92\x06\x40\xa5\x0d\x38\x5d\x9b\x0d\xc8\ \xc1\x73\x0e\x59\x7e\xd2\x9c\xf9\x27\x87\xa8\xb2\x78\x38\xb6\x28\ \x7b\x46\x57\xf0\x15\x20\x39\x74\xbc\x8e\x8f\xfc\xcb\x04\x7e\xf7\ \x03\xc3\x18\xe8\xd3\x1f\xe2\x5d\x3f\xd3\x8f\x08\xc0\x8f\x9e\xa8\ \x18\xf1\x5f\xb0\xc6\xc7\xaf\xbe\x63\x00\xab\x86\xf5\xab\xdc\x7e\ \x5d\x1e\x9f\xfb\x4e\x09\xcf\xef\x94\x0c\xc9\x74\x25\x50\xe9\xab\ \x9f\xf9\x12\xc7\x52\x6b\x8d\xd6\x23\xa7\x5a\x98\x9a\x0d\x61\x2c\ \x1b\x60\xbf\x6f\x8a\x90\x51\x8e\x31\x60\x72\x26\x44\xa3\xc5\x11\ \x78\x0c\x81\xcf\x30\xd8\x07\xcc\x16\xcd\x87\x68\x1c\x6f\xbc\xc9\ \xc7\xdb\x6e\xd7\xe0\x9f\x2f\x73\xdc\xff\x64\x1d\x76\xe5\xe6\x46\ \x8d\x86\x41\x00\xc5\x4a\x44\xee\x6b\xc2\xd0\x36\x00\x33\xae\xc5\ \xf5\x02\x64\x5c\xc4\xdf\x98\x96\xb0\x2d\xfd\xb3\x24\x7e\xba\x4c\ \x4f\x49\x30\x79\x9d\xb0\x6b\xa4\x69\x72\xd6\xfb\x12\x41\x60\x6a\ \x02\x40\x09\x7a\x6a\x67\x07\x36\x53\x1d\xe7\x59\x9c\xd1\xc7\x23\ \x8e\xa9\xc9\x32\x4e\x9d\x98\x47\xb5\xda\x5c\xf8\x81\x14\x77\xf0\ \xd0\x5e\xd5\x46\xa0\xdd\x7f\x50\xbf\xdd\x9b\x0e\xcc\x79\xc0\x1d\ \x29\x0a\x98\x04\xb4\xfa\x48\x14\xf8\x4c\xe7\x46\x5d\x1b\xd6\x64\ \x06\x1c\x1d\x6d\xe0\x2f\x3e\x31\x81\xdf\x7c\xcf\x52\xac\x5f\x2d\ \x40\xe1\x3a\x0c\x3f\xff\xe6\x01\xdc\x7c\x45\x01\x2f\xec\xa9\xa1\ \xb7\xe0\x62\x64\xd8\xc3\x25\x1b\x82\x84\x1e\xd3\xdf\xeb\xe0\x37\ \xde\xd5\x8f\x4f\x7c\xb5\x88\x67\x5e\x6e\xa4\xce\xfd\x57\x69\x8a\ \xd1\x74\xe6\x6a\x1f\xb1\xf4\xe7\x56\x15\xb2\x9e\x35\x6f\x90\xaa\ \x28\xeb\x58\x4b\x12\x00\x00\x0c\x2f\x61\x98\x99\x4f\xda\x1c\xfa\ \x7a\x18\xde\x77\x57\x1e\x57\x5f\x62\x7e\x8a\xef\x3e\x52\x47\xbd\ \x49\xa4\x6e\x06\x00\x29\x66\x4b\x15\x4e\x6a\x2f\xd1\x73\x62\xbf\ \x45\x0e\x21\x25\x69\xd2\x5e\x00\xad\xfa\x47\x5a\xd3\x60\x8a\x06\ \x34\x01\x59\xca\x3c\xf9\xc9\x90\xfe\xd6\x33\x9d\x8c\x32\xb4\x3c\ \xec\x0b\xe3\xda\x78\x7b\xaa\x55\x71\x8e\x92\x3b\x6c\xa5\xfb\xca\ \x38\xce\x39\xe6\x66\x6b\x98\x9a\x2c\x63\x66\xaa\x82\x30\x6d\xff\ \xfa\x45\xb8\x1f\x3d\xf0\xad\xb1\x14\xef\x78\x54\x60\x57\x35\x00\ \xc6\x85\xa2\x98\xb5\x6d\x17\xd4\x3d\xe8\xd5\x80\xe9\xca\xc0\x80\ \xae\x0f\x63\x53\x0d\xfc\xd9\x3f\x8f\xe1\x0d\x37\xf6\xe3\x9d\x6f\ \x18\x44\x2e\x10\x21\xce\x3f\xcf\xc7\xf9\xe7\xa5\x75\xcf\x98\x95\ \xdc\x71\x18\x7e\xed\x9d\xfd\xd8\xb1\x6f\x2a\xee\xee\x33\xa4\xbf\ \x4c\x70\xae\x94\x2c\xe0\xe7\x76\x35\x40\xcd\x5b\x76\x12\x9d\x91\ \x82\x9a\xd1\x28\xdc\xf2\xa5\x0c\xfb\x8e\x9a\x15\xeb\xaa\x4b\x3c\ \xbc\xef\xae\x3c\xfa\x7b\x1c\x12\x2f\xc7\xb3\x3b\x5b\x78\xe8\x99\ \x46\xc2\xe0\x66\x66\x45\x5c\xaf\x1d\xd1\xe4\x35\x29\xc7\x0b\x98\ \x00\xe1\xa9\x36\x80\xd3\x5b\x0f\x80\x1b\x40\x34\xe3\x94\x25\x96\ \x71\xbf\x23\xe9\x1f\x3f\xd6\x4e\x92\xa7\xdd\xe3\xd6\x6d\x1d\x9f\ \x11\x3f\x23\xf5\xc0\xca\x7b\x89\x69\x0d\xa0\x56\x3b\x3d\x69\x7b\ \x26\x6e\x7e\xae\x86\xc9\x89\x12\xa6\x27\xcb\x68\xb5\xce\x0c\xf4\ \xca\x8d\x8e\x9d\xa8\xee\x78\xe9\x59\xd5\x1f\x45\x0b\x2a\xfe\xed\ \xe6\x82\x20\x39\x5d\xdc\xe6\xaa\xc0\x80\xdd\x24\x80\x29\xfd\xd5\ \x87\x62\xe6\xde\x7e\x51\x04\xfc\xf0\xf1\x79\x3c\xbb\xb3\x8a\x5f\ \xbe\x67\x08\x97\x6f\xce\xdb\x69\xa6\x38\x4d\x04\x9e\xcb\xb0\x6a\ \x99\x83\xc3\x27\x5b\x99\xcd\x80\x79\x8b\x00\x4e\x8e\x87\x18\x9b\ \x94\x0b\x92\x2a\xc9\xde\x06\xe4\xa9\xa4\x00\xb1\x84\x98\xc3\x34\ \x1c\x97\x0f\x69\x55\x71\xfd\x79\x2e\xee\xbe\x35\x87\xad\x17\x7a\ \x71\x79\x29\xf7\xf4\x8e\x16\x3e\xf5\xcd\x72\xca\x14\x63\x12\x8a\ \x9c\x6c\x5a\x27\xe2\x68\x34\x81\xd1\xa9\x56\x8a\xc6\xc0\x11\x8f\ \x03\xea\x50\xb0\xe9\x5e\x00\x92\xba\x61\x44\x05\xb1\x85\xa8\xbc\ \x31\x63\x5a\x77\xd2\xf0\xa7\x1e\x5d\x8c\xf4\xa7\xaf\x4b\xfe\xc6\ \x36\x20\x24\xd3\xb0\xc2\xd3\xf8\xf5\x6c\x40\xa2\x29\x71\x91\x56\ \x95\x0d\xc4\x21\xcb\xa5\x3a\xe6\xe7\xab\x18\x18\x28\xa0\x9b\x8e\ \xbe\x53\x14\x71\x14\xe7\xaa\x98\x9e\xae\x60\x6a\xb2\x8c\x66\xca\ \x00\x9e\x33\x75\x8f\x3c\x7a\xdf\x04\x34\xf0\x39\xc4\x0e\x44\x21\ \x44\xdf\x6d\x08\x20\xea\x66\x13\x20\xc7\x99\x68\xeb\x53\x41\x20\ \x56\xe5\x21\x76\x01\x60\x51\x4d\x02\x80\x61\x6a\xb6\x89\xbf\xfb\ \xec\x04\xae\xdb\x5a\xc0\xed\xd7\xf7\x63\xf3\xfa\x5c\xaa\xf9\xb2\ \x15\x02\x13\xd3\x2d\x8c\x4f\x47\x18\x9b\x6a\xe1\xa5\xfd\x0d\x1c\ \x3a\x29\xd8\x3c\xad\x19\x00\x00\x35\x6b\x4e\xfd\xcb\x07\x9a\x9a\ \xb4\xe2\x07\xd4\x8f\x49\x08\x46\x18\xcb\x29\x8d\x45\xb9\xe1\x21\ \x07\x17\xac\x76\x70\xf7\xad\x79\x5c\xba\x29\xbd\xd8\x9f\x78\xa1\ \x81\xcf\xdc\x5b\x8d\xa5\x6c\xba\x66\xab\x7d\x97\x2d\x71\x30\xd8\ \xa7\x06\x0c\xb5\xe2\xae\x3a\x15\x2e\xfe\x17\x1b\x01\xe5\x7b\x75\ \x6a\xd8\x32\xb0\x6a\x02\xd7\xee\x6e\x34\x1f\xa3\xf7\x28\xfb\x98\ \x4d\x1a\x4e\xc3\xa4\x4a\xff\x76\xf7\x4e\xe7\x5a\xe7\xc3\x26\x81\ \x3c\x9f\x37\x82\x9d\x3a\x3e\x8b\x81\x2d\xdd\x23\x80\x28\xe2\x98\ \x9f\xab\x62\x7e\xae\x86\xf9\xb9\x2a\x8a\xf3\xf5\xb3\xda\xd4\xa8\ \x37\xea\xd1\x7d\x3f\xfa\xe6\x24\x04\xd8\x5b\xd0\xe0\x57\xe7\x11\ \xba\x49\x00\xb2\x09\x20\x99\xdf\x5c\xbc\x33\x7d\x35\x60\xda\x24\ \x58\x58\x1b\x00\x03\xb6\xbd\x54\xc1\xb6\x97\xaa\xe8\xef\x75\xb0\ \x69\x6d\x1e\xae\xc7\xe0\x30\x61\xfd\x1e\x9f\x6e\x61\x7a\x56\xad\ \x99\x17\x37\x71\x20\x47\xc4\x1a\x55\x81\x2e\x0d\xd6\x63\x7d\xe3\ \xe3\xa3\xad\xb8\x62\xf0\x2c\xa0\x53\x2c\xd0\xf6\x3f\x09\x14\x58\ \x04\x70\xd5\xc5\x3e\xae\xbd\x34\x7d\x64\xd9\xf4\x5c\x84\xaf\xdd\ \x5f\xc5\xb6\x97\x9a\x56\xfc\x69\x15\x44\xc3\x4b\x49\x7f\x00\x38\ \x7a\x8a\xe4\x3b\xfe\x2b\xcb\x3a\x6d\xc5\x92\x0c\x67\xac\x42\x4c\ \x53\x25\x86\x44\x31\xa7\x80\xa6\xa4\x34\x3e\xf9\xa1\xc4\x03\x56\ \x5e\xec\x58\x29\x39\x58\x12\x3c\x21\xfd\xc9\x79\xaa\xf1\x4f\x07\ \x48\x5a\xff\x49\x3d\x34\x86\x2c\x90\xf4\xc1\xd1\x13\xce\x00\xe4\ \xf3\x8c\x8f\xcd\x63\xcd\xba\xa5\xe8\xed\xcb\xa1\x9d\xcb\x02\x71\ \xa3\xde\x42\xa5\xd2\xc0\xdc\x6c\xf5\x9c\x00\xde\x76\x5f\xff\xc6\ \x67\x4f\x4c\xcf\x4c\x36\xa0\xc1\xde\x04\xd0\x20\xbf\x2d\x74\x55\ \x03\x00\x0f\x04\x64\x34\x68\x29\xf8\xda\xed\xe6\x43\x7b\x09\xe4\ \x23\x09\x6d\x40\x7d\x50\xc6\x80\x62\x39\xc2\xf3\xbb\x2b\xe2\x49\ \x16\x3f\x11\xff\x52\x2f\xad\x89\x58\x7e\x32\x0f\x7d\x05\x13\xa8\ \xc7\xc7\x84\x06\x40\x9b\x09\x80\x49\x06\xca\x65\xd9\x08\x00\xb1\ \xa0\x09\x75\x6e\xca\xaa\xc2\x8d\x26\xc7\x0f\x1e\xab\xe3\x07\x8f\ \xd7\xd0\x6c\x66\x55\x8e\x24\x84\x54\x61\xbc\xee\x1a\xdd\x6b\x70\ \x74\xb4\x65\x86\x24\x95\x7c\xb1\x4d\x00\x2b\x69\xf9\x2c\x91\xc6\ \x8c\x12\x42\x64\x7c\x60\xd3\xea\x6f\xe6\x45\x03\x35\x31\x4a\x20\ \x99\xa0\x21\xfd\x79\xca\x3d\xea\xb5\x80\xe4\xe7\x5c\xf7\x00\x40\ \xd4\xa1\xb8\x91\x23\xe3\x2f\x70\x73\x12\x4d\x14\x71\x3c\xff\xcc\ \x11\xac\x5e\x3b\x84\xa1\xa5\xbd\x28\xf4\xf8\x2a\x2a\x23\x9d\x7a\ \xad\x85\x6a\xb5\x81\x6a\xa5\x81\x6a\xa5\x29\x7e\xab\xcd\x33\x36\ \xde\x9d\x89\x3b\x7a\xec\x60\xe5\x6b\xdf\xf8\xec\x28\xb4\xaa\xdf\ \x00\x50\xb7\x7e\x9b\x00\x5a\x5d\x6d\x02\x88\x66\x60\xda\x4e\xbe\ \xda\x3a\xbc\x50\x93\xc0\xbe\x16\xda\x80\xdd\x2c\xd0\x6c\x6e\x5f\ \xc7\xd1\x18\xa0\xa7\xe9\x4b\x27\xc9\xa7\xbf\x4f\x3f\x18\x45\x1c\ \xa7\x26\x5a\x3a\x0e\x1d\x34\x55\x18\xa7\x91\x82\x72\xe7\x0d\xb7\ \x1f\x62\xf1\xe4\x8b\x0d\x7c\xfd\x47\x55\xcc\x16\xc9\xfe\x07\x99\ \xa1\x79\xe2\xe6\x86\x35\x2e\x36\xad\xd3\x2c\x73\xe4\x64\x13\xb4\ \x42\xab\xbf\x42\x62\xcb\xb1\x0e\xbc\xb3\x25\xc1\x8c\x74\xd5\x19\ \x1d\xff\x10\xf7\xfd\xdb\xe9\x71\x52\x28\x94\x75\xb2\x54\x7f\x18\ \xcf\xab\x74\x32\xf5\x86\x84\x51\xd4\x60\xa8\xb4\x27\xcc\x77\x8d\ \xf3\x40\xb4\x04\x2e\xd2\x2c\x84\xd3\x89\xf0\x61\x18\xe1\xe8\xe1\ \x29\x1c\x3d\x3c\x95\xb8\xf7\x6a\x75\x51\x14\xf1\x7f\xfa\xf8\x47\ \x0f\x47\x62\x18\x6b\x0b\x02\xe8\x4d\x08\xe0\xab\x1d\x88\x15\x01\ \x84\x5d\x6d\x02\x40\xc2\x4a\x75\xe7\x09\x7f\xf1\x87\x5e\xb7\xdf\ \xde\x3b\x4d\x1b\x90\x00\x4e\x69\x16\x64\x11\x83\x91\x76\x1c\x11\ \x15\x1a\x0c\x0e\xe3\xd8\xb4\x56\x4b\xd1\xf1\x29\xd1\x77\x6f\x40\ \x82\x25\xab\x92\x6d\x1b\x48\x38\x06\x5c\x7a\x61\xba\xba\x7f\xe0\ \x58\x0b\x5f\xfe\x41\x05\x87\x4f\xb4\x88\x2f\x4f\x3d\x35\x9d\x09\ \x8a\x37\xbd\xa6\x80\x4a\xc3\x43\xb1\x1e\x60\xbe\xea\x63\xed\x86\ \x1e\xac\x5c\x1b\xa2\xd5\x8c\xd0\x6c\x45\x68\x35\x43\x34\x5b\x21\ \x9a\xcd\x66\xbc\xf1\xca\x99\x68\xa0\x69\x43\x8c\xed\xeb\x78\x7b\ \x36\x0a\xf8\x44\xce\xb9\x71\x4e\xe3\x49\xf4\x7a\x64\x48\x7f\xca\ \x19\xa9\xfa\x03\x4f\x4f\x19\xb0\xd6\x03\x24\xc4\xda\x17\x8d\xa1\ \x10\xcd\xa0\xea\xa4\xec\xbd\xfe\x13\xe4\xbe\xf7\x83\xaf\x8d\xed\ \xdd\xf7\x72\x05\xba\xbd\x5f\x87\x00\x7d\x15\x40\x05\x82\x04\x6a\ \x90\xcd\x80\x6e\x36\x01\x72\x1c\x72\x3d\x00\xa4\x4b\xea\x64\x93\ \xc0\xea\x25\x00\x21\x02\x5b\x1b\x00\x62\xa2\xb0\x9b\x05\xa7\x43\ \x04\x00\xb0\xee\x3c\x1f\x7d\x3d\xba\x0d\x7f\x7c\x5c\x0e\xbb\x25\ \x6f\x95\x58\xb0\x38\x85\x10\xc8\xad\x38\xc1\xad\x9b\x92\x04\xf0\ \xdd\x47\xaa\xf8\xe6\x03\x95\x36\x40\xe4\xa9\x57\x8c\x31\x0c\x0d\ \x15\xc4\xb1\xb4\x07\x2b\x96\xf7\xa0\xe8\x17\xf0\xe4\x61\xfd\x32\ \xe7\xaf\xcf\x8a\x33\x3b\xfe\x44\xfe\x13\x2b\x01\xd3\x73\x3d\x14\ \x38\x56\xfb\x89\xaa\xcf\x0c\x98\xc9\xbf\x36\x80\x6d\xd5\x9f\x9b\ \x4f\x58\x4f\x9b\x7f\x17\x94\xfe\xed\xee\x89\xc3\xe8\xdb\xb0\xc6\ \x01\x30\x70\xac\xad\x3f\x85\xbd\x85\x3b\xf1\x93\xea\xb6\x3d\xf3\ \xe8\xcc\xa7\x3e\xf3\x3f\x4e\x42\x1b\xfe\x94\xca\x5f\x05\x50\x96\ \x87\x22\x81\x06\xba\xaa\x01\x70\x9e\x03\xe0\x70\x89\x6e\xd5\x1a\ \x4f\x6f\x12\x24\x41\xc9\x01\x04\x1e\xc3\x15\x9b\x7b\x91\xcb\x39\ \x78\x76\x67\x19\xf5\x3a\x59\x8b\xbe\x4d\xb3\xa0\x1d\x11\x00\x49\ \x6d\x44\x06\xc5\x1d\xd7\x9b\x16\xc0\xe3\x63\x4d\xc2\x20\xe4\x19\ \xe2\x52\xb7\x31\xb0\xc2\xae\x1d\xf1\x30\xd8\xaf\x9b\x00\xad\x90\ \xe3\x33\xdf\x2c\xe3\x89\x17\xdb\x0f\xe1\xbc\xe1\xf2\x1c\x7e\xf1\ \xee\x5e\x38\x4c\x0c\x1a\x7a\xfc\xc5\x16\x26\x2a\xfd\x58\xb3\x76\ \x08\xf9\xbc\x1f\xbf\x4b\xa1\x27\x40\x5f\x5f\x00\x3f\x70\xe1\x07\ \x2e\x82\xc0\x83\x1f\xb8\x60\x10\x6a\x6b\x18\x72\x84\x61\x84\x66\ \x23\x44\xb9\xd4\x40\xa9\x54\x47\xbd\xd6\x3a\x73\x0d\x80\x4b\x7a\ \x24\x05\x69\xb4\xf3\xb5\x05\x28\x0e\xa3\x31\x6e\x6a\x05\xc6\xc7\ \x50\xf1\xeb\x2b\x53\x9c\x13\xff\x6c\xe9\xcf\xad\x47\x93\xd2\x9f\ \x24\x26\x03\x72\x52\xa9\x38\x56\xd7\x9e\xc2\xbe\xc2\x9b\xc0\xbb\ \xbe\x50\xd6\xd9\x77\xbb\x76\xbf\x38\xff\x37\xff\xfd\x8f\x8f\x88\ \x19\xb9\x31\xf8\x6b\x10\x80\x2f\x91\xa3\x02\x41\x0a\x5d\xb6\x01\ \x88\x05\x41\x5c\xf5\x05\xd2\x77\xf3\x51\xdf\x3d\xad\x97\x80\xe1\ \x03\x6f\x5f\x81\xd7\x5e\x23\xc6\xe5\x86\x21\xc7\x3f\xfd\xfb\x38\ \x9e\x7a\xb1\x98\xdd\x65\x28\x2f\xda\x11\x81\x4a\x1f\x30\xb5\x82\ \xad\x17\xe6\xf1\x9a\xab\xcc\xdd\x5b\xf7\x1c\xaa\x1b\x15\xc9\x6e\ \x0a\xc4\xf9\xb7\x9c\x4d\x0a\x5b\x37\xe9\x66\x05\x38\xc7\x3f\x7d\ \xb9\x88\x17\xf6\xd4\x53\xac\x86\x3a\xdf\xea\x37\xf0\x5d\x4c\x94\ \x0a\x38\x59\xed\xc5\xe0\xea\x1c\x06\x01\xf4\xf6\x05\x18\x18\xcc\ \xa3\xbf\x3f\x87\xde\xfe\x5c\x62\xa2\x0a\x95\xdc\x59\x6d\xfc\x56\ \x33\x34\x0b\x20\x25\x6c\x32\x5b\x14\xa0\xb2\xfc\xb9\xf6\xe7\x90\ \xbd\x2e\x3c\x02\x98\x63\x94\x1d\x0d\x65\x83\x12\x3c\x4b\xf5\xe7\ \x71\x5a\x69\xd2\x5f\xff\x6d\x27\xfd\x91\x71\x4f\xe7\xc5\x98\x07\ \x40\xe2\x2c\x44\xb3\x58\x56\x7b\x19\x93\xf9\xcb\x32\x4a\xe4\xd5\ \xe9\x8e\x1e\x3b\x58\xf9\x8b\xbf\xfa\xbd\x43\xad\x56\x53\x75\xf1\ \xa9\x36\x7f\x15\x02\xf4\x45\x00\xf3\x10\x1a\x40\x15\x82\x18\x9a\ \xe8\x6e\x2f\x00\x02\x70\xb8\x72\x48\x48\xcc\xf8\x59\xc6\x3a\xdd\ \x24\xd0\x06\xba\xd7\x5c\xa5\x07\x63\xb8\x2e\xc3\x6f\xfd\xdc\x0a\ \xd4\x1b\x21\xb6\xef\xae\x24\x8c\x84\xc0\xe9\x13\x41\x5f\x8f\x83\ \xf7\xbf\xcd\x9c\x00\x30\x31\x13\x62\xdf\x91\xba\xc1\x5c\x46\xf5\ \xc9\x20\x04\x3b\x9c\xe3\x30\xdc\x74\xa5\xee\x3a\xfa\xf6\xc3\x15\ \x6c\xdf\x53\xcb\x34\x24\xd2\x38\x4e\xcc\xe4\xf0\xa3\x97\x97\xc3\ \x0b\x02\xf8\xbe\x8b\x95\xab\x7a\x30\xbc\xbc\x07\x85\x9e\x20\xfb\ \xc1\x0e\x9d\xe7\x2f\x62\x73\x43\x9a\x29\x75\x2a\x47\x02\x1a\x92\ \x9f\x83\x80\x53\x8f\xec\xb4\xc1\x6f\x82\xb6\x9d\xd5\xdf\xbc\x9b\ \xbc\xaf\x35\x83\x6c\xe9\xcf\x53\x9e\x03\xf9\x7e\x9c\x68\x00\xf1\ \xcb\xc5\xf1\x6f\x2c\x7e\x1b\xd3\xb9\xcd\x88\xd8\x99\x97\xf9\xb9\ \x70\x07\x0e\xec\x2e\xfd\xe5\x47\xff\xe0\x50\xb5\x5a\x69\x41\x77\ \xf7\xd5\xa1\x25\xff\x3c\x80\x39\x08\x12\x28\xe2\x6c\x69\x00\x9c\ \xf3\x3c\xc0\x99\x32\xe0\x69\xe9\xcf\x48\x93\x20\x4d\x1b\x10\xd7\ \x8e\x83\xc4\xe2\x8b\x0e\x63\xf8\xcd\x77\x8f\xe0\xbf\xfe\xfd\x11\ \x4c\xcf\x0b\xa3\xd9\x69\x11\x01\x74\x9a\x85\xbc\x83\xdf\x79\xff\ \x30\x96\x0e\x9a\x80\x78\x7c\x7b\x59\x8f\x77\x57\x64\x15\xff\x31\ \xbc\xc9\x85\x36\x4a\x2a\x77\xfb\x75\x05\xac\x1a\x16\x6b\x0c\x8e\ \x4f\x87\xf8\xe6\x8f\x4b\xc9\x67\x2d\x37\x38\x58\xc0\x35\xd7\xae\ \xc5\xc8\x48\x3f\xfa\x07\x72\x58\x31\xd2\x27\xd7\xa2\x6b\xf3\xd0\ \x69\xb8\xc5\xce\x64\x33\x60\x94\x62\xcd\x57\xa0\x89\x6d\x00\x36\ \xf8\xe5\xaf\x01\x55\x8b\x10\xda\x19\xfe\xb4\xf4\xcf\x20\x8d\x76\ \xd2\x3f\xf1\x0c\x3d\xa0\xbb\x05\xd5\xb7\x96\x76\x80\xbe\xd6\x49\ \xac\x9f\xf8\x3c\x0e\xae\xf8\x95\xf4\x42\x79\x15\xb9\x07\x1f\xfa\ \xde\xc4\x3f\x7e\xfc\xa3\x27\xc2\xb0\xa5\x06\xf9\xa8\x3e\xfe\x0a\ \x84\xb4\x9f\x23\x07\xd5\x00\xd4\xf8\x80\x6e\x0e\x05\xe6\x3d\x09\ \x95\xcf\x6a\xb7\x33\xa9\x7b\xa5\x69\x03\x51\x08\x14\x2b\x21\xfa\ \x7b\x4c\x60\xf6\x14\x1c\xfc\xa7\xf7\x8d\xe0\x6f\x3e\x75\x02\xe5\ \x2a\x4f\xf4\x16\x00\x6a\x2e\x01\x4b\x4f\x1b\x3a\x8d\x7c\xce\xc1\ \xef\x7e\x60\x39\x2e\x58\x6d\xb2\xfb\xec\x7c\x88\xfb\x9e\x28\xc1\ \xae\x44\x54\x4b\x8c\xe3\xb2\x30\x44\x9f\xe8\xed\x71\xf0\xd6\xdb\ \xf4\x4a\x32\x4f\xef\xa8\xe9\xf5\xf8\x52\x9c\xe7\x39\xb8\xe2\xca\ \x35\xb8\x68\xf3\x72\x14\x7a\x7c\xac\x5e\x3b\x88\xc1\x25\xf9\x33\ \x59\xf7\xbd\xbb\xce\xc0\x9a\x0d\xfe\x08\x54\x8d\x8f\xa5\xaf\xd6\ \xaf\x63\x2d\xd0\x94\xde\xdc\x88\x13\xe4\x7e\x96\xea\x4f\xd3\x10\ \x67\x1d\x48\x7f\x2b\x2d\x40\x82\x9e\x12\x10\xd7\xf9\x14\xf7\x01\ \xc6\x38\x96\x97\x9f\xc6\xf4\xf4\x7a\xcc\x2e\xbd\xbd\x5d\xe9\xbc\ \x62\xae\xd5\x6a\x46\x9f\xfe\xdc\xc7\x8e\x7f\xef\xfb\x5f\x9d\x82\ \xee\xeb\x6f\xc2\x6c\xf3\x2b\xe0\xcf\xca\x43\x11\x80\x52\xff\x5b\ \xe8\x6e\x37\x20\xe4\xe6\xd4\xda\x00\xa8\xb5\x01\x0d\x7c\x46\x90\ \xa4\x0d\x84\xe2\x93\x1c\x3d\x55\xc3\xa5\x1b\x7b\x60\xa3\x6c\xd3\ \xba\x02\xfe\xf4\x3f\xae\xc3\xdf\x7e\xfa\x24\x4e\x4d\x88\x29\xbe\ \xd9\xd2\x3f\x9d\x08\xfa\x7b\x5d\x7c\xe8\x17\x96\x63\xe3\x9a\xa4\ \x6a\xf7\xa9\x6f\xce\xa0\x5c\x31\xc7\x62\xdb\xb8\xe2\xd6\x89\x4d\ \x08\xcb\x87\x3c\xbc\xef\x2d\x03\xe8\xed\xd1\x0f\x16\x72\x0c\xdc\ \xaa\x84\xca\xf5\xf5\xe5\xf0\xba\x5b\x37\x61\xf9\x8a\x3e\xac\x5a\ \xdd\x8f\xe1\xe5\x7d\x5d\x97\xf8\x67\xee\x28\x58\xf5\x84\xa2\x44\ \x27\x1f\x07\xc4\xd8\x0e\xa2\x11\xa5\x80\xbf\xd3\x76\xbf\xa5\x7b\ \x10\x2c\x9b\x46\xc5\xf4\xf0\x56\x38\x22\x70\x00\x01\x70\x46\x9e\ \x8b\x75\x16\x19\xc8\x01\xe0\x39\xc0\xaa\xf1\x2f\xa3\xec\xae\x40\ \x73\xf0\xd2\xd4\x92\x79\xa5\xdc\xe8\xe8\xf1\xda\xc7\xfe\xe9\x23\ \x47\x76\xed\x7e\xa1\x02\x13\xfc\xb4\xcd\x3f\x07\x60\x46\x1e\xd3\ \xd0\x4d\x00\xa5\xfe\xab\xe6\x42\x17\x35\x00\xce\x0b\x72\x54\xc5\ \x02\xe3\xfb\x93\x4d\x02\x40\x00\x6e\xfb\xee\xa2\x24\x00\xf5\x81\ \x34\x22\x56\x2e\x0b\xf0\xe7\xff\x65\x1d\x1e\x7e\x66\x1e\xdf\x7e\ \x68\x06\x93\x33\x72\xc0\x4e\x06\x11\xa8\x1f\x97\x01\x6f\xb8\x69\ \x00\x6f\x7f\xfd\x10\x7a\xf2\x49\xeb\xee\xc3\xcf\x14\xb1\x7d\x4f\ \x25\x61\x9f\x4b\xeb\x45\x30\xee\xcb\xdf\xe5\x4b\x3c\xdc\xf5\xba\ \x3e\xdc\x72\x75\x21\xee\x6f\x57\xee\xda\x4b\xf3\xb8\xf7\xc1\x22\ \x4a\x15\x73\x54\xd8\xc8\xc8\x00\x6e\x79\xed\x26\x2c\x5b\xde\x8b\ \x0b\x36\x0c\xc1\xf3\x9d\x57\x21\xf8\xcd\x32\x88\x38\x37\x3c\x14\ \xb8\xb9\x01\x4c\xa1\x91\x2d\x04\x7e\x24\x63\x31\xfc\x92\xaa\xbf\ \x0d\x76\x4a\x40\x20\xf1\x67\x49\x7f\xfb\x9e\x8e\x5f\x28\x2d\x1c\ \x60\x80\x03\x0e\xc7\x11\x75\x26\x70\x42\xac\x38\xf0\x37\x38\x31\ \xfc\x2e\x60\xdd\x5d\x6d\x4a\xe9\xdc\xb8\x6a\xb5\x12\x7e\xe3\xde\ \xcf\x8f\x7e\xe3\xde\x2f\x4c\x84\x61\x8b\x43\x8f\xed\xa7\xe0\x2f\ \x42\x48\x7b\x05\xfc\x29\x68\xe9\xaf\xba\xff\x9a\xd0\xc3\x83\xbb\ \x47\x00\x1c\x3c\x27\x87\x01\xb5\x19\xdf\x6f\x37\x09\xd4\xd3\x42\ \x1b\x98\x9c\xb1\xa7\x61\xca\x0a\x25\x9d\xe7\x3a\xb8\xe3\x86\x25\ \xb8\xed\xfa\x41\x3c\xf3\x72\x09\x2f\xed\xad\x60\xe7\x81\x2a\xc6\ \xa7\x9b\x09\x22\x00\x80\xcb\x36\x17\xf0\xbe\xbb\x96\xe1\xbc\xe5\ \x52\xea\x1b\x5d\x7c\x0c\xe3\xd3\x4d\x7c\xe1\xbb\x33\xa4\xc2\x92\ \x3c\xd2\x5c\x90\xba\xb4\xa4\xdf\xc5\x25\x1b\x72\xb8\x78\x43\x0e\ \x17\xaf\xcf\x61\xc5\xb2\xec\x22\x1c\xec\x77\xf0\xdb\xef\x1d\xc2\ \xdf\x7c\x6a\x0a\xad\x50\x44\x72\xf1\x25\x23\xb8\xe6\x9a\x75\x18\ \x39\xaf\x1f\xab\x56\x0f\x9c\x53\xe0\xa7\x8d\x04\xec\xfc\x61\xe3\ \x07\x72\xed\x17\x68\xc0\x46\x60\x70\xf4\x75\x1b\xf0\x27\x16\x18\ \x25\x6a\x79\x47\xaa\x7f\x22\x4e\x12\x3e\x6b\xac\x01\x03\xd1\x4e\ \xc4\x1f\xaa\xad\x00\x1c\x8c\x71\xb8\xe0\xf0\x5c\x20\x70\x18\x72\ \x2e\x47\xef\x91\x2f\x60\x72\x72\x1f\x72\x97\xff\x26\x1c\xaf\xfd\ \xbc\x80\xb3\xe1\x38\xe7\x78\xec\xf1\xfb\xa7\x3e\xf5\xd9\xff\x79\ \x72\x76\x76\x4a\x49\x6e\x3a\xc4\xb7\x01\x2d\xf9\x67\x21\x40\xaf\ \x8e\x69\xe9\xa7\xba\xff\xe2\x11\x80\x90\xa5\xd0\x55\x0d\x80\x4e\ \x18\x51\x16\x61\x4e\xe7\x60\xa7\x69\x03\xd0\xcd\x80\x93\xe3\xc9\ \x45\x41\xd3\xb4\x01\x87\x31\x5c\xbf\xb5\x1f\xd7\x6f\xed\x07\x00\ \x4c\xcd\x36\xb1\xf7\x70\x0d\xa5\x4a\x88\x5a\x83\x63\xc5\x32\x0f\ \x9b\xd7\xf7\x60\x49\xbf\x9b\x1e\x03\x07\xc6\x67\x9a\xf8\xc8\xff\ \x1e\x45\xb5\x1e\x99\x80\xe7\xa4\x3a\x31\xa0\x27\xef\xe0\x92\x0b\ \x72\xd8\xb2\x31\x8f\x2d\x1b\xf3\x58\xb5\x7c\x71\x4b\x45\x6f\x5e\ \x1f\xe0\xf7\x7e\x65\x19\x3e\xf6\xc5\x69\xac\xbb\x60\x04\x57\x5d\ \xbd\x0e\xeb\x37\x2e\xc1\x92\xa1\xee\x4e\x35\x3d\x1d\xb7\x18\x42\ \xd0\xfb\x0b\xf2\x24\x40\x8d\x66\x00\xf1\x5f\x00\xfc\xba\xb0\x89\ \x44\x27\x4d\x03\x4a\x0e\xa6\xea\x6f\xa7\x61\xc5\x91\xd0\x04\x54\ \x1d\xe4\x30\xf2\x1b\xc7\x27\xc8\x80\xc9\xba\xe8\x32\x0e\xdf\x05\ \xf2\x1e\x43\x5f\xce\x41\x71\xea\x49\x4c\x3e\x70\x18\xc1\xc5\x3f\ \x8f\x25\xeb\xae\xef\xa8\xbc\xce\xd4\xd5\x6a\xd5\xf0\xe9\x6d\x0f\ \xcf\x7c\xe7\x7b\x5f\x99\x38\x70\x70\x77\x4d\x66\x5c\x81\x5f\x0d\ \xf1\x55\x43\x7b\xa9\xda\x3f\x05\x60\x42\xfe\xce\x40\x68\x05\xb4\ \xed\xaf\xe2\xe0\x9c\xf3\xae\x1a\x01\xf3\xb4\x72\x24\x47\xf4\xd1\ \xe5\xbf\x90\x1c\xb4\xc3\x80\x93\xe3\x75\x84\x11\x4f\xa8\xd2\x32\ \x94\xfc\x4d\xde\x5b\xb6\xc4\xc7\x4d\x57\x2e\x0c\x4c\x15\xc3\xf8\ \x74\x13\x1f\xf9\x97\x51\x4c\xcf\xb5\x10\xcb\x05\xa9\x15\x28\xa9\ \x30\xd0\xe7\xe2\x5d\x6f\x5c\x82\xd7\x5c\xd5\x07\xd7\xed\x5c\x6a\ \x96\x2b\x11\xe6\x4a\xa1\x3c\x22\xcc\xcb\xe3\x8a\x2b\x56\xe0\xfc\ \x8d\x6b\xb1\xee\x02\x61\xe8\xeb\x96\x3b\x23\xa9\xbe\x88\xb8\x22\ \x4e\x81\xa3\x14\x6e\x35\x0e\x80\x13\xa2\xa7\x36\x98\x34\xf0\xc7\ \xa9\x59\x46\x3f\x4a\x2c\x66\xbb\x5f\xc7\xc1\xe9\x5d\xeb\x3e\x12\ \xe4\xb0\x70\x97\xa2\x50\xfd\x99\xe2\x2f\x00\x0e\xe3\x70\x1d\x08\ \x02\xf0\x81\x82\xcf\xd0\x9f\x63\x28\xcf\x9f\xc0\xe8\xa3\x1f\xc1\ \xe1\x60\x2d\x56\x5c\xfe\x6e\x9c\x77\xd1\x6b\x90\x3d\xb0\xe3\xf4\ \xdd\xa1\xc3\xfb\x2a\x3f\x7e\xf0\xbb\x93\x0f\x3c\xf8\x9d\xd9\x5a\ \x2d\xde\x34\x93\x4a\x7d\x3a\xc8\x47\x81\x7f\x1e\xa6\xda\xaf\xa4\ \xff\x9c\xbc\x5f\x05\x31\xfc\xd1\xf4\xba\xd9\x04\xc8\xcb\x5f\xad\ \x86\x33\x5d\xb0\x4a\xfa\x03\xe9\xda\x00\x38\xd0\x0a\x23\x8c\x4e\ \xd4\xb1\x7a\x65\x3b\x80\x64\x13\x41\x27\x6e\x74\xb2\x89\xbf\xfc\ \xc4\x09\xcc\xca\x85\x40\x68\xfa\x71\xb6\x1d\xe0\x0f\x7f\x6d\x25\ \xce\x5b\xd1\xbe\x2f\xf8\xc4\x78\x13\x87\x4e\x34\x70\x7c\xb4\x89\ \x63\xa3\xe2\xd7\xd8\xb0\x53\xba\x35\x6b\x97\xe2\xb6\xdb\xd6\x61\ \xd5\xea\x7e\x0c\x2d\x7d\xe5\x25\x7f\x27\x2e\x39\x75\x95\x87\x1f\ \xbe\xd2\x00\x00\x20\x00\x49\x44\x41\x54\x5b\x67\x7a\xbc\x47\x04\ \xd1\x7e\x06\x31\xf6\x9a\xc0\xa5\xf1\xf1\xcc\x30\xea\x9c\x5b\x7e\ \xed\x54\x7f\x9e\x71\x4e\x54\x86\xf8\x47\x2d\xcc\xca\x60\x77\x03\ \x8a\xc5\x42\x38\xe4\xca\x99\x0c\xf0\x1d\xa1\x01\xf4\x06\x0c\xb5\ \x9c\x83\x6a\xde\x41\xad\xe9\xa0\x51\x3a\x8a\x7d\xf7\x7f\x14\xbb\ \x1e\x5f\x8d\xe5\x1b\x5f\x8b\x15\xe7\x5f\x81\x15\x6b\x2e\x86\xe3\ \x9c\xc6\x38\x0b\x00\x95\xf2\x1c\xf6\xec\xdb\x55\xdb\xb3\xf7\xa5\ \xf2\xb3\xcf\x3d\x3e\x77\xe8\xf0\xbe\x22\x34\xe0\xd5\xf8\x6b\xbb\ \x9b\x4f\x8d\xed\x57\x92\x9f\xb6\xfb\xa7\xe5\xf9\x1c\x92\x56\x7f\ \xb2\x4b\x1c\xef\x7a\x13\x20\xa7\x58\xd5\x98\xeb\x6f\x91\x00\xd0\ \x5e\x1b\x38\x36\x5a\x33\x08\xe0\xc4\x58\x1d\x63\x53\x0d\x6c\xbd\ \xb0\x0f\x81\x6f\x74\xec\xc9\xdf\xce\x88\x20\xe2\x1c\x0f\x6d\x2b\ \xe2\x2b\xf7\x4d\xa1\x54\x0e\xe3\xe7\xb4\xf4\xd7\x31\x0d\xf6\xba\ \x38\x6f\xb9\xaf\x25\x0a\x19\x10\xc0\x39\xc7\xf6\xdd\x55\x7c\xff\ \xd1\x79\xec\x39\x9c\xb6\x13\x0b\x33\xe2\x1b\x1e\xee\xc7\xeb\x5e\ \x77\x11\x96\x0e\xf7\x60\xe5\xaa\xe4\x66\x13\xdd\x76\xdd\xd4\x08\ \x8c\x78\x23\x4e\x60\x26\xbf\x1d\x8f\xe4\xb7\x25\x92\x3b\x9e\x10\ \x84\xf8\xd7\x56\xfb\x6d\xf0\x6b\xd5\x3f\x39\xce\x40\x83\xbf\xbd\ \xea\x6f\x6b\x03\xa9\x5d\x85\x24\x1d\xaa\x01\xa8\x9e\x0d\x06\x71\ \xed\x32\xc0\x77\x39\x72\x1e\xd0\xe3\x03\x8d\x3c\x43\xa3\xe5\xa0\ \x19\xb9\x68\x45\x62\xd6\xe8\x54\xf9\x04\x0e\x3e\xfd\x79\xbc\xf8\ \xc8\x67\xd1\x62\x79\x2c\x5b\xb3\x15\x23\xeb\xb6\xa2\x6f\x60\x39\ \xf2\xbd\x03\x28\xf4\x0e\xa2\xa7\x77\x09\xf2\x85\x5e\xd4\x6b\x15\ \x54\x2b\xf3\xa8\x94\xe7\x51\x2d\xcf\xa1\x52\x9e\xc3\xd8\xa9\x83\ \x38\x76\x70\x07\x26\x27\x8e\xe1\xa5\x13\xb5\xd9\x66\xc8\xd5\x08\ \x3d\x25\xe9\xe9\xa1\xa4\xbe\x92\xfc\x65\x68\xc9\xaf\xba\xf9\x94\ \xd5\x7f\x16\x42\xed\x57\x92\x5f\xcd\xfd\x57\xda\x44\x0c\x7e\xa0\ \xbb\x1a\x40\xc0\xa5\x2a\x68\x00\x5f\x0d\x0e\x49\x91\xfe\xe6\xb5\ \x08\x77\x6c\xac\x8e\x1b\x49\xbc\xe7\xad\xc8\xe1\xcf\x3f\x71\x08\ \xd5\x5a\x84\xad\x9b\xfa\x70\xf5\xa5\x03\xb8\xfa\xe2\x3e\x0c\xf6\ \x7b\x71\xca\x24\xa6\xd4\x9c\x3d\xf1\x42\x09\x5f\xbb\x6f\x12\x63\ \x53\xad\x44\x50\x83\x98\xa4\x47\x21\x9f\xd6\x07\x28\x02\x7d\xf2\ \x6b\x53\x78\xf8\xb9\x22\x94\xb2\x9b\x91\xa4\x88\xdb\x61\xb8\xf9\ \x35\x9b\xe0\xfb\x2e\x56\xaf\x1d\xc8\x0a\x7d\x56\x9d\x4d\x08\x8b\ \xbd\xa6\xfe\xe9\x00\xd3\x60\x52\x2b\x3b\xc7\x21\xac\xae\xbe\xf6\ \xe0\xd7\x31\x6b\xf0\xc7\x89\x9b\x69\x1a\x9a\x00\x90\x69\xf8\xb3\ \xc8\x81\xc5\xdd\xce\x84\x04\xa0\xef\xa9\x66\x88\xc3\xc4\x9e\x91\ \x4a\x0b\xe8\x0b\x1c\xb4\x0a\x1c\x2d\x0e\xb1\x6b\x33\x17\xd2\xde\ \x61\x80\xe7\x30\x94\x1b\x75\x4c\x1d\x79\x06\x27\x0f\x6c\x43\xa3\ \xc5\x11\x72\x8e\x28\x02\x42\xae\xf3\x42\x5f\x31\x16\x88\x00\x7c\ \x06\xf4\x04\xcc\x9b\xab\x72\xda\xa5\xa7\x24\xb6\x6a\xeb\xdb\x93\ \x7a\xd4\xf0\xde\x59\x68\x0d\x40\xf5\xfb\x97\x90\x1c\xf0\xd3\x52\ \x2f\xcc\x2d\xd5\xae\xbb\x6b\x02\xaa\x81\x3e\xc0\x02\x0b\x80\x80\ \x68\x03\xe6\xf5\xb1\x51\x73\x8b\x30\xc6\x80\x6b\x2f\xed\xc7\x8f\ \x9e\x98\xc6\xb3\x3b\xe7\xf0\xec\xce\x79\x30\x06\x6c\x5c\xdb\x83\ \x2b\x37\xf7\x63\xe5\x70\x80\x81\x3e\x0f\x83\xbd\x1e\x06\xfb\x3d\ \x54\xeb\x21\xc6\x67\x9a\x98\x98\x6a\x62\x62\xa6\x85\x17\xf7\x96\ \x71\x6c\x54\x49\x6a\x66\xa4\x45\xf3\x07\x92\xaf\x93\xe3\x0d\x8c\ \x4d\xb7\xb0\x62\xa9\x67\xde\x03\xf0\xe2\xde\x32\xa9\x90\xd6\x4d\ \xa9\x02\xab\xcb\xad\x97\xad\xc5\xe0\x60\x0f\x96\x2d\xef\x59\xd4\ \x46\x13\x67\x4b\x8a\x2f\xc6\x31\xc6\xe0\x07\x6e\xbc\x56\x9d\x1f\ \x04\x26\x9e\x2c\x50\x8b\x4d\xe6\x08\x0c\x17\x0d\xfe\x34\xa3\x9f\ \x06\x69\xba\xd5\xdf\xd2\x1a\xe2\x9f\xb4\x7c\x40\x36\xf6\x89\xf4\ \x27\xe9\x21\xd6\x00\x84\x9f\xeb\x70\xf8\x0e\x43\xe4\x31\x44\x9c\ \x21\xe4\x8e\x7c\xc4\x05\x03\x03\x63\x0c\x9e\x1b\x8a\x65\xdf\x6b\ \x0c\x41\x3d\x42\xad\xc5\x51\x6f\x89\xcd\x66\x5a\x21\x47\xc8\x19\ \x22\x2e\x16\x64\xe1\x9c\xe6\x4a\x66\x07\xa2\x7e\xf7\xe7\x1c\x77\ \xae\x1a\xa9\x61\xbc\x6a\xba\x2e\x05\xbe\xf2\x53\xe0\x2e\x42\x8f\ \xee\x53\xbf\xca\xd8\xa7\x9a\x07\xb4\xcd\x9f\x0a\x7e\xa0\xcb\xcb\ \x82\xc7\x85\xca\x24\x0c\x38\x8f\xb5\xe7\x6c\x6d\xc0\xec\x29\x38\ \x76\x2a\xd9\x13\x70\xe3\xe5\x4b\x70\xdf\xe3\x53\xc6\xc8\xc1\xfd\ \x47\x2b\xd8\x7f\xb4\x42\x80\xc2\xe4\x5f\xc5\x28\xb6\x3f\x92\x80\ \xb7\xd0\x4f\x2f\x1f\x79\x76\x1e\x3f\xfb\x46\xb2\x56\xbc\xfc\x7d\ \xdd\x75\xfd\xf8\xe6\x03\x33\x89\x9e\x03\xfb\x72\x70\xb0\x80\xcb\ \x2e\x5b\x0b\xc7\x61\x58\xb1\xb2\x37\xf1\x4e\x8b\x71\xe7\x9a\x10\ \x54\x7a\x85\x82\x1f\x13\x40\x5f\xaf\x7a\x07\x02\x40\x52\xab\x8d\ \x59\x9f\xf6\x20\x1f\x03\x68\xb1\x4f\x26\xf8\x8d\x74\x0c\x69\xaf\ \xae\x49\xb8\x44\xbc\x56\x1a\x34\xac\x74\x4c\x3d\x43\x9a\x00\xea\ \x5a\xed\xe2\xe8\x40\x92\x80\xcb\xc0\xe1\xa8\x21\x2e\xe2\x79\xc6\ \x44\x57\xa1\xc7\x90\xf3\x42\xe4\x7d\x86\xa2\xcf\x50\x6d\x72\x54\ \x9b\x11\x21\x01\xa1\x05\x84\x91\x2e\x2a\xba\x2e\xa3\x22\x80\xa5\ \x3d\xae\x7b\x7c\xb6\xa5\x80\xae\xa6\xed\xd6\xc8\x41\x25\x3f\x9d\ \xdc\x53\x84\x39\xcb\xcf\x58\xec\x03\x0b\x80\x1f\xe8\x6e\x13\xc0\ \x57\x1f\xc0\x58\x1a\x0e\x12\xf8\xa4\x8b\x28\x55\x3b\x80\xd0\x06\ \x46\xa7\xea\x68\x36\x23\xf8\xbe\x96\x98\x97\x6c\xe8\xc1\xd2\x41\ \x1f\xd3\x73\x62\xd5\x1b\x63\xae\x7f\xfc\x51\x74\x7a\xb0\xfc\xa8\ \x7f\x4c\x07\x46\x97\x55\x92\x0c\xee\x7b\x62\x16\x6f\x7e\xed\x20\ \x7a\xf2\xa6\x71\xe7\x1d\x77\x0c\xc1\x73\x80\xaf\xdf\x3f\x03\x7b\ \x94\x2f\x85\xe8\x8d\x37\x5d\x08\xd7\x75\xd0\x37\x10\xc0\xf3\xbb\ \x3b\xbd\xf4\x4c\xd5\xfa\x4e\xd5\x7e\xd7\xd5\xf9\xee\xed\xa5\xf6\ \x0b\x0a\x4c\x0e\xd1\x6c\x95\xa6\xb5\x2e\x80\x3f\xd3\xe8\x67\xa4\ \x29\xe2\xa0\x20\x4f\xaa\xfe\x54\x5b\xa0\xdd\x80\xd0\xe9\x51\x32\ \x50\x24\xc0\x44\xf3\xc5\x61\x0c\x9e\x2b\x2b\x6b\x20\xca\xc2\x61\ \x0c\x8e\xc3\xe0\x39\x40\xe0\x32\x14\x7c\x86\xde\x20\x42\x5f\x10\ \xa1\xd4\x88\x50\x6d\x38\xa8\xb5\x14\x09\x40\x6a\x02\x44\x0b\xb0\ \xea\xa6\xc3\x80\x5a\xd3\x01\xb4\x84\x57\xea\xbc\x02\xb4\xfa\xa5\ \xd2\x5f\x91\x84\x02\x7e\x0d\xe6\x52\x5f\xd4\x88\xd8\xd6\x75\x59\ \x03\x80\x06\x16\xb7\xa4\xae\x75\x4d\x17\xe6\x8c\xf9\x82\x03\x51\ \x18\x61\xff\xb1\x0a\x2e\xd9\xa0\x2b\x1c\x63\x0c\x37\x5f\x35\x88\ \x6f\x3f\x38\x21\x93\x12\x00\x8e\xbb\x9c\x90\x2c\x58\xc3\x2f\xfe\ \x43\xaa\x03\xcf\xf0\x97\x79\xab\x54\x43\x7c\xff\x91\x59\xbc\xf3\ \x8d\xcb\x8c\xd7\x64\x0c\x78\xeb\xed\x43\xb8\xed\xba\x01\x54\x6a\ \x62\xee\x7d\x4b\xb1\xbd\xfc\xad\x85\x01\xe6\xd8\x12\x00\x40\x3e\ \x2f\x97\xfe\xee\x10\x74\xaf\x94\xb3\xf3\x13\x45\x11\xca\x65\xbd\ \xf7\x5c\x5f\x5f\x3f\x14\x40\x38\x01\x66\xfc\x1b\x0f\xa6\x89\x63\ \x4c\x00\x32\x69\xd0\x6b\x07\x7e\x0a\x5e\x5b\x13\x00\x01\xbf\xd6\ \x14\xe2\xf3\x38\x3f\x3a\x15\x92\x0d\xc4\xb8\x50\x15\xd1\x6a\x16\ \x30\xa5\x19\x00\x70\xc1\x00\x42\x02\x8c\x45\x70\x1d\x47\x76\x13\ \x32\x14\x02\x07\x3d\x41\x84\xfe\x5c\x84\x72\x23\x42\xa5\xc1\x51\ \x6b\x46\xa8\xb6\xc4\xb6\x6d\xcd\x48\x68\x00\xad\x88\x27\x08\x80\ \x31\x41\x28\x2d\x61\x4b\x55\x93\x77\x54\x37\x9e\x02\x37\x3d\xca\ \xe4\x5c\x19\x0d\x55\x73\x81\x4a\x7d\xba\x91\x23\xb2\xa4\x3f\xd0\ \x55\x0d\x20\xf2\xd5\xc7\x4c\x5b\x11\xd8\xbe\x56\xa3\xb0\x13\x2b\ \x01\x01\x78\xf6\xe5\x19\x83\x00\x00\xe0\x96\xab\x86\xf0\xad\x07\ \xc7\x8d\x6e\x3b\x2e\x1f\xa0\x30\x4a\x25\x02\xf9\xc7\x68\x19\xd8\ \xfe\xe4\x9e\x2a\xad\xef\x3f\x36\x83\x3b\x6f\x19\x42\x4f\x21\x29\ \xc1\x07\xfa\x5c\x63\xeb\x32\xea\xf6\x4e\x0c\x61\x4e\xae\x31\xa9\ \x08\x60\x21\x77\xb6\x09\x61\xb1\x04\x74\x70\xdf\x24\x1a\x75\xbd\ \x6c\x99\xe7\xba\x12\x5e\x0a\x64\x12\x2c\x32\x2e\x31\x93\x53\x7d\ \xec\x85\xdb\xfb\xb1\x6f\x1b\xf0\xc7\xb5\xc8\xd6\x04\xe8\x3d\x33\ \x85\x84\x2f\x29\x01\xa8\xed\xc1\x01\xe8\x3d\x02\x8c\x2c\x69\x84\ \xd2\xba\x42\x49\x80\x31\x07\xae\xc3\xe1\xb9\x4c\x6a\x00\x1c\xbd\ \x01\x43\xb9\xe1\xa0\xda\x88\x8c\x66\x40\x43\x69\x01\x11\x8f\x09\ \x40\x69\x8d\x8c\xa9\xdd\x39\x99\x92\x81\xaa\x4b\x6f\x5c\x1e\x6a\ \xec\x3e\x05\xbb\xfa\xad\x43\x4b\x7c\x65\x2c\x54\x46\xc4\x8e\x80\ \xaf\x5c\x37\x07\x02\xc9\xb8\xa4\x51\x48\xb5\x07\x15\x29\x88\x4b\ \xa4\xd9\x06\x00\xb3\x59\xb0\xed\xe5\x59\xfc\xe2\x3d\x6b\x40\xd1\ \x7a\xfe\x79\x05\xac\x5c\x1a\x60\x6c\xaa\x6e\x82\x9e\x13\x32\x69\ \xd3\x34\x90\x41\x75\x05\x88\xff\xa4\x68\x05\xf2\x5e\xb5\x1e\x62\ \x7c\xba\x81\xf5\xab\x3b\x1f\xb8\x13\x71\x86\xb1\x79\xdd\xe6\xcf\ \x75\x48\x00\xb6\x3b\x5b\x6a\xfd\x42\x69\xb6\x9a\x11\x0e\x1e\x98\ \xc4\xd4\x44\xc9\xb8\x37\x36\x3e\x06\xa2\xab\xc5\xe1\xe3\xd1\x9f\ \x3c\x02\x53\x8b\x82\x2c\x00\x7e\x0a\xec\x4e\xc0\x6f\xa1\x34\x49\ \x2e\xb6\xc1\x91\x68\x0f\xe6\x00\x23\x2b\xce\x84\x0d\x20\x59\x26\ \x8c\x90\x00\x73\x45\xb3\xc0\x65\x62\xd7\x6a\xdf\x71\x90\xf3\xb8\ \x6c\x06\x70\xd4\x9a\x0e\xea\x2d\x8e\x7a\x4b\x18\x04\x55\x13\x40\ \x69\x01\x9c\xeb\x15\x9a\x1d\x26\x34\x5b\xf1\x8b\x08\x7a\x30\xcf\ \x04\x80\x51\x98\x93\x77\xa8\x8a\x1f\xaf\xe8\x0b\x13\xf8\x64\xa8\ \x66\x67\xe0\x07\xba\xa9\x01\x70\xee\x99\x2a\x98\xf0\x4f\x5b\x0c\ \xd4\xb8\x06\x12\xcd\x82\x53\x13\x35\x9c\x1c\xaf\xe1\xbc\x15\x79\ \x1d\x00\xc0\x35\x97\x0e\xe2\xbb\x0f\x8f\xb5\x91\xfe\xd9\x44\x40\ \xf3\xa2\xd2\x5f\x88\x0c\xfa\x7a\x5c\xac\x1c\xd6\x83\x81\x22\xce\ \x31\x3a\xd9\xc4\xf8\x54\x43\x7c\x3c\x57\xb4\x05\xd7\x8d\xe4\xd0\ \x2b\xa7\x31\x4f\x94\x7a\xd0\x8a\xb4\xc6\x10\x86\x1d\x7d\x87\x73\ \xe2\x16\x22\x89\xb1\x53\xf3\x38\x7a\x78\x3a\x75\x6b\xaa\xd1\xd1\ \x93\x71\xa1\x19\xc0\x27\xda\x00\xe7\x66\xb3\xac\x5b\xe0\xa7\xd2\ \x3e\x7d\x4c\x81\x7d\x9f\xa4\x46\xee\x33\x29\x2a\x8c\x9d\x9a\x0d\ \xc9\x6f\x7e\xab\x58\xa7\x51\x24\xc0\x44\x37\xa7\x00\x2e\x83\xe7\ \x70\x39\x5e\x80\xa3\xe0\x03\x8d\x50\x49\x7d\x07\xcd\x90\xa3\x11\ \x72\xb4\x22\xd1\x75\x18\x46\xf1\xf8\x5b\x59\xdf\x44\x49\xb9\x0c\ \x18\x9d\x6f\xd1\x6e\xbd\x49\x08\x12\x98\x87\xb9\x94\x77\x8b\x1c\ \xf1\xc6\x1e\xd0\xea\xfe\xa2\x80\xaf\x5c\x37\x35\x00\x37\x66\x63\ \x6b\xf5\xde\xc4\x02\x20\x80\x25\xfd\x95\x51\x4e\x37\x0b\x9e\xda\ \x31\x83\x77\xbc\x7e\x15\xc8\x93\xb8\x6e\xeb\x20\xbe\xf3\xf0\x28\ \xe4\xe3\x6d\x88\x40\x45\xbc\x70\xf3\x80\xe6\x2b\x8e\x97\x01\xbe\ \xc7\xf0\xcb\xf7\xac\xc0\xce\x03\x65\x6c\xdf\x5d\xc6\xde\xc3\x55\ \x8c\x4d\xd6\x21\x96\x7b\x37\x23\x76\x1c\x60\xf3\xfa\x02\xae\xd9\ \xd2\x8f\x95\x6b\xcd\x55\x65\xeb\xf5\x16\xfa\x71\x6e\x56\x97\x39\ \x1d\x2d\x80\x73\x8e\x6a\xb5\x89\x83\xfb\x26\x51\x9c\xcf\x5e\xb3\ \xf0\xd4\xa9\x93\xe0\xb1\xb4\x55\x40\x15\xbf\x11\x84\xd5\xdc\x18\ \x10\xa4\x13\xb0\xfc\xd2\x81\xdd\x09\xf8\x6d\xbb\x80\xd6\x04\x6c\ \xf0\x5b\xe0\x06\xf1\xa6\x60\xb7\x35\x80\x14\xa7\x4a\x8f\x31\xa1\ \xbe\x3b\x8c\x81\x39\x6a\xc8\x30\x83\xe7\x30\x04\x2e\x47\xc8\x85\ \xb4\x6f\x45\x1c\xcd\x48\x1a\xff\x14\xf8\x39\xe2\xee\x40\x5d\xe9\ \x45\xdc\x0e\x03\x8a\xb5\x68\x12\xa2\x7d\xaf\xba\xf5\xd4\x60\x1e\ \x0a\x7c\x6a\xd5\xa7\x12\x5f\xbf\xd9\x69\xec\x3c\xd2\x15\x02\xb8\ \xf1\xfa\x77\x07\xa0\x32\x94\x6b\xe6\x7c\xdf\x5b\xce\x47\x6f\xc1\ \xc7\xc3\xcf\x4e\x60\xef\xe1\x22\xc9\x6d\x7b\x62\xf8\xfe\xa3\x63\ \xb8\xe7\xd6\x11\x78\x9e\xae\xc0\x9b\xd7\xf7\x62\xcd\x8a\x3c\x8e\ \x8f\xd5\x16\x98\x06\xcc\x8c\x7c\x64\x12\x04\xb2\xc9\x20\x17\x30\ \x7c\xe2\x2b\x27\xd1\x0c\x89\xda\x92\x08\x28\xee\x44\x21\xb0\xeb\ \x40\x15\xbb\x0e\x56\x71\xf7\xdd\xe7\x63\xc5\x0a\x1d\xac\x5e\xd3\ \xed\xe8\x73\x65\xbd\x37\xb2\xd9\xe6\x99\xf9\xb9\x1a\xc6\x47\x8b\ \x98\x9a\x2c\xa3\x5d\xdd\xe1\x9c\xe3\xc4\xc9\x63\xd0\xc0\x52\x60\ \x25\xbb\x03\xc7\x1f\x74\x91\xed\xfd\x34\xb0\x67\x80\x9f\xca\x76\ \x1b\xdc\xa6\x8d\xc0\xfe\x2b\x7e\x59\x6c\xf0\x23\x79\xb6\x49\xa2\ \x8d\x73\x88\xd0\x72\x19\x83\xc3\x35\x11\x44\x5c\x0c\x1f\x16\x7d\ \xff\x02\xf8\x11\x17\xa4\x11\xc9\x73\x3b\x15\x45\x00\xc7\x67\x5b\ \x93\x30\x97\xf0\xa2\xb3\xf7\x6c\xc3\x1e\x3d\xe4\xab\x2c\x1e\xf8\ \xca\x75\x4b\x03\xc8\xc9\x7c\x30\x0a\x36\xce\xc5\xaa\x37\x6f\xbc\ \x79\x04\x77\xde\xb2\x0a\xfb\x8f\x14\xf1\xd7\xff\xba\x07\x93\x73\ \x75\x79\x5f\x6a\x0a\x29\xcd\x82\xe9\xb9\x3a\x7e\xbc\x6d\x02\x6f\ \xb8\x69\x45\x1c\x9f\xe3\x00\xff\xe1\xdd\xeb\xf0\xa7\x1f\xdb\xab\ \x55\x50\x8b\x08\x12\x7e\xd2\x3f\xcd\x4e\xa0\xf2\xa8\x1c\xbd\x57\ \x2c\xb7\x8c\x70\xb6\xa1\x90\x44\x6d\x5c\xf4\xf7\x9b\x0b\x8d\xd6\ \xaa\x66\x3c\x67\xdb\x2d\x44\x0a\xad\x56\x84\xc9\xf1\x12\xc6\xc7\ \x8a\xa8\x56\x3a\xdb\x05\x77\xe7\xae\x1d\x28\x95\x4b\x08\x82\x1e\ \xa1\xfe\x2b\x4d\x80\x03\x20\xb3\x04\xe5\x10\xb0\xb6\x52\x9f\xfa\ \xaa\x70\x6d\xc9\x40\x86\xd3\xd7\x8a\xd8\xad\x34\xec\xf8\x13\x76\ \x01\xf2\x42\x44\x8b\x59\xac\x13\x4d\x08\x2d\xe0\x18\x17\x44\xc0\ \xc1\x11\x39\x0c\x9e\x4c\x3a\xe2\x2c\x6e\xf3\x1b\x0b\x92\x13\x0d\ \x00\x00\x2a\x8d\xa8\xfe\xf5\x17\x4b\x87\x21\x0c\x7c\x74\xd5\x9e\ \x1a\xd2\xad\xfa\x5d\x01\xbe\x72\xdd\xea\xa0\x0e\x20\xd4\x14\xf1\ \xb1\x48\x01\x7f\xfa\x1b\x07\xf1\xeb\x7f\xfa\x14\xbe\xf8\xdd\x23\ \x58\x39\x5c\xc0\x5f\xfe\xce\xe5\x58\xb1\x34\x17\xdf\xd7\x95\x89\ \x5c\xcb\x0f\xf8\xcd\xfb\x4f\x21\x8a\xc7\xa0\x0b\x77\xf1\x05\x7d\ \x78\xfd\x4d\xcb\x10\xfb\xca\x67\xe3\xe7\xa8\x1f\x27\x7e\x2a\xbd\ \x0c\x7f\xe3\x1e\x4f\xb9\x47\xf2\x1a\xe7\xd7\x0a\xe7\xfb\x0e\x0a\ \x05\x53\xdd\x2f\x15\x1b\x67\x44\x02\xf6\x37\x5e\xe8\x3a\x2b\x8e\ \x52\xb1\x8e\x03\xfb\x26\xf1\xfc\xb6\x63\x38\x72\x68\xba\x63\xf0\ \x03\xc0\x23\x8f\x3c\x00\x5a\xae\xe2\xd4\x2a\x37\x91\x90\x24\x04\ \x55\x66\xc0\xd9\x06\xbf\x8e\x8b\x82\x3f\x7e\x73\x9d\x2f\xf2\x9d\ \x62\x1b\xc0\x19\xe0\x87\x36\x0d\x1c\x07\xd2\x26\xc0\xe0\xbb\xea\ \x10\xcd\x48\x31\x58\x48\x1c\x79\x8f\x21\xef\xcb\x43\x5e\xdf\xbf\ \xa7\xb2\x77\xa6\x12\xd2\x7e\x7d\x3a\x7e\x3f\x5e\xb9\x47\x1d\xd4\ \x9d\x76\xe6\x89\xeb\x16\x01\xe4\x00\x44\x14\x54\x14\x64\x33\x73\ \x75\xfc\xfb\x0f\x8e\xe0\xd3\xf7\x1e\xc0\xd0\x40\x80\xff\xfc\x0b\ \x17\xc5\x61\x12\x44\x40\xae\x47\xa7\xaa\x78\x70\xdb\x44\x9c\x88\ \x7a\xe3\x5f\x78\xcb\x5a\x5c\x75\xf1\x40\x3a\xe8\xa9\x1f\x4c\x22\ \x48\xf5\x3f\x0d\x32\x48\x23\x04\xce\x39\x7a\x0a\xe9\x0b\x46\x8c\ \x8f\x96\xf5\x3b\x74\x01\xd0\xb6\x4b\x8b\x83\x47\x1c\x73\xb3\x55\ \x1c\x39\x34\x8d\x17\x9e\x3d\x81\x97\x5f\x3c\x85\xc9\xf1\x12\xa2\ \x36\x6b\x14\xa6\xb9\xb9\xb9\x59\x6c\x7f\xf1\x39\x89\x7b\xf5\x4f\ \xd4\x49\x35\x19\x08\xf1\x8a\xc1\x00\xe2\xd2\x34\x49\x52\x97\x3f\ \x32\xc1\xaf\x43\x74\x0e\xfe\x74\xa3\x1f\x21\xa0\xd8\xf0\x43\xba\ \xfe\xc0\xcd\x81\x5f\xa7\xe9\x18\x3d\x98\x79\x28\xfb\x80\xef\x8a\ \xdf\xb4\xa3\x15\xa2\xf5\x57\xf7\x4d\xef\x80\x1e\xe8\xa3\x54\x7f\ \x03\xf8\x9c\xf3\xa8\x9b\xa0\xa7\xae\x8b\x04\xc0\x42\x53\xea\x22\ \x21\x85\x1f\x7c\x7a\x1c\x27\xc7\xab\xb8\x64\xc3\x00\xde\x7a\xfb\ \x6a\xc4\x24\x60\x4b\x13\x52\x99\xfe\xf7\x57\x0f\x63\xcf\x21\xdd\ \x25\xc5\x21\x56\xf6\xfd\xc3\x0f\x5e\x84\x5f\x7f\xf7\xf9\x58\xbf\ \xaa\x90\x4e\x04\x8b\xd0\x0a\x84\x3f\x3a\x22\x83\x2c\x42\x00\x38\ \xaa\xb5\xb4\xd9\x81\xc0\xec\x4c\x15\x8d\xfa\xe9\xef\xff\xde\x29\ \x49\x34\x9b\x21\x26\xc7\x4b\xd8\xbf\x67\x12\xcf\x6e\x3b\x86\x3d\ \x3b\xc7\x31\x76\xaa\x88\x7a\xfd\xf4\x35\x90\x47\x1e\xbd\x1f\x51\ \x24\x6d\x4f\x86\x64\xa5\x00\xd7\x7e\xba\xbc\x85\x9f\xba\x23\x33\ \x6e\x10\x82\x7a\x2e\x0b\xd8\x26\x61\xb7\x03\x7f\x5a\x9a\x30\xf2\ \x06\x5a\x64\x5d\x87\x51\x7b\x32\x48\x3b\x38\xc0\x3f\xf4\xd5\xb1\ \x87\x5e\x3a\x55\x9f\x86\x00\xfe\x0c\x44\x13\x20\xde\xb9\x17\x40\ \xc4\xf5\x4a\x2c\x67\xc5\x75\xd3\x06\x10\x71\xe8\xb5\x00\xd2\xb6\ \xf4\x8a\xa2\x08\x5f\xfa\xde\x21\xfc\xce\xfb\xb7\xe0\xe7\xef\x3a\ \x1f\xcf\xed\x9c\xc6\xb1\xd1\x4a\xfc\xdd\xec\xee\x3b\x06\xa0\xd1\ \x0c\xf1\x91\x7f\xd9\x85\x0f\x7f\x68\x2b\x56\xaf\x24\x73\xe9\x19\ \xf0\xfa\x1b\x97\xe3\xf5\x37\x2e\xc7\x89\xd1\x2a\x26\x67\x1b\x28\ \x55\x42\x94\x6b\x21\xea\x8d\x08\xf9\xc0\x41\xce\x77\x10\x04\x2e\ \xf2\x81\xf8\xf5\x5d\x06\xc7\x11\x4b\x8b\xb9\x2e\x10\x86\xc0\x89\ \xf1\x1a\x8e\x8d\xd6\xb0\x7d\x77\x11\x47\x4e\x56\x13\x75\xc5\x36\ \x20\xaa\xbc\xd9\x8e\x31\xa0\x5e\xaf\xa3\xd5\x0a\xe1\x79\x6e\x22\ \xfc\xf8\x68\x19\x6b\xce\x4f\x9f\x11\x78\xba\x7d\xf8\xcd\xa6\xd8\ \xf9\xa7\x5c\x6a\x60\x7e\xae\x86\x72\xa9\xb1\xe0\x33\x8b\x71\x33\ \xb3\xd3\xf8\xc1\x7d\xdf\x06\xb1\xea\x20\x2e\x20\x0b\x7c\x1c\xb2\ \x17\x20\x0d\xf8\xd0\xe1\x17\x54\xf9\xc1\x65\xd0\x85\x09\xc2\x48\ \x3f\x91\x2e\x25\x26\xc8\xee\xbb\x88\xf4\x54\x9c\x3d\x67\x7f\x39\ \x65\x33\x50\x8e\x73\xf0\x3f\xfb\xfe\xe4\x33\x9f\x7c\x62\xee\x20\ \x84\xb5\x7f\x12\x7a\xf4\x1f\x9d\xb7\x7f\xd6\x5d\x57\x8d\x80\xba\ \x22\x40\x7f\x5f\x66\x5e\x3f\xf2\xdc\x38\xee\xbc\x65\x35\xb6\x6c\ \x1c\xc4\x87\x7e\x71\x33\xfe\xe0\xef\x9e\x47\x14\xaa\x8f\x2a\x1e\ \xa0\x23\x09\xc1\x81\x52\xb9\x89\x0f\xff\xf3\x2e\xfc\xdf\xbf\x71\ \x31\x56\xaf\xec\x81\xed\x56\x8f\x14\xb0\x7a\xa4\x90\x66\xab\x27\ \x2e\xfd\xee\xfa\xd5\x82\x54\xde\x73\xe7\x2a\x3c\xf2\xcc\x14\xbe\ \xfc\xfd\x51\xcc\xcc\x93\xf6\x31\x25\x84\x14\x32\x88\x83\x49\x0d\ \xa2\x5c\xae\x61\x70\x30\x39\xf9\x67\x7a\xaa\x82\xe1\x15\x3d\xc8\ \x17\xbc\x8e\x01\x4e\x5d\x18\x46\xa8\x56\x5a\x28\x97\xea\x28\x97\ \x05\xe8\xcf\x44\xab\xe8\xc4\x7d\xee\xf3\x9f\x40\xb5\x5a\x81\xe3\ \xa4\x54\x13\x29\xee\x14\xd4\x18\x51\xb5\x95\xc1\x15\x80\xa5\x21\ \x20\x3e\x4f\x05\x3f\xef\x80\x0c\x90\x02\x7e\x24\xc3\x24\xe2\xa7\ \x9c\xf0\x0a\x38\xf5\xb5\x8f\x4c\x37\x4b\xff\xf1\xdf\xc6\xb6\x7d\ \xe7\xe5\xf2\x51\x08\xc0\x4f\x00\x18\x83\x20\x01\xa5\xfe\x9f\xb3\ \xdc\x76\x8b\x00\x02\xc4\x5f\x2b\x6d\x1d\x40\xba\x5c\x34\xf0\xcf\ \xff\xb6\x17\x7f\xfb\x07\xd7\x62\xc3\x9a\x3e\xfc\xb7\xff\xb0\x15\ \xff\xef\x27\x77\xa1\xda\x08\x8d\xb1\x03\x80\xd9\x4d\x38\x31\x5d\ \xc3\xef\x7e\xf4\x05\xdc\x79\xcb\x2a\xdc\x72\xf5\x30\x36\xae\xed\ \x93\x53\x50\xb5\x53\x25\x96\x0e\x2d\x5a\x9e\xc9\x10\x0e\x03\x6e\ \xbd\x6e\x19\x6e\xbc\x62\x08\xdf\x7a\x70\x0c\xdf\x7a\x68\x02\xf5\ \x46\x9b\xf5\x02\x49\x34\x3a\x4c\x84\x72\xb9\x9a\x4a\x00\x9c\x03\ \x7b\x77\x4d\x62\x68\x69\x01\xbd\x7d\x01\x7c\xdf\x81\xeb\xbb\xf0\ \x3c\x06\xcf\x73\xc1\x18\x47\xab\x25\xf6\xf3\x6b\x34\xc4\xaf\x38\ \x17\x47\xad\xda\x3c\x13\x9b\xd5\xa2\xdd\xb6\x67\x1e\xc7\xf3\xdb\ \x9f\x81\xe3\x38\xfa\x0d\x99\x98\x06\x2b\x3e\x0c\x23\xe5\x1d\xd3\ \x00\x01\x23\x27\x58\x4c\x82\x33\xcd\x90\x77\xda\xe0\xb7\x49\x86\ \x93\x7b\x89\x8f\x96\x4d\xe2\x67\xd3\x8d\x15\x5b\xb5\x2f\x3d\x5b\ \x3c\xf6\x5f\xbf\x35\xb9\xb3\xd2\x88\xd4\xfa\x7d\xa7\x00\x1c\x87\ \x18\xf9\xa7\xd4\x7f\x63\x38\xef\xd9\x76\xac\x1b\x76\x85\x1b\xaf\ \x7f\xf7\x2d\x00\xfb\xb6\xeb\x06\x83\x8c\x54\x16\x40\xf5\xc9\x93\ \x0a\x24\x7d\xaf\xb9\x74\x19\x7e\xff\x57\xb7\x22\xf0\x1d\xcc\xce\ \x37\xb0\xf7\x48\x11\x87\x4e\x94\x70\xe4\x64\x05\x87\x8e\x97\x30\ \x31\xd3\x90\x1f\x9b\xc5\xc3\x8a\x41\x62\xcc\xe5\x5c\x0c\xf4\xf9\ \xe8\xc9\x7b\xe8\xc9\xbb\xe8\x2d\xb8\xf2\xdc\x43\x4f\xc1\x83\xeb\ \x32\x44\x11\x17\xfd\xb1\x11\xf4\xc1\x39\x7a\xf2\x2e\xfa\x0a\x1e\ \xfa\x7a\x3d\xf4\xf5\xb8\xe8\xeb\xf5\x30\xbc\x24\x90\xbd\x13\xc2\ \x4d\xcf\x35\xf0\xe5\xef\x9d\xc2\xc3\xcf\x4e\xab\x86\x0d\xa9\x38\ \x09\x25\x0f\xa2\xc2\x72\x5c\x75\xf5\x85\xb8\xfe\xba\x2d\x67\x5c\ \xa6\xaf\xa4\x2b\x95\x8a\xf8\x6f\x7f\xf2\x7f\xa0\x38\x3f\x0f\xc7\ \x71\xe1\xba\x1e\x3c\x2f\x8f\x20\x28\x20\x97\xeb\x43\x3e\xd7\x8f\ \x5c\xd0\x87\x20\x28\xc0\xf7\xf2\x70\x5d\x1f\x70\x1c\xa8\x79\xf2\ \x49\x75\x5f\x5c\x65\xa9\xfc\x1a\xa3\xd9\xe0\xb7\x81\xbe\x10\xf8\ \x63\x1f\x19\x0f\xe3\x55\x5c\x3f\xb4\x1b\x97\x0d\x4f\x61\xd3\x70\ \x80\x8b\x56\x04\x58\xda\xeb\xc0\x4b\x5d\x7f\xb2\x3b\x6e\xb6\x1a\ \x36\x1f\x3d\x50\x9d\xfe\xd4\x53\xf3\x27\xbe\xf6\x42\xf1\x14\xe7\ \x71\x57\x9f\x02\xff\x31\x08\x02\x18\x83\x18\x00\xa4\xe6\xf1\x87\ \x10\xed\xff\xb3\x4e\x04\xdd\xd2\x00\x5c\x06\xc4\xdb\x82\x01\xaa\ \x3f\x3f\x7d\x55\x60\x00\x78\xf6\xe5\x29\xfc\xc9\xc7\xb6\xe3\xb7\ \xde\x7b\x31\xd6\x8d\xf4\xe0\xfa\xcb\x96\xe1\xfa\xcb\xf4\xcc\xbb\ \x6a\x2d\xc4\xfe\x63\x45\x3c\xb4\x6d\x02\x8f\x6f\x9f\x14\xd2\x98\ \x68\x04\xb5\x7a\x88\x7a\xdd\xde\xf0\x52\x13\x8c\x31\xbe\x97\xdc\ \x41\x0a\x99\xa8\xf3\x91\xe1\x1c\xae\xbe\x74\x10\xf7\xdc\xba\x12\ \x4b\x07\x03\xfc\xd6\x7b\xcf\xc7\x9d\xaf\x5d\x8e\xcf\xde\x7b\x02\ \x3b\x0f\x94\x8c\xa6\x80\x19\xbb\xca\x15\xc7\xae\x9d\x87\x71\xed\ \x35\x17\x4b\xc9\xf9\x93\xe7\x1a\x8d\x06\xfe\xfe\x1f\xfe\x12\xc5\ \xf9\x39\x69\xb1\x02\x20\x81\xcd\x98\x03\x07\x8e\x3c\x67\xf1\xd8\ \x7f\x0e\xb9\x9f\x6e\x5b\x75\xbf\x33\xa9\x2f\xbc\xad\xeb\x38\xee\ \x4e\x09\xc2\x4c\x4b\x88\x11\xa0\x2b\xa6\xff\x0c\x37\x53\x09\x9b\ \x07\xa7\x9a\xd5\x97\x4e\x36\x4a\x4f\x1f\xa9\xce\x3f\xbc\xbf\x3a\ \xfb\xd2\xa9\xfa\x3c\x04\xa0\xd5\xb4\xde\x79\x88\x35\xfb\xc6\x01\ \x9c\x84\x90\xfc\x6a\x14\x20\x95\xfe\x3f\x71\x1a\xc0\x75\x00\xbb\ \xdf\x71\xbc\x7e\x31\x12\xc8\x06\x18\x93\xff\xb5\x3f\xd5\x10\x2e\ \xbb\x68\x08\x77\xdf\xba\x16\xd7\x6d\x5d\x96\x18\xa8\x03\x00\x95\ \x5a\x88\x87\x9f\x19\xc7\xe7\xbe\x75\x58\x2c\xe3\x9d\x06\x62\xcb\ \x2f\xbe\x63\x8d\xe0\x31\x64\x79\x2a\x79\x00\xb9\xc0\xc1\xcf\xbe\ \xf1\x3c\xbc\xed\x8e\x91\xf8\xee\xdf\x7e\xfa\x20\x9e\xde\x31\x6b\ \xc4\xa5\x1f\x15\x1a\x40\xc4\x85\x9a\xf1\xc6\x37\x5e\x8f\x4d\x9b\ \xd6\x65\x15\xd7\xab\xd6\x45\x51\x84\x7f\xf8\xd8\x5f\x61\xfb\x0b\ \xcf\x68\xc0\x3b\x2e\x3c\x37\x80\xef\x17\x10\x04\x3d\xc8\xe5\xfa\ \xc4\x11\xf4\xc0\xf7\x0b\xf0\xbc\x1c\x5c\xc7\x05\x63\x8e\x34\x76\ \x51\x83\x21\xd2\xd5\x7d\x20\x1d\xfc\x29\x61\xcd\xae\xbd\xe4\x75\ \xba\x26\xa0\x09\x46\xf9\x38\xbc\x86\x1b\x96\xee\xc2\xd6\x65\xd3\ \xa7\xad\x01\x70\x00\xa7\xe6\x5a\xf5\x03\x93\xcd\xea\xbe\x89\x46\ \x65\xcf\x58\xa3\xf2\xd2\xc9\x7a\xf9\xf9\xe3\xf5\xf2\xa9\xf9\x96\ \x1a\xb8\x63\x2f\xe3\x55\x83\x5e\xc0\x43\x2d\xda\xa9\x8c\x7e\x6a\ \xcd\x7e\x7b\x21\x0f\x0e\xe0\xac\x74\xfb\xd9\xae\x5b\x1a\xc0\x0c\ \xd4\x5c\x00\x20\x73\xae\x3f\x57\xd2\x84\x4a\x05\x06\xec\xd8\x3b\ \x8d\x1d\x7b\x67\xb0\x7c\x69\x1e\x37\x5d\xbe\x1c\x57\x6f\x59\x8a\ \x2d\x9b\x96\xc0\x97\xcb\x68\xf5\xe4\x5d\xdc\x79\xcb\x2a\x6c\x5a\ \xd7\x8f\x3f\xfb\xe7\x97\x50\x92\xa3\xf4\x52\x17\x01\x89\xff\x68\ \x7f\xca\x01\xd4\x40\x95\xb5\x22\x50\xad\x11\xe1\x0b\xdf\x39\x8e\ \xe9\xb9\x06\x7e\xe5\x1d\x6b\x01\x30\x7c\xf0\x5d\xeb\xb0\xfb\x70\ \x11\x73\x45\xb2\x49\xa9\x72\x1c\x71\x77\x66\xc4\x23\xbc\xb8\x63\ \xef\x4f\x24\x01\x7c\xea\x33\xff\x88\xed\x2f\x6c\x33\x09\x9c\x39\ \x60\x8e\x3e\x1c\xc7\x85\xa3\xae\x19\x23\x70\x57\x5f\x5a\x03\x3f\ \xa1\x09\x00\x6d\xa4\x7e\x9a\x5f\x7b\x32\xe8\x14\xfc\x46\xfa\x40\ \xaa\x90\xa1\xae\x19\x72\x7e\x74\xa6\x55\x3b\x30\xd1\xa8\xec\x9d\ \x68\x54\x76\x8d\x36\x2a\x3b\x4e\xd6\xcb\xdb\x4f\xd4\xcb\xc5\x5a\ \x44\xe7\xdd\xd3\x45\x3b\x15\xe8\x29\xf0\xe9\x00\x1f\x35\xce\x9f\ \x6e\xd4\x49\x57\xed\x35\x86\xfb\x9e\x0b\xf0\x03\xdd\x23\x80\x59\ \x00\x81\xea\xbb\x8b\xf1\x2f\xeb\x84\x6a\x04\x28\x4b\x71\xd6\x38\ \xfe\x89\xe9\x2a\xee\x7d\xf0\x18\xee\x7d\xf0\x18\x86\x87\xf2\xf8\ \xe0\xbb\x2e\xc4\x0d\x97\x0d\xc7\x89\x6c\x5a\xd7\x87\x3f\xfb\x4f\ \x97\xe3\x4f\x3e\xf6\x22\xe6\x4b\x2d\xcb\x58\x28\xdb\xe1\x32\xce\ \x04\x11\x50\x7f\xc0\xc8\x67\x9c\x57\xeb\xde\xf7\x1e\x1d\xc3\x96\ \x8d\xfd\xb8\xe1\xf2\x25\x18\xe8\x75\x71\xdd\xa5\x4b\xf0\xa3\x27\ \x26\x74\x9c\xb4\xdb\x52\x69\x6e\x9c\xe3\xf8\xb1\x53\x38\x78\xf0\ \x18\x36\x6c\x58\xdb\x79\x09\xbe\x82\x2e\x8a\x22\x7c\xe9\xcb\xff\ \x8a\x47\x1e\xbd\x1f\xb6\xc1\x4f\x48\x76\x17\x8e\xe3\xc1\x75\x7c\ \x41\x00\x4c\x1c\x8c\x31\x70\x4a\xf2\x40\x36\xf0\x63\xb5\xdd\xf4\ \xcb\xd2\x10\x16\x02\xbf\x09\xf4\x34\xbf\xe4\x35\xd5\x4f\x18\x03\ \x4a\xf5\x28\x3a\x3a\xdd\xaa\xef\x9f\x6c\x54\xf6\x8c\x37\x2b\xbb\ \x4e\xd5\xcb\x3b\x4e\xd5\x4b\x2f\x9d\x6c\x54\x5a\x11\xa7\x13\x70\ \xe8\x84\x1c\x05\x76\x75\x34\x60\x02\x5f\x1d\x6a\xa3\x4e\x7b\x41\ \x0f\xba\x6e\x5f\xbc\x4d\x37\x5e\x01\xf5\x1f\xe8\x2e\x01\x78\x8a\ \x8d\x15\xf8\x6c\x30\x1a\xc4\x80\x14\x22\x20\xd7\x93\x33\x35\x7c\ \xe4\x13\x3b\x70\xdd\xd6\x61\xfc\xfa\x7b\x2e\xc2\xf0\x12\x61\xa0\ \x5b\xb7\xaa\x07\x1f\x78\xfb\x06\xfc\x8f\xcf\xed\x89\x13\xb7\x7b\ \x0d\x64\x74\x09\x22\x88\xfd\x49\x1e\x12\x24\x01\x93\x0c\x9e\xda\ \x31\x8d\x1b\x2e\x17\xab\xfb\xac\x5e\x99\x07\x27\x95\xc8\x78\x28\ \x1e\x78\x24\x76\xcd\xfd\xee\xf7\x7e\x8c\x5f\xfa\xc5\xb7\x63\x70\ \xf0\x95\x59\x0d\xb8\x53\x57\x2a\xcd\xe3\x1f\x3f\xfe\xb7\xd8\xb9\ \xf3\xc5\xd8\x8f\xa9\x7f\x52\xe2\xbb\xae\x0b\xd7\x71\xe1\x3a\x1e\ \x5c\xc7\x03\x8b\x55\x7e\x47\x98\x78\x63\xc1\x9f\x0e\x7c\xad\xf0\ \x75\x20\xf5\x13\x52\x3e\x0b\xfc\xed\x08\x21\x79\x1d\x71\x60\xcf\ \x58\x23\xda\x71\xb8\xd8\x98\xab\x86\xf5\x13\xb3\x61\xf1\xf8\x6c\ \x53\x19\xde\xd4\xd8\x7b\x3a\xd7\xde\x06\x39\x05\x3b\xbd\x57\xcf\ \x08\x63\x93\x01\x3d\xea\x56\x5a\xc6\x78\xff\x73\x25\xfd\x81\x2e\ \x11\xc0\x93\x4f\xff\x7b\xeb\xc6\xeb\xdf\x5d\x07\x78\x0e\x80\x6e\ \x06\x48\xf4\x71\xf0\xcc\x66\x41\xe2\x1a\x26\x11\x6c\x7b\x69\x12\ \x07\x8f\x97\xf0\xe1\x0f\x5d\x89\x91\x61\xd1\x67\x7f\xeb\xb5\x2b\ \x70\xdf\xe3\xa7\xb0\xf3\xc0\x5c\xfa\x22\x20\xf1\x9f\x05\x9a\x07\ \xf2\xc4\x32\x13\x18\xb8\x1e\xe8\xd5\x45\xb4\x6a\x58\x0c\x77\x48\ \x7e\x1d\x52\xd9\xe4\x51\xab\xd6\xf0\xd5\xaf\x7d\x1b\xbf\xfc\x4b\ \x3f\x97\x18\x18\xf4\x6a\x71\x47\x8e\x1c\xc4\x3f\xfc\xaf\xbf\xc2\ \xd4\x94\x1e\x6e\xad\x10\xcd\x98\x03\x47\xda\x00\x5c\xc7\x87\xe3\ \xfa\x70\x5c\x0f\x8e\xab\x48\x40\x5a\xfd\xe1\x40\x6b\x7e\xa4\x09\ \x00\xa4\xa8\xfb\xe2\x3c\x0d\xf8\x22\x78\x0a\x19\xc8\x78\x60\xf8\ \x68\xf0\x1b\xf1\x67\x80\x9f\x83\xa3\x15\x72\xfe\xd8\xc1\x6a\x73\ \x66\xb6\xac\x54\x73\xb5\xa8\x26\x9d\x7d\x47\x57\xdc\xc9\x02\x3c\ \x1d\xa7\xaf\x54\xf7\xac\xa5\xbc\xed\x83\x12\x85\x3d\xb7\xff\x9c\ \xaa\xfe\xca\x75\x73\x59\xf0\x32\xe7\x3c\xb7\xf0\xdc\xff\x94\x6b\ \xd8\xda\x80\x54\xe7\xa5\x68\x99\x9a\xad\xe1\x8f\xfe\xe1\x79\x7c\ \xf8\xbf\x5c\x85\x95\x72\x67\x9d\x5f\xfb\xd9\x8d\xf8\xdd\x8f\x3e\ \xdb\x56\xfa\xb7\xf5\x8f\xff\x64\x90\x01\x80\xa1\x41\x1f\xf7\xdc\ \x3e\x12\xdf\xaf\x37\x22\x0c\xf6\x79\xc8\xf9\xae\x98\xe8\xe1\x3b\ \xf0\x7d\x07\x9e\xc7\xd0\x68\x84\xd8\x77\xb4\x24\x65\x93\xa8\x82\ \xa7\x4e\x8d\xe2\xdb\xdf\xf9\x0e\xde\xf6\xd6\x7b\xce\xea\x72\x5f\ \x8b\x75\x9c\x73\x3c\xf4\xc8\x7d\xf8\xfc\x17\xff\x05\xcd\x66\xd3\ \x30\xce\x32\x30\x09\x7c\x47\xa8\xfd\x12\xf4\x9e\xeb\xc3\x95\xe0\ \x77\x98\x03\x47\x1a\x72\xc5\x9b\x3a\x32\x06\x2d\x99\xd3\x80\x6f\ \xaa\xfb\xfa\xbe\x96\xf0\x69\x7e\x16\xf8\xdb\x90\x01\xf5\x35\xc9\ \x20\x8e\x5c\x81\xb5\x02\xa1\xb5\x4e\x40\x18\xe5\x14\x19\xd8\xaa\ \x39\xd5\x06\xec\xa6\x40\x5a\xd3\xc0\x3e\xb7\xe3\xb0\x9f\x37\x16\ \xf4\x38\xd7\xe0\x07\xba\x4b\x00\xf3\x00\x5f\x9a\x36\x88\x07\x3c\ \xe5\x5a\x06\x52\xc6\x23\x96\x31\x88\x08\x10\x7c\x30\x31\x53\xc3\ \x1f\xfd\xfd\xf3\xf8\xf0\x87\xae\xc6\x8a\x65\x79\x2c\xe9\xf7\x41\ \xd5\xf1\xb8\xe8\xe8\xa0\x23\xe2\x9f\xda\x14\x68\x23\xfd\x47\x86\ \xf3\xf8\xa3\xdf\xbc\x04\x4b\x07\xf5\xec\xbe\x6b\x2e\x5d\x82\x1b\ \xae\xb8\xca\x7c\x6b\x29\xe5\x78\xc4\x31\x3d\x57\xc7\x93\x2f\x4c\ \xe1\x2b\xf7\x1d\xc1\xc4\x74\x0d\x60\xc0\xb3\xcf\x6f\xc7\xe4\xd4\ \x38\xde\xf7\xf3\xef\x43\x4f\x21\x39\x8a\xf1\x5c\xbb\xfd\x07\xf6\ \xe0\xf3\x5f\xfc\x17\x1c\x3a\xbc\x1f\x80\xd9\x33\xa3\xdb\xfc\x1a\ \xfc\xae\xeb\xc3\x73\x83\xf8\x70\x1c\x17\xcc\x71\x01\x69\xf5\x17\ \x87\xfa\x50\x19\xc0\x47\xba\xba\x2f\xfc\x6d\x3f\x4e\xf0\xdc\x0d\ \x4d\xc0\xf0\x0b\xa1\x57\xdf\x9d\x81\x5e\x7f\x4f\x2d\xc0\x41\xd7\ \xd4\xb7\x8d\x7d\x2d\x24\x8d\x7f\xf4\x88\xda\x84\x4d\x03\x7d\x62\ \x96\x1f\x5e\x01\xd7\x95\x6e\x40\x00\xb8\xf1\xfa\x77\x3f\x07\x80\ \xa0\x83\xc5\x20\xcf\xbe\xb6\xbb\xe3\x92\xfd\xf8\x76\xb7\xdd\xb2\ \x25\x79\xbc\xf6\xea\xe5\x18\x9b\xaa\xe3\xc9\x17\x26\xe2\xb0\x46\ \x17\x63\x1c\x85\xd9\xcd\x17\xa7\x61\xa3\xde\x48\x1b\x58\x3d\xd2\ \x83\x8f\xfe\xce\xe5\x08\x82\xf6\x7d\xf9\x95\x6a\x0b\x27\xc7\xeb\ \x98\x9a\x6d\x60\xc3\xba\x02\x96\xf4\x79\xa8\x37\x5b\x38\x35\x56\ \xc4\x7f\xff\xcc\x6e\xec\x3b\x32\x89\x7a\xbd\x84\x5a\xbd\x84\xbe\ \xfe\x3c\x7e\xf5\xfd\x1f\xc4\xea\xd5\xaf\x8c\x61\x70\x66\x66\x0a\ \xff\xf6\xd5\xcf\xe0\xc9\xa7\x1e\x89\x41\x67\x74\x8c\x32\x07\x60\ \x0c\x0e\x93\x03\x7f\xdc\x00\x9e\x9f\x43\x20\xbb\xff\x7c\xbf\x47\ \xfc\x7a\x39\x78\x5e\x20\x9a\x03\x4c\x6c\x92\xa1\xd9\xf5\x74\x80\ \x4f\xc2\x66\x49\xfd\x84\x94\x37\xfd\x6c\xf0\xa7\x8d\x37\x68\xb6\ \xea\xfc\xc0\xc1\xa7\x67\x67\x66\x4f\x4e\x43\xf4\xbf\x1f\x95\xc7\ \x18\x84\x16\xa0\xd6\xe0\xab\x21\x7d\xf9\xad\xac\xdf\xa8\xc3\xeb\ \x54\xe0\xcb\xb2\x78\x45\xc0\x0f\x74\x57\x03\x78\x1e\xc0\x15\x88\ \x67\x18\x12\x8b\x7c\x42\xfa\x33\x24\xf6\x09\x00\x3a\x32\x14\x4e\ \xcd\x54\xf1\x8d\x07\x8e\xc2\x80\xb7\xaa\x0b\x0c\x49\x3f\x20\x53\ \x2b\x90\xb7\x40\x1e\x01\x00\xd4\x1b\x21\x02\xdf\x01\x38\x50\x6b\ \x84\x78\xf6\xe5\x19\x5c\x76\xd1\x20\x5a\x11\xf0\xc8\xb6\x09\x6c\ \xdf\x3d\x8b\x63\xa3\x55\xcc\x97\x9a\x2a\x67\xe0\x9c\x63\xcd\x48\ \x0e\x97\x6d\xea\xc7\xe6\x0b\x7a\xf0\x1b\xef\xb9\x00\x7f\xfa\x8f\ \x73\xa8\x37\x44\x77\xd9\xf4\xf4\x34\xfe\xfa\xef\xfe\x02\x6f\x79\ \xf3\x5b\xf1\xba\xd7\xde\x81\x20\x38\x37\x7b\xcd\x8f\x8e\x9e\xc0\ \x83\x0f\xff\x10\x0f\x3c\xf8\x03\x34\x1a\xf6\x6c\x45\x42\xc0\x8c\ \x91\x36\xbf\x07\xc7\xf5\xe1\xba\x01\x5c\x2f\x07\xd7\x0d\xe0\x79\ \x81\x6c\x0e\xb8\xc2\x38\x08\x66\x44\x61\x80\x3c\xa1\x09\x90\xb2\ \x4f\x51\xf7\xd3\xa4\x7e\x5b\x95\x9f\xf8\xeb\xbf\x76\x13\x83\x12\ \x42\xfc\x9d\x23\x68\x03\x1d\xdd\x5b\x4f\xcd\xc4\x53\x04\x40\xa5\ \x76\x16\x88\x29\x98\xed\xf3\xb4\x5f\xfb\x90\xd9\x7b\xe5\xc0\x0f\ \x74\x51\x03\xb8\xe1\xfa\x77\xdd\xcd\xc0\xbe\x00\xa0\x3f\x23\x29\ \xd2\x5d\xa7\x64\x0f\x95\x1e\x04\xd2\xcc\xba\xce\xd4\x08\x52\xfc\ \x62\x8d\xc0\xf2\x53\x67\xd6\xe0\x9f\x64\xfe\xc4\xf9\x35\x5b\x96\ \x62\x49\xbf\x8f\xc7\x9e\x9f\x42\xad\x11\x92\xa6\x82\xdd\x96\x8f\ \x1b\x21\x72\xba\x70\x84\x28\x6c\x61\xf9\x90\x83\xde\x42\x88\xed\ \xbb\x47\x51\xaf\x97\x50\x6f\x94\xd1\x68\x54\xd0\x6c\xd6\x50\x28\ \xe4\xf1\xfa\x3b\xee\xc4\xeb\x6f\xbf\x13\x85\xb3\xd0\x2c\x68\xb5\ \x9a\x78\xe6\xb9\x27\xf1\xe0\x43\x3f\xc4\xee\x3d\x2f\xa5\x86\x89\ \x4b\x2d\x06\xbf\x1b\xab\xfd\x9e\x97\x83\xef\xe5\xe2\xc1\x3f\xbe\ \x5f\x40\xe0\xe7\xe1\x79\x39\x41\x0c\x8e\x47\x9a\x0b\x24\x52\x03\ \x80\xd2\x43\x97\x4e\x0a\xf0\xdb\x49\x7d\xb4\x55\xf9\x8d\x90\x19\ \x7d\xfe\xb4\x79\x11\x86\x0d\xbe\xff\xc0\xd3\x13\x33\xb3\x27\xc7\ \x20\x86\xdf\xee\x03\x70\x00\x62\x48\xae\x5a\x84\x53\xad\xc2\x6b\ \xaf\xc1\x67\x4b\xee\x2c\x50\xb7\x3b\x8c\x17\x7f\xa5\x81\xaf\x5c\ \xd7\x08\xe0\x9a\xab\xee\xe9\xf1\xfd\xfc\x2c\x00\xbf\x4d\x72\x89\ \x66\x40\xec\x7b\x5a\x44\xa0\x9f\xa1\xf3\x0c\x68\x7a\x99\x4d\x81\ \xcc\x26\x82\x8c\x3f\xb5\x99\x40\xf3\xa8\x2e\x6d\x02\xe0\x88\xa2\ \x10\xad\xb0\x81\x56\xb3\x86\x7a\xa3\x8a\x46\xa3\x8c\x7a\xbd\x84\ \x46\x53\x10\x40\xab\xd5\x40\x14\x35\x91\xcb\xe5\xf1\x9a\x9b\x6f\ \xc3\xd6\x4b\xaf\xc4\x45\x17\x6d\x41\x3e\xd7\xf9\xf2\xe3\xb6\x9b\ \x9a\x9a\xc0\xbe\xfd\xbb\xb0\x67\xdf\x4e\x3c\xf3\xcc\x13\x28\x96\ \xe6\x4d\x8d\x3c\x7e\x67\x5a\x06\x96\xb5\x5f\x4a\x7d\xdf\x97\xe0\ \xf7\xf2\xf0\xfd\x02\x7c\x3f\x0f\xcf\xcb\xc3\xf5\xd4\x58\x00\x87\ \x80\x9f\x59\x6a\xbe\x79\xde\x39\xf0\x63\x5f\x03\xf8\xc4\x37\x53\ \xe5\x37\xc2\x64\x68\x02\x61\xab\xc1\xf7\x1d\x78\x72\x6c\x76\x6e\ \x54\x8d\xc1\xdf\x0d\x60\x3f\xc4\x90\xdc\x09\x08\x4d\x40\x19\x00\ \xdb\xad\xc3\x97\x05\x6c\x1b\xe4\xaf\x5a\xd0\x53\xd7\x35\x02\x60\ \x8c\xb1\x1b\xae\x7b\xd7\x97\x00\xbc\x1d\x58\x68\x19\xdc\x85\xed\ \x03\xc4\xb7\x8d\x8d\x20\xad\xed\x6f\xb4\x6c\xf5\xbd\x84\x56\x40\ \x9f\x59\x80\x0c\x0c\xaf\x6c\x0d\x40\xfc\x8f\x10\xf1\x08\x51\xd8\ \x44\xb3\xd5\x40\xb3\x59\x45\xbd\x5e\x16\x24\xd0\xa8\xa0\xd9\xac\ \xa2\xd9\xaa\x23\x0a\x9b\x88\xa2\x50\x0c\x1f\xe6\x1c\xae\xeb\x60\ \xc3\x86\x8b\x70\xdd\xd5\x57\x63\xf5\x79\xeb\xd0\xdb\x37\x88\x9e\ \x9e\x7e\xf4\xf4\x0e\xa0\xb7\x47\x6c\x92\x52\xad\x56\x30\x3f\x3f\ \x87\x62\x71\x0e\xf3\xc5\x79\x4c\x4e\x8d\x63\xff\xfe\xdd\xd8\xb7\ \x7f\x37\x66\x66\xa6\x90\xe9\x18\x3d\x65\x92\x2c\xa5\xd1\x4f\x0e\ \xec\x11\x06\xbf\x40\xb4\xf1\x15\x01\xf8\x79\xf8\x5e\x1e\x9e\x9f\ \x13\x06\x40\xd7\x87\x2b\xc1\xcf\x39\x4b\x2a\x43\x46\x33\x6b\x21\ \x42\x48\x01\xbe\x45\x16\xed\x55\x7e\xea\xd7\x1e\xfc\x9c\x73\x84\ \x51\x93\xef\xd9\xfb\xe8\xc9\x62\x71\x72\x14\xc0\x61\x00\x3b\x21\ \x08\xe0\x38\xc4\xd0\x5c\x9b\x00\xb2\x16\xe1\xcc\x04\xb8\x75\xae\ \xd2\x7e\xd5\x81\x9e\xba\x6e\xee\x0b\xc0\xaf\xbf\xf6\x9d\xff\x97\ \xe3\xb8\x6f\xed\x20\x74\x5c\x07\xb2\xba\x0d\x63\x3f\x74\x66\x23\ \x88\x1f\xb3\xfc\xd3\x6d\x02\x16\x8c\x39\xd3\x95\xc6\xbe\x47\xf2\ \x66\xa4\x93\xa8\xfc\xb6\xa4\x92\xd6\x74\x26\x07\xd0\xb8\x3e\x5c\ \xd7\x47\x14\xb5\x10\x45\x21\x38\x8f\xc4\x76\xd5\xf2\xa9\x30\x8c\ \x70\xf8\xf0\x1e\x34\xca\x47\x00\xe9\x3b\x3a\x51\x43\xbd\x11\xc1\ \x75\xc5\xa8\xbb\x56\x6b\x91\x2b\xfb\xd8\xc0\x07\x10\x8f\xf0\x83\ \xee\xea\x73\x64\xfe\x7c\x4f\x18\xfe\x7c\x2f\x2f\x8d\x7d\x39\xdd\ \xf6\x77\x84\xc1\x2f\xd9\xed\x4a\xc1\x0d\xe0\xb4\x80\x4f\x9f\x4b\ \x97\xfa\x66\xe8\x74\xa0\xb7\x9b\x52\xcc\xc0\x10\x85\x2d\x25\xd9\ \x55\x97\x1c\x1d\xb4\x43\xfb\xfa\x13\xeb\xed\x5b\x19\x4f\xbb\x7e\ \xd5\x83\x3d\xcd\x75\x75\xca\xda\xb6\x67\xbf\x7e\x9c\x73\xfe\xf7\ \x10\x4c\xda\x81\xd3\x6a\xb3\x2a\x6b\x2e\xfd\x60\xfb\x41\xfa\x71\ \xea\x87\x14\x3f\xf9\x9c\xf4\x5f\xf4\x7a\x80\xed\xee\x59\x79\x8c\ \xf3\x2e\xd3\x57\x8b\x4d\xaa\xd9\x72\xb1\x6a\xed\xf9\xb2\x3b\xcd\ \x87\xeb\x88\x73\xd7\xf1\xe4\xb0\x5a\x27\x6e\x87\x2f\x1d\xcc\x49\ \xf5\x1a\x68\x34\x22\xd4\x9b\x11\xc0\x80\x30\x0c\x3b\x03\x3f\x23\ \x87\xe1\xc5\x4c\x75\x9f\xc9\xd1\x7d\x92\x94\x7c\x2f\x80\xef\xe7\ \xb5\xd4\xf7\xf3\xf0\x95\xd4\x77\x7c\x38\xcc\x93\x2a\xbf\x9c\xee\ \x6b\x09\x45\xbb\x1c\xd2\xca\x2a\x31\x9b\x2f\xe5\xfb\x21\x2e\x71\ \x2a\xe1\x53\xfc\x16\x09\x7e\x40\xd8\x3a\xc2\xa8\x45\xad\xf3\xb6\ \xa5\x3f\xad\x8f\x3e\xd1\x57\x2f\x5e\x57\xaf\xd1\x47\xdd\xc2\x1f\ \xe8\xd5\xe7\xba\xd9\x0b\x00\x00\x98\x99\x3d\xf1\xc7\x4b\x87\x56\ \x5f\x06\xb0\xdb\x01\x14\x16\x7c\x00\x80\xfe\x58\x67\xae\x11\x00\ \x0b\x6b\x05\x24\xca\x05\x34\x03\x8b\xe6\x53\xb4\x03\x9a\x57\x40\ \xd5\x67\x31\x3e\xc1\x71\x18\x1c\xd7\x85\x1b\xc9\xfe\x74\x2f\x90\ \x6a\xbf\xd0\x00\xe2\x3a\x13\xb5\xe0\xb8\x80\xeb\x38\x68\x85\x62\ \x9d\xf9\x62\xe5\xcc\x96\x13\x8f\x0d\xae\xb2\x79\xa3\xbb\xf9\xd4\ \x84\x1e\x21\xf9\x3d\xd7\x87\xeb\x05\x44\xe2\x8b\xc3\x75\x03\x49\ \x10\x72\xf2\x0f\xd3\x2a\x3f\x63\x7a\xcb\x37\xab\x14\xe4\x59\x52\ \x7a\x5b\x77\x52\x24\xbe\x55\x88\x89\x27\x74\x7a\x8b\xd7\x04\x44\ \x13\x35\x0c\x9b\x6a\xb5\x9d\xac\xad\xb5\x0c\x43\xdf\x4f\x2a\xa8\ \x17\xe3\xba\x4e\x00\xfb\xf6\x3f\xd9\x5a\xb3\x7a\xcb\xcf\x9e\xb7\ \xea\x92\xaf\x32\xc6\x6e\x03\xb0\x08\x33\xf7\xe9\x12\x81\x56\xe1\ \x99\x11\xc0\x38\x35\xea\x62\xa2\x89\x20\xef\x67\x92\x81\x7d\x3f\ \x23\x8c\xb9\x9c\x19\x1d\x54\xe3\x23\x8a\x42\x78\x9e\x00\xbf\x8a\ \x29\x94\xab\x7a\x45\x3c\xc4\xe8\x64\xdd\x90\x98\x6a\x83\x13\x9e\ \xc6\x3a\x29\xce\xb0\x7e\xc8\x55\x7b\xe8\xdc\x7d\x46\xc0\xaf\xda\ \xfc\x9e\xeb\xc7\xaa\x7e\x4c\x00\x52\x33\x10\xe0\x77\x63\x0d\x85\ \x73\xf1\x5d\x92\x83\x77\xc4\xb9\x06\x77\xbb\x7b\x69\xfe\x49\xc2\ \x30\x7a\x13\x32\xac\xfc\x9d\x82\x1f\x00\xa2\x28\xe2\xcd\x66\xdd\ \x1e\xc5\xc7\x91\x21\xe5\xf1\x53\xe2\xba\x4a\x00\x9c\x73\xce\x18\ \xc3\xf1\x13\x3b\x9b\xc7\x4f\xec\x7c\xc7\xd5\x57\xde\xfd\x3e\xdf\ \xcf\xfd\x35\x80\x5e\x80\x2d\xc2\xc4\x7d\x9a\x44\x00\x2a\xe5\xf5\ \xec\x43\xd3\xdf\xd2\x0a\x48\x7c\xed\xc8\x20\x71\xdf\x0e\x13\x87\ \x15\xa0\x15\x06\x36\x06\x87\x3b\xe0\xae\x0b\x8f\xfb\x52\xea\x47\ \xa6\x4a\xab\xf2\x1a\x39\x88\x20\x35\x03\x44\x62\x44\x24\x17\x63\ \x1d\xe3\xed\xaa\xdb\x55\x4b\xda\x0b\x42\x8d\x7c\x8c\xc9\xd9\x7c\ \x14\xfc\x7e\x3c\xd8\xc7\xf5\xe4\x28\x3f\x2f\x07\xcf\xf3\x63\xc9\ \xef\x38\x9e\x7c\x17\x79\x70\xf5\x2d\x3a\x07\xbd\xe1\xd3\x56\xe2\ \x67\xf9\x67\x68\x02\xf2\x5e\x3b\x95\xdf\x76\xf5\x7a\xb9\x09\x0d\ \x78\x3a\xd2\x8f\x5b\x87\x8c\xfe\xff\xff\x6e\x04\x26\x6f\x00\x00\ \x0a\x72\x49\x44\x41\x54\xd2\x1f\x38\x0b\x1a\x80\x74\x1c\x40\xf4\ \xdc\xf6\x6f\x7f\x79\x68\xe8\xbc\x1f\xac\x5b\x73\xd9\xaf\xf8\x7e\ \xfe\x3d\xae\xeb\x6f\xe5\x3c\x6a\x01\xcc\x65\x8c\x75\x90\x76\x36\ \x11\x00\x9a\x0c\x0c\x28\x2d\x24\xfd\xed\xf0\xe4\x1e\x25\x03\xe3\ \x94\x1b\x3f\xd9\x84\x40\x32\xc8\x65\x5b\x55\x49\x5d\xb8\x3e\xe8\ \xd0\x54\xa6\x48\x42\xb6\xcb\xc3\xa8\x25\x0d\x84\x91\x6c\x22\x70\ \x40\x35\x13\x98\x4d\x18\x76\x3e\x88\x81\x0f\xa6\xc4\x67\x8e\xea\ \xe6\xf3\xa4\x31\x52\x1b\x24\x15\xf8\x5d\x4f\xaa\xfb\x8e\xb4\x4d\ \x30\x65\x9b\xd0\xfd\xfc\x2c\x9e\xdd\xd5\x0e\xf4\x30\xef\x1b\x0c\ \xb9\x08\xe0\x93\xe7\xce\x44\xea\x53\x57\xae\xcc\x36\xa0\xdb\xfe\ \x76\x13\xc0\x66\xae\x9f\x0a\xf0\x03\x67\x97\x00\x38\x80\x70\x66\ \xe6\x64\x71\x66\xe6\xe4\xc7\x01\x7c\xa9\xb7\x67\x68\xf5\xf2\xe5\ \xe7\xdf\xe6\x79\xb9\x8b\x7d\x2f\xb7\xc1\x0f\x0a\x6b\x3c\xd7\x1f\ \x74\x1c\x37\xe7\x38\xae\xc7\x98\x23\x57\x96\x8a\x22\x65\x84\x8b\ \x3b\x08\x99\xc3\x74\x85\x54\x9f\x9b\x01\xdc\xec\xa6\x4b\x68\x05\ \x06\xe0\x4d\xad\xa0\x1d\x19\x00\x29\x5a\x03\x7d\x3b\x1a\x34\x83\ \x10\x54\x3b\xdc\x81\x03\xee\xb8\x70\xb9\x0f\xee\x72\x22\xd8\x88\ \x5a\x1e\x36\x11\x86\x2d\xa3\x97\x40\xd9\x09\x94\x91\xd4\x68\x77\ \x5b\xe0\x17\x6a\xba\x9c\xa1\x27\x41\xcf\xac\xf6\xbe\x98\xd6\xab\ \xa5\xbc\x68\xff\xfb\x72\xb6\x9f\x07\xd7\x51\x2a\xbf\xd9\xe6\x8f\ \x37\x6e\x4d\x55\xfd\x81\x6c\xd0\xeb\xb0\x9d\x01\x1f\x29\xea\x3e\ \x8d\x33\x29\xf5\x75\x72\xd9\x98\x8d\xa2\x90\x97\x2b\x33\xaa\x7b\ \x8f\xce\xe8\x4b\x9b\x94\xf3\x53\xe5\xba\x4e\x00\xb2\x19\xa0\x14\ \x56\xc5\xb8\x0d\x00\xa5\x72\x65\xe6\x64\xf9\xc8\xcc\x77\x01\x3c\ \x01\x60\x29\x80\x65\x00\x86\x00\x0c\x02\xe8\x63\xcc\xe9\x0d\xfc\ \xfc\x80\xe7\xe7\x7a\x7d\x2f\x57\xf0\xbc\x20\xe7\x79\xb9\xbc\xe7\ \xf9\x39\xd7\x0d\x02\xcf\x0b\x02\xdf\xcf\xe5\x3c\x37\xf0\x5d\xcf\ \xf7\x5d\xc7\xf7\x5c\xd7\x75\x19\x73\x1d\xc6\x18\x13\xb6\x58\xba\ \xf5\x0d\x63\x02\x04\x0e\x53\x96\x70\xb2\x24\x84\x1c\xce\xaa\xd1\ \xdb\x96\x0c\x44\x74\xb1\xa7\x6e\x6f\x73\xb3\x5e\x93\x08\xe4\xfc\ \x26\x30\x30\xb9\x46\xa0\x0b\x0f\xbe\x48\x95\x09\x3f\xa7\xe5\xa0\ \x25\x01\xea\x38\xcd\x98\x00\x62\x12\x88\x64\x93\x20\x53\xbd\x15\ \x40\x65\x6a\xad\x3e\x47\x77\x3f\x32\xc7\x95\xa0\x56\xd3\x78\xe5\ \x8c\x3e\xa5\x05\x38\x7a\x7a\xaf\x00\xbe\x2b\x96\x47\x96\xc6\x0d\ \xd5\xe6\x5f\x58\xd2\x03\x76\xdb\xde\xfe\xab\x4f\x17\x09\x7c\x79\ \x8f\xdb\x7e\x0b\xa8\xfc\x46\x09\x31\x86\xb9\xb9\x31\xb5\xe4\xb6\ \x9a\xf2\x9b\xb6\xf1\xe6\x4f\x9d\x3b\x2b\x1a\x80\xb2\x05\x40\x5b\ \x58\xd5\xa0\x79\x55\x9d\xd4\x42\x0a\x65\x88\x01\x18\xfd\x00\x7a\ \x39\x8f\x7a\xea\x8d\x4a\xae\xde\xa8\xe4\x20\x46\x14\x7a\x00\x5c\ \xf2\xeb\x42\x74\x5d\xba\xd6\xb5\xef\xba\x7e\xce\xf7\xf3\x05\xcf\ \x0b\x7a\x7c\x2f\x28\x78\x5e\x90\x77\xdd\x20\x27\xc8\xc3\xf7\x0b\ \xf9\x9e\x60\xcd\xf2\xc1\x5c\x6f\xe0\x39\xad\x90\xb1\x5a\xcb\x45\ \x3d\x74\xd0\x8c\x84\x56\xe1\x32\x0e\x97\xc9\x19\xed\x8c\x81\x73\ \x07\x21\x1c\x70\xee\x40\x8d\x54\x64\xdc\x5c\x22\x9b\xae\x4b\x9e\ \x66\x1f\x60\x71\x25\x65\x12\xa0\x1c\x8e\xeb\xc9\x92\xa0\x5d\x85\ \x1e\x42\xc7\x43\xe4\x7a\x52\x0b\x08\xad\xde\x82\x48\x6b\x01\x56\ \xf3\x47\x1b\xfa\x9c\xf8\xd0\x96\x7e\x2a\xfd\xe9\xaf\xf2\x77\xe3\ \x83\x41\x2f\xf0\x11\xeb\x15\x96\xda\x63\x22\x24\x5d\xd2\xeb\xb3\ \xa4\xb4\x4f\xdc\x03\x16\x00\x7e\x8a\xba\xdf\xa1\xd4\xa7\xae\x56\ \x2b\xb5\xaa\xd5\x79\x35\xcf\x5f\x2d\xd0\x49\xd7\xe0\xfb\xa9\x34\ \x00\x02\x67\xaf\x09\xa0\x1c\xd5\x02\xa8\x9f\x22\x05\xb5\x27\x5a\ \x8f\x3c\xf2\x10\x9b\x8c\x04\x10\x04\xa0\x48\x40\x81\x9e\xfe\x3a\ \x20\x04\x11\x86\x4d\x2f\x0c\x9b\xbe\x7c\x3e\x07\xd1\x05\x59\x90\ \xe7\x79\x00\xb9\xbd\xfb\x59\xfe\xca\x8b\x56\x2e\xf9\xc0\xed\x6b\ \x86\xb6\x0c\xc3\x5f\xdf\xd7\x72\xdd\x56\x03\xa5\x06\x43\xa9\xce\ \x50\xac\x3b\x28\x36\x3c\xcc\x35\x3c\xcc\x37\x7c\x14\x9b\x1e\xa6\ \xaa\x1e\xc6\x2b\x1e\x2f\xd6\x5d\x54\x9a\x2e\xea\x2d\x07\xad\xc8\ \x61\x62\x1d\x5c\xa6\xc6\xff\xc7\xb0\x94\x20\x64\xca\x7a\xce\x00\ \x70\xee\x90\x1e\x03\x26\x6c\x02\x10\x92\x29\x62\x0e\x98\x6c\x9f\ \x87\x91\x0f\xd7\x95\xcd\x00\x1e\x59\x4d\x01\xd2\x6d\x18\x3b\xdb\ \xca\x4f\x0c\x7e\xcc\x4d\x02\x9d\x89\xc9\x3c\x0e\x53\x5d\x7b\x4e\ \xac\x31\x30\xe8\xb9\x1a\xaa\xbd\x9f\xae\x86\xdb\x9f\x37\x09\x6f\ \x7d\x9a\x21\xed\x53\xdb\xf8\x24\x4c\x2a\xf0\xd1\x51\x5b\xdf\x76\ \x51\x14\xf2\xb1\xf1\x03\x45\x98\xf5\x4d\x4d\xfa\x49\x5d\x91\xe7\ \xa7\xc9\x9d\x35\x02\xc8\x68\x0a\xa8\x73\x45\x00\x75\x88\x8f\xa1\ \x80\x6f\x83\xdf\x45\x52\xda\xd3\x43\xf9\x7b\x32\x7c\x20\x8f\x3c\ \x04\xa1\x14\x40\xc8\x25\x8a\x78\xe1\xb9\xdd\xa3\x73\x2f\x1f\x9c\ \x1c\x5f\xb3\x72\xa0\x7f\xcb\xf9\x83\xbd\xd7\x6d\x5c\x52\xe8\x2f\ \xb8\x6e\xce\x77\x9d\x9c\xe7\xb0\x62\xd8\xe4\x13\xa5\x5a\x78\x6a\ \x6e\x96\x1f\x9b\xa8\xb5\x4e\x4c\xd7\xc2\xb9\x62\x2d\x9a\x2f\xd5\ \x78\xa9\xda\x0c\x09\x08\xb9\xe3\x78\xf0\xbd\x80\x79\x5e\xe0\x78\ \x5e\x4e\xfe\xea\xc3\xf7\xf2\xae\xe7\xe7\x5c\xdf\x0b\x1c\xc7\xf1\ \x1d\xd7\x75\x1d\xe6\x78\x8e\xc3\xc0\xa4\x94\xe7\x51\x14\xf1\x48\ \xaa\xf9\x8c\x45\xcc\x75\x1d\xe6\x38\x3e\x22\x1e\x81\x47\x2e\xd4\ \x00\x28\xce\x4d\x98\xc5\x92\x3a\xee\xee\x73\xe0\x38\x74\x0d\x3f\ \x69\xc8\x73\xac\x73\xa2\x29\x68\xf2\x90\x4d\xa3\xd8\x8e\x62\x36\ \x6d\x60\xa4\x9c\x7d\xd6\xa9\xb4\x17\xbe\x8b\x00\xfe\x22\xd4\x7d\ \xdb\x45\x51\x8b\x4f\x4e\x1d\x51\x4b\x7f\xcd\xcb\x43\x0d\xf9\xa5\ \xb6\x80\x9f\x3a\xe9\x0f\xa0\x7b\x73\x01\x32\x13\xd0\xd3\xef\x28\ \x70\x3d\x68\xd0\x2a\xe0\xfa\x30\xa5\x7e\x3b\xe0\x53\x02\x70\x52\ \xe2\x52\xd2\xbf\x07\x40\x2f\x4c\x0d\x43\xdd\xa3\xda\x86\x47\xe2\ \xa2\x8a\xaf\xad\x16\x66\xcd\xeb\xb6\x55\x48\xbb\xd3\x4e\x5d\x3b\ \x00\x38\x63\xcc\xf5\xbc\x9c\xe7\xb9\x41\xe0\xf9\x81\xe7\xba\x7e\ \xce\x75\x3d\xcf\x75\x7c\xdf\x75\x3d\xcf\x71\x5c\xcf\x75\xfd\xc0\ \x75\x3d\xd7\x61\xae\xcb\x1c\xc7\x65\xcc\x71\x18\x73\x18\x13\xf6\ \x4d\xae\x06\x1b\x21\x9e\xc9\xe7\xc0\x71\x84\x1d\x35\x5e\xb4\x53\ \x02\x1e\x8e\xd6\x0a\xc4\xe7\xb0\x46\xf5\x71\x2d\xfd\x4d\xb7\x38\ \xc0\xeb\xab\x6c\xcd\xe1\xf4\x80\x9f\x4c\xa7\x13\x17\x45\x21\xdf\ \xb3\xef\xb1\xb1\xf9\xf9\xf1\x69\x88\x79\xff\x87\x01\x1c\x04\x70\ \x04\xc0\x09\xe9\x37\x03\xbd\x3a\x6f\x0b\x3f\x25\x03\x80\x94\x3b\ \xdb\x4d\x00\xaa\x09\xd8\x20\x51\x83\x31\xd4\x58\x6c\x5b\xda\x53\ \xe0\xb3\x8c\x5f\x57\x9e\xbb\xd0\x1a\x83\x02\x75\x8f\x75\xf4\x22\ \x1d\xfc\x8a\x7c\x3c\x12\x1f\x05\xbc\x02\x38\x5d\xe8\x81\xfa\xd9\ \x24\x41\x49\x20\xcd\x31\xce\xb9\xd3\x6c\xd6\x58\xb3\x59\x63\xa8\ \xc5\xf9\xb7\x9b\x39\xb6\x1f\x03\xe0\x38\x8e\xeb\x79\x5e\xe0\xbb\ \xae\xef\x2b\x63\xa8\xe7\xfa\xca\xcf\xf3\xfc\x9c\x1f\x78\x79\xcf\ \xf5\x7c\xcf\xf5\x02\xdf\x73\x7c\xc7\x75\x7d\x17\xdc\x75\x38\x83\ \x1c\xb2\xca\x00\x30\xce\x44\xdf\x0a\x98\xe3\x32\x87\xb9\x4c\xb7\ \x53\xb4\x71\xd4\x20\x86\x14\x30\xa6\x12\x43\x27\xa0\x07\x90\x6e\ \xdc\x93\x4f\x9c\x01\xf0\x01\x01\xfe\x89\xc9\x43\xc5\xf9\xf9\x71\ \xb5\x14\xf7\x94\x3c\xe6\xa0\x9b\x01\xb6\x06\xf0\x53\xe7\xce\x3a\ \x01\x00\xa9\xcd\x01\xda\x14\x70\x20\x9a\x03\xb6\x74\xa7\x60\x6f\ \x77\x50\xa2\x70\x61\x36\x03\x72\x30\x49\x80\xda\x05\xa8\xa1\xd1\ \xd6\x00\x6c\xc9\x9e\xb6\x00\x04\x47\x12\xfc\x69\xbb\xba\xaa\x7b\ \x94\x10\xec\x77\x4b\xd3\x6a\x14\x09\x30\x99\x3f\x06\xc0\x89\xa2\ \x90\x35\x1a\x55\x07\xa8\xda\xcf\xc3\x2a\x3b\x90\x73\x87\x31\xe6\ \x78\x5e\xce\xf7\xfd\x7c\xce\xf7\x72\x79\xcf\x0b\x7c\xd1\xcb\x12\ \x04\x9e\x17\xf8\x9e\x1b\xe4\x7c\x3f\x17\xb8\x5e\x90\xf3\xdc\xc0\ \x13\x9a\x88\xe7\x3a\xff\x5f\x7b\x57\xd4\xa3\x36\x0c\x83\x5d\x27\ \x69\xf9\xff\xbf\x6b\xef\xdb\xc3\xb4\x3d\xed\x6e\x3b\x76\x3a\x0d\ \x6e\x6a\xa5\x02\xdd\x43\x30\x71\x8d\x9d\x52\x58\x01\x5d\xb1\xa8\ \x92\x34\xb4\xa4\xa5\xfe\xf2\xd9\x69\x62\x74\x4e\x8c\xb0\xc4\xeb\ \x29\x8a\x62\x6f\x4e\x60\x41\xce\xd0\x0e\x08\x31\xe0\x18\x03\x3b\ \x96\x4c\xa7\xf8\x00\x51\xf9\x7f\x3c\x7d\x7e\x7b\x7a\xfe\xf2\x0b\ \x22\xe5\x5f\x42\x5c\xfa\x8b\x00\x80\x96\xff\xa2\x49\x40\x0f\x1f\ \xc0\xd4\x42\xb4\xaa\x48\x03\xf9\xf4\x74\xec\x60\x58\xc9\x61\x20\ \x2f\x95\x87\x9c\x81\x04\x04\xa4\xf4\xdc\x29\xa8\x39\x19\xf9\xd3\ \x0b\xa0\x7b\x88\x37\xac\x9e\x03\x05\x09\x5d\x8f\xc6\x04\x64\xfb\ \x25\xa3\x91\x79\x0e\x06\x05\x4b\xb9\xf2\x4b\xd3\x85\x03\xc2\xe1\ \x5c\x5d\xd7\x15\x6d\xdb\x60\xdb\x36\x4e\xf9\x0d\x8d\x71\x1c\x36\ \x44\x5f\x96\x61\x51\xf9\x50\x55\xc1\x57\x15\x03\x8e\xd2\xb9\x50\ \x46\x50\x29\x4b\xe7\xca\xd2\xf9\xe0\x1d\x7a\x8f\xe8\x1c\xa2\xc3\ \x48\x39\xf6\x1f\xa0\x49\xc4\x05\x20\x46\xfe\x41\x37\xe6\x52\xc5\ \x27\x67\x6c\xdb\x36\x9b\x6f\xdf\x3f\x3d\xaf\xd6\x4b\x5a\xe5\xe7\ \x15\x22\xd5\xa7\xa5\xbf\x28\x1a\x0f\x5f\xfc\xe3\xa6\x0b\x73\xde\ \x52\x26\xf7\x01\x98\x3f\xac\x2f\xcd\x63\xa5\x43\x79\xae\x4c\x1c\ \x04\x3c\x24\x20\x90\x29\x99\x0c\x1e\xfa\x4a\x25\x7b\xf6\xdc\xb2\ \x4f\x1a\x0b\xc8\x39\x93\x78\xbb\xb9\x12\x53\x1d\x07\x01\xce\x00\ \x9c\x38\x46\x03\x0b\x8d\x31\x59\xac\x4a\x55\x74\xe5\x37\x2d\x9f\ \x8b\xf5\xdd\x23\x9f\x4d\x08\xd5\x62\xcf\x3a\x2a\xcf\xc0\xa3\xf7\ \x5e\x87\x2f\x4b\xef\x42\x40\x17\xbc\x43\xe7\x10\xfd\x9e\x75\xa4\ \x49\x77\xbd\x7b\x58\xa4\x0c\x22\xe2\x66\xd3\x6e\x57\xab\x97\xf5\ \xcf\x97\xaf\xcb\xf5\xfa\x37\xcd\xeb\x7f\x87\xd8\xdb\x53\x18\x2e\ \x5a\x00\x74\x09\x89\x09\x70\xdb\x7f\x0b\x0f\x00\xb8\x51\x23\xf4\ \x35\xb3\x4d\x1b\xda\xd8\xa7\x99\x05\xa4\xe0\x25\x24\x3f\x01\x39\ \xfd\x02\xf4\x7b\x4f\xc9\x57\x35\x65\x97\x8a\x2f\xe7\x8c\x93\x68\ \xa6\x80\xd6\x7e\xca\x3b\x56\xd6\x7a\x78\x8d\x2d\x58\xfb\x2c\xd3\ \x42\x02\xc0\xd8\x4d\x2a\xbf\x55\xaf\x81\x87\x56\xb6\x58\x87\x83\ \xe8\xeb\x08\x91\x75\x2c\x16\xc1\x57\x95\x73\x3e\xc4\xfa\xe8\xb6\ \xe8\xba\x0e\xea\x66\xdd\xd4\xf5\xaa\xde\xed\xb6\xa4\xc0\x34\xb2\ \x54\x43\x5a\xf3\xff\x0d\x52\x4c\xbe\xd7\x7d\x99\xfc\x00\xfc\x85\ \xa0\x1d\x40\x62\xaa\x73\x91\xbb\x00\x00\x4d\x0c\x50\xc8\x1e\x02\ \x8a\xed\x0b\xfd\xa1\x42\x9e\x22\xa4\xde\x9f\x9f\xc3\xf2\xfc\x6b\ \x79\x12\xcd\xcb\xc5\x53\xcd\x30\xa6\xf6\x76\xd0\x6f\xbb\x66\xfe\ \x68\xbe\x10\xad\xb7\xd7\x40\x41\xde\x8f\x53\xf3\x53\x6c\xb9\xe1\ \xdc\x53\x59\x87\xbc\x56\x6e\x9a\x6d\xa0\x1f\x96\x8b\x40\xe0\x0f\ \x44\xea\xcf\xe3\xf2\x91\xf2\x1f\x4c\x80\xb9\x29\x3f\xc0\x1d\x03\ \xc0\x58\x61\x80\x21\x15\x69\xe8\xa1\x94\xbd\x3f\x80\xed\xe0\xd3\ \xe8\xbe\x95\x16\x70\xcc\x0c\x80\xed\xd7\xcc\x1c\xd9\x7e\x7e\x1d\ \xd6\x36\xe6\xbb\x39\xd0\xc8\xb1\x09\xcd\xcc\x18\x62\x16\xe7\x82\ \x89\x35\xec\x2b\x47\x85\x24\x63\x93\xa3\x4a\x35\xa4\xc0\x9c\xef\ \x10\xc1\xe0\x2f\xe8\x2f\x01\xcd\x52\xf9\x01\xae\xe8\x04\x9c\x5a\ \xd8\x1f\xc8\x47\x1c\x28\x95\x8e\x46\xf9\x10\x21\x3f\x95\x92\x0e\ \xd9\xf8\xf2\x18\x9e\xd7\xc0\xc5\x52\x7a\xad\xac\x29\xf9\x50\x9d\ \xc5\x28\x64\x79\x68\xbf\x06\x12\xa7\xb0\x8f\x21\x00\xb9\x84\x7d\ \x70\x66\x43\x6d\xe7\x43\xb4\x34\xd9\x87\xe2\xf0\x51\xc8\x2f\x3e\ \x07\x80\x94\x7f\x96\x9e\x7f\x2e\x1f\x86\x01\x68\x92\x61\x05\x32\ \xaf\x89\xd5\xbb\xcb\x7c\xee\xd8\x6c\xf3\xce\xa8\x3f\x07\x38\x78\ \x7e\x4c\x6a\x01\x83\xb6\x4f\x63\x5d\x63\x41\x63\x0c\xf3\x90\xed\ \xe5\xc3\xca\x64\x0a\xf0\xf5\xfe\x78\x6c\x3e\xb9\xde\xff\xec\xec\ \x7e\x2e\x1f\x1a\x00\x48\x8c\x11\x07\xab\x4c\x62\xf5\xf2\x69\xc7\ \x05\x37\xef\x0c\x1f\x47\xef\xf0\x33\xea\xaf\x0d\x1e\x63\x01\xe4\ \x54\xf6\x21\xcf\x05\xd0\x77\xca\xca\xb8\x7d\x5a\x94\x9f\x9b\x44\ \xe2\xbd\x47\x99\x05\x00\x48\x19\xab\x7c\xf7\xf6\x90\x5c\x00\x1e\ \xa7\x1c\xf7\xbf\xc0\x43\xa6\xb9\x3a\x0b\x1c\x64\x59\x3b\x27\x09\ \x07\x81\x5c\x78\xae\x83\x09\x77\x6f\xff\xeb\x2d\x64\x96\x00\x30\ \x67\x99\x10\x3c\xae\xc1\x3a\x86\xda\x61\xbd\xc3\xd1\xf3\xe3\x3c\ \x14\x3f\xc9\x3f\x9e\x06\xd5\x09\x26\xfd\xab\xb3\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x57\x39\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x01\xc9\x00\x00\x01\xc9\ \x01\x61\x0f\x54\x5c\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x20\x00\x49\x44\ \x41\x54\x78\x9c\xec\xbd\x79\x9c\x5d\xc7\x75\xdf\xf9\xad\xba\xdb\ \xdb\x7b\xdf\xd0\xe8\xc6\x0e\x10\x00\x09\x10\x5c\x40\x8a\x04\x45\ \x51\x94\x28\xca\x5a\x2d\x59\x8b\x25\x47\xb2\x64\xd9\x96\xc7\x1e\ \xcb\xf6\x4c\x3e\x99\x99\x64\x9c\xc4\xb1\x13\xcf\x7c\x66\x9c\x8f\ \xe7\xe3\x78\x3e\x89\xc7\x4e\xec\x38\x8a\x25\x4b\x1e\x2f\x91\x2c\ \x29\x91\x44\x71\xdf\x49\x80\x24\x40\xec\x40\x63\xeb\x7d\x7d\xfd\ \xb6\x7b\x6f\xd5\xfc\x51\x75\xef\x7b\xaf\xd1\x0d\x34\x68\xca\xd4\ \x1f\x53\xf8\x3c\xdc\xd7\x77\xad\x7b\xce\xa9\x73\x7e\x67\xa9\x7a\ \x42\x6b\xcd\xff\xdf\xfe\x6e\x4d\x08\x21\xae\x75\x5c\xff\x08\x13\ \x59\xbe\xd5\x1d\xb8\x5e\x13\x2d\xed\xad\xee\x4b\xd2\x5a\xba\x24\ \x85\x10\x12\x43\x47\x07\x70\xed\xc7\x1b\xe8\xc9\x79\x76\x9f\xb4\ \xe7\xfd\xc8\xf4\xbf\xb5\xb9\x6f\x75\x07\x56\x69\xe2\x4b\x5f\xfa\ \x92\xff\xd5\xaf\x7e\x75\x5b\xb9\x5c\xde\x59\x28\x14\x90\x52\x5e\ \xca\x66\xb3\x63\x42\x88\x69\x40\x63\x06\xd5\xdf\xdb\xa8\x6a\x61\ \x5e\xeb\x56\x26\xdb\x7f\xf3\x0f\xef\x1f\xbd\x6d\xd8\x7d\x4f\x4e\ \xaa\xbd\x3e\x51\xbf\x2f\x54\xaf\x27\x75\x57\x4d\x39\x17\xe7\x23\ \xef\xb9\x23\x93\xfa\x2b\x5f\xf8\x57\xdf\x3f\x21\x84\x88\x7e\xd4\ \xb4\x81\xf8\x51\xea\xcf\x3b\xdf\xf9\xce\xce\x4b\x97\x2e\xfd\x66\ \x6f\x6f\xef\x17\x8a\xc5\x62\x90\xcd\x66\xa9\x54\x2a\x54\xab\x55\ \xa6\xa6\xa6\xd4\xd4\xd4\xd4\x91\x72\xb9\xfc\xd7\xf5\x7a\xfd\x0f\ \x81\x4b\x80\xfa\x61\x10\xf4\x3a\x0c\x77\x7e\xe7\x57\xee\x1d\xba\ \x7d\x38\x78\xa8\xcb\x8f\xef\xcb\xcb\x70\x67\xa7\xa8\x6f\x2b\x51\ \xed\x72\x75\x7c\xd5\xbd\x14\x92\x49\x8a\x13\x7f\x7d\x46\xfe\xfc\ \xcf\xff\xeb\xa7\xbf\x0d\x34\xb4\xd6\xea\xcd\xee\xf3\x1b\x6d\x3f\ \x32\x02\xb0\x67\xcf\x9e\xbb\x46\x47\x47\xbf\x91\xcb\xe5\x7a\x4e\ \x9e\x3c\xc9\xa5\x4b\x97\x68\x34\x1a\x04\x41\x40\xb1\x58\x64\x60\ \x60\x80\xae\xae\x2e\xc2\x30\xe4\xb5\xd7\x5e\xab\xcc\xce\xce\xfe\ \x46\x18\x86\xbf\x0b\xd4\xff\xae\x42\xb0\x42\x3d\x8b\x96\x8f\x04\ \xe4\x6f\x7e\xf1\x60\xff\xdd\x5b\xf2\x0f\xf6\x66\xd4\x03\x79\x11\ \xed\xea\x90\xf5\xad\x9d\x54\x7b\x3d\x1d\xad\xfb\x19\xc7\x1b\x1d\ \x17\xfe\xf7\xef\x2f\x7d\xf6\x8f\xfe\xcb\xb1\xa7\xde\x8c\x3e\xbf\ \x59\xed\x47\x42\x00\x3e\xfa\xd1\x8f\xf6\x94\xcb\xe5\x23\x8b\x8b\ \x8b\x1b\x8e\x1d\x3b\xa6\x96\x96\x96\xfe\x42\x29\xf5\x97\xc0\x59\ \x00\xc7\x71\x06\x1c\xc7\xd9\x2d\x84\x78\x70\x78\x78\xf8\xd0\xa6\ \x4d\x9b\xfc\xa9\xa9\x29\xc6\xc6\xc6\x5e\xad\x54\x2a\x5f\x8c\xa2\ \xe8\x69\x6e\x40\x1b\x5c\x8f\xe1\xff\xf3\x67\x6f\xed\xb9\x7f\x77\ \xd7\xfd\xfd\x59\xfd\x50\x5e\xc6\x3b\x4b\xa2\xb1\xa5\x4b\x54\x07\ \x03\x1d\x82\xd6\x18\x2b\x74\xe3\xed\xd1\xf9\xae\x67\xee\xff\x5f\ \x9f\xfe\x38\x70\x05\xf8\x91\x30\x07\x3f\x0a\x18\xc0\xb9\x74\xe9\ \xd2\x7f\xee\xea\xea\xda\xf0\xfa\xeb\xaf\xeb\x85\x85\x85\x2f\x02\ \x8f\x01\x35\xfb\x89\xe3\x38\x9e\xf4\x3c\x2f\xef\xfb\xfe\xb1\x99\ \x99\x99\x68\x72\x72\x72\xf3\xe6\xcd\x9b\x77\x1e\x38\x70\xe0\xe6\ \xcb\x97\x2f\xff\x60\x6c\x6c\xec\xf7\xea\xf5\xfa\xff\x28\x84\x88\ \x57\x23\xea\xf5\x18\xfe\x4b\x3f\xb1\xa7\xe3\xc7\x6e\x1f\x38\xd4\ \x9f\xe3\xc7\xf2\x32\xde\x55\x94\xd1\x96\x1e\xb9\x38\x94\xd1\xa1\ \x00\x6d\x99\x0e\x08\x89\x85\x20\x6f\x48\x10\xb6\xe5\x1b\xbb\x6f\ \xbb\x69\xe0\x9e\x17\x5f\x9f\xf8\x16\xb0\x78\xc3\x37\xf8\x21\xb4\ \xb7\x5a\x00\xc4\xbe\x7d\xfb\x7e\x69\x60\x60\xe0\xdd\x2f\xbc\xf0\ \x02\xf3\xf3\xf3\x7f\x80\x61\x7e\x15\x58\xec\xec\xec\xdc\xb3\x7d\ \xfb\xf6\x3f\x2c\x14\x0a\x3b\x8b\xc5\xa2\x88\xa2\x08\xa5\x14\x4b\ \x4b\x4b\x8c\x8d\x8d\x85\xd3\xd3\xd3\x1c\x38\x70\xc0\x03\xbe\x74\ \xe6\xcc\x99\x85\x38\x8e\xff\x05\x10\x5d\x8f\xe1\x3f\xfb\xe3\xb7\ \x14\x3e\x74\xf7\xc0\xdb\x06\xb2\xfa\x03\x39\xa9\x76\x15\x65\xbc\ \xa5\x5b\x56\x86\x73\x84\xd2\x5c\x98\xf0\xc5\x3a\x49\xa2\x85\xe1\ \x02\xf3\xbd\x75\xdf\x3a\x85\x61\xc8\xaf\x96\x3e\x7d\x68\xf0\xc3\ \x2f\xbe\x3e\xf1\x18\x50\x16\x42\xfc\xbd\x82\xd9\xd5\xda\x5b\x2a\ \x00\xf7\xdf\x7f\x7f\xef\xe8\xe8\xe8\xbf\x38\x7e\xfc\x38\x33\x33\ \x33\x2f\x01\xbf\x0b\x84\xc0\xf2\xc8\xc8\xc8\xc7\x0f\x1e\x3c\xf8\ \x7b\xf3\xf3\xf3\xee\xcb\x2f\xbf\xcc\xf2\xf2\x32\x61\x18\x2e\x6b\ \xad\x6b\x03\x03\x03\x3d\x1b\x36\x6c\xf0\x5c\xd7\xe5\xf0\xe1\xc3\ \xf1\xdd\x77\xdf\xed\x94\xcb\xe5\x5f\xaf\x54\x2a\x3f\x57\x2c\x16\ \x8f\x03\xff\x13\xf0\x3c\x96\xe9\x1f\x7b\xe7\xb6\xdc\xa7\x1e\xdc\ \x72\xd7\x86\x92\xfc\x50\x5e\xaa\xdd\x05\x27\xde\xdc\x23\xeb\xc3\ \x79\x11\xba\x22\x65\x9c\x06\xe5\x40\xeb\xdf\x09\xb3\x57\x7e\x5f\ \xeb\x73\x1d\x41\x90\x5a\x71\x60\xd8\xdf\x07\x0c\x02\xb3\xc0\xd5\ \xa8\xf1\xef\xb9\xbd\x95\x02\x20\x1b\x8d\xc6\xbf\x8e\xe3\xb8\x78\ \xe5\xca\x95\x58\x29\xf5\xeb\x18\x82\x54\x73\xb9\xdc\xc8\x9e\x3d\ \x7b\x7e\xf7\xe8\xd1\xa3\xee\x89\x13\x27\x66\xe2\x38\xfe\x37\x18\ \x86\x9e\x04\x1a\x57\xae\x5c\x39\x30\x31\x31\xf1\x91\x8d\x1b\x37\ \xfe\xe4\xf0\xf0\xb0\x73\xf4\xe8\x51\x3a\x3a\x3a\x08\xc3\x70\xf0\ \xe6\x9b\x6f\x1e\x3c\x7c\xf8\xf0\x37\x7f\xf9\xc3\x5b\xbe\xf0\x81\ \x83\x83\xef\xcc\x3b\x62\x4f\xde\x51\x9b\x7b\xbc\x78\x63\x51\x34\ \x3c\xd9\xc6\x24\xc7\x6c\x92\x7d\xf6\x4f\x54\x02\xd2\x15\x6d\x02\ \xb1\xde\xcf\x35\x40\xfe\xb6\x0e\xbd\x71\xdb\xc6\xae\x5d\xa7\x2f\ \xce\x9d\x05\xea\xac\x47\x75\xfc\x10\xdb\x5b\x16\x08\xda\xbb\x77\ \xef\xed\xfd\xfd\xfd\x3f\x79\xe4\xc8\x11\x96\x97\x97\xff\x04\x38\ \x05\x34\x80\xca\xd6\xad\x5b\xff\x8f\xf9\xf9\xf9\xe0\xf4\xe9\xd3\ \xe5\x38\x8e\x3f\x0d\xfc\x05\x70\x0c\x98\xb3\x9f\xef\xf5\xf7\xf7\ \x3b\x41\x10\x88\x4c\x26\xc3\xf8\xf8\x38\x41\x10\xd0\xa8\xd5\xa2\ \x72\xb9\xcc\xf0\xf0\x70\xd7\xe1\x63\x93\x5f\xbd\xb3\x14\xfd\xe2\ \x2d\xf9\xf0\x81\xad\x41\xb4\xa5\x43\x6a\x4f\x0a\x09\xd2\x31\x1f\ \xd1\xf2\x91\xae\xf9\x08\xc7\xd8\x79\xc7\x6d\x9e\xd7\xba\x3f\xb9\ \x6e\xd5\xad\x24\xd6\x0e\xd5\xc8\x65\xbe\xe1\x51\x8d\x9c\x55\xdf\ \xbb\x3f\x68\x14\xef\xd9\xdd\x73\x00\xc8\xd0\x74\x33\xdf\xb2\xf6\ \x56\x69\x00\x67\xc3\x86\x0d\xff\xee\xd2\xa5\x4b\x72\x6a\x6a\x6a\ \x06\xf8\x3d\xcc\x48\xa8\x75\x74\x74\x88\xa1\xa1\xa1\x7b\xce\x9f\ \x3f\x4f\xa3\xd1\xf8\x43\x60\x06\x88\x80\x0a\x16\x14\x6e\xdc\x30\ \x50\x0c\x32\xd9\xfb\xf3\xf9\x3c\xcf\x3e\xf3\xb4\x1e\xed\x0b\xea\ \x9d\xd1\x65\xef\x81\x9d\x79\xf7\xe8\xd4\x38\x83\x9b\x77\xf2\x83\ \x97\x2e\x3a\xcf\x9e\xd3\x74\xe6\x7d\x1a\xb1\x20\x8c\xa1\xd2\x10\ \x54\x42\xa8\x84\x82\x4a\x43\x50\x8b\x04\xd5\x06\xd4\x22\x41\x2d\ \x82\x7a\x04\xb1\x82\x58\xdb\xad\x02\xa5\x21\x56\xa2\x6d\xbf\x4a\ \x8e\x6b\xd1\x76\x8e\xd2\x56\x67\x68\x81\x40\xe3\x3b\x8a\x8c\xab\ \xc8\xba\x8a\x0f\x6e\x9f\xe5\xe1\xad\x73\xf8\xba\xc1\xdb\xb6\x17\ \xf7\xff\xc7\xff\x4a\x01\x98\x11\x42\xfc\x50\x62\x19\xab\x35\x61\ \x41\x47\xeb\xbe\x37\x4d\x00\xee\xbb\xe7\x73\x59\x04\x19\xad\x54\ \x16\x21\x32\x02\x91\xd1\x5a\x67\x80\x8c\x10\x22\x00\x51\x42\xc8\ \xa2\x23\x45\x71\x69\xf9\xcc\x3b\x47\x37\x95\x6e\x7d\xee\xb9\xe7\ \xe8\xeb\xd9\xfe\x7a\x5f\xdf\xb6\x7f\xe2\x48\xd7\xf7\xfd\xac\x9a\ \x5b\xb8\xd2\x5f\x2c\x16\x33\xcb\xcb\xcb\xec\xd8\x76\xe8\x81\x4c\ \xa6\x78\xc8\xf3\x32\x22\x97\x09\xbc\x52\x4e\x74\x07\x2e\x45\x15\ \x37\x32\x67\x26\x4e\xf8\xae\xeb\xe2\x79\x19\x51\x89\x3b\x33\x27\ \xa7\x34\x02\x49\x4c\xcc\xce\x52\x89\x5c\x2e\xcf\x17\xbf\x12\xd2\ \xd3\x3d\x48\xac\x20\xb4\x5a\x59\x6b\x8d\x10\x66\xfb\xf7\x19\x8f\ \x39\x3e\x93\xe1\x2b\xc7\x3a\xf9\x27\x6f\xbb\xc4\xc6\x0e\x39\x04\ \xf4\x60\x82\x59\x8d\x1f\xe6\x73\x2d\x20\x4e\x03\x59\x42\x08\x4d\ \x22\xa7\x5a\xeb\x37\x2c\x00\x6f\xbf\xf7\x67\xde\x27\x84\xf3\x73\ \x52\xc8\x1e\x84\xe8\xf6\xdc\x5c\x09\x84\x23\x5c\xe1\x82\x70\x84\ \x94\xae\x94\xb8\xe0\xb8\x42\xe0\x9a\x8e\x08\xa4\x88\xe9\xec\xe9\ \xe0\xf4\xe9\x53\x48\x91\x63\xe7\xce\x43\xf7\xa2\xc0\xf5\x7c\x5c\ \x37\x40\x31\xcd\xe4\xe4\x24\xcb\xcb\x21\x5b\xb7\x6c\xdb\x07\x10\ \x78\x59\x3c\x2f\x40\x48\x97\xba\x52\xd4\xa2\x25\x16\x16\x97\xd9\ \x58\x2a\xa2\xb4\x06\x59\x00\xa1\xd1\x02\x1c\x14\x13\x13\x13\x48\ \x29\x59\xac\x94\xe9\x1d\x28\xe0\xa1\x71\x2c\xc3\xb5\x56\x68\xa5\ \xcc\x75\xda\x6e\x51\x68\x9d\x08\xc5\x0f\x67\x30\x36\x94\xc3\xa9\ \xf9\x22\xff\xcb\x0f\x86\xf9\xec\x1d\x97\x07\x5c\x47\x0e\x46\xb1\ \x7a\x1d\xe3\xf1\xfc\x30\xa2\x99\x49\xe4\x32\xc9\x4f\xf8\x18\x94\ \x13\x63\xb0\x47\x43\x08\x11\xdf\xb0\x00\xdc\x77\xcf\xe7\x0a\xd2\ \xf1\xfe\xc0\xf7\x8b\x0f\x75\x76\x74\x75\xfb\x81\x8b\xe7\xba\xb8\ \xae\x83\x90\x22\x35\x6a\x1a\xd0\x4a\x9b\x37\xd3\x1a\x8d\x46\x20\ \xb8\x3c\xf1\x1c\x8d\x46\x8d\x73\xe7\xce\x73\xd7\x1d\x1f\x25\x97\ \xcb\x23\x84\xc4\xf7\x32\x38\x9e\xcf\x52\xa5\xce\xf8\xf8\x38\x5d\ \x9d\xc3\x64\x32\x01\x12\x41\x90\xc9\xe1\x3a\x01\x42\x08\x94\x52\ \x28\x5d\x47\xc5\x0e\xc5\x62\x91\x20\xf0\x88\x55\x88\xe7\x06\x68\ \x40\x0a\x87\x5a\xad\xc6\xe0\xe0\x20\x97\x2e\xce\x20\x84\x40\x0a\ \x69\x80\x9e\x16\x28\x2d\x50\x08\x1c\x34\x4a\x09\xa4\x56\xd6\xcd\ \xd7\x96\x70\xa4\xc2\xf0\xc3\x68\x53\xd5\x1c\xcf\x9e\x91\x5d\x5b\ \x47\xba\x76\x9f\x38\x37\xf3\x14\x6f\x32\x0e\x58\xc1\x78\x1f\xc8\ \x01\x05\x20\x6f\xf7\xd5\x30\x1e\xc8\x22\x50\xbb\x61\x01\x70\x9c\ \xe0\x6b\xc5\x42\xcf\x7b\xfa\xfa\xba\x09\x02\x0f\x8d\x4e\xe5\x37\ \x21\x5a\x42\x50\x21\xb1\xc7\x8d\x20\x2c\x2d\x5d\xa1\xb3\x4b\xf2\ \xf4\xd3\x47\xd9\x30\xb4\x97\x52\xb1\x17\xa5\x15\xae\xeb\xe3\x78\ \x01\x8b\x8b\x53\x74\x74\x14\x38\x73\x66\x99\x4d\x23\xfb\x71\x90\ \x38\x8e\x8b\xe3\x78\x38\xd2\x01\x01\x42\x48\x3c\x2f\xa0\x90\xef\ \x65\x71\x71\x91\x9e\x9e\x1e\xa6\xa7\x96\xf0\x4b\x19\x84\xed\x47\ \xad\xda\xa0\xb3\x2b\x43\xb5\xb6\x84\x14\x12\x21\x65\xca\x68\xa9\ \x04\x48\xcb\x65\x49\x2a\x14\x5a\x69\x54\x8b\x57\xf6\xc3\x12\x84\ \x50\x3b\xbc\x32\x3d\xe0\xde\x34\x38\x7d\xef\x89\x73\x7c\x8d\x37\ \x09\x07\xac\x60\x7c\x80\x61\x7c\x09\xe8\x1a\x1a\xdc\xb8\xf1\x53\ \x9f\xfc\xb9\xf7\x6b\xad\xf9\x9d\xdf\xfd\xa7\x5f\xc5\xbc\x79\x03\ \x68\xdc\x90\x00\xdc\x7f\xe8\x67\xef\xcc\x04\xa5\xdb\x37\x6e\x1c\ \x40\x3a\x92\x84\xf7\x49\xdf\x85\x36\x0c\x17\x89\x4c\xd8\x91\x8f\ \x36\x07\x63\x7d\x89\xc9\xf1\x71\xe6\xe7\x97\x79\xf0\x81\xfb\x40\ \x69\x1c\xd7\xc3\xf7\x02\x1c\xd7\xa7\x5c\xbe\x44\x90\x0d\x69\x34\ \x22\x7a\xba\x37\xa0\x54\x84\xe3\xfa\xb8\x8e\x8b\x14\x46\x00\xb4\ \xd6\xb8\xae\x4f\x77\xf7\x30\x93\x93\x87\xe9\xe9\xed\xe1\xf2\xe5\ \x09\x8c\x85\x11\x80\x26\x8a\x0c\x23\xb5\x56\x48\x29\x10\x42\x82\ \x10\x28\x25\xd0\xd2\x68\x22\xad\xb4\x75\xdd\x35\x52\x0b\x14\x31\ \x0e\x0e\x4a\xb5\xba\x7e\xcd\xf6\x66\x0a\x42\x2d\x76\xe9\xf7\xc5\ \x4e\x4c\x3c\xe0\x12\x46\x2d\xbf\xa1\x07\xac\x48\x47\x67\x80\x2c\ \x86\xf1\xdd\x77\xde\x7e\x68\xcf\xfb\xdf\xf7\x89\x4f\xdc\xba\x7f\ \xff\xfd\x7d\xfd\x9d\xc1\xe5\x4b\x0b\x1c\x7b\xfd\xc8\xe4\xdf\x7e\ \xfb\xeb\x7f\x83\x01\xd7\xce\x0d\x09\x80\x23\xbd\xdf\xe8\xed\xed\ \xef\x75\x3d\x73\x99\x6e\x8d\x8f\xd8\x1d\x89\x36\x4d\x18\x6f\x54\ \xbf\xe6\xd2\xf8\x11\xb2\x39\xc5\xe1\xc3\x87\x39\xb0\xef\x7d\x38\ \xd2\x43\x13\xe1\xba\x81\x51\xef\xd2\x41\xb3\xc4\x85\x0b\x17\x29\ \xe4\x07\x10\x42\x22\xa5\x8b\xe3\x79\x38\xd2\x43\x4a\x89\x42\x23\ \x94\xc6\x75\x7c\x0a\x85\x1e\xce\x8f\xc5\x78\x9e\x87\x94\x1a\xa5\ \x14\x99\x20\x4f\x14\x35\x70\xbc\xe4\xb5\x84\x31\x01\x8e\x63\x7d\ \x73\x81\x42\x21\x14\x28\xa9\x71\x34\x28\xad\xcd\x7b\x08\x50\x4a\ \x23\xa5\x48\xb1\x82\x21\x70\xcb\xfb\xf1\xe6\x08\x42\xa4\x1d\xf2\ \xbe\xec\x01\xb6\x00\xc7\x31\x36\x79\xdd\x88\x74\x05\xb0\x5b\x39\ \xe2\x7b\x3e\xfc\xc1\x4f\x1f\x7a\xfb\x7d\x0f\x7d\xec\xe6\x9b\x77\ \xdd\x3e\xb4\xb1\x53\x74\x76\xe6\xa9\x55\x63\x2e\x5f\x5a\xa0\x58\ \x2c\x6d\xc0\x08\x89\x0b\x37\xe8\x05\x48\xe9\x0f\x77\x75\x17\xcd\ \x68\xc4\x32\x5b\xb4\x10\x45\xcb\x36\xc6\xa3\x35\x5a\x0b\x6a\x8d\ \x45\x5c\x6f\x8e\x17\x5f\x3c\x42\x47\x69\x23\xc3\x1b\x76\xd2\x88\ \xea\xb8\xae\x6f\x6c\xbf\xeb\x51\xaf\x2f\x53\x2c\x05\x8c\x5d\xa8\ \x32\x34\x78\x1b\x42\x80\x90\x0e\xae\xf0\x90\x8e\x8b\xb4\xa3\xdb\ \x98\x16\x41\x3e\xdb\x49\x36\xdb\x85\xe7\x79\xf4\xf4\xf4\xb0\xbc\ \x3c\x47\x36\xeb\x13\xa9\x32\x52\x83\x10\x86\xf9\x20\x71\xa4\x63\ \xec\xbd\xd4\x08\x2d\xd0\x52\x18\x81\xd0\x02\x94\x42\x0b\xd0\x4a\ \x80\x6c\xc1\x09\x4a\xc2\x55\x26\x41\x03\xe2\xef\x2c\x04\xb1\x92\ \xe4\x83\x20\x97\x0d\xbc\xed\xd5\x7a\x58\x00\xe6\xd7\xca\x63\xb4\ \xb6\x96\x10\x77\xc2\xf8\x0c\x86\xf1\x1d\x99\x4c\xae\xef\x73\x9f\ \xfd\xef\x3f\x78\xfb\x81\xb7\x7d\x74\xfb\xce\x91\x2d\x43\x1b\x4a\ \xe4\xf2\x99\xab\xee\xa1\xb5\xf6\xed\xb5\x02\x10\xeb\x16\x80\xbb\ \x0f\x7e\x3a\xd3\xd5\x39\x5c\x72\x5d\x0f\x30\x2e\x57\x6a\xf3\x93\ \x9b\x5b\xa0\x67\xc9\x64\x40\x99\x14\x4c\x4c\xbe\x48\xb5\x36\xc7\ \xc4\xf8\x24\x0f\x3f\xf4\x8b\x28\xad\x90\xd2\xc1\x73\x02\x5c\xcf\ \x47\x0a\x87\x89\xc9\x13\xf8\x19\xc5\xd2\x52\x99\x5b\x6f\xd9\x82\ \x46\xe3\x48\x17\xd7\xf5\x70\x1c\x07\x41\x62\xb7\x15\x0a\x81\xe7\ \xf9\xf4\xf7\x8d\x70\xe1\xc2\xab\x94\x4a\x25\xa6\xa6\x4e\xd3\xdd\ \x5d\x40\xeb\x1a\xae\x9b\x27\x0c\x43\xb4\x8e\x08\xd5\x1c\xbe\x1c\ \x42\x92\x8c\x6c\xeb\xa7\x6b\x81\xd2\xda\xc0\x00\x04\x1a\x23\x14\ \x5a\x83\xd4\x02\x88\x41\x3b\xa8\x55\x72\xfc\x7f\x57\x7c\x10\x6a\ \x97\x8c\x1b\xf8\x9b\x06\x0b\x7b\x5e\x3f\x3f\xd7\x05\x4c\x60\x42\ \xe0\xab\xde\x70\x8d\x11\x9f\x07\x3a\xb6\x6f\xdb\x3d\xfa\x89\x8f\ \xfd\xcc\x27\x6f\xb9\x79\xdf\x87\x47\x37\xf7\x77\xf6\x0f\x96\x08\ \x02\x6f\xb5\xbb\x24\x5b\xa7\xe5\x8f\xeb\x6b\x80\xe4\xe1\xf7\xde\ \xfd\xb9\xad\xd9\x20\x5b\x94\x42\xb6\x24\x44\xa4\x61\x74\x0a\x02\ \x81\xb6\xbf\x35\x13\x93\xc7\xc9\x64\x15\x47\x8f\x9d\x65\xcf\xee\ \x77\x90\xcd\x15\x09\xeb\x35\x5c\xc7\xc3\xf3\x33\x38\x8e\x87\x14\ \x82\x30\x9e\xe2\xca\xf9\x8b\x64\x82\x1e\x3c\x2f\x20\x8a\x1a\xb8\ \x8e\x87\xe3\x7a\x48\xe9\x82\xd6\x48\x61\x46\x28\x5a\x53\xad\x5d\ \x61\xb1\x7c\x8e\x5a\xad\xc6\x96\x2d\x5b\x38\x7d\xfa\x34\x9d\x9d\ \x9d\xf8\xbe\x4f\x14\x45\x04\x41\x80\x94\x82\x6a\xf5\x1c\x5a\x2d\ \x53\xc8\x6d\x33\xfd\xb5\x8c\x17\xc9\xe8\x97\xa6\x9f\x4a\x82\x93\ \x02\x42\x05\x8e\xf1\x62\x64\xea\x1e\xae\xad\xa1\x6f\x54\x10\x94\ \x16\xa0\x85\xb8\x75\x53\x69\xfb\xeb\xe7\xe7\xfa\x30\x69\xef\xda\ \xca\xe4\xd0\x35\x18\xdf\xf9\xae\x77\x7e\xe0\xe6\x87\xde\xf5\xa1\ \xcf\xec\xdc\xb5\xf3\x5d\x1b\x47\xbb\x82\xde\xbe\x22\x8e\xb3\x7a\ \xf4\xb1\xb5\x49\xd9\x5e\x9a\x76\x4d\x01\x10\x89\x0e\x05\x47\xa3\ \x77\x65\xb2\xd9\x2e\x29\x4d\xf4\x58\x0b\x33\xca\xd1\x56\x20\xac\ \xea\x37\xb2\x61\xde\x21\x8e\x43\x16\x96\x8e\x73\xe9\xf2\x79\x96\ \x97\x63\x6e\x7e\xfb\xdb\x69\x84\x55\xa4\x74\x53\xe0\xe7\x38\x0e\ \xf5\x5a\x99\x8e\x8e\x0c\xe3\xe3\x11\x9b\x46\x6f\x01\x34\x52\x48\ \x5c\xd7\xc7\x75\x5d\xa4\x90\x4d\xb0\xa9\x14\x95\xda\x04\x97\xc6\ \x5f\x22\x9f\x0f\x58\x58\x10\x84\x61\x88\xef\xfb\x8c\x8f\x8f\x47\ \x99\x4c\x46\xc5\x71\xec\x47\x51\x84\xe7\x79\x74\x74\x74\x50\xab\ \x2d\x52\xa9\x9d\xa5\x90\xdb\x6e\xee\xa1\x55\x3a\xd6\x14\x02\xa1\ \x94\xb1\xc0\xc2\x84\xf2\x94\x14\x46\x18\xa4\x42\x69\x10\x5a\xd9\ \xf4\x80\x46\x88\xa6\x80\xb7\xe2\x83\x1b\x15\x02\x29\x60\x6b\x5f\ \xd0\x83\x01\x82\x39\x60\x89\x16\x9b\xd3\x02\xee\x12\x55\x9f\x07\ \x3a\x3e\xff\xd9\x2f\x3d\x70\xfb\xed\xf7\x7c\x66\xeb\xd6\x4d\x77\ \x0e\x8f\x94\x44\x67\x57\x81\x75\x95\x1b\x8a\xe4\xbe\x52\xb0\x1e\ \x0d\xd0\x22\x7d\x2e\x90\x79\xfb\xce\xa5\xcf\x5e\x0c\x3d\x91\x0a\ \x40\xf2\xbe\xad\x44\x48\x25\xc0\x10\xe7\xc4\xe9\xef\x53\xad\x2d\ \x71\xee\xdc\x79\x1e\x7a\xf0\xe7\xd1\x86\xca\x98\x08\x9e\x11\x00\ \x29\x05\x97\xaf\x1c\xa5\x11\x2f\x31\x3d\x3d\xc3\xad\xb7\xec\x42\ \xc5\x1a\xe9\xb8\x38\xae\x8b\xe3\xb8\xc6\xdc\x60\x50\x7d\xa4\x42\ \x2e\x5d\x7e\x8e\x4c\xc6\x54\x0a\x45\x51\xa4\xa7\xa7\xa7\x45\x36\ \x9b\xe5\xc2\x85\x0b\x35\x60\xa1\xb7\xb7\x77\x28\x8a\x22\xa9\xb5\ \xd6\x9d\x9d\x9d\xa2\x5a\xad\xb2\xb4\xb4\x48\x23\x9c\x26\xf0\xfa\ \x2d\xe0\x13\xc6\x43\xd0\xda\x60\x02\x61\x4c\x84\x4c\xde\x44\x19\ \x97\x51\x08\x61\xf1\x41\x2b\x38\x4c\xf0\x48\x42\xab\xc4\x24\xac\ \x4f\x10\x84\xa1\x2f\xa3\xdd\x41\x01\xe8\xc3\x8c\x6c\x69\xe9\x9e\ \x30\xde\xb3\xfb\x0b\xdd\xdd\x7d\x3d\x5f\xf8\xfc\xaf\xfe\xc4\x9e\ \xdd\xfb\x3f\x35\x32\xda\xb7\x75\x68\xb8\x83\x62\x31\x77\xdd\xe7\ \xac\x7c\xe6\x0a\xbe\x0a\xb8\xb6\x06\x48\x99\xff\xb9\xf7\x6e\xda\ \xb5\xa5\xa3\xf1\xe0\x95\x39\xd7\xba\x54\xa4\x3e\xb7\xf1\xf0\x12\ \x70\x94\xe0\x00\x98\x99\x1b\x23\x9b\xab\xf1\xea\x6b\xe7\xd8\xbc\ \xe9\x00\xfd\x7d\x9b\xa8\xd5\x97\x91\x52\xe2\xf9\x4d\xdb\x2f\x04\ \x2c\x2e\x5f\xa0\x5c\x9e\x26\x9f\x1b\xc0\xf3\xb2\xd4\x55\x05\xc7\ \xf5\xf0\x5c\x1f\x29\x5c\xc3\x04\x34\x5a\x09\xe6\xe6\x4f\x10\x46\ \x15\xba\xba\xba\x28\x16\x8b\x9c\x38\x71\x62\x71\x6c\x6c\xcc\x57\ \x4a\x79\x5a\xeb\x09\x60\x6e\x7a\x7a\xda\x03\x4a\xae\xeb\x4e\x57\ \xab\xd5\xbe\x62\xb1\x18\x44\x51\x44\xb5\x3a\x41\x26\x33\x80\x50\ \x0e\x48\x85\xd6\x86\xa9\x4a\x81\x23\x04\x4a\x81\x96\xc2\x8c\x78\ \x09\xda\x8e\x76\x85\xb0\xa6\x40\x58\x4d\xa0\x4c\x9f\x5a\x4c\x9f\ \x48\x47\xd8\x7a\x04\xc1\x5c\x30\xda\x29\xb3\x3d\x5d\xb9\xa1\x99\ \xb9\x4a\xce\xd2\x5a\xd1\x54\xf5\x85\x3b\x6f\x3f\x34\xfa\xe3\x1f\ \xfe\xa9\xcf\x6e\xdb\xb6\xf3\x63\xc3\x1b\x3b\x3a\x07\x06\x3b\xc8\ \x64\x83\x1b\x62\xfc\xca\x26\x93\x11\x7c\x2d\x10\xd8\xa2\xfa\x3d\ \x20\xff\xce\x9b\x3b\x3f\x21\xeb\xaa\xe0\x48\x87\x54\x03\xb4\xbc\ \x6c\xe2\x09\x24\x44\xa9\x47\x65\xe6\xe6\x5f\xe6\xcc\xd9\x13\x2c\ \x2e\x56\x79\xf8\xdd\x3f\x8e\x52\xa6\x7e\xce\xf5\x3c\x3c\x2f\x48\ \x23\x7b\x95\xca\x1c\xf9\xbc\x64\x6c\x6c\x96\x6d\x9b\xef\x03\xad\ \x90\xd2\xa8\x7f\x29\xbd\xd4\xae\x69\x0d\x5a\x2a\xaa\xd5\x39\x32\ \x99\x0c\xd9\x6c\x96\xc5\xc5\xc5\xfa\xd9\xb3\x67\x2f\x61\x00\xd4\ \x12\x70\x19\x58\xd0\x5a\xbf\x0e\x64\xc3\x30\xac\x8f\x8d\x8d\xed\ \xbf\xf3\xce\x3b\xf7\xd6\x6a\x35\xea\xb5\x05\x10\x31\x52\x7a\x16\ \xed\x2b\x83\x05\x84\xf5\x0a\xc0\xee\x03\x94\x89\x0d\x08\x1c\x90\ \x31\x5a\x3b\x2d\xd8\xa0\x25\xf6\xd1\x32\xfa\x57\x6b\xab\x0a\x82\ \x30\xd4\x1f\x28\x48\x7f\xff\xe6\xae\x4d\xdf\x9b\xab\x64\x31\x4c\ \xcf\x00\xd9\x8f\xff\xc4\xe7\xf6\x1f\xba\xf7\x5d\x3f\x3b\x3a\x3a\ \xf2\xf0\x86\xe1\x0e\xbf\xb7\xbf\x88\xe7\xad\x06\xec\x6e\xbc\x09\ \x21\x93\x80\x11\xb0\xb6\x06\x48\x04\xc0\x07\x8a\x83\x25\xe7\xde\ \xf1\x71\x07\xc7\x31\x02\x90\x48\xbc\xe5\xbd\x51\x88\x09\x0e\x40\ \x73\xe6\xc4\x77\xa9\xd6\xe6\x39\x75\xea\x34\x1f\x7a\xff\xaf\xe0\ \x7b\x19\x6a\xf5\x65\x1c\xe1\xe0\xd9\xb8\xbe\x23\x0d\x18\x3d\x73\ \xee\x39\x90\x9a\x5a\xad\xce\xa6\x4d\xfb\x50\x71\x68\xb4\x84\xe3\ \x99\x08\xa1\xe3\x58\xd0\x66\x46\x60\xbd\xb1\x88\xe7\x79\xf8\xbe\ \xcf\xe4\xe4\xe4\x32\x26\xa0\x71\x19\xb8\x60\xb7\x33\x18\xbf\xda\ \x01\xb2\x63\x63\x63\x57\xee\xbe\xfb\xee\x3d\x41\x10\x08\xc7\x95\ \x84\x8d\x05\x32\x41\x3f\x52\x61\xd5\xbb\xc2\x3a\x00\x48\x89\x05\ \x89\x02\x29\x6c\xbc\x40\xab\x14\x08\x2a\x8c\x87\xa0\x25\x28\xa5\ \x10\x42\xb5\x30\x5e\xdc\x10\x3e\xd0\x42\x80\xd2\xdc\xbd\xa3\xb4\ \xe9\x7b\x2f\x5d\x1a\x02\xca\xbf\xfa\xcb\xff\xec\x9e\x3d\xbb\x6f\ \xfd\xfc\xf0\x48\xff\x5d\x43\x1b\x4a\xa2\xab\xbb\xb0\x2e\x60\x77\ \x23\xad\x25\x62\x78\x5d\x13\xe0\x60\x55\x91\xab\x75\xb1\x21\xf2\ \x48\xe9\x20\x84\x4c\xd5\x5d\x3a\xfa\x31\x26\x41\x08\x78\xed\xf5\ \xef\x10\xc5\x4b\xbc\xf0\xc2\x0b\xdc\x73\xd7\x47\x19\x1a\xdc\x4e\ \xad\xb6\x8c\xd6\x1a\xc7\x33\x51\x3f\xd7\x31\x81\x9d\x30\xac\xe3\ \x78\x73\x8c\x8d\x5d\xa2\xbf\xef\x26\x7c\x3f\x43\xb5\xda\xc0\x91\ \x96\xf9\xae\x63\xc2\xb8\x16\xa0\xc5\x2a\x26\x56\x11\x7e\x53\x33\ \xd4\x31\x8c\x3f\x0e\x9c\xc0\x44\xd5\xe6\x30\xf1\x6e\x09\x64\x7d\ \xdf\xaf\x00\xca\x31\x0d\x4d\x64\x82\x4a\xc2\x80\xbf\x14\xfd\x4b\ \xc3\x78\xa1\x0d\x20\xd4\xc2\xd6\x0a\x29\x61\xa3\x88\x0a\x24\xa9\ \x2b\x99\x98\xbc\x04\x0b\xac\x0c\x18\x59\x0a\x61\x04\xa3\x69\x16\ \xb4\x4d\x3e\xc5\x4a\xb3\x1c\xc2\x40\x29\xd7\xff\xf9\x9f\xfe\x95\ \x4f\x3e\x70\xff\x7b\xde\x36\x34\xdc\x3d\x3a\xb4\xa1\x44\xb1\x94\ \x5f\x1f\xb0\xbb\x81\xd6\x34\x51\x6d\x18\xe0\x6a\x13\xb0\xc2\xf5\ \xf0\x80\xec\x72\xa8\xe3\xba\xce\x18\x40\x26\x85\x1d\xee\x3a\xed\ \x64\x42\x87\x8b\x97\x5f\xc1\x71\x17\x38\xfe\xca\x71\x36\x0c\xee\ \xe1\xf6\x03\xef\xa1\x5e\xaf\xa0\x54\x8c\x74\x0c\xf2\x77\xdd\x00\ \xd7\x35\xa3\xff\xd4\xe9\x67\xf0\x7d\x8f\x2b\x57\xc6\xf9\xc0\x8f\ \xfd\x24\x5a\x29\xa4\x10\x48\xc7\x35\x02\x20\x3d\x43\x3c\xa9\xed\ \x53\x24\xb9\x6c\x17\x4a\x2f\xa1\xb5\xa6\xbb\xbb\xdb\x07\xce\xd3\ \x14\x80\x49\xa0\x8c\xa9\x1f\x10\x80\x7f\xf0\xe0\xc1\xf7\xf9\xbe\ \xef\x94\xcb\x65\xb4\xd6\x64\x33\x1d\x36\xac\x9c\xe4\x87\x85\x0d\ \x07\x63\x03\x43\x80\x63\x18\x6e\xc6\x8a\x05\x84\x52\x34\x05\x43\ \x61\x41\xa1\xd1\x04\x88\xa6\x57\x91\x10\xbb\x5d\x18\x74\x2a\x2c\ \x1a\x85\x8e\x23\x1a\x22\xcb\x78\xc7\xfd\x8c\xdc\xf2\xc0\xf0\x81\ \xa1\x9e\x4f\xf4\x0f\x96\xc8\xe7\x6f\x0c\xd8\xdd\x58\x13\xb6\x6f\ \x29\xc8\x5c\x17\x08\x74\x00\xb7\x1a\xea\xb8\xa1\x03\x1c\x29\x4d\ \x66\xcd\x8e\x0e\xa1\x93\xd0\x0f\x2c\x2d\x4f\x32\x35\xf3\x32\x17\ \x2f\x1a\x97\xef\x23\x1f\xfc\x39\x62\x1d\x11\xc6\x26\xbe\xe1\xb9\ \x3e\x7e\x90\xc3\x73\x3d\x84\x10\xc4\x71\xcc\x72\xed\x1c\x63\x63\ \xa7\xe9\xef\xdb\x41\x47\xc7\x00\x95\xca\x22\x08\x07\xcf\x0d\x4c\ \x00\x48\x36\xe3\xff\x26\xae\xaf\xc9\x64\x3a\x59\x2a\xcf\x13\x45\ \x11\x7d\x7d\x7d\x5d\xfb\xf7\xef\x1f\x3c\x7c\xf8\xf0\x37\x30\xc1\ \x94\x79\x4c\x92\x43\x01\x72\xdb\xb6\x6d\xce\xc0\xc0\xc0\x87\xa2\ \x28\x32\x81\x21\xa5\xf1\xbd\xee\xa6\xd7\x2a\x05\x52\x29\xb4\x50\ \x68\x65\x84\x42\x03\x52\x9b\x44\x96\x52\x26\x7d\xad\x31\x01\x21\ \x29\x0c\x0e\x50\x92\x96\x2c\x62\x13\xfc\x1a\x02\xd3\x66\x16\xc0\ \xb8\x92\x06\x6c\x46\x74\x77\x75\x72\xc7\xed\xb7\x71\xe7\xc1\x5b\ \x19\x18\x2a\xd2\xd7\x5f\x12\x41\xf0\x77\x03\x76\x37\xd2\x56\x98\ \x80\x35\x23\x81\xad\xfa\x47\xd6\x22\x59\xad\xab\x24\x24\x2b\x2d\ \x53\x8c\x2b\x20\x10\x54\x2a\xf3\x9c\xbb\xf0\x08\x8b\x8b\x73\x9c\ \x3b\x77\x81\x4f\x7d\xf2\x9f\xe3\x79\xbe\x55\xfd\x0a\xc7\xf5\x08\ \xfc\x2c\xbe\x45\xfe\x00\x27\xcf\x3e\x43\x77\x77\x91\xa3\x47\xcb\ \xbc\xeb\x81\xcf\xa0\x55\x8c\x56\x31\x8e\xe3\x18\x90\xe8\xfa\x4d\ \xc0\x69\x43\xca\x5a\x6b\x3a\x3b\x46\x98\x9b\x3b\x4d\xad\x56\x23\ \x97\xcb\xc9\x03\x07\x0e\x7c\xa8\xb7\xb7\xf7\xb5\xef\x7e\xf7\xbb\ \x47\x31\x23\x5f\x03\x3c\xf4\xd0\x43\xfd\x9b\x37\x6f\xfe\x77\x85\ \x42\xe1\xe0\xfc\xfc\x3c\xb5\x5a\x0d\x4f\xe6\x70\x1d\xd7\x44\x00\ \xad\x07\x90\x84\x81\x95\x54\x26\x37\x20\x05\x4a\xc7\x08\xed\x90\ \xd6\x09\xc8\xc4\x2c\x28\xe3\xe3\x34\xa3\xc8\x48\xc7\x68\x84\xa6\ \x26\x10\xe9\x75\x66\xe4\xc7\xa8\x38\x62\x74\x74\x94\x83\x77\xde\ \xc6\xde\xbd\x3b\x19\xd8\x50\xa0\xab\xab\xf0\xa6\x01\xbb\x1b\x69\ \xeb\x75\x03\x75\xcb\x56\x9d\x98\xa8\x9f\x0b\x72\xee\xdb\x1c\xc7\ \xa4\x56\x49\xae\x16\x92\x85\xc5\x49\x4e\x9d\xfd\x16\x61\x58\xe5\ \xc8\x91\x23\x3c\xfc\xee\x2f\xd2\xdb\x35\x44\xbd\x5e\x21\x8a\x43\ \x24\x02\xcf\xcb\x10\xf8\x19\x5c\xc7\x4f\x6f\x5a\xad\x9f\xa3\xbc\ \x3c\x43\x3e\xd7\xc7\xe0\xc0\x16\x33\xfa\xc1\x44\x08\x3d\x1f\xd7\ \xb1\xf5\x76\x68\xb4\x52\xd6\x25\xd3\xf4\x76\x6f\x67\x69\xe9\x32\ \x0b\x4b\x67\x08\x82\x80\x8e\x8e\x8e\xee\x1d\x3b\x76\xfc\x6f\x9b\ \x37\x6f\xfa\x20\x88\x97\x80\x9a\xeb\xba\x1b\x33\x99\xcc\xfd\x8e\ \xe3\x6c\x5c\x5c\x5c\xa4\x5c\x2e\xe3\xea\x88\x5c\xf1\x0e\xa4\x4c\ \x60\xbc\x71\xe9\x94\x10\x08\x8c\x0a\xd7\x5a\x20\x55\x0c\x76\xa4\ \x27\xa7\x2a\x25\xec\x77\x81\x92\x89\x26\x00\x12\x61\x11\xd2\xe2\ \x03\x8d\xd2\xca\x08\x2c\x31\x42\x0a\xf6\xde\x74\x13\x07\x0f\xde\ \xc1\xa6\xcd\x03\x0c\x0e\x95\x28\x75\xe4\xdf\x74\x60\x77\x23\xcd\ \x6a\x80\x34\x1c\x7c\x2d\x13\x60\xd0\x0a\xc4\x8f\xbd\x32\xf5\xfa\ \xa1\x3b\x1c\xe5\x48\x47\x0a\x29\x53\xc7\x77\x76\xee\x12\xc7\x4f\ \x7e\x83\x99\xd9\x29\x8e\x1d\x7b\x9d\xf7\x3c\xf8\x05\x76\xdf\x74\ \x37\x8d\x46\x9d\x30\x32\xb3\x68\x3c\x3f\x20\x08\x72\xb6\xa2\xc7\ \x01\xad\x39\x7a\xe2\x71\x4a\x1d\x01\xcf\xbf\xf0\x3a\xef\xb8\xef\ \x0b\x56\x3d\xc6\xc8\xd6\xd1\xef\x38\x58\xaa\xa2\xa4\xc9\x30\x24\ \x82\xb0\x65\xd3\x21\x8e\x1e\x9f\x65\x71\xd1\x08\x4d\x1c\xc7\x4e\ \x36\x9b\x7d\xbb\xef\xfb\x6f\x77\x1c\x07\xad\x35\x8d\x46\x83\x5a\ \xad\xc6\xf2\xf2\x32\xf5\xea\x32\x5d\xc5\xed\x48\xaf\x98\x46\x01\ \xb5\x52\xa9\x30\x68\x69\xd1\xbd\x8e\x51\x38\x46\xbd\x4b\x23\x20\ \x26\x70\x66\xdd\xc0\x36\x4d\x00\x58\x97\xd1\x44\x13\x13\x2d\xa5\ \xc8\x04\x1e\xfb\xf6\xdd\xc6\xed\xb7\xdf\xca\xd0\x86\x12\xfd\x83\ \x1d\x14\x0a\xb9\x37\x1d\xd8\xdd\x50\x6b\x82\xc0\x56\x37\xf0\x6a\ \x13\xa0\xb5\xd6\xb6\xa3\x0a\x13\x9a\x0c\x9f\x7c\x75\xe6\xc2\x1d\ \xb7\x39\xca\x71\xa4\x0d\x25\x4b\x26\xa7\xcf\x72\xfc\xd4\xdf\xb2\ \xb4\xb4\xc0\xf1\xe3\x27\x78\xff\x7b\x7f\x89\xdd\x37\xbd\x8d\x46\ \x58\x23\x8e\x1a\x28\x1d\xe1\x38\x2e\xbe\x9f\xc1\xf7\x03\xa4\xe3\ \x22\x10\x2c\x2c\x4c\xb0\x54\x3e\xca\xb9\x73\x67\xf0\xbd\x2e\xb6\ \x6d\xd9\xcf\x72\x75\xd1\x98\x0a\xc7\xc5\xf3\x32\x78\xae\x8f\xe3\ \xb8\x29\x72\x4e\x4a\xb9\x95\x4d\x35\x09\x04\x37\xed\x78\x3f\x17\ \xaf\x3c\xc3\xc2\xe2\x39\x1a\x8d\x06\x99\x4c\xc6\xa6\x86\x4d\x92\ \x2a\x8a\x22\xea\xf5\x3a\x05\xdf\xa7\xa3\x7b\x1f\x42\x0e\xa1\x50\ \x06\xd0\x09\x53\x15\x84\x52\xa6\x36\x44\x09\x94\x75\xfb\xd2\x00\ \x51\xea\xf3\x2b\xa4\x4c\x6c\x38\x4d\x4d\x60\xc3\x07\xc4\xa6\x6f\ \x5a\x6b\xba\xbb\x3a\xd9\xb7\x6f\x2f\xfb\xf7\xed\xa6\x6f\x20\x47\ \x6f\x7f\x89\x6c\x36\xfb\x43\xe7\xed\x8d\xb4\x16\x10\x28\xe1\xda\ \x26\x40\x63\x05\xa0\x11\xa9\x6a\x23\x16\x71\x41\x4a\x57\x08\xc9\ \x95\x89\x93\x5c\x99\x7c\x8a\xcb\x97\x2f\x72\xe1\xc2\x45\x3e\xfc\ \xc1\x5f\x63\xc7\xd6\xdb\x88\xe2\x90\x38\x0a\x09\xa3\x06\x42\x08\ \x02\x2f\x43\x10\x64\x71\x5d\x0f\x21\x24\x4a\x69\x8e\x9e\xf8\x26\ \xd9\x6c\xc0\xe4\xe4\x34\x9f\xfa\xf8\x6f\x18\xb5\xa9\x62\x34\x26\ \xcf\x6f\x72\x04\xe6\x7c\x81\x4e\x55\xbf\xd6\x1a\x29\x13\x41\x00\ \xcf\xcb\xb0\x79\xe4\xed\x2c\x2c\x6e\x61\x6e\xfe\x0c\xf5\xda\x22\ \xd5\x4a\x99\x58\x45\xe4\x82\x1c\x81\x97\xa5\x98\x1d\xa0\x58\xb8\ \xa9\x19\xe6\xd5\xd2\x68\x13\x6d\x5d\x3a\x8b\x65\xb4\x35\x01\x58\ \x0f\x47\x6b\x65\x7d\x7e\x93\xea\x50\x96\x1a\x12\x9b\xc8\x91\x11\ \x02\x81\x88\x35\x0a\xc5\xc8\xc6\x0d\xec\xdb\xb7\x87\x1d\x3b\x47\ \xe9\xeb\xcf\xd2\xd5\x5d\xe4\xef\x13\xd8\xad\xb7\x99\x9a\x99\xeb\ \xb8\x81\x2d\x4d\x61\x40\x55\x03\xa8\x87\x91\x8c\x1d\xd7\xe1\xe8\ \xb1\x47\xb8\x34\xfe\x02\xb3\xb3\x33\x9c\x3b\x37\xc6\x27\x3f\xf6\ \x8f\xd9\xbc\xe9\x66\x94\x8a\x89\xe3\x90\x28\xac\xa3\xd1\x78\x6e\ \x80\xef\xe7\x70\xdd\xc0\x82\x39\xc1\xcb\x47\xfe\x0b\x9e\x17\xf2\ \xf4\xd3\xcf\x73\xcf\xdd\x1f\xa7\xa7\x7b\x98\x5a\xad\x6c\x2a\x7f\ \xa4\x83\xef\x05\x78\x9e\x6f\xb4\x85\x36\xa1\x58\x93\x5e\x68\x62\ \x00\x9d\x16\x6d\x18\xcf\xa0\xb3\x63\x94\x8e\xd2\x48\x8a\xb2\xa3\ \xb8\x8e\x23\x33\x68\x1d\xa7\x82\x63\x7c\x77\x9b\xc7\xd7\x31\x5a\ \x4b\xa4\x12\xd6\xa5\x53\x18\xbc\x27\xac\x1b\x6a\x83\x82\x49\x19\ \xa1\x1d\xea\x5a\x99\x90\x80\x24\x26\x52\xe0\x48\xc9\xf6\xed\x5b\ \xd9\x77\xcb\x6e\x86\x37\x76\xd3\x3f\x98\xa7\x54\x7a\x6b\x80\x5d\ \xd2\xa2\x48\xb3\xb4\x58\xa7\x58\x72\x71\xdd\xd5\x58\x2b\x5a\x93\ \x41\xd7\x05\x81\x89\x06\x68\x38\x8e\xd3\x98\x5f\xae\x35\x4e\x3c\ \xf3\xef\x73\xae\x57\xe7\xcc\x99\xd3\x2c\x2c\x2c\xf1\x99\x4f\xff\ \x06\x1b\x37\xec\x24\x56\x8a\x28\xaa\xd3\x68\xd4\x89\x55\x8c\xeb\ \xfa\x64\xfc\x1c\x7e\x90\xc1\x91\x1e\x08\x98\x9a\x3a\x4f\xac\x2f\ \x70\xf4\xe8\x51\x3a\x8a\x23\xdc\x75\xe7\xfb\x09\x1b\x35\x22\x65\ \xe6\xfb\x39\x8e\x67\x72\x04\xae\x51\xe3\x49\x51\x89\xb6\xfe\xb9\ \xd2\xda\x08\x82\xd4\x36\x2f\xa0\x0d\x03\x13\xd0\xa5\x6d\xf5\x8f\ \x74\xad\x30\x38\x26\x32\x97\x16\x7c\x68\x94\x50\x48\xe5\x58\x1b\ \xae\xd0\x5a\xa2\x24\xa0\x04\x52\xc6\x68\xa4\xc9\xfe\xd9\x39\xa0\ \x5a\x27\x15\x44\xca\xba\xbe\x9a\x4c\xc6\x67\xc7\x8e\x9d\xec\xdd\ \xbb\x83\xbe\xfe\x1c\xfd\x03\x05\xf2\x85\xb7\x16\xd8\x35\x1a\x9a\ \xd9\xe9\x0a\x93\x13\x8b\x34\xea\x0d\x6e\x39\x30\x78\x95\x00\xb4\ \x24\x83\xae\x8d\x01\x5a\x9a\xee\xee\xee\x56\x52\xca\x7c\x2e\x97\ \xfb\xdc\xc4\xe2\xe1\x92\x52\x31\x2f\x3d\x77\x84\xae\xce\x11\x7e\ \xe1\xe7\x7e\x8b\xce\x8e\x3e\xb4\xd6\xc4\x2a\xa4\xd1\xa8\x13\xc5\ \x21\x8e\xe3\x92\x09\x72\xf8\x41\x16\xc7\xf1\x91\x42\x12\xc5\x21\ \xa7\xce\x7e\x9b\xf2\xf2\x12\xf3\x73\x4b\xfc\xfc\x17\x7e\x0b\xd0\ \x44\x71\x44\x64\xcd\x85\xe7\x07\xf8\x5e\x16\xc7\xf1\x48\x80\xa6\ \xb6\x35\x85\x5a\x08\xa4\x4e\x84\x41\xdb\x0c\x9e\x39\x66\x78\xa3\ \xd3\x1c\xbf\x4e\xce\xa3\x69\x2e\xd0\x02\x21\x8d\x9a\x57\xd2\x86\ \x95\xa5\xc9\x05\x48\x65\xdc\x3c\xa5\x1d\x7b\x8e\x68\xe2\x84\x38\ \x36\x85\xad\x0a\x3a\x3b\x0a\xec\xd8\xb9\x99\x5d\xbb\x46\xe9\xee\ \xf5\xe9\xed\x2b\x91\xcb\xbd\x75\xc0\x4e\x6b\xa8\xd7\x14\xd3\x93\ \x65\xa6\x26\x17\xa9\x54\x6a\xe1\xc9\x53\xaf\x3d\xb7\x6d\xdb\xce\ \xdd\x40\xd7\x5a\xd7\xad\x9c\x27\xb0\xaa\x9e\xd0\x5a\x8b\xe1\xe1\ \xe1\x5b\x32\x99\xcc\xe7\x46\x47\x47\x7f\xc6\xf7\xfd\xdc\xb9\x73\ \xe7\xb8\x7c\xf9\x32\xef\x78\xfb\xa7\xb8\xef\xde\x8f\x22\x30\x04\ \x8c\xa2\x86\x19\xc9\x71\x03\x29\x25\x81\x97\xb5\x01\x1f\xdf\x26\ \x87\x04\x4f\x3d\xfb\x65\xfc\x40\x73\xf8\xc9\xc3\xbc\xef\x3d\x5f\ \xa2\x90\xef\x26\x4c\xc0\xa2\x52\xb8\x4e\x12\x27\x48\xc0\x62\xa2\ \xfe\x2d\xb3\x13\x6d\x20\x9a\xaa\xdf\x1c\xb3\x01\x7c\x9d\x28\x2c\ \x85\x12\x80\x72\x90\x32\x09\x1e\x25\xe1\x5b\x69\x2a\x7d\x94\xb2\ \x71\x78\x93\xfa\x55\x36\xfe\x8f\x4e\x00\xa2\x42\x69\x69\xdd\x3b\ \x18\xea\xef\x61\xc7\xce\x4d\x6c\xda\xd4\x4b\x77\x5f\x40\x57\x57\ \xf1\x2d\x05\x76\x4a\x41\xb5\x12\x33\x39\xbe\xc8\xec\x4c\x99\xa5\ \xa5\xa5\xf2\x2b\xaf\xbe\xf0\xc8\x9f\x7f\xfd\x3f\xfc\xe5\xd9\x73\ \x27\xc6\xbe\xfc\x27\xdf\xf9\xb7\x5a\xeb\xeb\x09\x40\x1b\x08\x14\ \x03\x03\x03\xfb\x1a\x8d\xc6\x66\x29\xe5\x68\xa9\x54\xda\x3f\x34\ \x34\xf4\xde\x3b\xee\xb8\x63\x43\x10\x04\x9c\x3c\x79\x92\xb3\x67\ \xcf\xc6\x85\xdc\xe8\xf2\x2f\xfc\xec\xef\x95\x06\xfa\x87\xad\xbf\ \xab\x89\x55\x44\x18\xd5\x09\xc3\x3a\x12\x81\xef\x67\x09\x32\x79\ \xe3\xf2\x99\x9a\x70\x1e\x79\xec\x8f\xf0\x82\x25\x9e\x7d\xf6\x05\ \xb6\x6f\xbd\x9b\x9b\xf7\xde\x47\x1c\x87\xc4\xb1\x89\x12\x0a\xb4\ \xb9\xce\x6f\x8e\x7e\x01\x2d\xa3\x3f\x11\x04\xcb\x7c\x14\x5a\xc8\ \xd4\x04\xc8\xb4\xc0\xc3\x08\x8a\x4c\xb4\x83\x4a\xce\x33\xb6\x3e\ \x49\xde\x80\x34\xf7\x40\xa6\x72\xa3\xb5\x42\x2a\x89\x12\x66\xae\ \x80\xeb\xc2\xa6\xe1\x41\x76\xec\x18\x61\x60\xb0\x40\x6f\x7f\x96\ \x62\xa9\xf0\x96\x02\xbb\x38\xd2\x94\xcb\x11\x93\x57\x16\x99\x9f\ \x2f\x33\x3d\x33\x35\xf9\xec\x73\x8f\x7d\xe7\xcf\xbe\xf2\x07\xdf\ \x28\x2f\x2f\x5d\xc2\xd4\xfa\x57\x1c\xd7\x59\x73\xa6\x91\x01\x81\ \x2b\xb2\x81\xcb\xcb\xcb\xfd\x07\x0f\x1e\xfc\x7e\xa1\x50\xe8\xf2\ \x3c\x8f\x4a\xa5\xc2\xf8\xf8\x38\xcf\x3d\xf7\x1c\x0b\x0b\x0b\x0b\ \xb5\x5a\xed\x6f\x94\x52\x7f\x76\xef\xc1\x9f\xf8\x9d\xde\xde\x0d\ \xa5\xa4\x32\x27\x8e\x43\x1a\x8d\x2a\x61\xbd\x06\x42\xe0\xf9\x19\ \x32\x41\x1e\xdf\xcf\x22\x6c\x05\xcf\xa3\x4f\xfe\x07\xf2\xc5\x3a\ \xcf\x3f\x7f\x84\xce\xd2\x26\x3e\xfa\xe1\x5f\x33\xc5\x18\x3a\x26\ \x8c\xea\x28\x15\xe1\x26\x51\x42\x5b\x1e\x96\x14\x98\x88\x34\xa0\ \x92\xd8\x7b\x0b\x08\xb5\x71\xf3\xb4\xd4\x69\x95\xb0\x16\x49\x48\ \x57\xa4\xb1\x02\x53\xb6\x61\x50\xba\xd0\x49\xa0\x46\x20\xad\x9b\ \xa7\x64\x6c\xf6\xdb\x62\x20\x45\x4c\x26\xeb\x31\x32\xd2\xc7\xb6\ \x6d\x43\x74\xf7\x04\xf4\xf6\xe7\x29\x14\xf2\x6f\x29\xb0\x0b\x1b\ \x9a\xc5\xc5\x06\x93\xe3\x0b\x2c\x2d\x56\x18\x1b\x3b\x7b\xfa\x91\ \xc7\xbe\xf5\xb7\x7f\xf5\xd7\x5f\xfe\x01\x30\x8e\x61\xfc\x3c\x66\ \xee\xa4\x96\x42\x5e\x73\xca\xb9\xd5\x00\x49\x20\x48\xb8\xf9\x7c\ \x7e\xee\xc8\x91\x23\x67\x2b\x95\x4a\x57\x14\x45\xf3\x8d\x46\xe3\ \x42\xbd\x5e\x7f\x3c\x8e\xe3\xff\x17\x78\x02\x93\x11\x1c\x10\x42\ \x22\x85\x40\xab\x98\x30\x6a\xd0\x68\xd4\x69\x84\x35\xb4\x10\xf8\ \x9e\x4f\x26\x28\x18\x26\x4a\x87\x5a\xbd\xca\x33\xcf\xfd\x29\x99\ \x6c\x83\xc7\x1f\x7f\x82\xee\xae\xad\x7c\xf6\xa7\xfe\x39\x42\xb8\ \xc6\x53\x88\x42\xa2\xd8\xd8\x7e\xdf\xcb\x10\x64\x8c\xc9\xd0\x42\ \xa4\xb5\x36\xda\x06\xd5\x85\x5e\x09\xfc\x9a\xa6\xc1\x0e\x79\x93\ \xc3\xb7\xfe\xbf\x51\xe9\x9a\x14\xce\x4b\x13\xe0\x91\x56\x70\x0c\ \x66\x50\xa0\x1c\x94\x65\x7d\x47\x29\xcb\xc8\x48\x2f\x9b\x36\xf7\ \xd0\xd9\xed\xd3\xd3\x5b\x20\x97\xcb\xad\x0a\xec\xde\xa8\xcd\xbf\ \xa1\x92\x31\x0d\xf5\xba\x66\x7e\xae\xca\xd4\xe4\x22\x8b\x0b\xe5\ \xf8\xf5\xe3\xaf\x1c\xf9\xe6\xb7\xbe\xf6\x8d\x67\x9e\x7d\xf4\x25\ \x4c\xd2\x6b\x06\x58\x00\x96\x31\x59\xd1\x18\x90\xa4\xa5\x3a\xab\ \xb7\x16\x10\x98\x62\x80\xc6\xd8\xd8\xd8\x07\x80\x45\xad\x75\xb9\ \xe5\xc4\x44\x52\x3c\x73\x73\x21\x63\x15\xd2\x08\xeb\x44\x8d\xba\ \x55\xdf\xe0\xfb\x19\x82\x20\x4f\xe0\x07\x48\xe9\x32\x3e\x79\x8e\ \x97\x5f\xf9\x1a\xf5\xfa\x12\x2f\x3d\xfa\x12\x23\x1b\xf7\xf1\xd3\ \x96\xf9\x5a\x2b\x54\x1c\x13\x86\x75\x54\x1c\xe3\xb9\x3e\x41\x26\ \x87\xef\x05\x08\xc7\x26\x9a\x94\xb6\xfe\x79\x13\x00\xae\x25\x08\ \x4d\xf5\x6f\x2b\x94\x75\xb3\x88\x53\x5a\x13\x60\xb6\x0e\x4a\x69\ \x6b\x02\x48\xbf\xf7\xf7\x16\xd8\x38\xd2\xcd\x86\x0d\x25\x3a\x7b\ \x7c\x3a\x3b\x0b\xab\x02\xbb\x37\x03\xe8\xad\xbc\xc7\xaa\x35\x02\ \x0a\x6a\x35\xc5\xcc\xd4\x32\x33\xd3\x4b\xcc\xcd\xcd\xd7\x5e\x3a\ \xfc\xf4\xb3\x5f\xff\x8b\x3f\xf9\xc6\xf9\xb1\xd3\xa7\x30\x8c\x9f\ \xc6\x30\xbe\x82\x61\x7c\x52\x4d\xac\x01\xcf\xc4\xb5\x57\x79\x7e\ \xb3\x1f\x57\x83\x40\xad\xf5\x65\xda\x4f\x80\x26\x50\x30\x45\xa1\ \x3a\x72\x6a\xb5\x65\xa2\xb0\x41\xac\x63\xa4\x74\xf0\xfd\x2c\x19\ \xdf\x14\x78\x20\x24\xcf\xbf\xf8\x0d\x96\x96\x8f\x33\x3b\x3b\xce\ \xab\xaf\xbe\xc6\xfd\x87\x3e\xc1\xc3\x0f\x7d\x1e\x90\x28\xa5\x88\ \xe3\xd8\x08\x50\xd4\x40\x48\x69\xae\x0f\x72\xb8\xae\x0f\x42\x98\ \x38\x9f\xd4\x4d\x0c\xb0\xc2\x13\x68\x15\x04\xe3\x16\x9a\x6c\xa4\ \x14\xca\xce\x43\x34\xb6\x5d\x09\x65\xeb\x08\x13\x2f\x40\xa7\xaa\ \xdf\x71\x04\x43\x43\x5d\x8c\x8c\x74\xd2\xd3\x97\xa1\xab\x27\xa0\ \x54\x2a\x5c\x05\xec\xae\xc7\xf4\xf5\x0a\xc5\x5a\x23\x3f\x4d\xa5\ \x6b\x4d\x1c\x6b\x6a\x15\xc5\xd4\xe4\x12\xb3\xb3\x65\xc6\xc7\xaf\ \xcc\x3f\xf5\xf4\xf7\x1f\xff\xfa\x5f\xfc\xf1\x77\x96\xca\x8b\x17\ \x69\x32\x7e\x91\x96\x69\xf2\x98\x85\xb1\x54\x0b\xdf\x74\x9a\x96\ \xbc\xea\x81\x24\x73\x25\x52\xe6\xb3\xd2\x0b\x68\x39\x98\x4c\x1e\ \xf0\x30\xd5\xa8\xb9\x28\xae\xb9\x8d\x46\x0d\x04\x36\xc8\x93\xc1\ \xb7\xcc\x3f\x7d\xe6\x45\x2e\x5c\x7e\x92\x4c\x46\x72\xe9\xf2\x45\ \x4e\x9f\x3e\xcf\x4f\xff\xd4\x6f\xb2\xfb\xa6\xb7\xd9\x97\x8c\x51\ \x28\xc2\xb0\x41\x18\xd6\xd0\x28\x7c\x2f\x20\x13\xe4\xf0\xfc\xc0\ \x14\x9a\xd0\x92\x62\xd6\x49\x21\x85\x5e\x5d\x10\x94\x46\x0a\x03\ \xfc\x12\xf7\x4f\x59\x17\x4e\xd8\x44\x8f\x96\x46\x3b\x48\x9b\xa4\ \xd1\x4a\x13\x03\x9b\x37\x75\xb3\xe7\xe6\x5e\xba\x7a\xb2\x14\x0a\ \xf9\xab\x80\xdd\x5a\x8c\x7d\xa3\x5a\xe0\x5a\x23\x3f\x0c\x35\x95\ \x72\xc4\xd4\xe4\x22\x73\xb3\x65\xa6\xc6\x8e\xf0\x9d\xef\x7d\xe3\ \xd4\xd7\xbf\xf9\xcd\x3f\xd6\x5a\x1d\xc3\xd8\xf8\x95\x23\x3e\xe2\ \x5a\x2b\xa2\x89\x35\x04\x20\x3d\x7c\xfd\x8a\x20\x1f\x28\x62\xa6\ \x0f\xf9\xd8\x5a\x35\x01\x42\x3a\x2e\x7e\x92\xd7\xf7\x7c\xc6\x2e\ \xbc\xc6\xd9\x73\x4f\x11\xc6\xf3\x5c\xb9\x72\x85\x13\x27\x4e\xb0\ \x65\xd3\xad\xfc\xda\x2f\xff\x01\x5d\x5d\x43\x29\xc2\x56\x4a\x13\ \x87\x75\x1a\x61\x95\x38\x0e\x71\xa4\x4b\x26\x93\xb7\xb3\x7e\x7d\ \xd3\x17\x61\xad\x57\xea\xd3\x27\xc4\xd2\x57\x0b\x82\xb4\x28\x5e\ \x99\xb9\x02\x49\x98\x57\x5b\xf3\x21\x75\xab\x17\x00\xca\x5e\x2f\ \x94\xa2\xa7\x37\x47\xff\x60\x91\x52\xa9\x74\x4d\x46\x5d\x6f\xff\ \x5a\xe7\xad\xc6\x97\x95\xf7\x68\xd4\x15\x4b\x8b\x0d\xc3\xf8\x99\ \x05\xae\x9c\x7e\x86\xe5\xb1\x47\xe9\x54\x17\x29\xd6\xca\x55\xad\ \xd5\x05\xcc\x72\x38\x53\x34\x6d\x7c\x64\x6e\xbf\xfa\x04\x85\x34\ \x87\xb3\x96\x06\x68\xf6\x65\x6d\x0d\x40\xd3\x36\x78\x18\xe6\x4b\ \x0c\x48\xae\x64\x32\x05\xf2\xb9\x02\xf5\x7a\x8d\x97\x0f\x7f\x8b\ \x89\xa9\x63\xe4\x0b\x3e\xb3\xb3\xb3\x1c\x3d\x7a\x94\x6c\xb6\x9b\ \xcf\x7d\xe6\x5f\xb2\xfb\xa6\xbb\x81\x04\xcc\x29\x13\x2b\x88\x1b\ \xd4\x1b\x55\xc2\xb0\x8e\x10\x92\xc0\xcf\x92\xc9\xe4\x8d\xed\x17\ \x8e\x8d\x62\xbc\x17\x4a\x00\x00\x20\x00\x49\x44\x41\x54\x17\x68\ \x10\x26\xa2\x27\x0d\xdc\xb7\x35\xf9\xa2\x5d\x10\x12\xc6\x26\xee\ \x9e\xb6\x6a\x1f\x8d\x90\xc6\x87\x37\x11\x43\x99\x82\xc3\x04\x0c\ \x46\x91\x42\xc5\xfa\xba\x36\xfe\x5a\x4c\x7f\xa3\xc7\xb4\xd6\xd4\ \x6b\x9a\x85\xf9\x1a\x53\x93\x0b\x4c\x8e\x4f\x70\xfe\xd8\x0f\x50\ \x53\xcf\xd2\x97\x0d\xd9\xdd\x1b\xd0\x9f\xeb\xc6\xcf\xf8\xd9\x7f\ \xff\xdd\xd3\x15\x0c\xc8\x4b\x0a\x5c\xac\xf3\x75\x7d\x24\xa9\x41\ \x37\xa7\xc5\x5d\x2d\x90\xab\xc5\x01\x56\x5c\x4f\x44\xd3\xc6\x00\ \xf8\x99\x4c\xe6\x6d\x63\x17\x9f\x2c\x2d\x7e\xef\x29\xf2\x79\x87\ \x4c\xc6\x67\x62\xf2\x22\x63\xcf\x8f\xe1\xfb\x05\x1e\x7a\xd7\xcf\ \x70\xdf\xbd\x1f\x41\x4a\x37\x29\x3c\x4a\x63\x05\x51\xd8\xa0\x5e\ \xaf\x10\x86\x66\x3d\x24\xdf\xcf\x90\xcd\x1a\x77\xd1\x71\xdc\xd4\ \x65\x6c\xaa\x7e\x9d\x96\x81\x4b\xb5\x52\x10\x6c\xe0\xc7\xba\x7f\ \x4a\x18\x00\x68\xc0\x9f\x42\x2b\x69\xf1\x80\x01\xc3\x26\xf8\xa7\ \xcc\xc4\x12\x9b\xd1\x51\x2b\x06\xd0\x7a\x98\xbf\xde\x7d\xab\xed\ \x8f\x63\x4d\xbd\xa6\x98\x9d\x59\x66\x7a\x72\x91\x73\xe7\xce\xf3\ \xf8\x93\xdf\x63\xee\xec\xf7\xb9\x67\x67\x89\x9b\x47\x3a\x19\xec\ \x2c\xd1\x5d\xf0\x28\x79\x31\xf9\x40\x74\x75\x16\xb3\x85\xf9\xa5\ \x6a\x92\x87\xb9\xd1\xa9\xe3\x6d\xe7\xa6\xfd\x11\x49\xc5\x52\xda\ \x41\x81\x59\x01\x09\x84\x10\x19\xdf\xf7\xb7\xe4\x72\xb9\xcd\x5a\ \xeb\x2d\x1d\x1d\x1d\x1b\xb3\xd9\xec\xa6\x62\xb1\x78\x4b\xb1\x58\ \xdc\x9d\xc9\x64\xdc\x72\x79\x86\xc5\xc5\x88\xe3\xc7\xaf\x30\x3b\ \x3b\xc7\xae\x1d\x07\xf9\xcc\xa7\xbf\xc0\x9e\x9b\xee\xb6\xc1\x9b\ \xa4\x52\x08\x63\x9b\x55\x4c\x14\xd6\xa9\xd5\xab\x34\x1a\x35\x94\ \x8a\xf1\xfd\x0c\x99\x4c\x81\x20\x93\xc7\x75\x7c\x5b\x5c\xd2\x9c\ \x4e\x9e\x6a\x02\x6c\x6e\xdd\xa2\xfe\xa6\x20\xc8\x54\x50\xb4\xb4\ \x88\x9f\x26\xf8\xd3\xd2\x44\xfc\x74\x8b\x6b\xa8\x6c\x94\x4f\x48\ \x65\xb4\x92\xb2\xe6\xe0\x06\x19\x7f\xa3\x26\x22\x8a\x34\xb5\x6a\ \xcc\xf4\xe4\x12\xd3\x53\x8b\xbc\x76\xf4\x55\x1e\x7f\xe2\x11\x4e\ \x9f\x39\x4d\x36\xe3\x73\x73\x5f\xc0\xee\xd1\x1e\x6e\xda\xd8\x49\ \x67\xce\x21\xef\x4b\x7c\x11\xd3\xe9\x55\xbb\x76\x6f\xea\x1e\x7e\ \xea\xd5\x4b\x6f\x64\xf5\x96\xb5\x41\x60\x62\x66\x57\x4b\x07\x7f\ \xfc\xe3\x1f\xff\xd5\x7a\xbd\xfe\x2f\x81\x94\x38\x95\x4a\x85\x85\ \x85\x05\xce\x9f\x3f\xcf\xf4\xf4\x34\x68\x57\x6d\xdf\xbe\x5f\xde\ \x75\xe7\x47\xb8\xe3\xf6\x87\xe8\x28\xf5\x99\x94\xa8\xb0\x37\x37\ \xca\x07\xa1\x4d\xf5\x6e\x23\xac\x53\xaf\x2f\x9b\x58\x81\x52\xf8\ \x7e\x40\x26\x53\x34\xc0\xcf\x7a\x0d\xa9\xb6\x80\x66\x49\x75\xcb\ \x02\x8c\x22\x49\xd7\xb6\x08\x42\x12\x07\x30\xc5\x18\x26\xc5\x8c\ \xc0\x6a\x84\xa6\xa7\x80\x4e\xb2\x7b\x46\x23\x28\x21\xac\x40\x5c\ \x9f\x89\xc9\xdf\x37\xaa\x0d\xb4\x86\xb0\xa1\xa8\x56\x0c\xb0\x9b\ \x18\x9f\xe3\xf9\x17\x9e\xe1\x89\xa7\x1f\x65\x66\x7a\x86\x20\xc8\ \xd1\xd5\xd9\x47\x36\xf0\xe8\xef\x0a\x19\xee\x29\x30\xd0\x95\x27\ \xe7\x09\x5c\xa9\x11\x3a\x86\x86\x94\x0f\xed\xeb\xdb\xfb\xd4\xab\ \x97\x72\x34\x4d\xf0\x8d\x34\xb5\x9a\x09\x48\x7b\xdd\x5e\x14\x6a\ \x30\xc0\x0b\x2f\xbc\xf0\xc2\xf4\xf4\x34\x8d\x46\x83\x28\x8a\xc2\ \x28\x8a\x2e\x6b\xad\x2f\x00\xe7\x80\xa7\xbb\x3a\x47\x8f\x7e\xe4\ \x83\xbf\xf1\x9f\xf6\xef\xdf\x36\x94\x2c\xb6\x90\xf0\xdd\x16\x07\ \xd9\x78\x7d\x4c\x1c\x45\x84\x8d\x1a\xf5\x46\x8d\x46\x58\x47\x29\ \x85\xe7\xfb\x64\x32\x45\xb2\x99\x1c\xae\x9b\x21\xed\x60\x3a\xf2\ \x0d\xf5\x12\xff\x9f\x96\x3a\x80\x44\x10\x94\x16\x08\x99\x78\x03\ \x76\xc4\x0b\x13\xcf\x4f\x46\xbd\xb4\xc7\x14\xd2\xa0\x02\x29\x50\ \x5a\x82\x34\x20\x31\x5d\x2a\x66\x0d\x86\xae\xc6\xf8\xf5\x08\x81\ \xd6\x50\xaf\x2b\x2a\xe5\x06\x93\x93\x8b\x5c\xba\x30\xc1\x93\x4f\ \x3d\xca\xb3\xcf\x3f\x45\xbd\x1e\x92\xc9\xe4\xe9\xee\x1a\xc4\xf7\ \x33\x78\x5e\x40\xe0\x29\x4a\xb9\x59\x3a\xf2\x01\xf9\xac\x8f\x27\ \x13\xa1\xd5\xe0\xba\xec\xd9\x90\x1f\x05\xba\x31\xf3\x1c\xd6\xbf\ \x22\xb5\xe5\xc9\xaa\xfd\xb7\xf5\x9b\x76\x6e\x68\xbb\x00\x9c\x3e\ \x7d\xfa\x09\xe0\x20\xa6\xc6\x7e\x62\xe5\x0c\xd5\x03\xb7\x7c\x7c\ \x58\x3a\x8e\x4c\xe5\xc8\xaa\x5e\xcf\x81\x8d\x03\xe0\xb9\x11\x82\ \x08\x4d\x44\x1c\xd7\xa9\x54\x6b\xcc\x2f\x44\x54\xea\x02\x47\xfa\ \x64\x73\x79\x32\x5e\x86\x4a\x14\x10\x47\x92\x64\xae\x9f\xd5\x4a\ \x96\xf9\x46\x8b\x08\x25\xcc\x28\x47\x37\xd5\xbd\xd6\xc9\x15\x36\ \xd9\x23\x4d\x06\x50\x91\x0a\x85\x6a\xd1\x0a\x26\xb1\x63\xb0\x4e\ \x53\x03\x48\x33\x1f\xa0\x45\x05\x5c\x8b\xe1\xeb\x11\x82\x38\xd6\ \x06\xd1\x2f\xd4\x98\x9c\x5c\xe0\xf4\xa9\xb3\x3c\xf6\xc4\x23\x1c\ \x79\xe5\x30\x42\xb8\x64\x33\x79\x0a\xdd\x39\xe3\x2e\xbb\x3e\x8e\ \xe7\xe2\x08\x07\xd7\x09\x71\x1d\xb3\xb6\x92\x23\xcd\xbb\x18\xa2\ \x4a\x90\x1e\xdb\xfa\x32\x43\x52\x88\x3e\xa5\xb5\x47\xaa\x5e\xd7\ \xcd\xff\x6b\x42\x06\x9b\x0b\x68\x37\x01\x5a\xeb\x65\xe0\xb9\xb5\ \x2e\x72\x1c\x3f\x70\x84\x74\x34\x89\x7a\x16\x8c\x0e\x69\xee\xd8\ \xab\x71\x9d\x90\x28\x8a\xa9\xd5\xeb\x54\x6b\x0d\x1a\x8d\x90\xa8\ \x18\xb3\x79\x48\x92\xc9\x04\xe4\x73\x01\xb9\xac\x4b\xe0\x0b\x1c\ \xa7\x41\x2d\x94\x4c\xcf\xb9\x9c\xbb\xe8\x70\x79\xda\x45\xc5\xda\ \x16\x66\x5a\xe6\x4b\x1b\x03\x48\xec\xbe\x58\x21\x08\x69\x2a\xd8\ \x8c\xf3\xc4\x2b\x32\x68\x42\xa6\xe3\xdf\x54\xf2\x68\x92\xd2\x1e\ \xa9\xa5\xd5\x7e\x4d\x06\xae\xc5\xe4\xb5\x4c\x40\xf2\x77\x14\x69\ \x1a\xb5\x98\xf9\xf9\x0a\x93\x13\xf3\x1c\x39\xf2\x0a\x8f\x3f\xf1\ \x03\x4e\x9f\x39\x4d\x26\xc8\x51\x2c\xf4\x18\x37\xd7\xcf\xe2\xf9\ \x81\x5d\xe3\x48\x58\x55\x09\x8e\xd4\xa6\xc4\xde\x2e\x30\x69\x6b\ \xd1\x8c\xf9\x73\x7c\x36\xf7\x78\xfd\xfd\x3d\xc5\xa1\xf1\xe9\x45\ \xeb\x23\xaf\xbb\xe9\xb5\xbc\x80\x64\xf9\xae\xf5\x96\x85\x27\x27\ \x0b\xc0\x11\x42\x64\x34\x5a\xc6\x51\x84\x16\x30\xd4\xa3\xb8\x63\ \xb7\x22\x0c\x43\x96\x97\x43\xc2\x30\x62\xb9\x12\x31\xb7\x64\xc2\ \xd1\xa5\xa2\x4f\x47\xc1\x27\x9f\xcd\x22\x44\x96\xe9\x79\x9f\x20\ \x90\x74\x95\x34\x59\x5f\x33\x32\x10\x31\x32\x10\xd1\x08\x1b\x8c\ \x5d\x71\x38\x77\xd9\x63\x6a\x4e\x36\xd7\xef\xd1\x1a\x6d\xe6\xca\ \x5a\xb5\x6e\x52\xbd\xc6\xd6\x0b\xb4\x4d\xd9\x26\x6e\x1f\x2a\x89\ \x15\x28\x50\xc6\x34\xa0\xa4\x89\x05\x4a\x3b\xbd\x4b\x48\x84\x23\ \x53\x0b\x70\xbd\x91\xbe\xda\xf1\xb0\xa1\x0c\xa2\x9f\x2d\x33\x71\ \x65\x8e\xa7\x9f\x79\x8a\xa7\x9e\x7a\x8c\xc9\xe9\x69\xb2\xd9\x02\ \x3d\x3d\x1b\xc8\x04\x79\x82\x20\x83\x67\xab\xa0\x1d\x47\xa6\xac\ \x49\x82\x59\x32\xe1\x81\x14\x56\x00\x68\xda\x52\xe9\xd1\x95\x91\ \xf9\x7b\x77\xf7\xee\xfa\xfa\x63\x8b\x7e\xc2\x87\xf5\x7a\x02\xe2\ \x5a\x5e\x40\xd3\x3c\xa4\x38\xe0\x7a\xd3\xc3\x25\xe0\x2d\x57\x66\ \x4a\x51\x5c\x77\xeb\xf5\x0a\x42\x2a\x6e\xd9\xae\x98\x5f\x8a\x88\ \xa2\x98\xf1\x69\xc5\xb9\x4b\x9a\xf1\x19\x07\x41\x06\xcf\x33\x45\ \xa0\x43\x03\x01\x03\xdd\x1e\xe7\x2e\x67\xd1\xa6\x14\x09\xe9\x08\ \x46\x07\x42\xb6\x8f\x86\xf4\x76\xc6\xf8\x9e\x66\xfb\x68\xc4\xf6\ \xd1\x88\xe5\xaa\xe4\xe8\x69\x8f\x33\x97\x3c\x54\xdc\xc4\x00\x02\ \xc3\x70\xdd\x92\x05\x44\x5b\x1b\x4f\xc2\xe4\x66\x3c\x40\xca\xa4\ \xd2\xc7\xe6\x09\x54\x62\xf7\xcc\x56\xa9\xb6\x77\xbc\xae\x10\x68\ \x0d\x8d\x86\xa2\x5e\x8d\x99\x99\x5e\xe2\xe2\x85\x09\x1e\x7d\xec\ \x11\x9e\x79\xee\x29\x6a\xb5\x06\xb9\x6c\x81\xbe\xde\x8d\x64\x33\ \x85\x34\xaf\x61\xaa\x9a\x6c\x7c\xc3\x32\xdf\x94\x8b\xc7\x16\x98\ \x4a\x84\xb4\x9e\x48\x02\xa6\x84\x00\x2d\xc0\x0d\x90\x5a\x71\x68\ \x67\xd7\x8e\xaf\x3f\x46\x27\x26\x12\x58\x5f\x0f\xf3\xe1\xea\x38\ \x80\x79\x7c\x9b\xd9\xbb\x1a\x04\x5e\xa3\xb9\x40\xae\x52\x9d\xeb\ \x09\xc3\x8a\x5b\xa9\x2c\xb1\x79\x18\x1a\x8d\x98\x6a\x1d\x9e\x7c\ \x59\xb2\xb4\xec\xd8\x6a\x5e\x0f\xdf\xcb\xda\xca\x9e\x80\xa5\xb2\ \xcb\x72\xd5\x4c\x26\x35\xde\x82\xa9\xb4\x19\xbb\xe2\x33\x36\xee\ \xd3\x51\x54\xec\x18\x69\xb0\x69\x43\x88\x23\x21\x9f\x55\xdc\x79\ \x73\x9d\x5d\x5b\x22\x8e\x9c\xf0\xb9\x38\xee\xb4\xd4\x03\x58\x77\ \x11\x63\x12\x48\x54\xbb\x30\xb9\x5c\x03\x12\x65\x9a\x12\x46\x25\ \x26\xc1\xcc\xf9\xc3\x06\x87\xa4\x74\x52\xc6\xae\x64\xfe\x4a\xc6\ \x2b\xa5\xa9\xd7\x62\xaa\x95\x88\xe9\xa9\x45\x4e\x9e\x3c\xc7\x23\ \x3f\xf8\x2e\x87\x8f\xbc\x84\x10\x2e\xf9\x5c\x91\x52\xdf\x00\xd9\ \x4c\xd1\x30\xde\x0f\xcc\x74\xf6\x36\xc6\x37\x17\xa4\x44\x19\xa3\ \x85\xc0\xac\xa7\x28\x04\x02\x5b\xfa\x2e\x54\x53\x08\xa4\x59\xa7\ \x78\xf7\x50\x6e\x04\xb3\x9a\xe8\x79\x9a\xc1\xa0\xf5\x48\xc0\x55\ \x5e\x83\xb0\x79\x16\x41\x3a\xb0\x93\xcf\xba\xa6\x86\x05\x71\xdc\ \x28\xaa\x38\x72\xc3\x38\x62\xa8\x57\x50\x6f\x08\x9e\x3e\xec\x50\ \xad\x7b\x64\x33\x46\xe2\x7b\xba\x3d\x8a\x39\x9f\x6a\xdd\xa7\x1e\ \xb9\x88\xd4\xe6\xae\x24\xb6\x71\x1d\x17\xcb\x0e\x2f\x1e\xcb\x71\ \xe4\xa4\x66\xe7\xa6\x06\xbb\xb7\xd6\x10\x02\x4a\x79\xc5\xa1\x03\ \x55\x66\xe6\x1d\x5e\x3e\x1e\x30\x39\x9b\x08\x8f\xa9\xf6\x91\xd6\ \x73\x30\xd5\xbd\xd2\x8e\x7e\x83\xa2\x85\x14\x66\xf4\x0b\x6d\x85\ \x43\x58\x1d\xa1\xd0\xd2\xb1\x29\xe3\x15\x84\x59\xc1\x78\x63\xdf\ \x23\x96\x97\x43\xa6\xa7\x16\x78\xf9\xe5\x57\x79\xf4\xb1\xef\x72\ \xf2\xd4\x49\x82\x20\x4f\xa9\xd8\x4b\x2e\x57\x22\x97\x2d\x12\x64\ \xf2\x2b\x18\x2f\x9b\x11\x4d\xa5\xec\xc2\x64\x06\x90\x0a\x29\x11\ \xca\x68\xfc\x74\x95\x16\xc1\x0a\x13\xa0\x21\xaa\x83\xd6\x6c\xe9\ \x09\x06\x7d\xcf\x1d\x68\x84\xd1\x8d\x16\x23\xac\x2a\x28\xa6\x7c\ \x4e\x5f\x37\x14\xbc\xf2\x46\x1a\x88\x02\xbf\x20\x3c\x2f\xe3\xf8\ \x5e\x40\xa9\x20\x39\x75\xd1\xa3\x11\x7b\x74\x96\x3c\xf6\x6c\x73\ \xd8\x36\x22\xe9\xee\x94\x48\x01\xd2\x09\xd1\x3a\x66\xa1\x2c\x99\ \x9e\x77\x98\x9a\x73\x98\x5f\x72\xe9\x2a\x2a\xfa\xba\x63\x06\x7a\ \x63\x1c\x29\xf8\xe6\x63\x45\x04\x66\xb1\xe5\x63\x67\xb3\x74\x95\ \x62\x36\xf4\x85\xd6\x27\x84\x9e\x2e\xc5\x83\x77\x55\x38\x7e\xde\ \xe7\xf0\x71\x9f\x18\x99\xba\x79\x40\xca\xd8\x84\x90\x66\x11\x28\ \x0b\x05\xd3\xa2\x8f\xa4\xb4\xd7\xe4\x07\x1c\xd9\x14\xc4\xd5\x00\ \x5e\x14\x6a\x66\xa6\x2b\x4c\x8c\xcf\xf1\xc4\xe3\x4f\xf2\xc4\x53\ \x8f\x32\x3e\x3e\x6e\xed\xfb\x30\x79\xcb\xf8\x4c\xb6\x80\x6f\xe7\ \x2f\x08\xc7\x31\x0c\xd5\xd8\x39\x86\x3a\x15\x56\x92\xda\x04\x21\ \x0d\xe4\x96\x26\x10\x55\xab\xd6\xa1\x68\x85\xa2\xe9\xa0\x9b\x4d\ \x75\x06\x80\x91\x2e\xaf\x6f\x74\xa0\xb4\xf1\xd4\xc5\xd9\x1b\x01\ \x82\xb6\x94\xa2\x1d\x04\x6a\xad\x99\x9f\x5b\x20\x8e\x55\x73\x14\ \xae\x43\x03\x80\x5d\xa5\xbb\x58\x18\x08\x33\x41\xde\xc9\x04\x05\ \x4e\x5c\x70\x98\x5b\x74\xe9\xed\x74\x78\xcf\x21\x41\x57\xc9\x3c\ \x6c\xa1\x2c\x39\x31\xe6\x31\x3d\xe7\x32\xd4\xab\xd8\xd0\xaf\xd9\ \x32\x1c\xb1\x63\x34\x22\x35\x61\x42\x50\xa9\x4a\x5e\x39\x91\x69\ \x61\x80\x51\x4d\xa5\xa2\x4e\x02\x02\x06\x33\x18\x67\x80\x5d\x9b\ \x43\xfa\xbb\x62\x9e\x3c\x9c\x61\x69\xd9\x2e\xdf\x26\xcc\x8c\x1c\ \x6d\xcb\xb8\x50\x66\xc5\x0e\xe3\x22\x26\xc4\x14\xd6\x0c\xd8\x99\ \x3b\xc9\x82\x91\x24\x78\x6b\x75\xbb\x3f\x39\xb1\xc0\x97\xbf\xfc\ \x9f\x78\xe6\xb9\xa7\x29\x16\x3a\xe9\xef\x1b\x25\x9f\x2f\x91\xcb\ \x95\xc8\x66\x8b\xc6\x97\x77\xcd\x3c\xc9\x04\x23\x98\xc8\xa5\x99\ \x0f\xa8\x84\x09\x57\x0b\xf3\x87\x89\x48\x98\xca\x53\x84\xd2\xcc\ \xce\x97\x59\x5e\x98\x41\x0c\x58\x1e\x24\xfc\x90\x02\x2a\x8b\x60\ \x17\xd2\xc8\x38\xda\x7d\xf8\xd6\xfe\x3d\xbf\x77\x71\x36\xcf\x0d\ \xad\x26\xaa\x75\x18\x86\x28\xa5\x52\xe6\xd7\x6a\x35\xea\x8d\x30\ \xa1\x76\xab\x00\xac\xad\x01\x6c\x76\x29\x06\x6a\xf9\x7c\x9f\xe3\ \xfb\x39\x7c\x3f\xc3\xfc\x92\xa4\x90\x93\x7c\xe8\x41\xc8\x65\xcc\ \xed\x2e\x4f\x39\x7c\xef\x59\x0f\x8d\x83\x44\x30\xbf\xe8\x72\xec\ \x9c\xa9\x20\xea\x28\x28\xba\x3b\xc0\xf7\x60\x62\xd6\x63\xb9\xe2\ \x80\xb5\x49\x08\x73\xbd\xeb\x68\xe2\x58\x70\x71\xd2\xe7\xd4\xb9\ \x80\xd9\x25\x97\x3b\xf7\x94\x19\x19\x6a\x80\x16\x74\x77\x28\xde\ \x73\x6f\x85\x47\x5f\xc8\x30\x39\x23\x0d\x20\xb4\x86\xde\x60\x42\ \x33\xfa\xcd\x68\xb3\xa0\x20\x99\xd1\x21\x14\xc2\x02\xc1\xe6\xea\ \x28\xcd\xd6\x6a\x9e\xcc\x57\x8d\x10\x0e\x5d\x9d\x03\x74\x77\x0d\ \x50\x2c\x76\x1b\x75\x1f\x64\xd3\xe9\x6d\xc9\xbc\x04\x20\xad\x43\ \x48\x17\x91\x92\xc2\xa4\xab\x53\x57\x14\xa4\x82\x30\x0a\x19\xbf\ \x32\x4d\xa5\x5a\xc3\x4d\x65\xdf\x7a\x01\x1a\x88\xeb\x50\x5b\x6c\ \xf6\x0b\xcd\x6d\x9b\x8b\x9b\x31\x15\xbe\x37\x12\x10\x52\xf5\x7a\ \x3b\x66\x4c\xc0\xb4\x7d\xcf\xf5\x6b\x00\xad\xb5\x12\x42\x68\xdf\ \xcb\x06\xae\x67\x6d\x1c\x82\xbe\x6e\x41\xde\xd6\x4f\x2c\x2c\x09\ \xbe\xf7\x8c\x43\xac\x85\x49\xcd\xa6\xa9\x5d\xf3\x7d\xa1\xec\xb0\ \xb8\x6c\x46\x5f\x42\x64\x91\x9c\x63\x5f\x35\x56\x82\xef\x3e\xd3\ \xd1\xfa\x64\xce\x5d\xce\x30\x32\x14\x22\x04\xc4\xb1\xc0\x73\x34\ \x87\x6e\xad\xf3\x9d\xa7\xb2\x94\x2b\x89\x19\x4b\xf0\x8e\xb9\x93\ \x04\x1b\xfd\x33\x2a\xd9\x14\x18\x19\xe6\x6b\x47\x22\xa3\x6b\xbb\ \x7c\x89\xf9\x74\x3d\x9f\xce\xce\x3e\x7a\xba\x87\x28\x14\xba\x08\ \x82\x2c\xd2\x2e\x8f\x63\xd9\x6e\x6c\xbc\x56\xd6\xdb\xb0\x2a\x57\ \x48\x5b\x66\x6e\x67\x0b\x5b\xe8\x55\xad\xd6\xb9\x7c\x79\x9a\x28\ \x0e\x69\x79\x68\x8b\x36\x06\x2a\xd3\xe9\xf3\x93\xb6\x6b\x20\x3b\ \x8c\x01\x82\x3e\xeb\xfc\x75\x91\x24\xa7\x62\xf9\x97\xbe\x5f\xf2\ \x8a\x52\xb6\x0b\xc0\xd5\x43\x62\xe5\x0d\xb5\xd6\x42\xc8\x5c\xb2\ \x54\x9b\x48\xaf\x35\x37\x7f\xfd\xac\x24\x8a\x85\xf5\x73\x6d\x36\ \x42\x6b\x9b\xbf\x6c\x89\xbc\xa6\xdf\x93\x73\x93\x59\x7e\xa4\x84\ \x12\xc8\x14\xb1\x56\xea\xcd\xf5\x0c\x1d\xc7\x04\x79\x02\x5f\x73\ \xdf\x6d\x35\x3c\xd7\xaa\xf4\x04\x4d\x8b\xf6\xef\x52\x4a\xbb\x46\ \xb0\xbd\xaf\x94\x88\x95\x04\x4f\x09\xd3\xfc\x60\x55\xba\xeb\xb8\ \xe4\x73\x25\xf2\x85\x0e\x72\xb9\x22\x7e\x90\xc5\xf3\xcc\x8a\x25\ \xc9\x1a\x09\xc2\x2e\x42\x9d\xd4\x4a\x4a\x29\x90\xd6\xdd\x15\xd6\ \xe4\x68\xad\x99\x99\x5a\xe0\xe2\xc5\x69\x62\x2b\x10\x89\x12\x4e\ \xde\x1b\x01\xd4\xe6\x21\x4e\x8a\x79\x9b\x66\x61\x73\x4f\x30\x58\ \xc8\x05\x43\x56\x00\xd6\x87\x03\xb4\x48\xbd\x80\xb6\x77\x4b\x2e\ \x17\xb2\xed\x3e\xd7\x15\x00\xdb\xf2\x49\x14\x4b\x6b\xcd\xfc\x52\ \xf2\x0c\xcd\xe9\x8b\xd6\x3f\xb7\xc7\x52\x41\x48\x25\xc0\x6c\x06\ \x7a\x42\xf6\xed\xa8\x72\xd3\xe6\x5a\x1b\x12\xd7\x3a\xe9\x9c\x4c\ \x5f\x5c\x08\x41\xa5\xe6\xf2\xec\xab\x05\xce\x5d\xce\x30\xbb\xe8\ \xd9\x24\x8e\xa0\xb3\xa8\xb9\x7b\x5f\x03\x47\x24\x04\xb7\xcc\x5f\ \xe5\x7b\xe2\x72\xc9\x54\x10\x44\x8b\x20\xb6\xb7\x56\x22\x09\xe9\ \xe0\x79\x9e\xfd\x0d\x03\xd7\xae\x58\x9e\x2c\x8f\x63\x73\x21\x56\ \xc0\xa4\x48\x4c\x59\xb2\x0f\x84\x94\x2c\x2d\x56\x39\x7b\x66\x9c\ \xd9\xd9\xa5\xd4\xd7\x4f\xfb\x45\xf3\x7a\xa2\x3a\xd4\x17\x68\x32\ \xbe\xd9\x06\x8a\x4e\xe7\xbe\x2d\x5d\xa3\x18\x01\x48\xd4\xf7\xf5\ \x9a\x6e\x67\x7c\xf2\x7e\x66\x2b\x57\x8c\x82\x75\x09\x80\x86\x9c\ \x01\x3c\x66\x74\x2f\x2e\x41\xdd\x0a\x6c\x18\x36\xc1\x86\x89\xc9\ \x5b\xdd\xa0\x92\x08\x9e\xe6\xae\x5b\xaa\xec\xdf\x55\x63\x71\xd9\ \xe1\xd4\x05\xeb\xd5\xe8\x24\xfb\x67\x1e\xb0\x7f\x57\x99\xee\x92\ \x59\xd9\x25\xd1\x0c\x97\x27\x7d\x5e\x7a\x3d\xcf\x0f\x9e\x2f\xf0\ \xed\x27\x8a\xcc\x97\x8d\xc5\xda\x38\x10\x71\xcb\xce\x10\xac\x16\ \x90\x96\x11\xc6\xa3\x6a\x8e\x66\x69\x47\x67\xd3\xf7\xb6\x4b\xce\ \x5f\xe5\x9a\x5a\x22\x25\x6f\xab\x31\x0b\x55\x4b\xc7\x7e\x12\x82\ \x4a\xab\x61\xec\xf3\x2c\xd3\xa5\xd5\x04\x42\x48\x1a\x8d\x88\xf3\ \xe7\x26\xb8\x7c\x69\x86\x28\x52\x4d\xa1\x4e\x1f\xd0\xc2\x43\x15\ \x43\x79\x82\xb5\x34\xbb\xa3\x63\x1e\xba\xa5\x67\x0f\x66\xbd\xff\ \xf5\xa6\x87\x75\x3b\xe3\xdb\x35\x80\x3d\x76\x63\x02\x80\x59\xc9\ \x32\x1d\xe9\x91\xd2\x9c\x1a\x33\x43\x69\xdb\x88\x4e\x47\x7b\x12\ \xea\x44\xe9\xf4\xdc\xbd\xdb\xeb\x6c\x1d\x6e\xf0\xec\x2b\x19\xce\ \x5e\xf4\x68\x34\xec\xda\x3a\xc9\x35\xca\x9c\x57\xae\x38\xdc\xbd\ \x7f\x3e\x8d\xda\xa5\xeb\xf7\x9a\x6e\x53\x0f\x1d\x1e\x79\x2e\xcf\ \xc4\xac\x0b\x42\xb0\x7b\x4b\xc8\xe8\xa0\x4a\x19\x81\x6c\x1f\x85\ \xb2\xd5\x3c\xac\x18\x11\x1a\xdd\xf6\x77\xdb\xc0\xb2\x42\x29\x84\ \x71\x35\x69\x33\x35\xd6\x6d\x6f\xbb\xa7\x21\xa1\x8a\x15\xe3\x57\ \xe6\x38\x73\xfa\x0a\x95\x4a\xe2\xf5\xa4\x4a\xbf\x89\xf6\xd3\x37\ \xd2\x88\xca\x14\xac\xb2\x16\x71\x6b\xbb\x65\x38\xcd\x0c\xae\x5b\ \x00\x92\x77\x6a\x7b\x47\xcb\xe9\x95\x5a\x64\x9d\x02\xa0\x72\xd2\ \xd6\xea\x25\x05\x96\xaf\x9c\x14\x34\x1a\x70\xe8\x40\xcc\xdb\x6f\ \x8f\xc9\x04\x86\x91\x12\xd8\x32\x1c\xf2\xae\xbb\x6b\x7c\xec\xdd\ \xcb\xec\xdb\xd9\x20\x8a\x60\xff\xce\x1a\xbb\xb7\x56\xe9\xef\x09\ \x71\x5d\x05\x34\x85\x44\xa3\x39\x7f\x29\x20\x70\x15\x1b\xfa\xab\ \x4d\x61\xb2\xc7\x4b\xb9\x98\x8d\x03\x21\x42\x0a\x9e\x78\x39\x47\ \xb9\x6a\xd4\xf0\x5d\xfb\x1a\x74\x96\x54\x53\x05\x27\xff\x52\x33\ \x80\xd5\x04\x4d\x06\xae\x1c\x6b\x2b\x83\x54\x49\xe8\xd6\x10\x2d\ \xb9\xaf\x34\x00\xcf\x7e\x52\x73\x23\x24\x51\x18\x73\xe5\xf2\x1c\ \xc7\x8f\x5f\x64\x66\x66\x31\xc5\x39\x49\x7f\xda\x4d\x77\x8b\x19\ \x68\x2c\x81\xba\xfe\xcf\x05\x6d\xef\xcf\x0c\x09\x21\x7a\x59\x3f\ \x0e\xb8\x2a\x14\xdc\xae\x01\xd6\xb9\x54\xec\x8a\x5b\x66\x0d\xf5\ \x9a\x05\x27\x73\x0b\x9a\x67\x5e\x15\xdc\x77\x9b\x66\xc7\x68\xc4\ \x60\xaf\xe2\x91\x67\x1d\x6e\xdb\xa3\xd9\x38\xa0\x88\x62\xc1\xe9\ \x0b\x2e\x97\xa6\x5d\xe2\xc8\xb8\x4e\xdd\x9d\x8a\x3d\xdb\x6a\xf4\ \x75\x2d\x73\xf4\x54\x96\xa3\x67\xb2\x60\x35\x46\x18\x1b\x5b\x30\ \x32\x50\x63\xec\x4a\x90\x6a\xcb\xd1\xa1\x3a\xb7\xef\x5e\x46\x08\ \x28\x57\x24\x2f\x1c\xcb\xf0\xfc\x6b\x19\xde\x71\x47\x05\x47\x6a\ \xee\xbd\x35\xe4\xdb\x4f\xfa\x84\x11\xd6\xad\x32\xa8\x1c\x61\x42\ \xc1\x32\x89\x2b\x34\xc9\xbf\x36\x1d\xad\x39\x32\x45\x31\x32\x65\ \xb2\x55\x30\x76\x71\x11\x43\xdc\x6a\x2d\x64\xe2\xca\x1c\x73\x73\ \x8b\x36\xce\x9f\xdc\x40\xd0\xba\x5e\x60\xaa\x4e\xec\x2f\x89\x99\ \x9a\x07\x85\x88\x1b\x29\x04\xbe\x16\xb6\xdf\xdc\xe5\x0d\x76\x16\ \xb3\x03\x73\x8b\x95\x24\x35\x7c\x5d\x6e\xa5\x4f\x6e\xf1\x06\x12\ \x79\x68\x11\x0c\x01\xeb\x5e\x2e\x5e\x67\x0d\xff\x6d\x56\x0e\x49\ \x31\xaf\xb9\x63\x8f\xf9\xf9\xb4\x97\x5f\x97\xbc\x7c\xc2\xe1\xc0\ \x2e\xd8\xd8\xaf\xb8\x32\x23\x79\xe4\x19\x9f\x5a\xe4\xd8\xd1\x67\ \x88\x79\x65\xda\xe5\xe8\x69\x41\x31\x07\xd5\x7a\xf2\x9b\x03\xa6\ \x86\x5f\x5a\x8a\x15\xb2\x51\x3a\xa5\x5b\x68\x4d\x18\xc2\x42\xd9\ \xa1\xb3\x18\x51\xc8\xc5\xdc\x7f\x7b\x85\x4a\xad\x69\x1a\x0a\x39\ \xc5\x6d\xbb\x43\x9e\x7d\xc5\xb5\x0c\xb4\xa3\x58\x68\xeb\x28\x5a\ \xc9\xd7\xc2\x2c\xe8\x64\xe3\x9b\x6b\x05\x82\xd2\x8a\x2a\x81\xcd\ \xdc\x91\x2e\x8d\xa7\x85\xa6\xbc\x58\x65\x62\x62\x8e\x85\xf9\x32\ \xc9\xb4\xf4\x44\x72\x12\xa1\x6d\xee\x33\x02\xd9\x5c\x56\xd7\x0a\ \x48\x0b\x43\xda\xf8\xb6\x0a\x3a\x2d\x06\x22\xf3\xe0\xcd\x3d\x37\ \x7d\xed\xc9\xca\xb7\x4d\x57\xaf\x9d\x19\x14\x02\x9d\x78\x1a\xad\ \x6e\xa0\x6c\x6a\xba\x96\xce\xad\x53\x03\x68\xf0\x8c\xdd\xd6\x16\ \xaf\x6b\x0e\xdd\xa6\xc9\x04\xf0\xc8\xb3\x82\xe3\xe7\x41\x4a\xcd\ \x70\xbf\xe2\xc2\x84\xe0\xbf\x3d\xed\x9b\x18\x8c\xfd\x25\x2f\x6c\ \x86\x4e\x0a\x63\x23\x96\x96\x85\xcd\x86\x69\x3b\x6f\x4f\x31\x32\ \x68\xf2\x1d\xd9\x8c\x59\x2d\x04\x6b\x1a\x2e\x4d\x78\x5c\x9a\x74\ \xc9\x65\x14\xc3\xfd\x21\x9b\x86\x1a\x74\x16\x13\xbb\x69\x5e\x6a\ \xcb\x70\xcc\xe5\x49\xc9\x85\x89\x24\x05\x64\xe9\x29\xec\x18\xb3\ \xa9\xd6\x26\xd1\xdb\xb2\x63\xe9\x36\x39\x9c\xbc\x67\xa2\xc6\xeb\ \xb5\x90\xa9\xa9\x25\x66\xa6\x17\xa9\x37\x1a\xb4\xa1\xd7\x74\x23\ \x52\x06\xa7\xf7\x17\xc2\x14\xb3\xb6\x08\xc3\xba\x3c\xf9\x44\x4a\ \x01\xa1\x15\x87\x76\x76\xee\xfc\xda\x93\x17\x3a\x31\x65\xe2\xd7\ \x04\x0d\x3a\x05\x81\xba\x4d\x03\xb4\x80\xc0\xa4\x93\xd7\x4e\x07\ \xaf\xb8\xad\xbc\x30\x36\x4b\xa9\x94\xa5\xa3\x23\x4b\x4f\x77\x96\ \xcd\x1b\x4c\x9c\x7d\x62\x96\x14\x17\x4c\xcf\xc3\x0b\xaf\x39\x44\ \xb1\x5d\x39\xcb\x46\xeb\x85\x02\x29\x6c\xb1\x96\xb2\x48\xca\x2e\ \xba\x80\x50\x48\x04\x37\x6f\x5b\x36\x18\x42\x68\x4a\xf9\x90\x85\ \xb2\xf9\x8d\x80\x64\x59\xfa\xe5\x8a\xe0\xc4\x79\x8f\x13\xe7\x5d\ \x06\x7a\x22\x0e\xde\x5c\x23\xe3\x37\xa9\x79\xc7\xde\x90\xe9\x79\ \x9f\x6a\x2d\x09\x86\x40\xb2\xa0\x25\x42\xd8\xfb\x98\x3a\xc4\xd5\ \xea\x02\xd3\x37\xd5\xe6\x79\x71\xac\x99\x99\x5e\xe2\xc2\x72\x99\ \x4a\x35\xb4\x7c\x49\x56\x29\x6a\x6a\x09\xa3\xda\xed\xbe\x94\xf7\ \x89\xc1\x69\xa9\xd0\x4c\xfb\x23\xd2\x3f\xaf\x4f\x76\x73\xf5\x9e\ \xa1\xec\x46\xd6\x97\x19\x4c\x96\xba\x24\xf1\xda\x92\xef\x2d\x26\ \x20\x65\x3e\x4d\x6c\x78\xdd\x8e\xb8\x2a\x56\xcc\xcf\x57\x19\x1b\ \x9b\xe3\xc8\x2b\x13\x9c\x39\x3d\xc7\xd2\x52\x8d\xd9\x05\x45\x52\ \x92\xf5\xe4\x4b\x82\x5a\xdd\x4c\x04\x49\x84\x22\x59\xc1\x43\xe9\ \xe6\x4c\x1e\x65\x97\x5d\x57\xf6\xef\xdd\x5b\xaa\x64\x33\x31\xf6\ \xf7\x0c\x79\xe8\x6d\x0b\xdc\xbd\x6f\x89\xae\x52\x68\xae\xb5\xf7\ \x4b\xb6\xe3\xd3\x0e\xff\xed\x99\x0c\xf5\x08\x4b\x0b\x4d\xe0\x69\ \x0e\xde\x1c\xb6\x50\x36\x85\xe0\x4d\x82\x8b\x44\x2b\xb4\xa3\xff\ \x76\x60\xac\x59\x5c\xac\x71\xfa\xd4\x24\x97\x2e\xce\xb1\x5c\xa9\ \xa7\x37\x69\x57\xdb\x29\xbe\x6f\x7f\xc0\x55\xe7\x8a\xf6\xfd\xe9\ \x7f\x76\x94\xb7\x8c\xf6\x35\x88\xcf\xd6\x5e\x7f\x83\xe7\x3a\x7d\ \xac\x4f\x63\xeb\x36\xad\xd6\xe4\x7c\xb2\xaf\xb5\x43\xeb\xd3\x00\ \xda\xfc\x60\x84\xc1\xc8\xda\xb8\x3c\xff\xe7\x1f\x55\xc8\x04\x35\ \x6a\x75\x49\x3e\x1f\x90\x2b\x04\x14\xf2\x01\xf9\xbc\x8f\xeb\x09\ \x3b\x4b\x47\x99\x45\x19\x6c\x3d\xbf\xd2\x8a\x64\x4d\x3d\xb3\x14\ \x8b\xe2\xe6\x6d\x0d\x6e\xd9\x51\x63\xb9\xe2\x30\x3d\xef\x52\xcc\ \x2b\xba\x3b\x62\x46\x06\xea\x8c\x0c\x84\x3c\x7d\x24\xc3\xf9\x2b\ \x7e\x33\x04\x6b\x4d\x4b\x79\x59\xf0\xf8\x8b\x01\x0f\x1c\xac\xa5\ \xae\xcc\x50\xaf\x62\xcf\xd6\x98\x57\x4f\xad\x90\xeb\x16\x35\x6d\ \xec\xf1\xea\x26\x20\x79\xd9\x30\x8c\x9a\x6a\xd3\x02\xca\xa6\x62\ \x6f\xb7\xf9\x2b\xf7\x25\xb4\x6e\x82\x42\xbd\x62\x63\x9e\x23\xdb\ \x4c\x12\x4d\x41\x58\xc5\xbc\x8f\x74\xb8\xbd\x43\x3d\xb9\xe1\xb1\ \x89\xa5\x75\x7a\x02\xfa\x2a\x0d\xd0\x7c\x5f\x99\x74\xec\x86\x4c\ \x80\x93\xb8\x6d\x89\xf4\xc6\xb1\xa6\x52\x35\x65\x5a\xe5\x72\xdd\ \xe4\xcf\xc5\x32\x20\xd9\xbd\xdd\xe3\x81\xbb\x1c\x2e\x4c\x65\x39\ \x79\x31\x20\x93\x71\x71\x80\x7c\x5e\xb0\x77\x7b\x83\x38\x16\x5c\ \x99\x72\x19\x1d\x52\xec\xd9\xd6\xe0\x95\x93\x01\x47\x4e\x98\xdf\ \x52\x16\x02\xfa\xba\x23\xee\xb9\xb5\x4a\x3e\xa3\xb8\x6b\x5f\x95\ \x28\x12\x5c\x9c\x74\x53\x02\x1b\x54\xab\x99\x9c\x91\xfc\xe5\x77\ \xb3\x6c\x1b\x89\xd8\xbd\x25\xc2\xf7\x34\x37\xef\x88\x99\x98\x81\ \xc9\x59\xd2\xf3\xd1\x50\xad\x46\x2c\x2e\x54\x28\x14\x1b\xd6\xfa\ \xb4\xd3\x31\x61\xb8\x4e\xbf\x37\x9b\x48\x99\xdb\x6a\xdf\x93\xaf\ \x2d\xfb\x68\x65\xf2\xca\xfd\x16\x0b\xb4\x2c\x7c\xb5\x6a\x48\x32\ \xe9\x70\x8b\x66\xf0\xa5\x76\xde\x7f\x6b\xef\x9e\xdf\xff\xf6\xd2\ \x3a\x32\x83\x42\xaf\x14\xea\xd6\x79\x10\x2b\x4d\xc0\xba\x04\x40\ \x80\x6b\x6e\x62\xa7\x62\xa3\x49\x0a\x19\x45\x52\x00\x81\x39\xf6\ \xae\xbb\x62\x3e\xf0\x40\x08\x08\x9e\x3b\x5c\xe3\xe4\xeb\x1e\x08\ \x81\x1f\x78\x64\x02\x97\xe3\x27\x3c\x76\x6d\x15\xbc\xf7\xbe\x32\ \xf9\xbc\xcb\xb3\x47\x32\x1c\x3b\xeb\xd9\x89\x1b\x26\x9a\x37\x39\ \xe3\xf0\xcd\xc7\x0a\x3c\x7c\xef\x32\xc5\x5c\xcc\xc1\x5b\x2a\x8c\ \x3f\x92\x27\x8c\x9a\x44\x4d\x80\x62\xad\xa1\x79\xed\x94\xe4\xe4\ \x39\x87\x43\xfb\xab\xf4\x77\x87\xec\x1a\xd6\xbc\xf8\x32\xd4\xaa\ \x21\xe5\xe5\x3a\xcb\xe5\x3a\xb1\x8a\x50\x71\xc4\x8e\x5d\xd9\xa6\ \x59\xb8\xca\x13\xb0\x84\xd7\x2d\xcf\x48\x58\xd9\x1c\xd6\xcd\x7d\ \x6b\x02\xc1\x16\xde\xa4\x40\xb0\x95\x5f\x56\xab\xb4\x3e\x73\x8d\ \xd1\x8f\xf5\xbc\xee\xdc\x9c\xdf\xc2\xfa\x32\x83\x5a\x6b\xda\x32\ \x96\xad\x00\xf7\x0d\x9a\x00\xed\x60\x57\xd5\x32\xf5\xe5\xad\x82\ \xa0\x41\x1b\x57\x6e\xfb\x26\xc5\xfb\xde\x61\xee\xfd\xd5\x6f\x49\ \x9e\x7f\x4d\x22\x84\x29\xd5\x6e\xd4\x43\xc2\x7a\xcc\xd2\x52\x83\ \x99\x29\xc1\xf9\xb3\x9a\x5f\xfd\x07\xd3\xf4\x67\x5d\xfe\xec\xa5\ \x12\x42\x48\x5c\x4f\xe2\x3a\x12\xc7\x95\x38\x8e\x60\x6e\x42\xf1\ \xd3\x1f\x5e\xc4\x11\x9a\x9e\x60\x89\x47\x8e\x04\x06\x47\x60\xf0\ \x45\xac\x14\x61\x3d\xa2\x11\x45\xa0\x34\x8f\x3f\x06\xbf\xfe\xc5\ \x0a\x83\x79\x85\xa7\x5c\xce\x8d\x0b\x4c\xbf\x9b\x5e\x45\xaa\xc4\ \x5a\xd9\xd1\xe6\x06\x62\xa7\x8f\x5d\x0f\xae\x8b\xd5\xcf\x59\xc9\ \xff\xd6\x3f\x53\xd0\x68\x2a\x9d\xc5\xaa\x4c\x5f\x5d\x20\x76\x0d\ \x64\x12\x20\xb8\x66\x66\x50\x6b\xad\xff\xfc\x3f\x3f\xba\x1e\x0d\ \x20\x30\xd5\x5e\xab\x24\xc8\x57\x6b\x5a\x3b\xba\xa5\x53\x69\xc8\ \x57\x1b\xe6\x6b\x34\xa5\xbc\xe2\xa7\x3f\x64\xec\xf3\x57\xbf\x05\ \x4f\x1e\x36\xb6\x3f\x9d\xc8\xa1\x95\xd5\x12\x66\x7b\x79\x4a\x50\ \x0f\x05\xc3\x7d\x11\x3b\x46\x1b\x66\x36\x51\x3d\xa2\x52\x69\xb0\ \xb4\x58\x67\x7e\xae\xc6\xb1\x93\x0d\x8e\x1e\x8f\x50\x61\x85\x03\ \x3b\x16\x58\x5a\xac\xb1\xb0\x50\x67\x69\xa1\xce\xd2\x52\x9d\x4a\ \xb9\x41\x23\x8c\xcd\xf2\xad\x68\xa2\x48\xf1\xcc\x11\x93\xb5\x7c\ \xf8\x50\x12\x6d\xa4\x8d\x56\x06\x4c\x5e\x6d\x02\x92\xb3\x94\x4a\ \xc0\x6b\xa2\x82\x57\x99\x6d\xb5\xaa\x15\xbe\x4a\xac\xd6\xd8\xb7\ \x9a\xd8\x5c\x4b\x0b\x98\x7d\xdb\x7a\xdc\xa1\x4c\xe0\xf5\x73\x8d\ \x88\xa0\x61\xae\x45\x1f\x6b\xc4\x39\xde\x90\x17\xa0\xd1\x4e\x33\ \xcd\xdb\x12\xc6\x35\x63\x11\x47\x28\x3e\xff\x11\x49\x31\xa7\xf9\ \xfe\xb3\xf0\xf8\xcb\x58\x86\x27\x5e\x40\xb2\x88\x53\xb2\x3e\x9f\ \xf9\xa5\xcf\x9a\x8d\x84\xf6\x76\x45\x56\x58\x5a\x3e\x98\xcf\x0b\ \xc7\x4c\xf2\x28\x9f\x89\x19\xea\x8d\x80\x44\x90\x9a\x42\xa8\x5b\ \x18\xf5\xe4\x61\x07\xad\x25\xdb\x36\x2a\xb6\x8f\xae\x40\xd8\x5a\ \x5c\x4d\xdf\x96\x56\xab\x36\xa8\x56\xea\x4d\x86\x5f\xd7\x67\x6f\ \xb6\xeb\xcb\x44\xcb\x1f\x69\x27\xae\xcd\xf4\xd6\x0e\xf4\x15\x9c\ \x8e\x5b\x46\x8a\x9b\xb9\x7e\x66\xb0\xa9\x70\x5a\x19\x2f\xdb\xb4\ \x42\x2a\x04\xeb\xcd\x05\x38\x89\x2d\x4a\x62\xf4\xd0\x64\xea\x43\ \xf7\x38\x6c\x1d\x86\xf1\x59\xf8\x9b\x47\x9a\xa3\xdc\x4c\xda\x68\ \x6a\x01\x52\x61\x30\xc7\x5d\xbb\x04\xcf\xf8\xb4\xbc\x8a\xf1\xc9\ \x79\x0b\x8b\x4d\x22\x2c\x94\xed\xb3\x5b\xef\x47\xb3\x5f\xa0\x99\ \x99\x87\xa3\x67\xcc\xcb\xde\x7b\x9b\x49\x5b\xeb\x16\x82\x9b\xcb\ \xdb\xbd\x00\xad\x35\xd5\x6a\x95\xa9\xa9\xd9\x96\xf3\x6f\x80\xfb\ \x6b\x8c\x74\xb1\xca\xf1\x76\x63\xa3\xdb\x85\x61\x35\x2d\x60\xf7\ \x09\x15\xf3\x9e\xbd\x9d\x37\x71\xfd\xcc\x60\x5b\x2e\x60\xa5\x9c\ \xb4\x08\xce\x0d\x60\x00\x8d\x93\x80\x3c\x91\xae\x94\x6d\x6a\xf3\ \xf2\x19\x87\x77\xde\x6d\xaa\x70\xfe\xe3\x5f\x45\x84\x11\x69\xc0\ \x45\x8b\x96\x6b\xb4\x20\x2d\x7f\xb2\xeb\xea\xff\xf1\x5f\x79\x6c\ \x1c\x80\x13\xe7\x85\xc1\x15\x36\x66\xde\x02\xaf\x10\x36\x8e\x3a\ \x35\x27\x59\x5c\x36\x36\xdd\x76\xe0\x6a\x0d\x60\x89\x75\xee\x32\ \xec\xdd\x06\xdb\x86\x5b\x18\x9f\x80\x47\x6b\x96\xe6\xe6\xe6\xf0\ \x7d\x9f\x38\x8e\xd3\xfa\x39\x15\x37\xbd\x8c\xe4\xaa\x37\xad\x5d\ \x05\x06\xb0\x73\x35\x92\x77\x5a\x29\x74\x57\x6b\x81\x03\x23\xc1\ \x28\xd0\x8b\xf9\x69\x9c\xb5\x32\x49\xcd\x38\x95\x15\xee\x56\x10\ \x28\xdb\x97\x8a\xbd\x01\x37\x50\x27\x35\xfa\xd6\x59\xb2\x93\x35\ \xde\x79\x97\x24\xeb\x0b\x5e\x3e\x1e\x71\xee\x4a\x6c\x90\x70\x0a\ \x76\x92\xca\xdd\x44\xe3\x34\xab\x62\x40\x70\x72\xcc\x7c\xcc\x5a\ \xc0\x90\x44\xca\x5a\x69\x75\xcb\x4e\x03\x78\x4f\x5d\xb0\x73\xfe\ \x12\xe2\xd0\x04\x76\xad\xcc\xd7\x5a\x13\xb8\x8a\x38\x86\x52\x01\ \xba\x4b\x9a\x99\x05\x0c\x31\x45\xb3\x58\x45\x6b\x4d\xbd\x5e\x5f\ \x75\xa4\xa4\x5a\x4e\x37\x9f\x26\xda\x46\xe5\xfa\xa8\x76\x0d\x7a\ \xb6\x30\x77\xc5\xc8\xd7\x2b\xf6\x41\xfa\x7d\x67\x5f\xb0\x51\x08\ \xd1\xa3\xaf\x3d\x67\x70\xb5\x44\xc3\xca\xf7\x4c\x01\xca\xfa\x30\ \x80\xd6\x4e\x53\x75\x37\xa3\x7b\x42\x28\xde\x7e\xbb\xf9\x2d\xe1\ \x57\x4e\x25\x2a\x5c\xb7\x9f\x87\x62\x64\x50\xd1\x55\x32\xe6\x80\ \x16\xf5\xae\x57\xf9\xd0\x62\x0a\x86\x07\x62\xee\xde\x67\xea\xe8\ \x4e\x5d\x90\x6d\xc7\xb1\x42\x98\x00\xcd\x84\xf9\xbe\xaf\xb8\xef\ \x0e\x6d\x27\x9b\xc2\xd6\x8d\xad\x20\xae\x35\x4b\x77\x15\x51\x52\ \xfd\xdc\x3e\x0e\xd7\xe2\xb6\x5e\xe3\xfb\x3a\xda\x35\x03\x40\xab\ \x33\x1f\xad\xd9\xd2\xe3\x0e\xe6\x32\x5e\x3f\x66\x05\x97\xd5\x30\ \x40\xe2\x57\xae\xf9\x6e\x2b\x16\x8b\x96\xeb\x74\x03\x95\x9b\x8c\ \x34\xa1\xcd\x12\x2d\x68\xc5\xe6\x21\x97\x42\xd6\x28\xec\x57\x4f\ \x84\x46\xcd\xa7\xa3\x9c\xd4\x07\xbe\x63\xaf\xc3\x3b\xee\x50\x34\ \x22\xc1\xe4\xac\x60\x62\x5a\x33\xbb\x28\x58\x5c\x96\x94\x97\x61\ \x69\x59\xb2\x54\x15\x2c\x95\xa1\x56\x97\x74\x77\x6a\xf6\xef\x8c\ \x79\xef\xa1\x18\xcf\x35\x0b\x43\xbc\x7e\xa6\x65\x1e\x80\x25\xcc\ \x4f\xbd\x3f\xe4\xc9\x97\x1d\x4e\x5d\x30\x74\x92\x52\xf3\x8f\x3e\ \xaf\x08\x3c\xb3\x00\x13\x42\x33\xd4\xaf\xe1\xd5\x16\x73\xa1\x34\ \x26\xe0\xd4\x4e\x20\xd1\x52\x2c\xa0\x95\xbe\x8a\xf1\xba\xe5\xff\ \xf6\x6f\xab\xff\x7d\xad\x96\xf8\x02\xe2\x5a\x38\xc0\xbe\x63\xeb\ \xf1\xbc\x47\xe6\x5d\xbb\x4b\x3b\x4b\xbb\x3f\xbe\xe3\xbd\x0f\x7f\ \xf4\xfe\xaf\xfd\xd9\x63\xb7\x02\x7b\x2d\xd1\x2b\x5f\xfd\xf2\x23\ \x15\x21\xe4\x6d\xe9\x73\x5a\x4c\x40\x6a\x76\x64\x3b\x08\x5c\x67\ \x3d\x80\x76\x52\xf5\x2b\x64\x2a\x04\xa3\xc3\x0e\x1a\xb8\x38\x11\ \xb3\x50\x4e\x7e\x4d\x53\x34\xcf\xb1\xcf\x29\x64\x0d\xd1\x7d\x57\ \xb3\xb1\x5f\xb3\x71\x20\xd1\x5e\x49\x62\xab\x99\xe0\x8a\x63\x53\ \x04\x9a\x3e\x1a\x38\x7f\x19\x96\xab\xad\x33\x9e\x0c\x7b\x8e\x9e\ \x96\xfc\xe2\x4f\x86\x4c\xcf\x4b\x5e\x3b\x05\xb7\xde\xa4\xe8\x28\ \xc0\xdc\xa2\xa6\x56\x87\xa1\x5e\x28\x64\x93\xdf\x03\xb0\xc1\x6c\ \xab\x66\xd7\x72\x93\x4c\x4b\x3c\x9d\x26\xde\x48\x3b\xb3\xe6\xc8\ \xbf\x51\x8d\xb0\x52\xd5\x5f\xdb\x14\xc4\xc2\xe3\xac\x77\x17\x9f\ \xf9\x1f\x7e\xf3\x97\xf2\x9d\xdd\xff\x30\x97\xf3\xc9\xe4\x3c\x72\ \x39\x0f\xad\x35\x8d\x86\x71\xa3\xeb\xb5\x68\xf5\xf2\xf7\x74\xfb\ \x46\x40\xa0\x75\x03\x45\x82\xbe\x2d\x83\x93\xfa\xd2\x58\x41\xf2\ \x9b\xba\x66\x7a\x54\xb3\x36\xbf\xab\x43\x33\x3c\x08\x7f\xf5\x03\ \xcd\xc5\x2b\x9a\x4b\x93\xd0\x08\x05\x8e\x34\xf9\xf9\x8c\x2f\xe8\ \xef\x86\xc1\x5e\xc1\x60\xaf\x66\xef\x76\x28\xe5\xdb\x09\x78\xfc\ \x9c\x5d\x1f\x68\x05\x81\x9f\x7b\x0d\x36\x6f\x10\xdc\x7b\x9b\xe2\ \xfe\x3b\xcc\x91\x63\x67\xe0\xff\xfe\x0a\x7c\xe4\x5d\x56\x00\x72\ \x2d\x40\x51\xdb\x75\x04\x12\x0a\xac\x21\x04\x2a\xf5\x34\x9a\xcf\ \x6a\x37\x06\x7a\x5d\xfc\x5e\x53\x0c\x74\x82\xa5\x92\x7b\xad\x64\ \x78\x73\x7f\x24\x7c\x4e\x7b\x6f\xe3\x5c\xf1\x41\xfa\x46\x36\x70\ \x70\xb0\x98\x6d\xbf\x55\x3b\x70\x5d\xb9\xaf\x5d\x0b\xbc\xc1\x48\ \x20\x5a\x99\x40\x90\x8d\xea\x25\x42\x90\xfc\xdc\x6a\xd6\x87\x34\ \x52\xd8\x02\xfa\x04\x8a\x6a\x1d\x7e\xeb\xdf\x36\xb0\xeb\x53\x18\ \xb3\x90\xdc\x57\x98\x34\xef\xcc\xbc\xe0\xd8\x59\x7b\x95\x14\xec\ \xd9\x2a\x78\xe8\x5e\xd8\x34\x64\xee\xbf\x77\xbb\xe2\x5b\x4f\x34\ \x69\xa3\x13\x22\x02\x5f\xfd\x0e\x2c\x2e\x0b\xde\x7b\x9f\x21\xea\ \xb7\x1e\x37\xcc\xbe\x34\x09\x20\xc8\xe7\x92\x30\xac\xa6\x19\xcb\ \x58\xc5\xfe\x9b\xbf\x56\x10\x53\xd1\x0a\x06\x57\x47\x07\xba\x7d\ \x8f\x6e\xfe\xb5\xfa\xf7\xd6\x7d\x76\x12\xc1\x1a\xda\xe0\x94\x77\ \x0f\x27\xf3\x0f\x33\x30\x3a\xc8\xde\xc1\x52\xfb\x84\x94\x96\x30\ \x6f\x2b\xa3\xd7\x6c\xa9\x55\x6e\x33\x01\xd7\x8f\x04\xbe\xf7\xdd\ \xff\x58\x34\x43\xc1\xed\xfe\x7c\x42\x82\x20\x20\x3d\x96\x00\xb4\ \x04\xc8\x55\xaa\x71\xf3\x97\xb4\x56\x04\x7a\x58\xe5\x7b\x1c\x2b\ \x5e\x39\xa5\xf8\xbf\xfe\x14\x5e\x78\xcd\xf4\x61\xe3\x80\x66\xff\ \xae\x76\xa0\x68\xc8\x6d\xee\xfb\xe4\xcb\x46\xc5\x57\x1b\x70\xe6\ \xa2\xf9\x5e\xae\x98\x6b\x8d\xf9\x69\xf1\x12\x56\x59\x21\xa4\xf9\ \xdd\x1e\x4b\x22\x81\x56\xe5\xb7\x46\x13\xdb\x89\x7c\xb5\x10\xac\ \xdb\x14\xe8\xc4\xc5\x4d\x34\x80\x6a\xf9\xae\x79\xc5\x7b\x98\x2b\ \xa3\x9f\x66\xdf\x5d\xbb\x18\x1a\xee\x34\x3f\x5c\xc9\x5a\x82\xdb\ \xde\x56\xc5\x37\xe9\xb1\x76\x37\x70\x1d\x13\x43\x94\x4f\xab\x17\ \xd0\x82\xf4\x97\x96\x4d\xa7\x0b\x79\x49\xe0\x69\x58\xc1\xe0\x26\ \xc3\xed\x31\x56\x1e\xd3\x2b\xce\x6b\x1e\x0b\xa3\x98\x3f\xf9\x1b\ \xcd\xcb\xaf\x03\x5a\xf3\xfe\xfb\xcc\xea\xa0\xed\x1e\x83\xb9\x7e\ \xbe\x6c\x5c\xbd\xe9\xb9\x64\x9c\x2b\xca\x95\xd8\xf6\x1f\x5a\xbd\ \x84\xa4\xd0\x74\x75\xf5\x6f\xb6\x2a\xf1\x62\x5a\xd5\x7f\xab\x10\ \xac\x8a\x09\xf4\x55\xff\xaf\xf6\xcd\xa0\xa1\x35\x6c\xbd\xd5\x4e\ \x2f\x7a\x1f\x62\x61\xf4\x7d\xec\xd8\xd5\x9f\x2e\x30\xb1\x5a\x7f\ \xaf\xc5\xe8\xb5\xda\x0d\x87\x82\x35\xda\xd3\x68\xb7\x39\xfa\x75\ \x2a\x04\x97\xa7\x8c\x8b\xe6\x08\xcd\x9e\xed\x2e\x49\x8e\x60\xa5\ \xbb\xd6\xca\xd8\x64\x7f\x67\x49\x33\xd8\x73\xb5\x56\x68\x3d\x47\ \x29\xc5\x9f\x7f\x27\xa6\x5a\x17\xf4\x76\x69\x36\xf6\xb7\xce\x41\ \x68\x0f\x31\x57\xeb\x30\x35\x1b\x93\xb8\x85\x53\xb3\x86\xe0\x61\ \xa4\x49\x5d\x4f\xd4\x55\xd5\x40\xad\xc4\x6b\xb3\xf6\xab\xd9\xe4\ \x64\xbb\x02\x0c\xea\x95\xfb\xda\x9e\x71\x2d\xed\x90\x98\x01\xf3\ \x5d\x21\x79\xd6\xfb\x18\xd5\xd1\x07\xd9\xb1\x6b\x60\xd5\x3e\xbe\ \xd1\x26\xda\x4d\x00\xac\x3b\x14\xac\x55\x80\xb6\xab\xf3\xa7\x23\ \xd6\x10\xfd\xca\xa4\xb1\xed\x00\xfb\x76\x7a\x4d\x55\x9e\x9e\xbb\ \x82\xc1\x2d\x4c\x1e\xea\xd1\xfc\xa3\x9f\xf1\x78\xe0\x4e\xbb\xb2\ \xe7\x4a\x4d\x60\xcf\x5d\x28\x2b\xbe\xf1\x98\xc1\x02\x43\x03\x06\ \xd1\x27\x39\x88\xa6\xc0\x98\xfa\xc4\x0b\x13\x09\x33\x14\x8b\xcb\ \x8a\xe5\x2a\x44\x71\xeb\xda\x83\xd0\x44\xf6\xab\x8c\xa0\xe4\x95\ \x75\x73\xf4\xb7\x0a\x43\x7b\x82\xc8\x1c\x5d\xcd\xb6\xb7\x69\x01\ \xbd\x8a\xc6\x10\xb4\x8f\xfe\xc4\xe6\x3b\x07\xa9\x0f\xbd\x2d\x65\ \xfe\x1b\x51\xf3\x6b\x6d\xab\x15\x13\x50\x73\x3d\xaf\x75\x91\x28\ \x67\x1d\x26\x40\x07\xda\xac\xc7\x9e\x32\x36\x19\x51\xf5\x50\x71\ \x79\xc2\xd4\xcb\xdd\xb6\xc7\xa7\xa3\xc0\x0a\x15\xdd\x9a\x0f\x68\ \x67\x72\x2d\xd4\x78\xae\xe6\x27\xde\xed\xf2\xcf\x7e\xd1\x67\x74\ \x88\xb6\x6b\x5a\xcd\xc4\x8b\x47\x4d\xe7\x87\x7a\x57\x0a\x94\xe9\ \xd3\x96\x11\x4d\x6f\x07\x9c\xbf\x1c\xb7\x60\x13\xc5\xc4\x8c\x22\ \x8c\x9a\xc9\xab\xa6\x19\x58\x9d\x50\x4d\xec\xd7\x6a\xef\xd7\x08\ \x24\xb5\x79\x09\x4d\x2f\x23\x3d\x2f\x3d\x96\x52\xb2\xed\xbb\x10\ \x34\x7f\xf3\x40\x2b\x22\x3c\x4e\x38\x87\x18\xdd\xdc\xb3\x2e\x86\ \xde\x68\x9b\x1c\x37\xbf\x04\x50\xc8\x17\x7d\xd7\xf5\x3c\x4c\x3e\ \xe1\xfa\x20\x50\xa3\x82\x66\x24\xb0\x45\xf5\xda\xd1\xfd\xfb\x5f\ \x99\xa1\x52\xd3\x64\x3c\xc1\xa7\x7f\xac\xd0\x34\x13\x96\x81\x5d\ \x1d\x70\x55\xf4\x0f\xc5\xf2\x72\x9c\x3e\xa1\xbb\x24\x98\x9e\x8d\ \x9b\x1a\x66\x85\xe6\x98\x5f\x52\x5c\x99\xd1\x6c\xe8\x17\x56\x65\ \x36\xef\xe5\xbb\x8a\x8f\x3c\xe8\x52\xae\xc2\xd9\x8b\x51\x4b\x1f\ \x35\x95\xba\x26\x8a\x68\xe9\xaf\x4e\x1c\x97\x6b\x12\x35\x5d\xd6\ \xe5\xaa\xd1\x6f\xfa\x9b\x78\x15\x4d\xc6\x27\x47\x9a\xff\xb7\x99\ \x0e\xbd\xf2\x18\xe9\x7d\x13\x13\x70\xc6\xb9\x93\x6c\x77\x1f\xf9\ \xc2\x9b\xfb\xb3\x34\x71\xa4\x38\x7d\x62\x86\xf9\xb9\x6a\xf2\xae\ \xa2\xa7\xa7\x2f\x87\x89\x26\x7a\xeb\x30\x01\x3a\x10\x68\xf7\xaa\ \xec\x9e\x65\xc0\xe5\xc9\x90\xdf\xfd\xd3\x19\x1a\x91\xe6\xc0\xee\ \x80\xcf\x7d\xa8\x44\x4f\x87\x60\xe3\x80\xc3\xaf\xfc\x83\x22\xbf\ \xfd\x2b\x1d\xfc\xc2\x27\xf2\x64\xb3\xad\x76\xdb\xa8\xf6\x84\x44\ \x27\xce\xc7\x2c\x55\x62\xda\x40\x64\x2b\xe2\xd7\x8a\x93\xe7\x62\ \x36\xf4\xd1\x62\x02\x14\xb9\x8c\xe6\xbf\xfb\xa4\xcf\x96\x0d\x82\ \x6f\x3d\x16\x52\x6b\x58\x9c\x62\x05\x28\x8e\x35\x61\xdc\x82\x4b\ \x50\xa9\x47\x72\xad\x91\x95\xb8\x8a\x5a\x2b\x54\x2b\xb3\x75\x93\ \xb9\xda\x6e\x81\x76\x81\x58\x0d\x2c\xb6\x8e\x7e\x0d\x24\xeb\x20\ \xda\xbe\x46\x78\x1c\x77\xee\x65\x78\xa4\x6b\xd5\x3e\xbd\x11\x6d\ \xa0\x35\xcc\xcd\x56\x39\xfa\xca\x44\xca\x7c\x80\x28\x8a\xd4\xd4\ \xd4\xb8\xc2\xac\x02\xef\x5f\x37\x0e\xa0\xb5\x0a\x34\xca\x45\xeb\ \x34\xbb\x97\x64\xf3\x92\xa0\xcf\x89\xf3\x55\xfe\xe9\xef\x4f\xf0\ \xb9\x0f\x77\x73\xef\x81\x0c\xf7\x1e\xc8\x98\x8b\x6d\xff\xf6\xef\ \xf2\xf8\xe5\x9f\x2c\xf0\xdb\x7f\xb8\x48\x92\xf1\x5b\xae\x6a\x62\ \x25\x70\xa4\xe6\xa5\x63\x0d\xd2\xa4\x91\x6e\x5e\x68\x12\x4b\x86\ \x78\x4a\x2b\x8a\x39\x87\x42\x0e\x96\x96\x15\xb7\xed\x76\xf9\xc4\ \xc3\x3e\xa5\x3c\xbc\x7e\x36\xe6\x91\xe7\x1b\x6d\xa3\x14\xa0\xbb\ \x24\xb8\x30\xd1\xac\x1d\x48\x01\xe4\x75\xde\x39\xad\x08\x6a\x31\ \xd7\x89\xcb\xd6\x3e\xfa\x69\x8e\xf4\xd5\xd4\x7f\x9b\xfd\x5f\x89\ \x0d\x9a\xc8\xff\x8a\xb3\x83\x86\xc8\xd1\xdd\x9d\xbf\x1e\x3b\xae\ \xdb\xea\xb5\x88\xc9\x89\x25\xa6\x27\x97\x09\xc3\xab\xa7\x10\xcc\ \xcc\x4c\xd6\x94\x52\xc9\x6f\x41\xac\xfa\xf3\x92\x6d\xad\xcd\x04\ \xb4\x31\xc6\x06\x82\x2c\x43\xc7\xa7\x42\x7e\xfb\xff\x99\xe4\x9e\ \x5b\xf3\xec\xdc\x1c\x30\xd4\xeb\x92\xcb\x3a\x4c\xcf\x45\x2f\x30\ \x97\x93\x00\x00\x16\x9e\x49\x44\x41\x54\x4c\xce\x2a\x8e\x9c\x08\ \x5b\xec\xa4\xa9\x9d\x0b\x23\x85\xe3\x0b\x5e\x39\xd1\xb0\x04\x6a\ \x71\xc7\x92\x78\x85\xa5\x57\xe0\x99\x63\xef\xbc\xcb\x61\xcf\xd6\ \x80\xd1\x41\xf3\xf7\xcb\xc7\x63\xfe\xf0\x2f\x6a\x44\xe9\x6f\xf8\ \x9a\x5e\xfb\x9e\x60\xc3\x80\xc3\x93\x87\x1b\x4d\x13\x80\x8d\x03\ \xac\x01\x02\xd3\x77\x4e\x05\xa5\x55\xeb\x25\x79\x96\x56\xc6\xaf\ \x60\xfa\x2a\xc2\xb0\x72\x9b\x2a\x00\x8b\x03\xd0\x8a\x25\x7a\xd2\ \xcb\xde\x88\x85\xd7\x5a\x33\x37\x5b\x61\x72\x7c\x89\x85\xf9\xda\ \x35\xcf\x7d\xfc\xc9\xff\x3a\xc9\x8d\x44\x02\xb5\xd6\x19\xe3\x0a\ \xda\x28\xa0\x1d\xfd\xa6\x25\x93\x22\x4c\x04\x50\x6b\xc1\x13\x2f\ \x95\x79\xe2\xa5\x65\xda\x57\x08\xb3\xb5\xf8\xa2\x39\x89\xa2\x98\ \x73\xc8\xf8\x82\x6a\x5d\x33\x35\x1f\xb7\x97\x50\x08\x61\x8b\x67\ \x9b\xe4\xc8\x06\x86\x8c\xef\xb9\xc7\x54\x08\x4d\xcf\x6b\xbe\xfa\ \xed\x1a\x87\x8f\xb7\xac\xba\x61\x7a\x8c\x06\x6e\xde\xe6\x22\x85\ \x66\xec\x4a\xab\xe0\x59\x13\xd0\x72\x76\x3b\x08\x4c\x18\xd8\x5a\ \xf5\xa4\x49\xe6\xd6\xa5\xa3\x3f\xf1\x12\x5a\xb6\x2b\x81\xdf\x9a\ \x23\xbf\x75\xab\x4d\x61\x6d\x4d\x14\x00\x98\x9f\xaf\xd0\xdd\xb3\ \x3e\x2d\x10\x85\x31\xe5\x72\x9d\x85\xf9\x2a\xff\x5f\x75\x67\x1e\ \x6b\xc7\x55\xdf\xf1\xcf\x39\xb3\xdd\xe5\x6d\x8e\xfd\xbc\x25\x5e\ \xc8\x42\x70\x1c\x9c\x40\x88\x63\x92\x10\x48\x1a\x40\x25\x0d\x69\ \x21\x6c\x52\xd3\xd2\x4a\x15\x2a\xad\x10\x12\x15\x82\x3f\x28\x94\ \xa2\x6e\xa1\x94\x00\x15\x42\x45\x0a\x82\x12\x51\x11\x70\xc8\x42\ \x02\x59\x9d\x38\xa1\xc6\xb1\x0d\x89\xf7\xfd\x79\x7b\xdb\x7d\xcb\ \xdd\x97\x99\x3b\xa7\x7f\x9c\x59\xef\xbd\xcf\xbe\x76\x22\xda\x1e\ \x69\x34\x73\x67\xe6\xde\x3b\x33\xdf\xef\xf9\x6d\xe7\x37\xe7\x37\ \x3d\x59\xe9\xd9\xdb\x3b\x5b\xb9\x52\xf2\x1e\xfa\xd9\x03\xe3\xe8\ \xa4\x52\x17\xf0\xce\x1d\x0a\x56\x7e\x86\x30\x27\x30\x04\x3f\x1a\ \x10\x12\x29\x95\x10\x4a\x83\x68\x3c\x20\x31\xf6\x1f\x27\x7b\xe8\ \xde\xbd\x7c\x89\x4e\xf3\x3e\x3d\xe9\x11\xc7\xf9\x83\x9e\x9f\x20\ \x58\xd8\xd6\x5e\x12\x9b\x2b\xcf\xef\x68\xf1\xe0\x93\xf5\x68\x8e\ \x82\xb8\xc7\x45\x17\xcd\xad\x9b\x6c\x00\x4e\x9c\x09\xd2\xcd\x52\ \x12\xa0\x7b\xba\xf8\xd4\xb7\x23\x37\x30\xb9\x26\x21\xd2\xd3\xba\ \x3f\xe5\x0d\x44\xc6\x5d\x0f\x12\x74\x18\x86\x22\xb0\x03\x6c\x5f\ \x5b\xe8\x63\xc7\x0a\x64\x73\x36\xd9\x6c\x7a\x66\x38\xcf\xf3\xa9\ \x94\x1b\x94\xcb\x0d\x2a\xa5\x26\x95\x4a\x83\x66\xe3\xfc\xe6\x90\ \x06\x78\xfc\x89\x07\x27\xea\x8d\x5a\x13\xa8\xa3\x4b\xd0\xd4\xfb\ \x50\x01\x6a\x20\x64\x6b\x18\xcf\x4f\x26\x79\xac\x5a\x61\xb2\x76\ \xa5\xc3\xd6\x9d\xd5\x94\x34\x08\x7b\xbf\x8a\x5e\x9d\x4a\x13\xe1\ \xad\xeb\x02\x80\x26\x5c\xe2\x91\x46\x11\x3c\x98\x30\x28\xa3\x09\ \x71\xf1\x32\x83\xe1\x01\x49\xa9\xa2\xb8\x7f\x73\x85\xbd\x47\xe3\ \x9b\x1f\xbd\xc8\xe0\x8f\xef\xc8\x33\x36\xe1\xf1\xcb\x17\x1b\x94\ \xab\x3e\x97\xaf\x36\xb9\x62\xb5\xc9\xd4\x6c\x9b\x86\xeb\x23\x0d\ \x41\x3b\x70\x07\xe3\x37\x79\x17\x6e\xf1\x60\x90\xd2\x95\x46\xc3\ \x72\xb3\x5d\xbd\x9e\x94\x7b\xd9\x49\x8c\x14\x09\xba\xd4\x44\xe0\ \xc9\xf8\x92\x2c\x3a\x15\xad\x5c\x6a\xf0\xf2\x7f\x1f\x65\x60\x30\ \x13\x5d\x8b\xe7\xb6\xa9\xd7\x3b\xa5\xdc\xf9\xb7\x72\xb9\xe8\x3e\ \xfc\xc8\x8f\xc6\xd1\xc0\xcf\x03\x73\x40\xa5\x8f\xc1\x20\x95\x57\ \xca\x4f\x19\x80\x42\x69\x1b\x40\x28\x9f\x4f\xdc\xbd\x94\xd5\x2b\ \x33\xdc\x72\x7d\x83\x7f\xfb\xde\x38\xf5\x56\xa8\x22\xba\x7b\x7f\ \x48\x84\x9b\xdf\x92\xe7\xf6\x4d\x39\x7c\x5f\xf0\xec\xb6\x9a\x96\ \x00\x41\xcf\xd7\x9a\x36\x56\x05\x28\xd8\x78\xb5\x7e\x20\xff\xf9\ \x68\x85\x3d\x47\xd2\x99\x50\xd3\xb3\x3e\xe3\x05\x97\xf7\xde\x98\ \xe5\xd6\xeb\x1d\x66\xcb\x82\x89\x62\x86\x03\x93\x19\x26\xe6\x4d\ \x3e\xfc\x91\xd5\x38\x8e\x49\xab\xe5\xe1\xba\x7e\x94\xfe\xa5\x7f\ \xbe\xc3\x06\x88\x3a\xac\x1f\x81\x15\xad\x05\x2c\x24\xfa\x3b\xc9\ \x90\x96\x14\x49\x57\xb1\xd3\x10\xd4\x41\xa9\x65\xee\x1e\x44\xe6\ \x8f\x50\x42\xa7\x5e\x96\x4b\x67\xd7\xe3\xe7\xdb\x9a\xcd\x86\xff\ \x8d\x7f\xff\xca\xd1\x46\xb3\x5e\x47\x57\x1e\x2b\xa0\x5f\x34\x2d\ \xf5\x63\x03\xe4\x63\x3d\x18\x18\x43\x09\x03\xd0\xb2\x34\x64\x57\ \xae\xc9\xf0\x99\x3f\x5d\xce\xbd\xf7\x8f\xd3\x74\x55\x2c\xf2\x53\ \xa2\x5f\x70\xe5\x9a\x0c\x7f\x72\x97\x2e\xd8\xb4\x75\x57\x95\x33\ \x53\xad\x08\xe8\x58\xe4\xc7\xaa\x60\xc9\x88\xc1\xed\x9b\xb2\x1c\ \x3e\xd1\x62\xd7\xbe\xee\x07\xa3\x14\x3c\xf0\x58\x85\x23\xa7\x05\ \x1b\xaf\x5f\x49\xcb\x5a\x44\x7e\xa9\x83\x93\xb3\x78\xd3\x1a\x8b\ \x6c\xce\x8a\x92\x3d\x9a\x4d\x8f\x56\xab\x8d\x65\xf5\xbe\xed\xa8\ \xaf\xaa\x04\x88\x01\xd8\x22\x01\x6a\xaf\x75\x0c\x6d\x07\x09\x42\ \xdd\x91\x5a\xd2\xfb\x6c\xbf\xcc\x92\xfa\x6f\x98\xce\x5d\x77\x2e\ \x38\xce\xbb\x55\x6b\x15\xef\x9f\xef\xfd\xdc\xe1\xbd\xfb\x7e\x3b\ \x0b\x94\xd1\xe0\x87\xd5\xc8\xfa\x91\x00\x7e\x3e\x0c\xec\xc4\xbd\ \x9a\x68\x7b\xdf\x91\x1a\x2b\x46\x6d\x40\x71\xc5\xda\x0c\x5f\xf8\ \xc4\xc5\x3c\xbd\xbd\xc8\xf6\x57\x6a\x54\xea\x7e\xd4\xeb\x0d\x53\ \xf0\xee\x4d\xc3\xfc\xe1\xed\xc3\x98\x12\x5a\xae\xcf\xe6\xa7\x8a\ \xfa\x77\x55\xd2\xbb\xd0\x84\x5a\xba\xc8\xe2\xfa\xab\x1d\xde\x7b\ \x63\x1e\xcb\x80\x55\xcb\x2d\x46\x86\x04\x73\xa5\xb4\xb1\xb3\x68\ \x51\x8e\x0d\xd7\xac\x64\xc3\x35\x2b\x18\x5d\x31\x40\x2e\xa7\x55\ \x4b\x97\xcf\x2c\x85\xd6\xaf\xb9\xb3\xf8\xcf\x51\xc7\x4c\xf4\xfc\ \x90\x04\x02\x92\xd9\xc7\xc9\xf0\x72\x2c\x05\x12\xd2\xa1\xa3\xf7\ \x77\x91\x41\xf9\x41\x9e\xa1\x8f\x40\x71\x59\xf1\xa7\xcc\x5a\x97\ \xd3\xb6\x86\x79\xbd\x5a\xb1\x34\xef\xfe\xc3\x3f\xfd\xcd\xa1\x23\ \x47\x0f\x94\xd0\xd5\xc7\xa6\x81\x53\xe8\xa4\xd2\x02\x50\xeb\x27\ \x0e\x90\x53\x09\x77\x2f\x34\xf0\x42\xfd\xfe\xdb\x43\x15\x6e\xdb\ \x34\x12\x9d\xbf\x6a\xa5\xcd\xc7\xef\x1a\xe5\x9e\x3b\x05\xaf\x1e\ \xaa\x52\x98\xf3\x18\x19\x30\x59\x73\xb1\xc3\xd2\x45\xfa\xef\xda\ \x0a\xbe\xbb\x79\x96\xb9\x92\x1b\x79\x09\xa6\x21\x79\xdb\x7a\x87\ \xab\xaf\xc8\x72\xd5\x65\x16\x8b\x06\xd3\x97\xe6\x58\xf0\x89\x0f\ \x0d\x71\xdf\x0f\xe7\xa8\xd5\x35\x52\x1b\x6f\x58\xc3\xcd\xb7\xbc\ \x81\xd1\x65\x79\xec\xb3\x84\x34\xfa\x0d\x9f\xc6\x12\x40\x93\x32\ \x99\x7a\x2e\x12\x00\x76\x93\x20\xb9\x26\x41\x9c\xf0\x57\x3b\x3c\ \x83\x58\xd7\x04\x6f\x08\xf9\xe4\x29\xb1\xe2\xd4\x77\x38\xb9\xea\ \x53\x08\x33\xb6\x01\x2e\xb4\x1d\x3b\x7e\xa8\x7a\xdf\x37\xff\xee\ \xd8\xa9\xd3\x63\x15\xa0\x82\x2e\x3e\x79\x02\x38\x86\x7e\xbd\xac\ \x04\xb4\xfa\x51\x01\x39\x2d\x02\xfd\x94\x81\x17\x1a\x81\xe3\x53\ \x71\x94\x49\x25\xcc\x37\x43\x2a\xae\xbd\x32\x47\xd2\x92\x57\x80\ \xd7\x56\x7c\xfb\x47\x05\x76\xec\xad\x69\x4e\x29\xc1\x50\xde\xe4\ \x73\x7f\x31\xca\xca\x25\x66\x74\xfe\xc1\xb1\x16\x87\x4f\x36\x39\ \x35\xe1\x31\x35\xeb\x31\x5f\xf6\x29\x56\x7d\xda\x9e\x06\xf4\x1d\ \xb7\x5c\xce\xad\xb7\x5f\xc6\xd0\xf0\x6b\x7f\x58\x89\xbb\x05\xc2\ \xe1\x60\x11\xf4\x7c\xdd\x4b\x93\x71\x80\x73\x93\x40\xa5\x48\xa0\ \x3a\xbe\x27\x02\x7b\x42\x04\xd2\x4f\xa2\xb0\x0c\xc5\xa8\x77\x98\ \xe9\xdf\x7c\x91\xd2\x1b\x3f\x85\x33\x74\xf1\x05\xdd\xc1\xc1\x83\ \xbb\xcb\x3f\x79\xe8\x07\x13\x3b\x76\xbe\x54\x44\xa7\x8e\x57\xd0\ \x3d\xff\x18\xba\x16\xe1\x18\x71\x3d\xc2\x73\xbb\x81\x0a\x3f\x17\ \x3d\x80\x94\xbb\xa7\xf3\xfd\x27\x0a\x4d\x6d\xe9\x0b\xc5\xfd\x9b\ \x4f\x61\x9a\x26\xd7\xad\x1b\xe4\x4d\x97\xe6\x31\x64\xcc\x7e\x5f\ \x09\x5e\xdc\x59\x66\xf3\x53\xb3\xcc\x14\xdb\x09\xdb\x40\x31\xba\ \x48\x04\xe0\x6b\x7a\x7d\xf9\xdb\x13\x8c\x9d\x49\x5a\xbe\x31\x89\ \x0c\xc3\xe0\xb6\xdf\x7b\x23\x37\xbf\xf3\x52\x06\x06\xed\x0b\x7a\ \x48\x67\xb9\x59\xbd\x52\xda\xe0\xd5\x5e\x80\xd2\x5e\x80\x20\x05\ \x6e\x0a\xf4\x05\x6c\x83\xae\x7d\x49\x09\xa2\xfc\x88\x00\x02\x85\ \x29\x60\xc0\x86\x51\x31\xc1\xe4\x0b\x9f\xe5\xd4\xf0\x3b\x58\xb1\ \xe1\x83\xe4\x86\x46\xcf\x7d\xd9\x4a\xb1\x7b\xcf\xce\xd2\x4f\x36\ \x7f\x7f\x62\xf7\x9e\x9d\x25\xb4\x9f\xdf\x44\xeb\xfc\x69\x74\x29\ \xa0\x43\xc0\x61\x74\xef\x2f\x02\x2d\xa5\x94\xdf\x8f\x0a\xc8\xc6\ \xe9\x60\x5a\x47\x27\x03\x42\x2d\x57\x51\x98\x6b\x32\xba\xc8\xe6\ \x92\x65\x19\xbe\xf7\xd0\x04\xbf\xd8\x3a\x83\x6d\x1b\x2c\x1e\xb2\ \x19\xc8\x1b\x54\xaa\x3e\x33\x25\x0f\xcf\x53\x51\x40\x28\x39\x5b\ \xc6\x91\xd3\x0d\x66\x4b\x1e\x17\x0d\xe9\x12\x32\xb5\x66\x18\x81\ \x0b\x9b\x3e\x4f\x1a\x82\xf7\xbc\x67\x1d\x6f\x7f\xc7\x5a\xf2\x03\ \xfd\x83\x9f\x8c\xfd\x9f\xf5\xbc\xc4\xf9\x2a\xd0\xd3\x11\x80\x9d\ \xe2\x3f\x05\x6c\xe7\xba\xbb\xd7\x27\xbf\x23\xc2\x7f\x0b\xdc\x4d\ \xa1\x7c\x2c\xa9\xc8\x59\x82\xd1\xbc\x64\xf5\xb0\xa2\x36\xf1\x24\ \xdb\x77\x3f\x4e\x89\xc5\x98\x43\xab\x18\x58\xbc\x9a\x8b\x46\xd7\ \x30\xb2\x78\x05\xe5\xe2\x0c\x85\xa9\x13\x14\xa6\x4e\x30\x7e\xe6\ \x64\xfb\xc5\xdd\x47\x4e\x36\x1a\xf5\x39\x74\xbd\x47\x17\xdd\xbb\ \xe7\xd1\xe0\x9f\x46\x17\xff\x1a\x43\x83\x1f\x9e\xe7\x43\x1f\x33\ \x4e\x28\xa5\xb2\x69\x23\xb0\x43\x0d\x08\xc1\xd1\x93\x35\x46\x17\ \x59\x6c\xbc\x7a\x98\xef\x3d\x74\x06\xa5\x04\xcd\xa6\x62\xbc\xd0\ \x86\x42\x1c\x05\xd4\x2d\x8e\x0c\x86\xf3\x0a\xfb\x6d\xc1\xa3\x5b\ \x8a\xdc\x73\xe7\x62\x0c\x03\xbe\xf4\x97\xcb\xf8\xed\xfe\x1a\xae\ \x87\x5e\xda\x3e\x93\x05\x8f\xc9\xca\x00\x57\xbd\x79\x39\xb9\xfc\ \xf9\x4e\xa1\x1f\x03\xdb\x99\x43\x97\x5c\x87\xd3\xc9\xeb\xe9\xdf\ \xe3\x9e\x1a\x45\x02\x7b\x01\xda\xc3\x35\x3c\x7b\xbc\x80\x30\x16\ \x9c\x20\x81\x96\x06\x8e\xa1\x58\x94\x15\xac\x1e\x31\xf1\x7d\x85\ \x29\x05\x63\xb3\x33\x4c\x4c\x4e\x71\xfc\xd8\xaf\xd9\xeb\x2a\x5a\ \x9e\xa2\xad\x82\x62\x9a\xe8\x6a\x39\x8d\x46\xbd\x85\xee\xd5\xe5\ \x60\x99\x43\xeb\xfc\x33\x01\x01\xce\x04\x64\x28\x85\xe0\xab\xc0\ \x60\xe9\x27\x12\x68\x47\x96\x7a\xc2\xfd\x8b\xa5\x81\x60\xcb\x8e\ \x02\x37\x6c\x18\x66\x64\xd0\x60\xdd\xa5\x59\xf6\x1e\xa9\x75\xb9\ \x7f\x51\x1c\x20\x9c\xc6\x2d\xda\xaf\x49\xf1\x9b\x7d\x15\xee\xb9\ \x53\xc7\xc4\xb3\x8e\x64\xd3\x35\x03\x1d\xd7\x21\x78\xe9\xf8\x0a\ \x96\x2c\x7d\xed\x03\x26\x0b\x35\xc3\xd4\xd1\xc6\x4c\x36\x4b\xb5\ \x56\x43\x83\x1c\x8e\x05\xe8\xe4\xcd\x6e\xf0\xfd\x05\xc0\x27\x3e\ \x8f\x34\x71\x82\xe7\x4a\x3c\x36\xad\x8d\x4c\x43\x28\x72\xb6\x60\ \x74\xd0\x40\x4a\xc8\x5a\x92\xa1\xac\x64\x71\xd1\xa3\x50\x69\x53\ \x6c\xf8\xd4\x9a\x3e\xcd\xb6\xa2\x1d\x84\x4e\x4c\x03\xb9\x7d\x4c\ \x54\x3c\x5f\x9d\x04\x26\x81\x59\x34\xd8\x93\xa4\xcb\xcd\x57\xe9\ \x51\x89\xb4\x1f\x1b\xc0\x50\xca\x47\x0a\x43\x5b\xff\xc9\xa8\x5e\ \x20\x11\x76\xee\x2b\x32\x5b\x72\xb9\x68\xc8\x62\xd3\x86\x11\xf6\ \x1c\xae\x24\x7a\x78\x27\x11\x80\xd4\x7e\xfd\xf9\xb2\x35\x0e\x3f\ \x7f\x61\x8e\x89\x69\x97\x4a\xbd\x4d\xa5\xea\x63\x9a\x70\xe3\x5b\ \x86\xd9\xb8\x3e\x47\xa1\x3e\x44\x5b\xd8\x98\xd1\x5c\xeb\xaf\x6f\ \x6b\x7b\x3e\x13\x67\x8a\x00\xd8\xb6\x95\x50\x03\xc9\x18\x48\x1f\ \x3d\x3f\xa9\x1e\x3a\xbd\x83\x04\x19\x44\xa0\x62\xf4\x47\x4d\x06\ \x29\x14\x96\x21\xc8\xdb\x12\x43\x0a\x32\x96\x64\x38\x2b\x59\x36\ \x68\x32\x5b\x6d\x33\x5f\x6f\x53\x6d\x29\xea\xae\x8f\xd7\xd6\x8f\ \xd1\x92\x82\xad\x47\xea\xa5\x53\xf3\xde\x01\xb4\xa1\x37\x8b\x96\ \x00\xb3\xc4\xe5\xe6\x93\xc5\xa7\x23\xf0\xa1\x3f\x09\x60\x28\xa5\ \x58\xbe\xd4\xe6\x93\x1f\xbd\x82\xed\xaf\xce\xf1\xf0\x73\x67\x48\ \xbe\xe8\xd9\x6e\x2b\x9e\xfd\x75\x81\x0f\xde\xbe\x82\x5b\xde\xb6\ \x88\x9f\x3d\x3b\x41\x61\x4e\xcf\x12\xd2\x4d\x18\x22\x17\x52\x1f\ \x07\x25\x04\x2f\xed\x9a\xe7\xa5\x5d\xc1\x1e\x41\x74\xee\xee\x43\ \x35\x7e\x98\x95\x7c\xe0\xee\x9b\x18\x18\x8c\xc7\x03\xce\x25\xce\ \xcf\x67\x5d\x2e\x35\x39\x7a\x68\x9a\x56\x4b\xc7\x18\x66\x67\x67\ \x40\x09\x1d\x35\xec\x65\xc0\x2d\x44\x82\x14\xe8\xdd\x99\x48\xd1\ \x5a\x04\x64\xe8\x20\x00\xe8\x09\x29\x6d\x53\x60\x48\xb0\xa4\x41\ \xce\x12\x5c\x94\x33\x28\x37\x7d\xaa\x4d\x9f\x86\xa7\x68\x7a\x8a\ \x76\x10\xab\xb0\xa4\xe0\xbb\x2f\x89\x49\xb4\x81\x77\x30\x00\xbf\ \x86\x8e\xf7\xb7\x38\x47\xb9\xf9\x3e\x32\x82\xf4\x9b\xc1\xa7\x27\ \xab\xfc\xed\xb7\x5e\x61\xe5\x52\x87\x5b\x37\x2e\x25\x95\xf2\xa5\ \x7c\x9e\xde\x36\x45\xcb\x53\x38\x96\xe4\xaf\x3e\xb6\x86\xc5\xc3\ \x26\xc9\x14\x30\x12\xdb\xe9\xbc\x3f\x15\x9f\x13\xa5\x82\xa9\xd4\ \x39\x76\x26\x83\x69\xd9\x34\x9b\x6d\x7a\xdf\xc6\x85\xb5\x52\xb1\ \xce\x91\x83\xd3\xec\x79\xe5\x4c\x14\x6f\x77\xdd\x16\x53\xd3\x53\ \x01\xa0\xc9\xec\xe3\xf3\x01\xff\x1c\x2e\x62\x4a\x02\x24\x55\x81\ \x6e\x02\x02\x09\x20\x18\xcc\x48\x16\xe7\x0d\x2e\x1e\x31\x79\xc3\ \x12\x8b\x2b\x46\x2d\xd6\x2d\xb3\xb9\x6a\x85\xc3\xfa\xe5\x0e\x83\ \x8e\x2c\x1e\x9d\x71\x8f\xa3\x2d\xfd\xd3\x68\xf1\x3f\x8f\x26\x41\ \x4b\x29\xd5\x5e\x08\x7c\xe8\x6f\xda\x31\x23\x1c\x08\x6a\xb7\x15\ \x0f\x3c\x36\xc6\x7d\x9f\xbf\x8e\xf1\x42\x8d\xfd\x47\xcb\x91\x78\ \x9f\x9a\xa9\x73\xdf\x0f\x0e\xf3\x99\x3f\x7b\x23\xeb\xde\x30\xc0\ \xd7\x3f\x7f\x15\xcf\xef\x98\xa3\x52\x75\xa3\x61\x60\x00\xb7\x0d\ \xcd\x66\x9b\x46\x53\xd1\x68\x29\x5e\x39\x50\xa1\x54\xd5\xb3\x84\ \xc7\x23\x81\xc9\xc8\xa0\x62\x20\x78\x19\x46\x29\x45\xad\xda\x62\ \x60\xf0\xc2\xd2\xa6\xf4\xf7\x5d\x66\x0a\x55\x66\x0b\x35\x5a\xad\ \xee\x11\xb5\xe7\xb6\x3c\x85\xdf\xf6\xf0\xfd\x76\xaa\x37\x47\xb3\ \xfe\x85\x92\xe0\xac\xe0\xf7\x88\x18\x26\xac\x82\x34\x01\x7a\xab\ \x34\x81\xd6\x92\x96\x21\x30\x25\x38\x4a\x04\xd3\xea\x85\xf7\xa2\ \xd7\xcf\x1e\xaa\x8d\xa1\x75\xfd\x24\x5a\xe4\xbb\x9c\x47\xc5\xf1\ \x7e\x06\x83\xcc\x38\x12\x28\x99\x2b\x37\xf8\xe6\x03\x07\xf8\xec\ \x9f\xaf\xe3\x8b\xdf\x7a\x85\x13\xe3\xf5\x48\x9f\x6f\x7b\xb5\xc0\ \x17\xbe\xd9\xe2\x8e\x77\xae\xe0\xca\x35\x79\xae\x5f\x3f\x8c\x61\ \x0a\x2c\x43\x62\x59\x32\xfd\x8a\x75\xd0\x6a\x2d\xc5\x43\x4f\x4f\ \xf2\xf8\x0b\xb3\xba\xa8\x11\x69\xd5\x80\x22\xa5\xf7\xa7\x26\x6b\ \xe4\x07\xec\xf3\x12\xf3\xb5\x5a\x8b\xb9\x99\x3a\xb3\x85\x2a\x8d\ \xb3\x0c\xa3\x36\x1a\x75\x1e\xff\xc5\xc3\x5a\x3d\x29\x1f\xa5\xda\ \xf8\x4a\x61\x84\xf0\x25\xc3\xbc\x9d\x2e\x5f\x0f\xf0\x23\xe3\xaf\ \x43\x62\x10\xfc\x56\x3f\xe2\x2c\x24\x82\x12\x10\x96\xdb\x0e\xdb\ \xf1\x19\xb7\x74\xef\x53\xb3\x2f\xa3\xc3\xbb\x55\xf4\x4b\x96\xe7\ \x55\x6e\xbe\x2f\x09\xa0\x7b\x80\x1e\x06\x16\x08\xb6\xbf\x3a\xcd\ \x7f\x3d\xe1\xf0\x95\x4f\x6d\xa0\xd1\x6a\x73\xf4\x64\x95\x43\x63\ \x15\xb6\xee\x2c\xb0\xff\x68\x89\x03\xc7\xca\x84\x20\xc6\xbd\x5f\ \x60\x9a\x12\x53\x4a\x32\x8e\x49\x2e\x67\x30\x90\x91\xac\xbb\x6c\ \x88\xdb\xdf\xbe\x98\xdb\x37\x2d\xe6\x81\x47\x27\xd8\xf6\xea\x3c\ \x9d\x79\x01\x95\xf0\x35\x1f\xa0\x5c\x6c\x32\x5b\xa8\xa3\xf3\x1a\ \xd3\xad\xdd\x56\x34\x1b\x2e\x8d\xba\x47\xa3\xe1\xd1\xa8\xbb\xd4\ \xeb\x1e\xad\x66\x7f\x63\xe7\x4f\x3e\xf5\x18\x95\x4a\x89\x8c\x33\ \x4c\x1c\x7c\xf2\x89\xef\x3f\xe1\xdb\x9f\x43\xfc\xa7\xb6\x7b\xa8\ \x0b\xa2\xf3\xfa\x33\x6a\x3b\xcf\xda\x3e\xd6\x28\xfc\xc1\x77\x4e\ \xfd\x62\xaa\xdc\xde\x8b\xd6\xfd\x55\xce\xbf\xd2\x78\x9f\x04\x08\ \xc5\x55\x62\x84\xef\xe7\x5b\x4e\xf2\xe4\x8b\x67\xb8\x61\xc3\x12\ \xde\xb5\x71\x39\x1f\xbb\x63\x35\x1f\xbb\x63\x0d\x0f\x3f\x73\x8a\ \x1f\x3c\x72\x82\xd8\xd2\x57\xd1\xb6\xeb\x29\x3c\x7c\x1a\x6e\x9b\ \x62\x45\xdf\xd6\xa1\x13\x35\x1e\xd9\x32\xc1\x3d\x77\x5e\xc2\xa7\ \xef\x59\xc5\xbf\xdc\xef\xb1\x73\x5f\x39\xf6\x16\x80\xb9\xb9\x62\ \x2a\x98\x73\xea\x44\x89\x99\x42\x5d\x13\xca\x94\x78\x9e\x4f\xa3\ \xe1\xe1\xb6\xce\x9d\x15\xb3\x50\x2b\x97\x4b\x3c\xf1\xcb\x47\x00\ \x11\x97\xa3\x89\x42\x36\xc1\xfd\x27\x04\x79\x3f\x36\x40\x37\x09\ \xfc\x04\xf0\xe7\xdf\xce\x14\xbd\xe6\x96\xc3\xb5\xc2\x13\x7b\xab\ \xa7\x7f\xb4\xb3\xbc\xbf\xe5\xa9\x7d\xc0\x36\xf4\xe8\x5e\x8b\x1e\ \x56\xfe\xb9\x5a\x3f\x2a\x80\xae\xec\x9e\x60\x69\x79\xb0\x75\xe7\ \x14\x5b\x77\x4d\xb3\xee\xd2\x61\x3e\xf9\xd1\x2b\xb9\xeb\xb6\x8b\ \xa9\xd4\x3c\x36\x3f\x7d\x3a\xb2\xf4\xc3\x29\xdc\xa3\xd1\xbe\x64\ \xc6\x8f\x10\xe0\xc3\x03\x8f\x9e\xe2\xc6\x6b\x47\x78\xfb\xb5\xc3\ \xec\xdc\x5b\x0c\x1e\x91\x3e\xaf\x5a\x6b\x30\x36\x36\xce\xda\xb5\ \x2b\xa3\xab\xaa\xd7\x5e\x7b\x92\x44\xd8\xe6\x8b\x73\x7c\xf5\x6b\ \x5f\xa6\xd1\xa8\x63\x59\x19\x0c\x69\x61\x48\x0b\x11\x66\xcd\x2b\ \x15\x5c\x72\x12\x70\xce\x6e\x00\x26\xa5\x45\x87\x24\x08\xc5\xfa\ \x42\xad\xed\xa3\x4e\xce\xb9\x8d\x23\x05\xb7\x7e\x68\xba\x55\xdd\ \x3f\xd9\xaa\xfc\xea\x58\x7d\xee\xd7\x63\x8d\x02\xda\xca\x3f\x05\ \x1c\x41\xf7\xfc\x13\xe8\x78\x7f\x9b\x0b\x60\x56\x1f\x91\x40\x9a\ \x7a\x0a\x17\xd1\x11\x0a\x26\x9a\x03\x40\x20\xd8\x77\x64\x9e\xcf\ \x7f\x7d\x17\x7f\xff\xd7\x1b\xb8\xfb\x3d\x97\xf0\xcc\xb6\x49\xe6\ \xcb\x6e\x62\x78\xa8\x93\x40\xa4\x62\x01\x8b\x87\x6d\x86\x06\x2c\ \x46\x06\x2d\x2e\x59\x66\x93\xb1\x24\x76\xc6\xa4\x30\xef\x32\x31\ \x55\x63\xe7\xce\x3d\x29\x02\xbc\x5e\x6d\x7a\x7a\x92\x7b\xbf\xf6\ \x25\x0a\x85\x69\x5d\x26\xc6\xb0\x30\x2d\x07\xd3\xb4\x31\xa4\xae\ \x4e\x82\x08\xc1\x03\x3a\x7a\x7d\x2a\xe8\xb3\x80\x97\x90\x74\x0b\ \xe3\x05\xaa\x2d\x5f\x1d\x9f\x75\x1b\x47\x0a\x6e\xed\xd0\x54\xab\ \xb2\x77\xa2\x55\xd9\x7d\xa6\x59\x7e\xe5\x4c\xb3\xd4\xf4\x54\x83\ \x38\x75\xab\x8c\x0e\xe6\xcc\xa0\x03\x3b\x05\xd2\x41\x9e\xae\x00\ \x4f\xbf\x4d\x9c\xeb\x3b\x9b\x36\x7e\xe8\x67\x42\xc8\xf7\x87\x3e\ \x3d\x41\xc5\x8c\x48\xb7\x27\x74\xbc\x10\x82\xa1\xbc\xcd\x47\xde\ \xb7\x96\x1f\x3f\x71\x92\x62\xc5\x25\x8e\xc1\x77\x26\x88\x12\x6d\ \x2f\x5f\x92\xe5\x1f\x3f\xbd\x9e\x7c\x2e\xa8\xed\x0b\x54\x6a\x6d\ \x4e\x4c\xd6\x59\xb3\x32\xcb\x9e\x43\x45\xbe\xfe\xfd\x7d\x5c\xb5\ \xfe\x72\x6e\xba\xe9\x86\xf3\xbd\xc7\x05\xdb\xe9\x33\x27\xf9\xea\ \xbf\x7e\x89\xf9\xe2\x3c\x42\x4a\x2c\xc3\x21\x93\x1d\x62\x60\x60\ \x94\xc1\xfc\x12\xb2\xd9\x21\x4c\xc3\xd6\x31\x8f\xce\xde\xbf\x80\ \xa8\x57\x29\x2f\xc1\xef\x69\x37\xb4\x1a\xd3\xea\xd8\xe1\x67\x2a\ \xb3\xb5\xf6\x69\xa5\x98\x44\x03\x3b\x8f\xd6\xe3\x65\x74\x8f\xae\ \x27\x96\x1a\x31\x11\xca\x89\x73\xce\x1a\xe4\xe9\xa7\xf5\x63\x03\ \xd4\x23\x15\xd0\x91\x0a\x9e\xea\xd1\xc1\xbe\x62\xa5\xc9\x7f\xfc\ \xf8\x60\x6a\x9f\x06\x5f\x25\x54\x42\xb8\x5f\xdb\x07\xf5\x96\xcb\ \x0b\xbb\xa6\xd8\xb1\xbb\xc8\xc8\xa0\xc5\x81\xb1\x2a\x13\x85\x06\ \x20\xb0\x4c\xc9\x86\x2b\x06\x58\x77\x69\x9e\xe7\x9e\x7f\x11\xc3\ \x52\x6c\xda\xb8\xe9\x7c\xef\x33\xd5\x9a\xcd\x06\xcf\x6e\xf9\x25\ \x8f\x3e\xfa\x20\xd5\x5a\x15\x21\x04\x52\x1a\x98\xa6\x8d\x6d\xe7\ \x70\xac\x2c\xa6\x69\xeb\xdc\x07\x42\x49\xd7\x0b\x78\x7a\x93\xe0\ \x2c\x86\x9f\x42\xd1\x70\x95\x3f\x53\x6d\x17\xd1\x62\x7c\x3f\xda\ \x7f\x0f\x09\x10\xf6\xfc\x56\xb0\x34\x13\xeb\x46\xb0\x0e\xf7\x79\ \x04\xa2\xff\x42\xc0\x87\xfe\x08\x70\x30\xbe\xf1\x38\x14\x1c\xea\ \xf3\x50\x2d\x74\xc6\xfd\xd3\x03\x3e\x69\xc0\x3b\xd5\xc0\x5c\xb1\ \xc9\x77\x1f\x3c\xd6\x15\x05\x14\x08\x5c\xd7\xe7\xe5\xbd\x73\xb8\ \xae\x4e\x07\xdb\xbc\x79\x33\xc7\x8e\x1e\xe4\xae\xf7\x7f\x90\x5c\ \xee\xfc\xc6\x05\x6a\xb5\x2a\x4f\x3d\xf3\x73\x9e\x7c\xea\x51\xca\ \x95\x72\xa0\x8b\x25\x52\x1a\x58\x86\x83\x6d\xe7\x71\xec\x3c\x96\ \x9d\xc5\x30\x2c\xc2\x29\xdc\xc2\x49\xeb\x16\x06\x1e\xce\x4a\x82\ \x0e\x3b\x20\x38\xb9\x8c\xd6\xe5\x07\xd0\x7a\x3c\x1c\xa5\x6b\x11\ \xa4\x6c\x2f\xb0\xb4\x83\xc5\x0f\x16\x2e\x14\x7c\xe8\x83\x00\xed\ \xb6\x77\x9f\x61\x98\x1f\x07\x56\xc5\x37\x26\xba\xa4\x40\xda\xc0\ \xeb\x3e\xde\x33\x0c\x2c\x88\xa5\x82\x3e\x98\xb2\xfe\x43\x77\x30\ \x7c\x78\x52\x9a\x98\x86\xc5\xaf\xb6\xbd\xc4\xaf\xb6\x3d\xc7\xcd\ \x37\xdd\xca\x5b\xaf\xbd\x8e\x95\x2b\x57\x91\xcb\x0d\xf6\xbc\xfe\ \xd9\xb9\x19\xc6\xc7\x4f\xb1\x77\xdf\x2b\x3c\xf3\xdc\x13\xd4\xeb\ \x35\x22\xa5\x15\x80\x6f\x9a\x0e\xb6\x93\x27\x93\x19\x24\xe3\x0c\ \x60\x99\x19\x5d\x6a\x3e\xe0\x6c\xf8\xba\x19\x90\x26\x41\x0f\xf1\ \x9e\xdc\xbf\x20\x09\xb4\x4b\x51\x27\xce\xcf\x3b\x85\xd6\xe5\x0d\ \x82\xd0\x6d\x8f\x45\x25\xd6\x2a\xb8\x96\x0b\x06\x3e\x6c\xe7\xb4\ \x01\x84\x10\xe2\x86\xeb\xef\x7e\x0c\xf8\xfd\x1e\x47\x7b\xbe\xf8\ \x41\xaf\x7d\x01\x98\xf1\x76\xe8\x64\xc5\x64\x48\x02\x1f\x4b\x03\ \xfd\x5c\x7d\xdf\xa5\xd5\xac\x51\xad\xcd\x52\xae\x16\xa8\xd5\xe6\ \x71\xdd\x3a\x86\xe1\xeb\xd8\xb9\x95\x67\xc5\x8a\x55\xac\x5c\x71\ \x09\xb5\x5a\x95\xf1\xf1\xd3\x4c\x4c\x9c\xa6\xd1\xea\x4e\x24\x15\ \x88\x00\x7c\x13\xcb\x74\xb0\x9d\x1c\xd9\xcc\x30\xb9\xdc\x08\x99\ \xcc\x20\xb6\x95\x8b\xca\xc1\x77\xf7\xf2\x4e\xe0\xe9\x41\x82\xee\ \xc0\x51\xd2\x4b\x28\x97\x27\x9b\x7b\xf7\x6f\xd9\x01\x3c\x0c\xbc\ \x84\x56\x05\x65\x02\x63\x8e\x04\xc8\x9d\xeb\xd7\x03\xf4\x64\xeb\ \x27\x1f\x40\x6d\x7c\xdb\x07\x3e\x27\xa5\xbc\x1c\xc4\x15\x1d\x47\ \x83\x1b\x93\x41\x6f\x89\x45\x7c\x6f\x89\x40\x74\x3c\xdd\xcb\x3b\ \x8f\xa9\xc4\xbe\x78\xbf\x61\x5a\x58\x76\x16\xc7\xcd\xe1\x79\xfa\ \x95\x2f\xcf\x6b\x52\x75\xdb\xa8\x5a\x91\xf9\xe2\x3c\xfb\xf6\xbf\ \x9a\x76\x86\x44\x72\x53\x13\x56\x48\x03\x43\x9a\x98\xa6\x83\x63\ \xe7\xc8\x64\x86\xc8\x64\x86\x70\x9c\x01\x4c\xd3\x0e\x0a\x41\x86\ \x96\xbb\xbe\xcf\x6e\xb0\x49\x03\x1f\x7c\xee\x8e\x14\x76\x93\xa0\ \xed\xb7\xdb\x68\x3d\x1e\x0e\xda\x84\x7a\x3d\x14\xed\xa9\xe7\x7f\ \x2e\x8c\x5e\x4b\xeb\x6b\x92\xa8\xed\x3b\x36\xbf\xba\xfe\xaa\xdb\ \xde\x95\xcb\x8d\xfc\x54\x20\xde\x22\x84\xe8\x48\xc7\xf1\x63\x51\ \xde\x8b\x08\xa9\x6d\x0d\xae\x88\xaa\x7b\x25\xb6\x13\xd2\x40\xa5\ \xde\x0e\xd2\x09\x19\x52\x4a\x2c\x2b\x83\xe3\x0c\x06\xc5\x99\xb5\ \x18\xf7\xbc\x66\x10\xbb\x8f\x33\x78\xa2\x16\x4a\x1d\xa1\x2b\x89\ \x8a\x40\x8d\x58\x66\x46\x1b\x7c\x4e\x1e\xc7\x19\xd0\xa2\xdf\x72\ \x10\x42\xbf\xb1\x14\xce\x79\x18\x03\x0d\xfd\x01\x4f\x37\x09\x3a\ \xec\x07\xcf\x6d\xb6\xe9\xd6\xf7\x3e\x17\xe8\xca\xbd\x96\xd6\xe7\ \x5c\xc1\x4a\x09\x21\x26\xb3\x99\xc1\x77\xaf\x59\x7d\xcd\xfb\x2c\ \x2b\xf3\x61\x21\xe4\x9b\x85\x34\x16\x0b\x44\x46\x08\x61\x0a\x21\ \xa4\x10\x52\x48\x69\x48\x29\x4d\xd1\x2b\x21\x24\x26\x48\x87\x04\ \x58\x50\x1a\x90\x50\x15\x1a\x6c\xd3\xb0\x70\x9c\x7c\xe2\xb3\x49\ \xcb\xad\xe3\x79\x2d\x7c\xdf\x0b\x5e\xfc\x88\x3b\x51\x58\xd2\x55\ \x17\x94\x0e\xc0\xb7\x32\x58\x56\x4e\x13\xc0\xce\x61\x59\x99\xc0\ \xea\xd7\x89\x18\x1a\xe4\x64\xef\x0f\xc5\x7e\xb8\x15\x03\xdf\x4b\ \xdc\x2f\x18\x33\x08\x5a\xbd\x59\x4e\x5a\xf4\x91\xd8\xff\x5d\x83\ \x0f\xfd\x97\x23\x05\xf0\xeb\x8d\x72\x63\xff\xc1\xad\x8f\x03\xdb\ \x81\x4b\x80\xb5\xc0\x4a\x21\xe4\x12\xdb\xce\x2c\xb1\xcc\xcc\x90\ \x69\x39\x83\x96\x69\xe7\x6c\x3b\x37\x68\x59\x99\xbc\x65\x3a\x59\ \xc3\xb0\x1c\x21\xa4\x25\x84\x30\x2d\xd3\x34\x97\x8d\x64\x4c\x5b\ \x0a\xe1\xf9\x82\xb6\x92\xf8\xca\xc0\x53\x12\x0f\x4b\x4f\x4c\x8e\ \x06\xae\x33\x69\x04\x94\xf6\xd7\x4d\x07\x21\xc0\x90\x12\xd3\xb4\ \x30\xdd\x0c\x9e\xdb\xa4\xdd\x76\x35\x09\x94\x1e\xc9\x13\x08\x44\ \x00\xbc\x94\x06\x86\x61\x61\x99\x4e\x40\x80\x2c\x96\xe5\x60\x98\ \x0e\x86\x30\x03\xb1\x1f\xce\x12\xe2\x27\x00\x0c\xd6\x24\x75\x3f\ \x3d\x48\xb0\xb0\x5b\x98\x6c\xcd\x66\xad\x5d\x28\x8c\xcd\xa3\x13\ \x36\x2a\xa4\xf5\xfe\xef\xbc\xf5\x4d\x80\x40\x0a\xb4\x89\xad\xd7\ \x16\xda\x75\x39\xae\x94\x3f\xdc\x6c\xd6\x06\x9a\xcd\x5a\x06\xc8\ \xa0\xe7\xb4\xb7\x82\xb5\x03\xe4\x81\x61\x74\xc9\x93\x11\xd3\x90\ \x8b\x6e\x5a\x3f\xba\xec\xc3\xd7\x2f\x1a\x19\xce\x58\x66\xa9\x21\ \x45\xb1\x21\xd4\x6c\x4d\xc8\x53\x45\xe9\x4f\x94\x24\x85\xaa\xc0\ \x6d\x9b\x02\x0c\x25\x84\x21\xa4\x34\x84\x94\x06\x52\x1a\xe1\x5c\ \x87\x42\xe1\x0b\xd3\x34\x91\x32\x2f\x7c\x3b\x23\xfc\xb6\x47\xbb\ \x1d\xa8\x82\x60\xec\x40\x04\x05\xa0\xa3\x28\x9f\x61\x61\x98\x36\ \xa6\x61\x13\xfc\x5e\x44\x36\x1d\xab\x87\x24\x16\x69\xa0\x93\xe2\ \x9d\x74\xcf\x5e\x48\x0d\x74\xb4\x72\xa5\xd0\x68\xb5\xea\x33\xc0\ \x38\x7a\xf8\x36\xd4\xfd\xff\x2b\xed\x9c\x5e\x40\xd7\x17\xf4\xd3\ \x37\xd0\x00\x3b\x68\xc0\x3b\x81\x37\x13\x8b\x0d\x64\x81\x21\x74\ \x11\xe4\x51\x74\xe9\x93\x61\xf4\xdc\xf7\x83\xc1\x39\x10\x5b\xbf\ \x6d\x82\x71\xed\x60\x5b\x24\x8e\x05\xa6\x83\x90\xa6\xe9\xd8\xa6\ \x69\x67\x4c\xc3\xca\x1a\xa6\x9d\xb5\x4c\x27\x6b\x9a\x76\xc6\x90\ \xa6\x23\x0d\xd3\x94\xc2\x90\xd2\x30\x84\x34\x2c\x69\x4a\x53\x48\ \xc3\x92\x86\x61\x09\x53\x5a\x42\x1a\xa6\x30\xa4\x2d\x4c\xd3\x10\ \x42\x98\xb1\x43\x92\x74\x3d\xa2\x8b\xea\x21\xf2\xbb\x80\x87\x5e\ \xe2\x3e\xd9\x9a\xcd\xaa\xb7\x67\xdf\xb3\xc7\x5d\xb7\xb1\x03\x78\ \x1e\x78\x19\x9d\xc6\x55\x04\xdc\xff\xeb\x2a\x00\x48\x49\x02\x1f\ \x0d\x52\x1d\x4d\x08\x83\x60\xe6\x29\xe2\x59\xa8\x44\xf0\x1f\x16\ \x9a\x04\x91\x14\x08\x96\x3c\x9a\x44\x61\x9a\x6f\x08\xbe\x4f\x1c\ \xf4\x88\x02\x1e\xc4\x04\x10\x4a\x29\xe1\xba\x0d\xe9\xba\x8d\x90\ \x8c\xe1\xff\x58\x89\xcf\x46\x70\x0d\xa9\x6b\x32\x0c\xd3\xb6\xac\ \x4c\xd6\xb2\x32\x59\xd3\xb4\xf3\x8e\x9d\xcb\xdb\x76\x76\xc0\x32\ \x33\x39\xd3\x72\x1c\x29\x0c\x4b\x48\xc3\x94\x42\x4a\x29\xa5\x21\ \x84\x94\x42\x1a\x42\x0a\xa9\xed\x9c\xf0\x73\x38\x7b\xe3\x59\x7a\ \x3c\x80\xe7\xb5\xfc\x6a\x75\xb6\x71\x6c\x6c\xd7\x09\xd7\x6d\x1c\ \x00\xf6\xa2\x83\x3f\xb3\x68\x5b\xe0\xff\x8f\x04\x48\x7d\x39\x3d\ \xc3\x62\xa7\x65\x97\xdc\x6f\xa0\x01\xc9\xa0\x4b\xd1\x0f\xa0\x09\ \x91\x41\x83\x15\x3a\xdc\x21\xd8\x5e\xf0\x39\xb4\x8e\xc3\x63\x04\ \xdb\xe1\xef\x26\x09\x67\x26\xd6\x21\xf8\xe1\x22\x7a\xec\x4b\x4a\ \xa8\x68\xca\x94\xe0\x73\x27\xa9\x82\xef\x0a\xd3\xb2\x9c\xac\x65\ \x65\x72\x96\xe9\xe4\x2d\x2b\x93\xb7\xed\x5c\xde\xb6\x33\x03\xa6\ \x69\x67\x4d\xd3\xb6\x85\x90\x26\x20\x94\xef\x2b\xdf\xf7\x7c\xcf\ \x6b\xb5\x0a\xb3\x27\x27\x4a\xa5\xa9\x71\xb4\xd8\x3f\x86\x8e\xfe\ \x1d\x22\x7e\x45\xcb\x55\xaa\x23\x2f\xec\x77\xd4\x5e\x13\x01\xba\ \x7e\x6c\xe1\xb7\x2f\x92\x44\x08\x6d\x83\x68\xaa\x32\x62\x02\x24\ \x25\x40\x72\x81\xb4\x7f\xdc\x49\x30\xd9\xb1\x2d\x3b\xb6\x21\x2d\ \xa5\x92\x64\xe8\x77\x3b\x5c\x3a\x89\xd1\x8b\x44\xe1\x7d\x89\xe0\ \xba\x9b\x68\x83\xaf\x80\x26\xc1\x69\xf4\x68\xde\x6b\x1a\xc9\x7b\ \x3d\xda\xff\x00\xe3\x6e\x4f\xfb\x1e\xf1\x28\x2d\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\xcb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0a\x61\x00\x00\x0a\x61\ \x01\xfc\xcc\x4a\x25\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x06\x48\x49\x44\ \x41\x54\x48\x89\x8d\x96\x5b\x6c\x54\xc7\x1d\x87\xbf\x99\x39\xe7\ \xec\x59\xaf\xbd\x17\x5f\xd7\x4b\x6c\x1c\x83\x81\x26\x84\x62\x6a\ \x08\x69\x20\x14\x08\x69\xa3\xf6\x21\x2d\x12\x55\x55\x91\x48\x55\ \xaa\x3c\xa4\x2a\x2f\x29\xad\xaa\x5e\x02\x52\xd4\x56\x51\xa4\x56\ \xa9\x9a\x56\x41\x95\x22\x85\xb4\x52\x85\x48\x55\x12\x25\x4d\x22\ \x10\x01\x37\x6d\x30\x31\x21\x36\x84\x1a\x30\x36\xbe\xdb\x6b\xf6\ \xea\xf5\xee\x99\x99\x3e\x18\x1b\x92\x5e\xd4\x79\x1a\x8d\x46\xbf\ \x6f\x7e\xf3\xbf\xcc\x08\x6b\x2d\xff\x6b\x08\x21\x94\xb5\x56\x7f\ \x6a\x4d\x1e\xd8\xe5\xd7\x6d\x6c\x51\xeb\x67\x8a\x36\xb3\xf7\x8f\ \xc5\x5e\xa0\x62\xff\x83\x98\xf8\x6f\x00\x21\xc4\x5e\xe0\x49\xa0\ \x11\xf8\xf1\xb7\xba\x42\xaf\x7d\xa3\xd3\xdb\x12\x0f\xd9\x3d\x55\ \x2e\x3b\x94\xb0\x71\x4f\x68\x77\xde\x2a\x71\xe8\x4c\xf0\xc4\x73\ \x27\xe7\x0f\x5b\x6b\xcb\x9f\xd6\x71\x16\x27\x5b\x3a\xbf\x9d\x40\ \xc8\xfd\x42\x8a\xfb\xb0\x54\xd5\xc6\x5a\x57\x57\x82\xa2\xdf\x10\ \x6b\x66\x70\xbc\xff\xe5\x77\xae\xb7\xd9\x31\x67\x93\xc0\x82\xb1\ \x60\xad\xc0\x5a\x70\x65\x85\x9d\xcd\xef\x3f\x0b\x03\x7f\x06\xd2\ \x42\x08\xb1\x7b\xf7\x63\x77\xa5\xd3\x33\xce\xf1\xe3\xc7\xfa\x96\ \x00\x8e\xeb\x1e\x4c\xb6\x2c\x7f\x32\xe4\xd7\x88\x40\x07\x5c\x1e\ \x7b\x97\x1a\xb7\x91\x8e\x55\x3b\xb9\x3a\xd6\x47\xba\x30\x2d\x4c\ \xb4\x83\xa0\x62\x09\x02\x83\x31\x06\x80\x92\xd5\x1c\x1f\xcb\xd5\ \xc2\x40\xf4\xfb\xdf\x3b\xb0\xe5\xe4\x89\xf7\x9e\x5d\xd1\xb1\xbc\ \xe3\x87\xfb\x0f\xfe\x06\xf8\xe9\x12\xa0\x39\x16\xec\x8d\xd7\x35\ \x09\x84\x64\x78\xf8\x3c\x75\x89\x65\x84\xfc\x1a\xf2\x85\x73\x34\ \x37\x35\x21\x1d\x45\xb1\xd0\x4b\x3c\xb6\x99\xf9\x72\x99\x4a\x25\ \x40\x6b\x83\x36\x86\xd4\xea\xbb\xc4\xdf\x7f\xf5\xf4\x07\x6d\xed\ \xad\x71\x47\x29\x00\xf2\xa5\x5c\x12\xa8\x5e\x02\x28\x57\x45\xc2\ \x55\x55\x80\x60\x64\xf4\x23\xa2\xb1\x7a\x12\xb1\x14\xb3\x99\x5e\ \x56\xad\x6c\x0f\x2c\x94\x03\x5d\xa8\x0a\x87\xc3\x48\x29\x81\x02\ \x0f\x6c\x6b\xe5\x91\x47\x3e\x4f\x4b\x4b\x23\x42\x88\xf8\xed\x77\ \xaf\x84\x52\x80\x5a\x02\x48\xe9\x10\xf6\x43\x80\x24\x93\x9d\xc0\ \xf3\x7c\x52\xa9\x15\xa4\x96\xb5\x73\xe1\xc2\x51\x07\x70\xee\x6c\ \x7b\x08\xa9\xe0\x8b\x5f\xea\x60\xeb\xb6\x7b\xa8\xad\x8d\x21\x6e\ \x13\xcd\x66\x0b\xb6\xbb\xfb\xfd\xd1\x5d\x0f\x3d\xb0\x4c\xb9\x8e\ \x06\xe4\x12\xc0\xe0\x6a\xdf\xf7\x9d\xc9\xc9\x41\x52\xcd\x2b\x49\ \xa7\x47\x69\x6e\x6e\xc7\x68\x43\x5d\xed\x3e\xe6\x4a\x45\xb6\x6f\ \x6f\x62\x43\xd7\x4a\xaa\xab\x23\x08\xb1\x20\x6d\xad\x65\x7c\x6c\ \x9a\x53\xc7\x0e\x9b\x1f\x3d\xf7\xe2\xfe\x64\x72\xd9\xd4\xae\x5d\ \x5b\x5f\x72\x94\x6b\x01\x47\x2e\x01\xa4\x3b\xef\x79\x1e\x7d\x17\ \xde\x65\x53\xd7\xc3\x48\x29\xa8\x0a\x87\x09\x87\x7d\x7c\x3f\x84\ \xa3\x60\xe3\xa6\xd5\xc4\xa2\x35\x38\x8e\x83\x52\x8a\xa1\xa1\x71\ \x0e\x1e\x78\x81\xc7\xf6\x3c\x41\xdd\xc5\xe7\xed\xe4\xe4\xc8\x9b\ \xc9\xfa\xe6\x41\x84\xc0\x51\xca\x7e\xc2\x81\xb6\xaa\x22\x84\x60\ \x72\xea\x1a\xf5\xf5\xcd\x54\x47\xe2\xf8\xe1\x10\x41\x45\xa3\x94\ \xa2\x5c\x76\x91\x52\x80\x10\xf4\xf7\x5f\xe6\xf7\x87\x8e\x30\x30\ \x30\x8d\x1f\x8a\xd3\x10\x4f\xb1\xe6\x8e\x21\xf9\xb5\xb5\xd9\xbb\ \xd3\xe5\xf9\x89\x05\x77\x46\x00\xf2\x96\x03\x2b\x4d\xff\x85\x6e\ \xd6\xad\xdd\x46\x6f\xef\xdb\x74\x7d\xee\x41\xfc\x50\x08\xdf\xf7\ \x08\x85\x3c\x3c\xd7\x43\x48\xc9\xc9\x13\x3d\xfc\xec\x99\xc3\xcc\ \xcd\x25\x68\x5b\xbe\x9e\x58\x2c\x89\x14\x92\x86\x98\x2f\xd6\x34\ \xaa\x87\x4b\x41\xc5\x19\x1b\x1d\x27\x9b\x2f\x56\x3e\x01\x00\xc4\ \xd9\x0f\xde\xe4\x0b\x9b\x37\xd2\x77\xe1\x34\x9f\x5d\xb7\x03\xcf\ \xf3\xf0\x42\x1e\x9e\xa7\x70\x5d\xb5\x90\x3d\x52\x90\x48\x34\x11\ \x8b\x35\x50\x28\x04\x4c\x4d\x65\x09\x02\x4d\x8d\x63\x58\xdb\xe4\ \x6c\xd5\x7a\xde\x45\x08\x9c\x05\x1b\xb7\x00\x97\x07\xcf\x85\xee\ \x5f\x33\x4b\x47\xf8\x79\x36\x77\x8c\xb1\xbd\xf5\x77\xb4\xd6\xfc\ \x03\x81\x40\x29\x85\x72\x1c\xb0\x80\xb1\xe4\x72\x25\x86\x87\x66\ \xc9\xe5\x4a\x58\x04\x02\x83\xe7\xba\xb4\x25\x64\xaa\x52\x2a\x79\ \x52\x4a\x94\xeb\xde\x02\x08\x21\x7e\x30\x34\xda\x17\x52\xb5\xcf\ \xf0\xdb\xa3\x39\x6a\x93\x8f\x32\x3c\x16\xa6\x2d\xfc\x16\x6b\x22\ \x2f\x71\x65\x60\x8a\x4b\x97\xa6\xc9\x64\x72\x5c\xb9\x3a\x4a\xe6\ \xc6\x1c\xd6\x9a\x5b\xd6\xb1\x80\x25\xec\xe1\x61\x8a\x51\x29\x04\ \x42\x20\x00\xb1\xe8\xe0\xe8\xda\x8e\x2f\x17\x66\x33\xe3\xcc\xa4\ \x87\xd8\xb3\xf9\x1c\x17\x47\xdb\x78\xf1\xc4\xa3\x54\xbb\x53\x74\ \x34\x7c\x88\x0e\x02\xf2\xf9\x22\xc5\x42\x09\x6b\xc1\x5a\x83\xb5\ \x96\x85\x66\x69\x19\xcc\x48\x86\xef\x39\x20\x7f\xf2\xf4\xcf\x7f\ \x2d\x95\x42\x20\xd4\x12\xc0\x5a\xfb\xf1\x7c\x39\xe7\x9c\x3c\xf5\ \x02\xfb\xbe\xde\x49\x2c\x2a\x68\x6f\xba\xc2\x86\xd6\xf7\x38\xd1\ \xb7\x89\x7b\x57\xf4\xa0\xb5\x46\x08\x81\xb5\x16\x63\x35\xda\x18\ \x8c\x35\x60\x0c\x86\x0a\x37\x76\x1e\x62\xdd\x8e\xdd\xac\xdf\xb0\ \x2e\xaa\xb5\x25\x93\xcd\x28\xb8\xd9\x4d\x95\x72\x1f\xaf\x8d\xb5\ \xfa\xdb\xb7\x7d\x07\x3f\x74\x9a\x5f\xbe\xf1\x4d\xda\x9b\x46\xf0\ \x54\x99\x81\xf1\x46\x76\x6f\x9a\xc6\x04\x19\x84\x10\x18\x63\xb1\ \xc6\x60\x8c\xc6\x18\x83\xb1\x9a\x48\x34\x82\xf2\xa2\x4c\x4f\xe5\ \x29\x14\xe6\x19\x19\x9e\xe2\xfc\x47\x67\xae\x01\xc6\x01\x48\xd5\ \xdf\xfd\xfa\x8a\xb6\xad\x73\xbb\x3a\x47\xdc\x54\x43\x89\xdd\x5d\ \x6f\x50\x1f\xbb\xc1\xd5\xc9\x24\x43\x33\x1e\x57\xc3\x4f\xb1\xef\ \xa9\x14\xd5\xd5\x61\xac\xd1\x68\xad\x31\x3a\x40\x6b\x8b\xd6\x9a\ \xb9\x6c\x9e\x93\xaf\xbe\x42\x55\xaa\x93\x42\x66\x9a\x3f\xbd\xfa\ \x87\x77\x06\x07\x2f\x9f\x06\xd2\x0e\xc0\xf2\xd4\xc6\xb2\xb5\x88\ \xa8\x9f\xe1\x54\x5f\x0b\xdd\x03\xf7\xf2\xe0\xba\xf3\x1c\x3b\xb3\ \x8a\xef\xee\xeb\xa2\xb1\x29\x8e\x52\x8a\x20\x30\x4c\x4c\xcd\xa0\ \x4d\x40\xa0\x35\x5a\x2f\x04\x5a\x5a\xf8\x4a\xfe\x17\x9c\x3f\x2d\ \x18\x9f\x10\xb6\xbf\xb7\xf8\x17\xe0\x43\x60\x6c\xb1\x92\x43\x00\ \x7f\xfb\x38\xc5\xaa\xe4\x75\x92\xb1\x31\x06\x27\xa3\x08\x72\xe4\ \xb2\x65\x8c\xc9\x11\x54\x0c\xa3\x23\xd3\xf4\xf4\xf4\x61\x74\x2d\ \x41\x10\xb0\xf8\x1a\x0a\x6b\x68\x8d\xcc\xd1\xec\x43\xb2\xa6\xca\ \xbe\x7c\x56\xfe\x33\x5d\xd4\x57\xad\xb5\xe5\x45\x40\xd9\x18\xcd\ \x95\xf1\x38\xc3\xd3\x09\x9a\x12\x05\xb0\x9a\x62\xc9\xe5\xc8\x91\ \x13\xdc\xd9\x96\xe0\x46\x36\x47\x77\xf7\x59\xf2\x39\xa8\x8a\x38\ \xdc\xfe\xd4\x06\x06\xfa\x6f\x84\x75\xd9\xc8\xa0\x67\x44\x77\x5f\ \x9c\xd2\x67\x80\xca\x02\xfc\xe6\xc6\xfb\x3b\x1f\xbf\xa6\x42\x35\ \x2d\x9e\x17\x11\x52\x3a\x08\xe9\x20\x84\x24\xd0\xf3\x64\x72\x13\ \xcc\x95\xd2\x28\xe9\xe1\xfb\x09\x3c\x2f\x86\x58\xcc\x70\x53\xa1\ \x98\xee\xcd\xd7\xd9\xb7\xef\xfb\xeb\xa5\x60\x1a\x28\x02\x79\x7b\ \xb3\x50\x96\x9a\x9d\x40\x74\xe4\x33\xd7\xbf\x5a\x2c\xcd\x6e\x5b\ \x55\xaf\xb7\x34\x46\xe4\x67\xb2\x15\x5f\xe6\xca\x21\x22\xc6\xb3\ \xae\xe3\x5a\x63\xc1\xce\x67\x45\xb9\x9c\x13\x20\x11\x42\x0a\x6c\ \x60\x47\x66\xae\xbd\xd5\x33\x1d\xf4\xfd\xdf\xbf\x0a\xb1\x70\xbc\ \xaa\x9b\xb1\x31\x37\xed\x56\x80\xc0\x5a\xab\xa3\xd5\x4d\xe1\x44\ \xcd\x1d\xcd\x4a\x85\x52\x13\x33\x17\x67\x8a\xa5\xd9\x01\x6b\x6d\ \xe5\xdf\x84\x80\x7f\x01\xb2\x71\xde\x05\xc8\xb8\x10\x94\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ " qt_resource_name = "\ \x00\x06\ \x07\x03\x7d\xc3\ \x00\x69\ \x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\ \x00\x05\ \x00\x35\xbb\x54\ \x00\x32\ \x00\x34\x00\x78\x00\x32\x00\x34\ \x00\x10\ \x00\xe0\x1d\x47\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x08\xc2\x5a\x27\ \x00\x43\ \x00\x6f\x00\x76\x00\x65\x00\x72\x00\x41\x00\x72\x00\x74\x00\x53\x00\x68\x00\x61\x00\x64\x00\x6f\x00\x77\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x07\ \x04\x5f\xb4\x38\ \x00\x31\ \x00\x32\x00\x38\x00\x78\x00\x31\x00\x32\x00\x38\ \x00\x08\ \x0a\x85\x58\x07\ \x00\x73\ \x00\x74\x00\x61\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x15\ \x07\x05\x4c\x07\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x31\x00\x30\x00\x30\ \x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x07\ \x05\x8d\xb5\xe6\ \x00\x32\ \x00\x35\x00\x36\x00\x78\x00\x32\x00\x35\x00\x36\ \x00\x05\ \x00\x36\x9b\x62\ \x00\x33\ \x00\x32\x00\x78\x00\x33\x00\x32\ \x00\x05\ \x00\x37\xfb\x78\ \x00\x34\ \x00\x38\x00\x78\x00\x34\x00\x38\ \x00\x0d\ \x0d\xdc\xf1\x67\ \x00\x73\ \x00\x74\x00\x61\x00\x72\x00\x2d\x00\x67\x00\x72\x00\x61\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x0e\xf2\x04\x27\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x35\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0a\xb0\x36\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x35\x00\x30\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x0e\xe2\x04\x27\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x36\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0a\xa0\x36\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x36\x00\x30\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x08\ \x06\xa8\x59\xe7\ \x00\x6e\ \x00\x6f\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x05\ \x00\x35\x9b\x52\ \x00\x32\ \x00\x32\x00\x78\x00\x32\x00\x32\ \x00\x0c\ \x0e\xd2\x04\x27\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x37\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0a\x90\x36\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x37\x00\x30\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x08\ \x00\x28\x5a\xe7\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x0e\xc2\x04\x27\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x38\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0a\x80\x36\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x38\x00\x30\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x05\ \x00\x34\xdb\x46\ \x00\x31\ \x00\x36\x00\x78\x00\x31\x00\x36\ \x00\x0c\ \x0e\xb2\x04\x27\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x39\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x03\x8a\x2a\x47\ \x00\x74\ \x00\x72\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x73\x00\x61\x00\x76\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x03\x26\x60\x87\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x31\x00\x30\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0a\xf0\x36\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x39\x00\x30\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x0d\x58\x3e\xe7\ \x00\x61\ \x00\x70\x00\x70\x00\x6c\x00\x69\x00\x63\x00\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x73\x00\x2d\x00\x73\x00\x79\x00\x73\x00\x74\ \x00\x65\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x06\x8b\xba\x67\ \x00\x70\ \x00\x72\x00\x65\x00\x66\x00\x65\x00\x72\x00\x65\x00\x6e\x00\x63\x00\x65\x00\x73\x00\x2d\x00\x64\x00\x65\x00\x73\x00\x6b\x00\x74\ \x00\x6f\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x0a\xc8\xfb\x07\ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x15\ \x00\x24\xf9\x87\ \x00\x61\ \x00\x63\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2d\x00\x67\x00\x6f\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2d\x00\x31\x00\x36\ \x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x08\x89\x88\x67\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x08\x1f\x12\x27\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x65\x00\x72\x00\x72\ \x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x01\xa6\xc4\x87\ \x00\x64\ \x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2d\x00\x6f\x00\x70\x00\x65\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x20\ \x0a\x57\x7b\xa7\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x73\x00\x61\x00\x76\ \x00\x65\x00\x64\x00\x2d\x00\x6d\x00\x6f\x00\x64\x00\x69\x00\x66\x00\x69\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x0d\xcd\xf8\x07\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x73\x00\x61\x00\x76\ \x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0c\xee\xc3\x07\ \x00\x70\ \x00\x6c\x00\x61\x00\x79\x00\x2d\x00\x6d\x00\x75\x00\x73\x00\x69\x00\x63\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x10\ \x08\x15\x13\x67\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x10\ \x0f\xcb\x90\x67\ \x00\x64\ \x00\x69\x00\x61\x00\x6c\x00\x6f\x00\x67\x00\x2d\x00\x65\x00\x72\x00\x72\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0c\xaa\xc0\xa7\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x70\x00\x61\x00\x73\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1a\ \x04\x78\x27\x87\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x6d\x00\x6f\x00\x64\ \x00\x69\x00\x66\x00\x69\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x07\xb1\x59\x27\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x63\x00\x75\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x0f\xe3\xd5\x67\ \x00\x64\ \x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2d\x00\x73\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x11\ \x00\xbd\x49\x67\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x0e\ \x0d\x8b\x39\xe7\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x63\x00\x6c\x00\x65\x00\x61\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x06\x89\x11\xa7\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x61\x00\x75\x00\x74\x00\x6f\x00\x2d\x00\x74\x00\x61\x00\x67\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x0f\ \x02\x30\x8b\xe7\ \x00\x6c\ \x00\x69\x00\x73\x00\x74\x00\x2d\x00\x72\x00\x65\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x16\ \x08\x9b\xc7\x87\ \x00\x6c\ \x00\x6f\x00\x6f\x00\x6b\x00\x75\x00\x70\x00\x2d\x00\x6d\x00\x75\x00\x73\x00\x69\x00\x63\x00\x62\x00\x72\x00\x61\x00\x69\x00\x6e\ \x00\x7a\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0e\xe8\x99\x87\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x65\x00\x64\x00\x69\x00\x74\x00\x2d\x00\x74\x00\x61\x00\x67\x00\x73\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x02\xd2\xa5\xe7\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x61\x00\x6e\x00\x61\x00\x6c\x00\x79\x00\x7a\x00\x65\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x11\ \x05\x35\xe6\x47\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x73\x00\x75\x00\x62\x00\x6d\x00\x69\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x11\ \x0e\xfe\x4a\xe7\ \x00\x73\ \x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x2d\x00\x73\x00\x65\x00\x61\x00\x72\x00\x63\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x12\ \x09\x17\x4c\x27\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x63\x00\x6c\x00\x75\x00\x73\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ " qt_resource_struct = "\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00\x02\ \x00\x00\x02\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x57\x19\ \x00\x00\x02\x8c\x00\x02\x00\x00\x00\x12\x00\x00\x00\x34\ \x00\x00\x01\xce\x00\x02\x00\x00\x00\x13\x00\x00\x00\x21\ \x00\x00\x00\x12\x00\x02\x00\x00\x00\x01\x00\x00\x00\x20\ \x00\x00\x00\xe0\x00\x02\x00\x00\x00\x01\x00\x00\x00\x1f\ \x00\x00\x00\xf0\x00\x02\x00\x00\x00\x01\x00\x00\x00\x1e\ \x00\x00\x00\x22\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x02\xde\x00\x00\x00\x00\x00\x01\x00\x00\x5c\xbd\ \x00\x00\x02\xba\x00\x00\x00\x00\x00\x01\x00\x00\x5b\xea\ \x00\x00\x00\x72\x00\x02\x00\x00\x00\x01\x00\x00\x00\x1d\ \x00\x00\x00\xcc\x00\x02\x00\x00\x00\x01\x00\x00\x00\x1c\ \x00\x00\x01\xb8\x00\x00\x00\x00\x00\x01\x00\x00\x53\xf6\ \x00\x00\x00\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x49\x37\ \x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x01\x81\ \x00\x00\x02\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x5a\x50\ \x00\x00\x00\x86\x00\x00\x00\x00\x00\x01\x00\x00\x42\x11\ \x00\x00\x01\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x56\x5d\ \x00\x00\x01\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x53\x2b\ \x00\x00\x01\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x51\x9f\ \x00\x00\x02\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x5d\x72\ \x00\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x49\xe7\ \x00\x00\x02\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x5b\x1c\ \x00\x00\x02\x40\x00\x00\x00\x00\x00\x01\x00\x00\x59\x7e\ \x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\x55\x9d\ \x00\x00\x01\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x52\x58\ \x00\x00\x01\x20\x00\x00\x00\x00\x00\x01\x00\x00\x50\xdf\ \x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x01\x07\x26\ \x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x01\xf2\x73\ \x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x00\xe9\x46\ \x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x00\xfc\xd9\ \x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x02\x49\xb0\ \x00\x00\x05\xde\x00\x00\x00\x00\x00\x01\x00\x00\xdb\xe2\ \x00\x00\x04\x2c\x00\x00\x00\x00\x00\x01\x00\x00\xac\xba\ \x00\x00\x06\x54\x00\x00\x00\x00\x00\x01\x00\x00\x9b\x25\ \x00\x00\x06\xd8\x00\x00\x00\x00\x00\x01\x00\x00\xbf\xae\ \x00\x00\x05\x5e\x00\x00\x00\x00\x00\x01\x00\x00\xcc\xd9\ \x00\x00\x07\x02\x00\x00\x00\x00\x00\x01\x00\x00\xc2\x85\ \x00\x00\x06\x28\x00\x00\x00\x00\x00\x01\x00\x00\x92\xa2\ \x00\x00\x03\x60\x00\x00\x00\x00\x00\x01\x00\x00\x95\xfa\ \x00\x00\x03\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x9d\xfa\ \x00\x00\x06\x78\x00\x00\x00\x00\x00\x01\x00\x00\xa3\x90\ \x00\x00\x07\x52\x00\x00\x00\x00\x00\x01\x00\x00\xe1\x57\ \x00\x00\x04\x54\x00\x00\x00\x00\x00\x01\x00\x00\xb0\xa7\ \x00\x00\x03\x94\x00\x00\x00\x00\x00\x01\x00\x00\x97\xfe\ \x00\x00\x04\xce\x00\x00\x00\x00\x00\x01\x00\x00\xc8\xd4\ \x00\x00\x06\x06\x00\x00\x00\x00\x00\x01\x00\x00\xe4\x6d\ \x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\xba\x49\ \x00\x00\x06\xaa\x00\x00\x00\x00\x00\x01\x00\x00\xb6\x1b\ \x00\x00\x07\x2a\x00\x00\x00\x00\x00\x01\x00\x00\xd6\xeb\ \x00\x00\x05\xb6\x00\x00\x00\x00\x00\x01\x00\x00\xd2\x69\ \x00\x00\x03\xae\x00\x00\x00\x00\x00\x01\x00\x00\x64\x3b\ \x00\x00\x05\xde\x00\x00\x00\x00\x00\x01\x00\x00\x8c\xb0\ \x00\x00\x04\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x6e\x2b\ \x00\x00\x05\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x82\x3c\ \x00\x00\x03\x60\x00\x00\x00\x00\x00\x01\x00\x00\x60\x89\ \x00\x00\x05\x98\x00\x00\x00\x00\x00\x01\x00\x00\x85\xf2\ \x00\x00\x04\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x79\xe2\ \x00\x00\x03\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x63\ \x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x00\x66\xea\ \x00\x00\x04\x54\x00\x00\x00\x00\x00\x01\x00\x00\x70\x48\ \x00\x00\x03\x94\x00\x00\x00\x00\x00\x01\x00\x00\x62\x45\ \x00\x00\x05\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x80\x07\ \x00\x00\x04\xce\x00\x00\x00\x00\x00\x01\x00\x00\x77\x58\ \x00\x00\x03\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x5e\x39\ \x00\x00\x06\x06\x00\x00\x00\x00\x00\x01\x00\x00\x90\x57\ \x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x74\x04\ \x00\x00\x05\x16\x00\x00\x00\x00\x00\x01\x00\x00\x7d\x76\ \x00\x00\x05\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x89\x1d\ " def qInitResources(): QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() picard-release-1.3.2/picard/script.py000066400000000000000000000534111245305550700175270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2007 Javier Kohen # Copyright (C) 2008 Philipp Wolfer # # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from collections import namedtuple from inspect import getargspec from picard.metadata import Metadata from picard.metadata import MULTI_VALUED_JOINER from picard.plugin import ExtensionPoint class ScriptError(Exception): pass class ParseError(ScriptError): pass class EndOfFile(ParseError): pass class SyntaxError(ParseError): pass class UnknownFunction(ScriptError): pass class ScriptText(unicode): def eval(self, state): return self class ScriptVariable(object): def __init__(self, name): self.name = name def __repr__(self): return '' % self.name def eval(self, state): name = self.name if name.startswith(u"_"): name = u"~" + name[1:] return state.context.get(name, u"") FunctionRegistryItem = namedtuple("FunctionRegistryItem", ["function", "eval_args", "argcount"]) Bound = namedtuple("Bound", ["lower", "upper"]) class ScriptFunction(object): def __init__(self, name, args, parser): try: argnum_bound = parser.functions[name].argcount argcount = len(args) if argnum_bound and not (argnum_bound.lower <= argcount and (argnum_bound.upper is None or len(args) <= argnum_bound.upper)): raise ScriptError( "Wrong number of arguments for $%s: Expected %s, got %i at position %i, line %i" % (name, str(argnum_bound.lower) if argnum_bound.upper is None else "%i - %i" % (argnum_bound.lower, argnum_bound.upper), argcount, parser._x, parser._y)) except KeyError: raise UnknownFunction("Unknown function '%s'" % name) self.name = name self.args = args def __repr__(self): return "" % (self.name, self.args) def eval(self, parser): function, eval_args, num_args = parser.functions[self.name] if eval_args: args = [arg.eval(parser) for arg in self.args] else: args = self.args return function(parser, *args) class ScriptExpression(list): def eval(self, state): result = [] for item in self: result.append(item.eval(state)) return "".join(result) def isidentif(ch): return ch.isalnum() or ch == '_' class ScriptParser(object): """Tagger script parser. Grammar: text ::= [^$%] | '\$' | '\%' | '\(' | '\)' | '\,' argtext ::= [^$%(),] | '\$' | '\%' | '\(' | '\)' | '\,' identifier ::= [a-zA-Z0-9_] variable ::= '%' identifier '%' function ::= '$' identifier '(' (argument (',' argument)*)? ')' expression ::= (variable | function | text)* argument ::= (variable | function | argtext)* """ _function_registry = ExtensionPoint() _cache = {} def __raise_eof(self): raise EndOfFile("Unexpected end of script at position %d, line %d" % (self._x, self._y)) def __raise_char(self, ch): #line = self._text[self._line:].split("\n", 1)[0] #cursor = " " * (self._pos - self._line - 1) + "^" #raise SyntaxError("Unexpected character '%s' at position %d, line %d\n%s\n%s" % (ch, self._x, self._y, line, cursor)) raise SyntaxError("Unexpected character '%s' at position %d, line %d" % (ch, self._x, self._y)) def read(self): try: ch = self._text[self._pos] except IndexError: return None else: self._pos += 1 self._px = self._x self._py = self._y if ch == '\n': self._line = self._pos self._x = 1 self._y += 1 else: self._x += 1 return ch def unread(self): self._pos -= 1 self._x = self._px self._y = self._py def parse_arguments(self): results = [] while True: result, ch = self.parse_expression(False) results.append(result) if ch == ')': # Only an empty expression as first argument # is the same as no argument given. if len(results) == 1 and results[0] == []: return [] return results def parse_function(self): start = self._pos while True: ch = self.read() if ch == '(': name = self._text[start:self._pos-1] if name not in self.functions: raise UnknownFunction("Unknown function '%s'" % name) return ScriptFunction(name, self.parse_arguments(), self) elif ch is None: self.__raise_eof() elif not isidentif(ch): self.__raise_char(ch) def parse_variable(self): begin = self._pos while True: ch = self.read() if ch == '%': return ScriptVariable(self._text[begin:self._pos-1]) elif ch is None: self.__raise_eof() elif not isidentif(ch) and ch != ':': self.__raise_char(ch) def parse_text(self, top): text = [] while True: ch = self.read() if ch == "\\": ch = self.read() if ch == 'n': text.append('\n') elif ch == 't': text.append('\t') elif ch not in "$%(),\\": self.__raise_char(ch) else: text.append(ch) elif ch is None: break elif not top and ch == '(': self.__raise_char(ch) elif ch in '$%' or (not top and ch in ',)'): self.unread() break else: text.append(ch) return ScriptText("".join(text)) def parse_expression(self, top): tokens = ScriptExpression() while True: ch = self.read() if ch is None: if top: break else: self.__raise_eof() elif not top and ch in ',)': break elif ch == '$': tokens.append(self.parse_function()) elif ch == '%': tokens.append(self.parse_variable()) else: self.unread() tokens.append(self.parse_text(top)) return (tokens, ch) def load_functions(self): self.functions = {} for name, item in ScriptParser._function_registry: self.functions[name] = item def parse(self, script, functions=False): """Parse the script.""" self._text = script self._pos = 0 self._px = self._x = 1 self._py = self._y = 1 self._line = 0 if not functions: self.load_functions() return self.parse_expression(True)[0] def eval(self, script, context=None, file=None): """Parse and evaluate the script.""" self.context = context if context is not None else Metadata() self.file = file self.load_functions() key = hash(script) if key not in ScriptParser._cache: ScriptParser._cache[key] = self.parse(script, True) return ScriptParser._cache[key].eval(self) def register_script_function(function, name=None, eval_args=True, check_argcount=True): """Registers a script function. If ``name`` is ``None``, ``function.__name__`` will be used. If ``eval_args`` is ``False``, the arguments will not be evaluated before being passed to ``function``. If ``check_argcount`` is ``False`` the number of arguments passed to the function will not be verified.""" args, varargs, keywords, defaults = getargspec(function) args = len(args) - 1 # -1 for the parser varargs = varargs is not None defaults = len(defaults) if defaults else 0 argcount = Bound(args - defaults, args if not varargs else None) if name is None: name = function.__name__ ScriptParser._function_registry.register(function.__module__, (name, FunctionRegistryItem( function, eval_args, argcount if argcount and check_argcount else False) ) ) def func_if(parser, _if, _then, _else=None): """If ``if`` is not empty, it returns ``then``, otherwise it returns ``else``.""" if _if.eval(parser): return _then.eval(parser) elif _else: return _else.eval(parser) return '' def func_if2(parser, *args): """Returns first non empty argument.""" for arg in args: arg = arg.eval(parser) if arg: return arg return '' def func_noop(parser, *args): """Does nothing :)""" return '' def func_left(parser, text, length): """Returns first ``num`` characters from ``text``.""" return text[:int(length)] def func_right(parser, text, length): """Returns last ``num`` characters from ``text``.""" return text[-int(length):] def func_lower(parser, text): """Returns ``text`` in lower case.""" return text.lower() def func_upper(parser, text): """Returns ``text`` in upper case.""" return text.upper() def func_pad(parser, text, length, char): return char * (int(length) - len(text)) + text def func_strip(parser, text): return re.sub("\s+", " ", text).strip() def func_replace(parser, text, old, new): return text.replace(old, new) def func_in(parser, text, needle): if needle in text: return "1" else: return "" def func_inmulti(parser, text, value, separator=MULTI_VALUED_JOINER): """Splits ``text`` by ``separator``, and returns true if the resulting list contains ``value``.""" return func_in(parser, text.split(separator) if separator else [text], value) def func_rreplace(parser, text, old, new): return re.sub(old, new, text) def func_rsearch(parser, text, pattern): match = re.search(pattern, text) if match: try: return match.group(1) except IndexError: return match.group(0) return u"" def func_num(parser, text, length): format = "%%0%dd" % int(length) try: value = int(text) except ValueError: value = 0 return format % value def func_unset(parser, name): """Unsets the variable ``name``.""" if name.startswith("_"): name = "~" + name[1:] try: del parser.context[name] except KeyError: pass return "" def func_set(parser, name, value): """Sets the variable ``name`` to ``value``.""" if value: if name.startswith("_"): name = "~" + name[1:] parser.context[name] = value else: func_unset(parser, name) return "" def func_setmulti(parser, name, value, separator=MULTI_VALUED_JOINER): """Sets the variable ``name`` to ``value`` as a list; splitting by the passed string, or "; " otherwise.""" return func_set(parser, name, value.split(separator) if value and separator else value) def func_get(parser, name): """Returns the variable ``name`` (equivalent to ``%name%``).""" if name.startswith("_"): name = "~" + name[1:] return parser.context.get(name, u"") def func_copy(parser, new, old): """Copies content of variable ``old`` to variable ``new``.""" if new.startswith("_"): new = "~" + new[1:] if old.startswith("_"): old = "~" + old[1:] parser.context[new] = parser.context.getall(old)[:] return "" def func_copymerge(parser, new, old): """Copies content of variable ``old`` and appends it into variable ``new``, removing duplicates. This is normally used to merge a multi-valued variable into another, existing multi-valued variable.""" if new.startswith("_"): new = "~" + new[1:] if old.startswith("_"): old = "~" + old[1:] newvals = parser.context.getall(new) oldvals = parser.context.getall(old) parser.context[new] = newvals + list(set(oldvals) - set(newvals)) return "" def func_trim(parser, text, char=None): """Trims all leading and trailing whitespaces from ``text``. The optional second parameter specifies the character to trim.""" if char: return text.strip(char) else: return text.strip() def func_add(parser, x, y): """Add ``y`` to ``x``.""" try: return str(int(x) + int(y)) except ValueError: return "" def func_sub(parser, x, y): """Substracts ``y`` from ``x``.""" try: return str(int(x) - int(y)) except ValueError: return "" def func_div(parser, x, y): """Divides ``x`` by ``y``.""" try: return str(int(x) / int(y)) except ValueError: return "" def func_mod(parser, x, y): """Returns the remainder of ``x`` divided by ``y``.""" try: return str(int(x) % int(y)) except ValueError: return "" def func_mul(parser, x, y): """Multiplies ``x`` by ``y``.""" try: return str(int(x) * int(y)) except ValueError: return "" def func_or(parser, x, y): """Returns true, if either ``x`` or ``y`` not empty.""" if x or y: return "1" else: return "" def func_and(parser, x, y): """Returns true, if both ``x`` and ``y`` are not empty.""" if x and y: return "1" else: return "" def func_not(parser, x): """Returns true, if ``x`` is empty.""" if not x: return "1" else: return "" def func_eq(parser, x, y): """Returns true, if ``x`` equals ``y``.""" if x == y: return "1" else: return "" def func_ne(parser, x, y): """Returns true, if ``x`` not equals ``y``.""" if x != y: return "1" else: return "" def func_lt(parser, x, y): """Returns true, if ``x`` is lower than ``y``.""" try: if int(x) < int(y): return "1" except ValueError: pass return "" def func_lte(parser, x, y): """Returns true, if ``x`` is lower than or equals ``y``.""" try: if int(x) <= int(y): return "1" except ValueError: pass return "" def func_gt(parser, x, y): """Returns true, if ``x`` is greater than ``y``.""" try: if int(x) > int(y): return "1" except ValueError: pass return "" def func_gte(parser, x, y): """Returns true, if ``x`` is greater than or equals ``y``.""" try: if int(x) >= int(y): return "1" except ValueError: pass return "" def func_len(parser, text=""): return str(len(text)) def func_performer(parser, pattern="", join=", "): values = [] for name, value in parser.context.items(): if name.startswith("performer:") and pattern in name: values.append(value) return join.join(values) def func_matchedtracks(parser, arg): if parser.file: if parser.file.parent: return str(parser.file.parent.album.get_num_matched_tracks()) return "0" def func_firstalphachar(parser, text="", nonalpha="#"): if len(text) == 0: return nonalpha firstchar = text[0] if firstchar.isalpha(): return firstchar.upper() else: return nonalpha def func_initials(parser, text=""): return "".join(a[:1] for a in text.split(" ") if a[:1].isalpha()) def func_firstwords(parser, text, length): try: length = int(length) except ValueError as e: length = 0 if len(text) <= length: return text else: if text[length] == ' ': return text[:length] return text[:length].rsplit(' ', 1)[0] def func_truncate(parser, text, length): try: length = int(length) except ValueError as e: length = None return text[:length].rstrip() def func_swapprefix(parser, text, *prefixes): """ Moves the specified prefixes to the end of text. If no prefix is specified 'A' and 'The' are taken as default. """ # Inspired by the swapprefix plugin by Philipp Wolfer. text, prefix = _delete_prefix(parser, text, *prefixes) if prefix != '': return text + ', ' + prefix return text def func_delprefix(parser, text, *prefixes): """ Deletes the specified prefixes. If no prefix is specified 'A' and 'The' are taken as default. """ # Inspired by the swapprefix plugin by Philipp Wolfer. return _delete_prefix(parser, text, *prefixes)[0] def _delete_prefix(parser, text, *prefixes): """ Worker function to deletes the specified prefixes. Returns remaining string and deleted part separately. If no prefix is specified 'A' and 'The' used. """ # Inspired by the swapprefix plugin by Philipp Wolfer. if not prefixes: prefixes = ('A', 'The') text = text.strip() match = re.match('(' + r'\s+)|('.join(prefixes) + r'\s+)', text) if match: pref = match.group() return text[len(pref):], pref.strip() return text, '' def func_eq_any(parser, x, *args): """ Return True if one string matches any of one or more other strings. $eq_any(a,b,c ...) is functionally equivalent to $or($eq(a,b),$eq(a,c) ...) Example: $if($eq_any(%artist%,foo,bar,baz),$set(engineer,test)) """ # Inspired by the eq2 plugin by Brian Schweitzer. return '1' if x in args else '' def func_ne_all(parser, x, *args): """ Return True if one string doesn't match all of one or more other strings. $ne_all(a,b,c ...) is functionally equivalent to $and($ne(a,b),$ne(a,c) ...) Example: $if($ne_all(%artist%,foo,bar,baz),$set(engineer,test)) """ # Inspired by the ne2 plugin by Brian Schweitzer. return '1' if x not in args else '' def func_eq_all(parser, x, *args): """ Return True if all string are equal. $eq_all(a,b,c ...) is functionally equivalent to $and($eq(a,b),$eq(a,c) ...) Example: $if($eq_all(%albumartist%,%artist%,Justin Bieber),$set(engineer,Meat Loaf)) """ for i in args: if x != i: return '' return '1' def func_ne_any(parser, x, *args): """ Return True if all strings are not equal. $ne_any(a,b,c ...) is functionally equivalent to $or($ne(a,b),$ne(a,c) ...) Example: $if($ne_any(%albumartist%,%trackartist%,%composer%),$set(lyricist,%composer%)) """ return func_not(parser, func_eq_all(parser, x, *args)) register_script_function(func_if, "if", eval_args=False) register_script_function(func_if2, "if2", eval_args=False) register_script_function(func_noop, "noop", eval_args=False) register_script_function(func_left, "left") register_script_function(func_right, "right") register_script_function(func_lower, "lower") register_script_function(func_upper, "upper") register_script_function(func_pad, "pad") register_script_function(func_strip, "strip") register_script_function(func_replace, "replace") register_script_function(func_rreplace, "rreplace") register_script_function(func_rsearch, "rsearch") register_script_function(func_num, "num") register_script_function(func_unset, "unset") register_script_function(func_set, "set") register_script_function(func_setmulti, "setmulti") register_script_function(func_get, "get") register_script_function(func_trim, "trim") register_script_function(func_add, "add") register_script_function(func_sub, "sub") register_script_function(func_div, "div") register_script_function(func_mod, "mod") register_script_function(func_mul, "mul") register_script_function(func_or, "or") register_script_function(func_and, "and") register_script_function(func_not, "not") register_script_function(func_eq, "eq") register_script_function(func_ne, "ne") register_script_function(func_lt, "lt") register_script_function(func_lte, "lte") register_script_function(func_gt, "gt") register_script_function(func_gte, "gte") register_script_function(func_in, "in") register_script_function(func_inmulti, "inmulti") register_script_function(func_copy, "copy") register_script_function(func_copymerge, "copymerge") register_script_function(func_len, "len") register_script_function(func_performer, "performer") register_script_function(func_matchedtracks, "matchedtracks") register_script_function(func_firstalphachar, "firstalphachar") register_script_function(func_initials, "initials") register_script_function(func_firstwords, "firstwords") register_script_function(func_truncate, "truncate") register_script_function(func_swapprefix, "swapprefix", check_argcount=False) register_script_function(func_delprefix, "delprefix", check_argcount=False) register_script_function(func_eq_any, "eq_any", check_argcount=False) register_script_function(func_ne_all, "ne_all", check_argcount=False) register_script_function(func_eq_all, "eq_all", check_argcount=False) register_script_function(func_ne_any, "ne_any", check_argcount=False) picard-release-1.3.2/picard/similarity.py000066400000000000000000000041571245305550700204140ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from picard.util import strip_non_alnum from picard.util.astrcmp import astrcmp def normalize(orig_string): """Strips non-alphanumeric characters from a string unless doing so would make it blank.""" string = strip_non_alnum(orig_string.lower()) if not string: string = orig_string return string def similarity(a1, b1): """Calculates similarity of single words as a function of their edit distance.""" a2 = normalize(a1) if a2: b2 = normalize(b1) else: b2 = "" return astrcmp(a2, b2) _split_words_re = re.compile('\W+', re.UNICODE) def similarity2(a, b): """Calculates similarity of a multi-word strings.""" alist = filter(bool, _split_words_re.split(a.lower())) blist = filter(bool, _split_words_re.split(b.lower())) total = 0 score = 0.0 if len(alist) > len(blist): alist, blist = blist, alist for a in alist: ms = 0.0 mp = None for position, b in enumerate(blist): s = astrcmp(a, b) if s > ms: ms = s mp = position if mp is not None: score += ms if ms > 0.6: del blist[mp] total += 1 total += len(blist) * 0.4 if total: return score / total else: return 0 picard-release-1.3.2/picard/tagger.py000066400000000000000000000613241245305550700174760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sip sip.setapi("QString", 2) sip.setapi("QVariant", 2) from PyQt4 import QtGui, QtCore import getopt import os.path import platform import re import shutil import signal import sys from functools import partial from itertools import chain # A "fix" for http://python.org/sf/1438480 def _patched_shutil_copystat(src, dst): try: _orig_shutil_copystat(src, dst) except OSError: pass _orig_shutil_copystat = shutil.copystat shutil.copystat = _patched_shutil_copystat import picard.resources import picard.plugins from picard.i18n import setup_gettext from picard import (PICARD_APP_NAME, PICARD_ORG_NAME, PICARD_FANCY_VERSION_STR, __version__, log, acoustid, config) from picard.album import Album, NatAlbum from picard.browser.browser import BrowserIntegration from picard.browser.filelookup import FileLookup from picard.cluster import Cluster, ClusterList, UnmatchedFiles from picard.const import USER_DIR, USER_PLUGIN_DIR from picard.dataobj import DataObject from picard.disc import Disc from picard.file import File from picard.formats import open as open_file from picard.track import Track, NonAlbumTrack from picard.releasegroup import ReleaseGroup from picard.collection import load_user_collections from picard.ui.mainwindow import MainWindow from picard.plugin import PluginManager from picard.acoustidmanager import AcoustIDManager from picard.config_upgrade import upgrade_config from picard.util import ( decode_filename, encode_filename, thread, mbid_validate, check_io_encoding, uniqify, is_hidden, versions, ) from picard.webservice import XmlWebService class Tagger(QtGui.QApplication): tagger_stats_changed = QtCore.pyqtSignal() listen_port_changed = QtCore.pyqtSignal(int) cluster_added = QtCore.pyqtSignal(Cluster) cluster_removed = QtCore.pyqtSignal(Cluster) album_added = QtCore.pyqtSignal(Album) album_removed = QtCore.pyqtSignal(Album) __instance = None def __init__(self, args, localedir, autoupdate, debug=False): QtGui.QApplication.__init__(self, args) self.__class__.__instance = self self._args = args self._autoupdate = autoupdate self._debug = False # FIXME: Figure out what's wrong with QThreadPool.globalInstance(). # It's a valid reference, but its start() method doesn't work. self.thread_pool = QtCore.QThreadPool(self) # Use a separate thread pool for file saving, with a thread count of 1, # to avoid race conditions in File._save_and_rename. self.save_thread_pool = QtCore.QThreadPool(self) self.save_thread_pool.setMaxThreadCount(1) if not sys.platform == "win32": # Set up signal handling # It's not possible to call all available functions from signal # handlers, therefore we need to set up a QSocketNotifier to listen # on a socket. Sending data through a socket can be done in a # signal handler, so we use the socket to notify the application of # the signal. # This code is adopted from # https://qt-project.org/doc/qt-4.8/unix-signals.html # To not make the socket module a requirement for the Windows # installer, import it here and not globally import socket self.signalfd = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM, 0) self.signalnotifier = QtCore.QSocketNotifier(self.signalfd[1].fileno(), QtCore.QSocketNotifier.Read, self) self.signalnotifier.activated.connect(self.sighandler) signal.signal(signal.SIGHUP, self.signal) signal.signal(signal.SIGINT, self.signal) signal.signal(signal.SIGTERM, self.signal) # Setup logging self.debug(debug or "PICARD_DEBUG" in os.environ) log.debug("Starting Picard from %r", os.path.abspath(__file__)) log.debug("Platform: %s %s %s", platform.platform(), platform.python_implementation(), platform.python_version()) log.debug("Versions: %s", versions.as_string()) if config.storage_type == config.REGISTRY_PATH: log.debug("Configuration registry path: %s", config.storage) else: log.debug("Configuration file path: %s", config.storage) # TODO remove this before the final release if sys.platform == "win32": olduserdir = "~\\Local Settings\\Application Data\\MusicBrainz Picard" else: olduserdir = "~/.picard" olduserdir = os.path.expanduser(olduserdir) if os.path.isdir(olduserdir): log.info("Moving %s to %s", olduserdir, USER_DIR) try: shutil.move(olduserdir, USER_DIR) except: pass log.debug("User directory: %s", os.path.abspath(USER_DIR)) # for compatibility with pre-1.3 plugins QtCore.QObject.tagger = self QtCore.QObject.config = config QtCore.QObject.log = log check_io_encoding() # Must be before config upgrade because upgrade dialogs need to be # translated setup_gettext(localedir, config.setting["ui_language"], log.debug) upgrade_config() self.xmlws = XmlWebService() load_user_collections() # Initialize fingerprinting self._acoustid = acoustid.AcoustIDClient() self._acoustid.init() # Load plugins self.pluginmanager = PluginManager() if hasattr(sys, "frozen"): self.pluginmanager.load_plugindir(os.path.join(os.path.dirname(sys.argv[0]), "plugins")) else: mydir = os.path.dirname(os.path.abspath(__file__)) self.pluginmanager.load_plugindir(os.path.join(mydir, "plugins")) self.pluginmanager.load_plugindir(os.path.join(mydir, os.pardir, "contrib", "plugins")) if not os.path.exists(USER_PLUGIN_DIR): os.makedirs(USER_PLUGIN_DIR) self.pluginmanager.load_plugindir(USER_PLUGIN_DIR) self.acoustidmanager = AcoustIDManager() self.browser_integration = BrowserIntegration() self.files = {} self.clusters = ClusterList() self.albums = {} self.release_groups = {} self.mbid_redirects = {} self.unmatched_files = UnmatchedFiles() self.nats = None self.window = MainWindow() self.exit_cleanup = [] def register_cleanup(self, func): self.exit_cleanup.append(func) def run_cleanup(self): for f in self.exit_cleanup: f() def debug(self, debug): if self._debug == debug: return if debug: log.log_levels = log.log_levels | log.LOG_DEBUG log.debug("Debug mode on") else: log.debug("Debug mode off") log.log_levels = log.log_levels & ~log.LOG_DEBUG self._debug = debug def move_files_to_album(self, files, albumid=None, album=None): """Move `files` to tracks on album `albumid`.""" if album is None: album = self.load_album(albumid) if album.loaded: album.match_files(files) else: for file in list(files): file.move(album.unmatched_files) def move_file_to_album(self, file, albumid): """Move `file` to a track on album `albumid`.""" self.move_files_to_album([file], albumid) def move_file_to_track(self, file, albumid, recordingid): """Move `file` to recording `recordingid` on album `albumid`.""" album = self.load_album(albumid) file.move(album.unmatched_files) album.run_when_loaded(partial(album.match_file, file, recordingid)) def create_nats(self): if self.nats is None: self.nats = NatAlbum() self.albums["NATS"] = self.nats self.album_added.emit(self.nats) return self.nats def move_file_to_nat(self, file, recordingid, node=None): self.create_nats() file.move(self.nats.unmatched_files) nat = self.load_nat(recordingid, node=node) nat.run_when_loaded(partial(file.move, nat)) if nat.loaded: self.nats.update() def exit(self): log.debug("exit") self.stopping = True self._acoustid.done() self.thread_pool.waitForDone() self.browser_integration.stop() self.xmlws.stop() for f in self.exit_cleanup: f() def _run_init(self): if self._args: files = [] for file in self._args: if os.path.isdir(file): self.add_directory(decode_filename(file)) else: files.append(decode_filename(file)) if files: self.add_files(files) del self._args def run(self): if config.setting["browser_integration"]: self.browser_integration.start() self.window.show() QtCore.QTimer.singleShot(0, self._run_init) res = self.exec_() self.exit() return res def event(self, event): if isinstance(event, thread.ProxyToMainEvent): event.run() elif event.type() == QtCore.QEvent.FileOpen: f = str(event.file()) self.add_files([f]) # We should just return True here, except that seems to # cause the event's sender to get a -9874 error, so # apparently there's some magic inside QFileOpenEvent... return 1 return QtGui.QApplication.event(self, event) def _file_loaded(self, file, target=None): if file is not None and not file.has_error(): recordingid = file.metadata.getall('musicbrainz_recordingid')[0] \ if 'musicbrainz_recordingid' in file.metadata else '' if target is not None: self.move_files([file], target) elif not config.setting["ignore_file_mbids"]: albumid = file.metadata.getall('musicbrainz_albumid')[0] \ if 'musicbrainz_albumid' in file.metadata else '' if mbid_validate(albumid): if mbid_validate(recordingid): self.move_file_to_track(file, albumid, recordingid) else: self.move_file_to_album(file, albumid) elif mbid_validate(recordingid): self.move_file_to_nat(file, recordingid) elif config.setting['analyze_new_files'] and file.can_analyze(): self.analyze([file]) elif config.setting['analyze_new_files'] and file.can_analyze(): self.analyze([file]) def move_files(self, files, target): if isinstance(target, (Track, Cluster)): for file in files: file.move(target) elif isinstance(target, File): for file in files: file.move(target.parent) elif isinstance(target, Album): self.move_files_to_album(files, album=target) elif isinstance(target, ClusterList): self.cluster(files) def add_files(self, filenames, target=None): """Add files to the tagger.""" ignoreregex = None pattern = config.setting['ignore_regex'] if pattern: ignoreregex = re.compile(pattern) ignore_hidden = config.setting["ignore_hidden_files"] new_files = [] for filename in filenames: filename = os.path.normpath(os.path.realpath(filename)) if ignore_hidden and is_hidden(filename): log.debug("File ignored (hidden): %s" % (filename)) continue if ignoreregex is not None and ignoreregex.search(filename): log.info("File ignored (matching %s): %s" % (pattern, filename)) continue if filename not in self.files: file = open_file(filename) if file: self.files[filename] = file new_files.append(file) if new_files: log.debug("Adding files %r", new_files) new_files.sort(key=lambda x: x.filename) if target is None or target is self.unmatched_files: self.unmatched_files.add_files(new_files) target = None for file in new_files: file.load(partial(self._file_loaded, target=target)) def add_directory(self, path): ignore_hidden = config.setting["ignore_hidden_files"] walk = os.walk(unicode(path)) def get_files(): try: root, dirs, files = walk.next() if ignore_hidden: dirs[:] = [d for d in dirs if not is_hidden(os.path.join(root, d))] except StopIteration: return None else: number_of_files = len(files) if number_of_files: mparms = { 'count': number_of_files, 'directory': root, } log.debug("Adding %(count)d files from '%(directory)s'" % mparms) self.window.set_statusbar_message( ungettext( "Adding %(count)d file from '%(directory)s' ...", "Adding %(count)d files from '%(directory)s' ...", number_of_files), mparms, translate=None, echo=None ) return (os.path.join(root, f) for f in files) def process(result=None, error=None): if result: if error is None: self.add_files(result) thread.run_task(get_files, process) process(True, False) def get_file_lookup(self): """Return a FileLookup object.""" return FileLookup(self, config.setting["server_host"], config.setting["server_port"], self.browser_integration.port) def search(self, text, type, adv=False): """Search on the MusicBrainz website.""" lookup = self.get_file_lookup() getattr(lookup, type + "Search")(text, adv) def collection_lookup(self): """Lookup the users collections on the MusicBrainz website.""" lookup = self.get_file_lookup() lookup.collectionLookup(config.setting["username"]) def browser_lookup(self, item): """Lookup the object's metadata on the MusicBrainz website.""" lookup = self.get_file_lookup() metadata = item.metadata # Only lookup via MB IDs if matched to a DataObject; otherwise ignore and use metadata details if isinstance(item, DataObject): itemid = item.id if isinstance(item, Track): lookup.recordingLookup(itemid) elif isinstance(item, Album): lookup.albumLookup(itemid) else: lookup.tagLookup( metadata["albumartist"] if item.is_album_like() else metadata["artist"], metadata["album"], metadata["title"], metadata["tracknumber"], '' if item.is_album_like() else str(metadata.length), item.filename if isinstance(item, File) else '') def get_files_from_objects(self, objects, save=False): """Return list of files from list of albums, clusters, tracks or files.""" return uniqify(chain(*[obj.iterfiles(save) for obj in objects])) def save(self, objects): """Save the specified objects.""" files = self.get_files_from_objects(objects, save=True) for file in files: file.save() def load_album(self, id, discid=None): id = self.mbid_redirects.get(id, id) album = self.albums.get(id) if album: log.debug("Album %s already loaded.", id) return album album = Album(id, discid=discid) self.albums[id] = album self.album_added.emit(album) album.load() return album def load_nat(self, id, node=None): self.create_nats() nat = self.get_nat_by_id(id) if nat: log.debug("NAT %s already loaded.", id) return nat nat = NonAlbumTrack(id) self.nats.tracks.append(nat) self.nats.update(True) if node: nat._parse_recording(node) else: nat.load() return nat def get_nat_by_id(self, id): if self.nats is not None: for nat in self.nats.tracks: if nat.id == id: return nat def get_release_group_by_id(self, id): return self.release_groups.setdefault(id, ReleaseGroup(id)) def remove_files(self, files, from_parent=True): """Remove files from the tagger.""" for file in files: if file.filename in self.files: file.clear_lookup_task() self._acoustid.stop_analyze(file) del self.files[file.filename] file.remove(from_parent) def remove_album(self, album): """Remove the specified album.""" log.debug("Removing %r", album) album.stop_loading() self.remove_files(self.get_files_from_objects([album])) del self.albums[album.id] if album.release_group: album.release_group.remove_album(album.id) if album == self.nats: self.nats = None self.album_removed.emit(album) def remove_cluster(self, cluster): """Remove the specified cluster.""" if not cluster.special: log.debug("Removing %r", cluster) files = list(cluster.files) cluster.files = [] cluster.clear_lookup_task() self.remove_files(files, from_parent=False) self.clusters.remove(cluster) self.cluster_removed.emit(cluster) def remove(self, objects): """Remove the specified objects.""" files = [] for obj in objects: if isinstance(obj, File): files.append(obj) elif isinstance(obj, Track): files.extend(obj.linked_files) elif isinstance(obj, Album): self.window.set_statusbar_message( N_("Removing album %(id)s: %(artist)s - %(album)s"), { 'id': obj.id, 'artist': obj.metadata['albumartist'], 'album': obj.metadata['album'] } ) self.remove_album(obj) elif isinstance(obj, Cluster): self.remove_cluster(obj) if files: self.remove_files(files) def _lookup_disc(self, disc, result=None, error=None): self.restore_cursor() if error is not None: QtGui.QMessageBox.critical(self.window, _(u"CD Lookup Error"), _(u"Error while reading CD:\n\n%s") % error) else: disc.lookup() def lookup_cd(self, action): """Reads CD from the selected drive and tries to lookup the DiscID on MusicBrainz.""" if isinstance(action, QtGui.QAction): device = unicode(action.text()) elif config.setting["cd_lookup_device"] != '': device = config.setting["cd_lookup_device"].split(",", 1)[0] else: # rely on python-discid auto detection device = None disc = Disc() self.set_wait_cursor() thread.run_task( partial(disc.read, encode_filename(device)), partial(self._lookup_disc, disc)) @property def use_acoustid(self): return config.setting["fingerprinting_system"] == "acoustid" def analyze(self, objs): """Analyze the file(s).""" files = self.get_files_from_objects(objs) for file in files: file.set_pending() if self.use_acoustid: self._acoustid.analyze(file, partial(file._lookup_finished, 'acoustid')) # ======================================================================= # Metadata-based lookups # ======================================================================= def autotag(self, objects): for obj in objects: if obj.can_autotag(): obj.lookup_metadata() # ======================================================================= # Clusters # ======================================================================= def cluster(self, objs): """Group files with similar metadata to 'clusters'.""" log.debug("Clustering %r", objs) if len(objs) <= 1 or self.unmatched_files in objs: files = list(self.unmatched_files.files) else: files = self.get_files_from_objects(objs) fcmp = lambda a, b: ( cmp(a.discnumber, b.discnumber) or cmp(a.tracknumber, b.tracknumber) or cmp(a.base_filename, b.base_filename)) for name, artist, files in Cluster.cluster(files, 1.0): QtCore.QCoreApplication.processEvents() cluster = self.load_cluster(name, artist) for file in sorted(files, fcmp): file.move(cluster) def load_cluster(self, name, artist): for cluster in self.clusters: cm = cluster.metadata if name == cm["album"] and artist == cm["albumartist"]: return cluster cluster = Cluster(name, artist) self.clusters.append(cluster) self.cluster_added.emit(cluster) return cluster # ======================================================================= # Utils # ======================================================================= def set_wait_cursor(self): """Sets the waiting cursor.""" QtGui.QApplication.setOverrideCursor( QtGui.QCursor(QtCore.Qt.WaitCursor)) def restore_cursor(self): """Restores the cursor set by ``set_wait_cursor``.""" QtGui.QApplication.restoreOverrideCursor() def refresh(self, objs): for obj in objs: if obj.can_refresh(): obj.load(priority=True, refresh=True) @classmethod def instance(cls): return cls.__instance def signal(self, signum, frame): log.debug("signal %i received", signum) # Send a notification about a received signal from the signal handler # to Qt. self.signalfd[0].sendall("a") def sighandler(self): self.signalnotifier.setEnabled(False) self.exit() self.quit() self.signalnotifier.setEnabled(True) def help(): print """Usage: %s [OPTIONS] [FILE] [FILE] ... If one of the filenames begins with a hyphen, use -- to separate the options from the filenames. Options: -d, --debug enable debug-level logging -h, --help display this help and exit -v, --version display version information and exit """ % (sys.argv[0],) def version(): print "%s %s %s" % (PICARD_ORG_NAME, PICARD_APP_NAME, PICARD_FANCY_VERSION_STR) def main(localedir=None, autoupdate=True): # Some libs (ie. Phonon) require those to be set QtGui.QApplication.setApplicationName(PICARD_APP_NAME) QtGui.QApplication.setOrganizationName(PICARD_ORG_NAME) signal.signal(signal.SIGINT, signal.SIG_DFL) opts, args = getopt.gnu_getopt(sys.argv[1:], "hvd", ["help", "version", "debug"]) kwargs = {} for opt, arg in opts: if opt in ("-h", "--help"): return help() elif opt in ("-v", "--version"): return version() elif opt in ("-d", "--debug"): kwargs["debug"] = True tagger = Tagger(args, localedir, autoupdate, **kwargs) tagger.startTimer(1000) sys.exit(tagger.run()) picard-release-1.3.2/picard/track.py000066400000000000000000000175651245305550700173410ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from picard import config, log from picard.metadata import Metadata, run_track_metadata_processors from picard.dataobj import DataObject from picard.util.textencoding import asciipunct from picard.mbxml import recording_to_metadata from picard.script import ScriptParser from picard.const import VARIOUS_ARTISTS_ID from picard.ui.item import Item import traceback _TRANSLATE_TAGS = { "hip hop": u"Hip-Hop", "synth-pop": u"Synthpop", "electronica": u"Electronic", } class Track(DataObject, Item): def __init__(self, id, album=None): DataObject.__init__(self, id) self.album = album self.linked_files = [] self.num_linked_files = 0 self.metadata = Metadata() def __repr__(self): return '' % (self.id, self.metadata["title"]) def add_file(self, file): if file not in self.linked_files: self.linked_files.append(file) self.num_linked_files += 1 self.album._add_file(self, file) self.update_file_metadata(file) def update_file_metadata(self, file): if file not in self.linked_files: return file.copy_metadata(self.metadata) file.metadata['~extension'] = file.orig_metadata['~extension'] file.metadata.changed = True file.update(signal=False) self.update() def remove_file(self, file): if file not in self.linked_files: return self.linked_files.remove(file) self.num_linked_files -= 1 file.copy_metadata(file.orig_metadata) self.album._remove_file(self, file) self.update() def update(self): if self.item: self.item.update() def iterfiles(self, save=False): for file in self.linked_files: yield file def is_linked(self): return self.num_linked_files > 0 def can_save(self): """Return if this object can be saved.""" for file in self.linked_files: if file.can_save(): return True return False def can_remove(self): """Return if this object can be removed.""" for file in self.linked_files: if file.can_remove(): return True return False def can_edit_tags(self): """Return if this object supports tag editing.""" return True def can_view_info(self): return self.num_linked_files == 1 def column(self, column): m = self.metadata if column == 'title': prefix = "%s-" % m['discnumber'] if m['discnumber'] and m['totaldiscs'] != "1" else "" return u"%s%s %s" % (prefix, m['tracknumber'].zfill(2), m['title']) return m[column] def _customize_metadata(self): tm = self.metadata # Custom VA name if tm['musicbrainz_artistid'] == VARIOUS_ARTISTS_ID: tm['artistsort'] = tm['artist'] = config.setting['va_name'] if config.setting['folksonomy_tags']: self._convert_folksonomy_tags_to_genre() # Convert Unicode punctuation if config.setting['convert_punctuation']: tm.apply_func(asciipunct) def _convert_folksonomy_tags_to_genre(self): # Combine release and track tags tags = dict(self.folksonomy_tags) self.merge_folksonomy_tags(tags, self.album.folksonomy_tags) if self.album.release_group: self.merge_folksonomy_tags(tags, self.album.release_group.folksonomy_tags) if not tags: return # Convert counts to values from 0 to 100 maxcount = max(tags.values()) taglist = [] for name, count in tags.items(): taglist.append((100 * count / maxcount, name)) taglist.sort(reverse=True) # And generate the genre metadata tag maxtags = config.setting['max_tags'] minusage = config.setting['min_tag_usage'] ignore_tags = config.setting['ignore_tags'] genre = [] for usage, name in taglist[:maxtags]: if name in ignore_tags: continue if usage < minusage: break name = _TRANSLATE_TAGS.get(name, name.title()) genre.append(name) join_tags = config.setting['join_tags'] if join_tags: genre = [join_tags.join(genre)] self.metadata['genre'] = genre class NonAlbumTrack(Track): def __init__(self, id): Track.__init__(self, id, self.tagger.nats) self.callback = None self.loaded = False def can_refresh(self): return True def column(self, column): if column == "title": return self.metadata["title"] return Track.column(self, column) def load(self, priority=False, refresh=False): self.metadata.copy(self.album.metadata) self.metadata["title"] = u"[loading track information]" self.loaded = False self.tagger.nats.update(True) mblogin = False inc = ["artist-credits", "artists", "aliases"] if config.setting["track_ars"]: inc += ["artist-rels", "url-rels", "recording-rels", "work-rels", "work-level-rels"] if config.setting["folksonomy_tags"]: if config.setting["only_my_tags"]: mblogin = True inc += ["user-tags"] else: inc += ["tags"] if config.setting["enable_ratings"]: mblogin = True inc += ["user-ratings"] self.tagger.xmlws.get_track_by_id(self.id, partial(self._recording_request_finished), inc, mblogin=mblogin, priority=priority, refresh=refresh) def _recording_request_finished(self, document, http, error): if error: log.error("%r", unicode(http.errorString())) return try: recording = document.metadata[0].recording[0] self._parse_recording(recording) for file in self.linked_files: self.update_file_metadata(file) except: log.error(traceback.format_exc()) def _parse_recording(self, recording): recording_to_metadata(recording, self) self._customize_metadata() m = self.metadata run_track_metadata_processors(self.album, m, None, recording) if config.setting["enable_tagger_script"]: script = config.setting["tagger_script"] if script: parser = ScriptParser() try: parser.eval(script, m) except: log.error(traceback.format_exc()) m.strip_whitespace() self.loaded = True if self.callback: self.callback() self.callback = None self.tagger.nats.update(True) def run_when_loaded(self, func): if self.loaded: func() else: self.callback = func picard-release-1.3.2/picard/ui/000077500000000000000000000000001245305550700162625ustar00rootroot00000000000000picard-release-1.3.2/picard/ui/__init__.py000066400000000000000000000020431245305550700203720ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui class PicardDialog(QtGui.QDialog): flags = QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent, self.flags) picard-release-1.3.2/picard/ui/cdlookup.py000066400000000000000000000063561245305550700204660ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui from picard.ui import PicardDialog from picard.ui.ui_cdlookup import Ui_Dialog from picard.mbxml import artist_credit_from_node, label_info_from_node class CDLookupDialog(PicardDialog): def __init__(self, releases, disc, parent=None): PicardDialog.__init__(self, parent) self.releases = releases self.disc = disc self.ui = Ui_Dialog() self.ui.setupUi(self) self.ui.release_list.setSortingEnabled(True) self.ui.release_list.setHeaderLabels([_(u"Album"), _(u"Artist"), _(u"Date"), _(u"Country"), _(u"Labels"), _(u"Catalog #s"), _(u"Barcode")]) if self.releases: for release in self.releases: labels, catalog_numbers = label_info_from_node(release.label_info_list[0]) date = release.date[0].text if "date" in release.children else "" country = release.country[0].text if "country" in release.children else "" barcode = release.barcode[0].text if "barcode" in release.children else "" item = QtGui.QTreeWidgetItem(self.ui.release_list) item.setText(0, release.title[0].text) item.setText(1, artist_credit_from_node(release.artist_credit[0])[0]) item.setText(2, date) item.setText(3, country) item.setText(4, ", ".join(labels)) item.setText(5, ", ".join(catalog_numbers)) item.setText(6, barcode) item.setData(0, QtCore.Qt.UserRole, release.id) self.ui.release_list.setCurrentItem(self.ui.release_list.topLevelItem(0)) self.ui.ok_button.setEnabled(True) for i in range(self.ui.release_list.columnCount() - 1): self.ui.release_list.resizeColumnToContents(i) # Sort by descending date, then ascending country self.ui.release_list.sortByColumn(3, QtCore.Qt.AscendingOrder) self.ui.release_list.sortByColumn(2, QtCore.Qt.DescendingOrder) self.ui.lookup_button.clicked.connect(self.lookup) def accept(self): release_id = self.ui.release_list.currentItem().data(0, QtCore.Qt.UserRole) self.tagger.load_album(release_id, discid=self.disc.id) QtGui.QDialog.accept(self) def lookup(self): lookup = self.tagger.get_file_lookup() lookup.discLookup(self.disc.submission_url) QtGui.QDialog.accept(self) picard-release-1.3.2/picard/ui/collectionmenu.py000066400000000000000000000061551245305550700216630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2013 Michael Wiencek # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import locale from PyQt4 import QtCore, QtGui from picard.collection import user_collections, load_user_collections class CollectionMenu(QtGui.QMenu): def __init__(self, albums, *args): QtGui.QMenu.__init__(self, *args) self.ids = set(a.id for a in albums) self.update_collections() def update_collections(self): self.clear() for id, collection in sorted(user_collections.iteritems(), key=lambda (k, v): (locale.strxfrm(v.name.encode('utf-8')), k)): action = QtGui.QWidgetAction(self) action.setDefaultWidget(CollectionCheckBox(self, collection)) self.addAction(action) self.addSeparator() self.refresh_action = self.addAction(_("Refresh List")) def refresh_list(self): self.refresh_action.setEnabled(False) load_user_collections(self.update_collections) def mouseReleaseEvent(self, event): # Not using self.refresh_action.triggered because it closes the menu if self.actionAt(event.pos()) == self.refresh_action and self.refresh_action.isEnabled(): self.refresh_list() class CollectionCheckBox(QtGui.QCheckBox): def __init__(self, menu, collection): self.menu = menu self.collection = collection QtGui.QCheckBox.__init__(self, self.label()) releases = collection.releases & menu.ids if len(releases) == len(menu.ids): self.setCheckState(QtCore.Qt.Checked) elif not releases: self.setCheckState(QtCore.Qt.Unchecked) else: self.setCheckState(QtCore.Qt.PartiallyChecked) def nextCheckState(self): ids = self.menu.ids if ids & self.collection.pending: return diff = ids - self.collection.releases if diff: self.collection.add_releases(diff, self.updateText) self.setCheckState(QtCore.Qt.Checked) else: self.collection.remove_releases(ids & self.collection.releases, self.updateText) self.setCheckState(QtCore.Qt.Unchecked) def updateText(self): self.setText(self.label()) def label(self): c = self.collection return ungettext("%s (%i release)", "%s (%i releases)", c.size) % (c.name, c.size) picard-release-1.3.2/picard/ui/coverartbox.py000066400000000000000000000175561245305550700212100ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006,2011 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os from functools import partial from PyQt4 import QtCore, QtGui, QtNetwork from picard import config, log from picard.album import Album from picard.coverart.image import CoverArtImage, CoverArtImageError from picard.track import Track from picard.file import File from picard.util import webbrowser2, encode_filename class ActiveLabel(QtGui.QLabel): """Clickable QLabel.""" clicked = QtCore.pyqtSignal() imageDropped = QtCore.pyqtSignal(QtCore.QUrl) def __init__(self, active=True, *args): QtGui.QLabel.__init__(self, *args) self.setMargin(0) self.setActive(active) self.setAcceptDrops(False) def setActive(self, active): self.active = active if self.active: self.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) else: self.setCursor(QtGui.QCursor()) def mouseReleaseEvent(self, event): if self.active and event.button() == QtCore.Qt.LeftButton: self.clicked.emit() def dragEnterEvent(self, event): for url in event.mimeData().urls(): if url.scheme() in ('http', 'file'): event.acceptProposedAction() break def dropEvent(self, event): accepted = False for url in event.mimeData().urls(): if url.scheme() in ('http', 'file'): accepted = True self.imageDropped.emit(url) if accepted: event.acceptProposedAction() class CoverArtBox(QtGui.QGroupBox): def __init__(self, parent): QtGui.QGroupBox.__init__(self, "") self.layout = QtGui.QVBoxLayout() self.layout.setSpacing(0) # Kills off any borders self.setStyleSheet('''QGroupBox{background-color:none;border:1px;}''') self.setFlat(True) self.release = None self.data = None self.item = None self.shadow = QtGui.QPixmap(":/images/CoverArtShadow.png") self.coverArt = ActiveLabel(False, parent) self.coverArt.setPixmap(self.shadow) self.coverArt.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignHCenter) self.coverArt.clicked.connect(self.open_release_page) self.coverArt.imageDropped.connect(self.fetch_remote_image) self.layout.addWidget(self.coverArt, 0) self.setLayout(self.layout) def show(self): self.__set_data(self.data, True) QtGui.QGroupBox.show(self) def __set_data(self, data, force=False, pixmap=None): if not force and self.data == data: return self.data = data if not force and self.isHidden(): return cover = self.shadow if self.data: if pixmap is None: pixmap = QtGui.QPixmap() pixmap.loadFromData(self.data.data) if not pixmap.isNull(): offx, offy, w, h = (1, 1, 121, 121) cover = QtGui.QPixmap(self.shadow) pixmap = pixmap.scaled(w, h, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) painter = QtGui.QPainter(cover) bgcolor = QtGui.QColor.fromRgb(0, 0, 0, 128) painter.fillRect(QtCore.QRectF(offx, offy, w, h), bgcolor) x = offx + (w - pixmap.width()) / 2 y = offy + (h - pixmap.height()) / 2 painter.drawPixmap(x, y, pixmap) painter.end() self.coverArt.setPixmap(cover) def set_metadata(self, metadata, item): self.item = item data = None if metadata and metadata.images: for image in metadata.images: if image.is_front_image(): data = image break else: # There's no front image, choose the first one available data = metadata.images[0] self.__set_data(data) if item and metadata: self.coverArt.setAcceptDrops(True) else: self.coverArt.setAcceptDrops(False) release = None if metadata: release = metadata.get("musicbrainz_albumid", None) if release: self.coverArt.setActive(True) self.coverArt.setToolTip(_(u"View release on MusicBrainz")) else: self.coverArt.setActive(False) self.coverArt.setToolTip("") self.release = release def open_release_page(self): host = config.setting["server_host"] port = config.setting["server_port"] url = "http://%s:%s/release/%s" % (host, port, self.release) webbrowser2.open(url) def fetch_remote_image(self, url): if self.item is None: return if url.scheme() == 'http': path = url.encodedPath() if url.hasQuery(): path += '?' + url.encodedQuery() self.tagger.xmlws.get(url.encodedHost(), url.port(80), path, partial(self.on_remote_image_fetched, url), xml=False, priority=True, important=True) elif url.scheme() == 'file': path = encode_filename(unicode(url.toLocalFile())) if os.path.exists(path): f = open(path, 'rb') mime = 'image/png' if path.lower().endswith('.png') else 'image/jpeg' data = f.read() f.close() self.load_remote_image(url, mime, data) def on_remote_image_fetched(self, url, data, reply, error): mime = reply.header(QtNetwork.QNetworkRequest.ContentTypeHeader) if mime in ('image/jpeg', 'image/png'): self.load_remote_image(url, mime, data) elif reply.url().hasQueryItem("imgurl"): # This may be a google images result, try to get the URL which is encoded in the query url = QtCore.QUrl(reply.url().queryItemValue("imgurl")) self.fetch_remote_image(url) else: log.warning("Can't load image with MIME-Type %s", mime) def load_remote_image(self, url, mime, data): try: coverartimage = CoverArtImage( url=url.toString(), data=data ) except CoverArtImageError as e: log.warning("Can't load image: %s" % unicode(e)) return pixmap = QtGui.QPixmap() pixmap.loadFromData(data) self.__set_data([mime, data], pixmap=pixmap) if isinstance(self.item, Album): album = self.item album.metadata.append_image(coverartimage) for track in album.tracks: track.metadata.append_image(coverartimage) for file in album.iterfiles(): file.metadata.append_image(coverartimage) elif isinstance(self.item, Track): track = self.item track.metadata.append_image(coverartimage) for file in track.iterfiles(): file.metadata.append_image(coverartimage) elif isinstance(self.item, File): file = self.item file.metadata.append_image(coverartimage) picard-release-1.3.2/picard/ui/edittagdialog.py000066400000000000000000000156661245305550700214530ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2011 Michael Wiencek # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui from picard.util.tags import TAG_NAMES from picard.ui import PicardDialog from picard.ui.ui_edittagdialog import Ui_EditTagDialog class EditTagDialog(PicardDialog): def __init__(self, window, tag): PicardDialog.__init__(self, window) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.window = window self.value_list = self.ui.value_list self.metadata_box = window.metadata_box self.tag = tag self.modified_tags = {} self.different = False self.default_tags = sorted( set(TAG_NAMES.keys() + self.metadata_box.tag_diff.tag_names)) tag_names = self.ui.tag_names tag_names.editTextChanged.connect(self.tag_changed) tag_names.addItem("") visible_tags = [tn for tn in self.default_tags if not tn.startswith("~")] tag_names.addItems(visible_tags) self.completer = QtGui.QCompleter(visible_tags, tag_names) self.completer.setCompletionMode(QtGui.QCompleter.PopupCompletion) tag_names.setCompleter(self.completer) self.tag_changed(tag) self.value_selection_changed() self.ui.edit_value.clicked.connect(self.edit_value) self.ui.add_value.clicked.connect(self.add_value) self.ui.remove_value.clicked.connect(self.remove_value) self.value_list.itemChanged.connect(self.value_edited) self.value_list.itemSelectionChanged.connect(self.value_selection_changed) def edit_value(self): item = self.value_list.currentItem() if item: self.value_list.editItem(item) def add_value(self): self._modified_tag().append("") item = QtGui.QListWidgetItem() item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) self.value_list.addItem(item) self.value_list.editItem(item) def remove_value(self): value_list = self.value_list row = value_list.row(value_list.currentItem()) if row == 0 and self.different: self.different = False self.ui.add_value.setEnabled(True) value_list.takeItem(row) del self._modified_tag()[row] def disable_all(self): self.value_list.clear() self.value_list.setEnabled(False) self.ui.add_value.setEnabled(False) def enable_all(self): self.value_list.setEnabled(True) self.ui.add_value.setEnabled(True) def tag_changed(self, tag): tag_names = self.ui.tag_names tag_names.editTextChanged.disconnect(self.tag_changed) flags = QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive # if the previous tag was new and has no value, remove it from the QComboBox. # e.g. typing "XYZ" should not leave "X" or "XY" in the QComboBox. if self.tag and self.tag not in self.default_tags and self._modified_tag() == [""]: tag_names.removeItem(tag_names.findText(self.tag, flags)) row = tag_names.findText(tag, flags) self.tag = unicode(tag) if row <= 0: if tag: # add custom tags to the QComboBox immediately tag_names.addItem(tag) tag_names.model().sort(0) row = tag_names.findText(tag, flags) else: # the QLineEdit is empty, disable everything self.disable_all() tag_names.setCurrentIndex(0) tag_names.editTextChanged.connect(self.tag_changed) return self.enable_all() tag_names.setCurrentIndex(row) self.value_list.clear() values = self.modified_tags.get(self.tag, None) if values is None: new_tags = self.metadata_box.tag_diff.new display_value, self.different = new_tags.display_value(self.tag) values = [display_value] if self.different else new_tags[self.tag] self.ui.add_value.setEnabled(not self.different) self._add_value_items(values) self.value_list.setCurrentItem(self.value_list.item(0), QtGui.QItemSelectionModel.SelectCurrent) tag_names.editTextChanged.connect(self.tag_changed) def _add_value_items(self, values): values = [v for v in values if v] or [""] for value in values: item = QtGui.QListWidgetItem(value) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) font = item.font() font.setItalic(self.different) item.setFont(font) self.value_list.addItem(item) def value_edited(self, item): row = self.value_list.row(item) value = unicode(item.text()) if row == 0 and self.different: self.modified_tags[self.tag] = [value] self.different = False font = item.font() font.setItalic(False) item.setFont(font) self.ui.add_value.setEnabled(True) else: self._modified_tag()[row] = value # add tags to the completer model once they get values cm = self.completer.model() if self.tag not in cm.stringList(): cm.insertRows(0, 1) cm.setData(cm.index(0, 0), self.tag) cm.sort(0) def value_selection_changed(self): selection = len(self.value_list.selectedItems()) > 0 self.ui.edit_value.setEnabled(selection) self.ui.remove_value.setEnabled(selection) def _modified_tag(self): return self.modified_tags.setdefault(self.tag, list(self.metadata_box.tag_diff.new[self.tag]) or [""]) def accept(self): self.window.ignore_selection_changes = True for tag, values in self.modified_tags.items(): self.modified_tags[tag] = [v for v in values if v] modified_tags = self.modified_tags.items() for obj in self.metadata_box.objects: for tag, values in modified_tags: obj.metadata[tag] = list(values) obj.update() self.window.ignore_selection_changes = False self.window.update_selection() QtGui.QDialog.accept(self) picard-release-1.3.2/picard/ui/filebrowser.py000066400000000000000000000133761245305550700211710ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006-2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # import os import sys from PyQt4 import QtCore, QtGui from picard import config from picard.formats import supported_formats from picard.util import find_existing_path class FileBrowser(QtGui.QTreeView): options = [ config.TextOption("persist", "current_browser_path", ""), config.BoolOption("persist", "show_hidden_files", False), ] def __init__(self, parent): QtGui.QTreeView.__init__(self, parent) self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.setDragEnabled(True) self.move_files_here_action = QtGui.QAction(_("&Move Tagged Files Here"), self) self.move_files_here_action.triggered.connect(self.move_files_here) self.addAction(self.move_files_here_action) self.toggle_hidden_action = QtGui.QAction(_("Show &Hidden Files"), self) self.toggle_hidden_action.setCheckable(True) self.toggle_hidden_action.setChecked(config.persist["show_hidden_files"]) self.toggle_hidden_action.toggled.connect(self.show_hidden) self.addAction(self.toggle_hidden_action) self.set_as_starting_directory_action = QtGui.QAction(_("&Set as starting directory"), self) self.set_as_starting_directory_action.triggered.connect(self.set_as_starting_directory) self.addAction(self.set_as_starting_directory_action) self.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) self.focused = False self._set_model() def _set_model(self): self.model = QtGui.QFileSystemModel() self.model.layoutChanged.connect(self._layout_changed) self.model.setRootPath(QtCore.QDir.rootPath()) self._set_model_filter() filters = [] for exts, name in supported_formats(): filters.extend("*" + e for e in exts) self.model.setNameFilters(filters) # Hide unsupported files completely self.model.setNameFilterDisables(False) self.model.sort(0, QtCore.Qt.AscendingOrder) self.setModel(self.model) if sys.platform == "darwin": self.setRootIndex(self.model.index("/Volumes")) header = self.header() header.hideSection(1) header.hideSection(2) header.hideSection(3) header.setResizeMode(QtGui.QHeaderView.ResizeToContents) header.setStretchLastSection(False) header.setVisible(False) def _set_model_filter(self): filter = QtCore.QDir.AllDirs | QtCore.QDir.Files | QtCore.QDir.Drives | QtCore.QDir.NoDotAndDotDot if config.persist["show_hidden_files"]: filter |= QtCore.QDir.Hidden self.model.setFilter(filter) def _layout_changed(self): def scroll(): # XXX The currentIndex seems to change while QFileSystemModel is # populating itself (so setCurrentIndex in __init__ won't last). # The time it takes to load varies and there are no signals to find # out when it's done. As a workaround, keep restoring the state as # long as the layout is updating, and the user hasn't focused yet. if not self.focused: self._restore_state() self.scrollTo(self.currentIndex()) QtCore.QTimer.singleShot(0, scroll) def mousePressEvent(self, event): index = self.indexAt(event.pos()) if index.isValid(): self.selectionModel().setCurrentIndex(index, QtGui.QItemSelectionModel.NoUpdate) QtGui.QTreeView.mousePressEvent(self, event) def focusInEvent(self, event): self.focused = True QtGui.QTreeView.focusInEvent(self, event) def show_hidden(self, state): config.persist["show_hidden_files"] = state self._set_model_filter() def save_state(self): indexes = self.selectedIndexes() if indexes: path = self.model.filePath(indexes[0]) config.persist["current_browser_path"] = os.path.normpath(unicode(path)) def restore_state(self): pass def _restore_state(self): if config.setting["starting_directory"]: path = config.setting["starting_directory_path"] scrolltype = QtGui.QAbstractItemView.PositionAtTop else: path = config.persist["current_browser_path"] scrolltype = QtGui.QAbstractItemView.PositionAtCenter if path: index = self.model.index(find_existing_path(unicode(path))) self.setCurrentIndex(index) self.expand(index) self.scrollTo(index, scrolltype) def move_files_here(self): indexes = self.selectedIndexes() if not indexes: return path = self.model.filePath(indexes[0]) config.setting["move_files_to"] = os.path.normpath(unicode(path)) def set_as_starting_directory(self): indexes = self.selectedIndexes() if indexes: path = self.model.filePath(indexes[0]) config.setting["starting_directory_path"] = os.path.normpath(unicode(path)) picard-release-1.3.2/picard/ui/infodialog.py000066400000000000000000000147471245305550700207640ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os.path import cgi import traceback from PyQt4 import QtGui, QtCore from picard import log from picard.coverart.utils import translate_caa_type from picard.coverart.image import CoverArtImageIOError from picard.util import format_time, encode_filename, bytes2human, webbrowser2 from picard.ui import PicardDialog from picard.ui.ui_infodialog import Ui_InfoDialog class InfoDialog(PicardDialog): def __init__(self, obj, parent=None): PicardDialog.__init__(self, parent) self.obj = obj self.ui = Ui_InfoDialog() self.ui.setupUi(self) self.ui.buttonBox.accepted.connect(self.accept) self.ui.buttonBox.rejected.connect(self.reject) self.setWindowTitle(_("Info")) self._display_tabs() def _display_tabs(self): self._display_info_tab() self._display_artwork_tab() def _display_artwork_tab(self): tab = self.ui.artwork_tab images = self.obj.metadata.images if not images: self.tab_hide(tab) return self.ui.artwork_list.itemDoubleClicked.connect(self.show_item) for image in images: data = None try: if image.thumbnail: try: data = image.thumbnail.data except CoverArtImageIOError as e: log.warning(unicode(e)) pass else: data = image.data except CoverArtImageIOError: log.error(traceback.format_exc()) continue item = QtGui.QListWidgetItem() item.setData(QtCore.Qt.UserRole, image) if data is not None: pixmap = QtGui.QPixmap() pixmap.loadFromData(data) icon = QtGui.QIcon(pixmap) item.setIcon(icon) item.setToolTip( _("Double-click to open in external viewer\n" "Temporary file: %s\n" "Source: %s") % (image.tempfile_filename, image.source)) infos = [] infos.append(image.types_as_string()) if image.comment: infos.append(image.comment) infos.append(u"%s (%s)" % (bytes2human.decimal(image.datalength), bytes2human.binary(image.datalength))) if image.width and image.height: infos.append(u"%d x %d" % (image.width, image.height)) infos.append(image.mimetype) item.setText(u"\n".join(infos)) self.ui.artwork_list.addItem(item) def tab_hide(self, widget): tab = self.ui.tabWidget index = tab.indexOf(widget) tab.removeTab(index) def show_item(self, item): coverartimage = item.data(QtCore.Qt.UserRole) filename = coverartimage.tempfile_filename if filename: webbrowser2.open("file://" + filename) class FileInfoDialog(InfoDialog): def __init__(self, file, parent=None): InfoDialog.__init__(self, file, parent) self.setWindowTitle(_("Info") + " - " + file.base_filename) def _display_info_tab(self): file = self.obj info = [] info.append((_('Filename:'), file.filename)) if '~format' in file.orig_metadata: info.append((_('Format:'), file.orig_metadata['~format'])) try: size = os.path.getsize(encode_filename(file.filename)) sizestr = "%s (%s)" % (bytes2human.decimal(size), bytes2human.binary(size)) info.append((_('Size:'), sizestr)) except: pass if file.orig_metadata.length: info.append((_('Length:'), format_time(file.orig_metadata.length))) if '~bitrate' in file.orig_metadata: info.append((_('Bitrate:'), '%s kbps' % file.orig_metadata['~bitrate'])) if '~sample_rate' in file.orig_metadata: info.append((_('Sample rate:'), '%s Hz' % file.orig_metadata['~sample_rate'])) if '~bits_per_sample' in file.orig_metadata: info.append((_('Bits per sample:'), str(file.orig_metadata['~bits_per_sample']))) if '~channels' in file.orig_metadata: ch = file.orig_metadata['~channels'] if ch == 1: ch = _('Mono') elif ch == 2: ch = _('Stereo') else: ch = str(ch) info.append((_('Channels:'), ch)) text = '
'.join(map(lambda i: '%s
%s' % (cgi.escape(i[0]), cgi.escape(i[1])), info)) self.ui.info.setText(text) class AlbumInfoDialog(InfoDialog): def __init__(self, album, parent=None): InfoDialog.__init__(self, album, parent) self.setWindowTitle(_("Album Info")) def _display_info_tab(self): tab = self.ui.info_tab album = self.obj tabWidget = self.ui.tabWidget tab_index = tabWidget.indexOf(tab) if album.errors: tabWidget.setTabText(tab_index, _("&Errors")) text = '
'.join(map(lambda s: '%s' % '
'.join(unicode(QtCore.Qt.escape(s)) .replace('\t', ' ') .replace(' ', ' ') .splitlines() ), album.errors) ) self.ui.info.setText(text + '


') else: tabWidget.setTabText(tab_index, _("&Info")) self.tab_hide(tab) picard-release-1.3.2/picard/ui/infostatus.py000066400000000000000000000053221245305550700210350ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui from PyQt4.QtGui import QIcon from picard.util import icontheme from picard.ui.ui_infostatus import Ui_InfoStatus class InfoStatus(QtGui.QWidget, Ui_InfoStatus): def __init__(self, parent): QtGui.QWidget.__init__(self, parent) Ui_InfoStatus.__init__(self) self.setupUi(self) self._size = QtCore.QSize(16, 16) self._create_icons() self._init_labels() def _init_labels(self): size = self._size self.label1.setPixmap(self.icon_file.pixmap(size)) self.label2.setPixmap(self.icon_cd.pixmap(size)) self.label3.setPixmap(self.icon_file_pending.pixmap(size)) self.label4.setPixmap(self.icon_download.pixmap(size, QIcon.Disabled)) self._init_tooltips() def _create_icons(self): self.icon_cd = icontheme.lookup('media-optical') self.icon_file = QtGui.QIcon(":/images/file.png") self.icon_file_pending = QtGui.QIcon(":/images/file-pending.png") self.icon_download = QtGui.QIcon(":/images/16x16/action-go-down-16.png") def _init_tooltips(self): t1 = _("Files") t2 = _("Albums") t3 = _("Pending files") t4 = _("Pending requests") self.val1.setToolTip(t1) self.label1.setToolTip(t1) self.val2.setToolTip(t2) self.label2.setToolTip(t2) self.val3.setToolTip(t3) self.label3.setToolTip(t3) self.val4.setToolTip(t4) self.label4.setToolTip(t4) def setFiles(self, num): self.val1.setText(unicode(num)) def setAlbums(self, num): self.val2.setText(unicode(num)) def setPendingFiles(self, num): self.val3.setText(unicode(num)) def setPendingRequests(self, num): if num <= 0: enabled = QIcon.Disabled else: enabled = QIcon.Normal self.label4.setPixmap(self.icon_download.pixmap(self._size, enabled)) self.val4.setText(unicode(num)) picard-release-1.3.2/picard/ui/item.py000066400000000000000000000032241245305550700175730ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class Item(object): def can_save(self): """Return if this object can be saved.""" return False def can_remove(self): """Return if this object can be removed.""" return False def can_edit_tags(self): """Return if this object supports tag editing.""" return False def can_analyze(self): """Return if this object can be fingerprinted.""" return False def can_autotag(self): """Return if this object can be autotagged.""" return False def can_refresh(self): """Return if this object can be refreshed.""" return False def can_view_info(self): return False def can_browser_lookup(self): return True def is_album_like(self): return False def load(self, priority=False, refresh=False): pass picard-release-1.3.2/picard/ui/itemviews.py000066400000000000000000000742231245305550700206600ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os import re from functools import partial from PyQt4 import QtCore, QtGui from picard import config, log from picard.album import Album, NatAlbum from picard.cluster import Cluster, ClusterList, UnmatchedFiles from picard.file import File from picard.track import Track, NonAlbumTrack from picard.util import encode_filename, icontheme from picard.plugin import ExtensionPoint from picard.ui.ratingwidget import RatingWidget from picard.ui.collectionmenu import CollectionMenu class BaseAction(QtGui.QAction): NAME = "Unknown" MENU = [] def __init__(self): QtGui.QAction.__init__(self, self.NAME, None) self.triggered.connect(self.__callback) def __callback(self): objs = self.tagger.window.selected_objects self.callback(objs) def callback(self, objs): raise NotImplementedError _album_actions = ExtensionPoint() _cluster_actions = ExtensionPoint() _clusterlist_actions = ExtensionPoint() _track_actions = ExtensionPoint() _file_actions = ExtensionPoint() def register_album_action(action): _album_actions.register(action.__module__, action) def register_cluster_action(action): _cluster_actions.register(action.__module__, action) def register_clusterlist_action(action): _clusterlist_actions.register(action.__module__, action) def register_track_action(action): _track_actions.register(action.__module__, action) def register_file_action(action): _file_actions.register(action.__module__, action) def get_match_color(similarity, basecolor): c1 = (basecolor.red(), basecolor.green(), basecolor.blue()) c2 = (223, 125, 125) return QtGui.QColor( c2[0] + (c1[0] - c2[0]) * similarity, c2[1] + (c1[1] - c2[1]) * similarity, c2[2] + (c1[2] - c2[2]) * similarity) class MainPanel(QtGui.QSplitter): options = [ config.Option("persist", "splitter_state", QtCore.QByteArray()), ] columns = [ (N_('Title'), 'title'), (N_('Length'), '~length'), (N_('Artist'), 'artist'), ] def __init__(self, window, parent=None): QtGui.QSplitter.__init__(self, parent) self.window = window self.create_icons() self.views = [FileTreeView(window, self), AlbumTreeView(window, self)] self.views[0].itemSelectionChanged.connect(self.update_selection_0) self.views[1].itemSelectionChanged.connect(self.update_selection_1) self._selected_view = 0 self._ignore_selection_changes = False TreeItem.window = window TreeItem.base_color = self.palette().base().color() TreeItem.text_color = self.palette().text().color() TrackItem.track_colors = { File.NORMAL: config.setting["color_saved"], File.CHANGED: TreeItem.text_color, File.PENDING: config.setting["color_pending"], File.ERROR: config.setting["color_error"], } FileItem.file_colors = { File.NORMAL: TreeItem.text_color, File.CHANGED: config.setting["color_modified"], File.PENDING: config.setting["color_pending"], File.ERROR: config.setting["color_error"], } def save_state(self): config.persist["splitter_state"] = self.saveState() for view in self.views: view.save_state() def restore_state(self): self.restoreState(config.persist["splitter_state"]) def create_icons(self): if hasattr(QtGui.QStyle, 'SP_DirIcon'): ClusterItem.icon_dir = self.style().standardIcon(QtGui.QStyle.SP_DirIcon) else: ClusterItem.icon_dir = icontheme.lookup('folder', icontheme.ICON_SIZE_MENU) AlbumItem.icon_cd = icontheme.lookup('media-optical', icontheme.ICON_SIZE_MENU) AlbumItem.icon_cd_modified = icontheme.lookup('media-optical-modified', icontheme.ICON_SIZE_MENU) AlbumItem.icon_cd_saved = icontheme.lookup('media-optical-saved', icontheme.ICON_SIZE_MENU) AlbumItem.icon_cd_saved_modified = icontheme.lookup('media-optical-saved-modified', icontheme.ICON_SIZE_MENU) AlbumItem.icon_error = icontheme.lookup('media-optical-error', icontheme.ICON_SIZE_MENU) TrackItem.icon_note = QtGui.QIcon(":/images/note.png") FileItem.icon_file = QtGui.QIcon(":/images/file.png") FileItem.icon_file_pending = QtGui.QIcon(":/images/file-pending.png") FileItem.icon_error = icontheme.lookup('dialog-error', icontheme.ICON_SIZE_MENU) FileItem.icon_saved = QtGui.QIcon(":/images/track-saved.png") FileItem.match_icons = [ QtGui.QIcon(":/images/match-50.png"), QtGui.QIcon(":/images/match-60.png"), QtGui.QIcon(":/images/match-70.png"), QtGui.QIcon(":/images/match-80.png"), QtGui.QIcon(":/images/match-90.png"), QtGui.QIcon(":/images/match-100.png"), ] FileItem.match_pending_icons = [ QtGui.QIcon(":/images/match-pending-50.png"), QtGui.QIcon(":/images/match-pending-60.png"), QtGui.QIcon(":/images/match-pending-70.png"), QtGui.QIcon(":/images/match-pending-80.png"), QtGui.QIcon(":/images/match-pending-90.png"), QtGui.QIcon(":/images/match-pending-100.png"), ] self.icon_plugins = icontheme.lookup('applications-system', icontheme.ICON_SIZE_MENU) def update_selection(self, i, j): self._selected_view = i self.views[j].clearSelection() self.window.update_selection( [item.obj for item in self.views[i].selectedItems()]) def update_selection_0(self): if not self._ignore_selection_changes: self._ignore_selection_changes = True self.update_selection(0, 1) self._ignore_selection_changes = False def update_selection_1(self): if not self._ignore_selection_changes: self._ignore_selection_changes = True self.update_selection(1, 0) self._ignore_selection_changes = False def update_current_view(self): self.update_selection(self._selected_view, abs(self._selected_view - 1)) def remove(self, objects): self._ignore_selection_changes = True self.tagger.remove(objects) self._ignore_selection_changes = False view = self.views[self._selected_view] index = view.currentIndex() if index.isValid(): # select the current index view.setCurrentIndex(index) else: self.update_current_view() class BaseTreeView(QtGui.QTreeWidget): options = [ config.Option("setting", "color_modified", QtGui.QColor(QtGui.QPalette.WindowText)), config.Option("setting", "color_saved", QtGui.QColor(0, 128, 0)), config.Option("setting", "color_error", QtGui.QColor(200, 0, 0)), config.Option("setting", "color_pending", QtGui.QColor(128, 128, 128)), ] def __init__(self, window, parent=None): QtGui.QTreeWidget.__init__(self, parent) self.window = window self.panel = parent self.numHeaderSections = len(MainPanel.columns) self.setHeaderLabels([_(h) for h, n in MainPanel.columns]) self.restore_state() self.setAcceptDrops(True) self.setDragEnabled(True) self.setDropIndicatorShown(True) self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) # enable sorting, but don't actually use it by default # XXX it would be nice to be able to go to the 'no sort' mode, but the # internal model that QTreeWidget uses doesn't support it self.header().setSortIndicator(-1, QtCore.Qt.AscendingOrder) self.setSortingEnabled(True) self.expand_all_action = QtGui.QAction(_("&Expand all"), self) self.expand_all_action.triggered.connect(self.expandAll) self.collapse_all_action = QtGui.QAction(_("&Collapse all"), self) self.collapse_all_action.triggered.connect(self.collapseAll) self.doubleClicked.connect(self.activate_item) def contextMenuEvent(self, event): item = self.itemAt(event.pos()) if not item: return obj = item.obj plugin_actions = None can_view_info = self.window.view_info_action.isEnabled() menu = QtGui.QMenu(self) if isinstance(obj, Track): if can_view_info: menu.addAction(self.window.view_info_action) plugin_actions = list(_track_actions) if obj.num_linked_files == 1: menu.addAction(self.window.play_file_action) menu.addAction(self.window.open_folder_action) plugin_actions.extend(_file_actions) menu.addAction(self.window.browser_lookup_action) menu.addSeparator() if isinstance(obj, NonAlbumTrack): menu.addAction(self.window.refresh_action) elif isinstance(obj, Cluster): menu.addAction(self.window.browser_lookup_action) menu.addSeparator() menu.addAction(self.window.autotag_action) menu.addAction(self.window.analyze_action) if isinstance(obj, UnmatchedFiles): menu.addAction(self.window.cluster_action) plugin_actions = list(_cluster_actions) elif isinstance(obj, ClusterList): menu.addAction(self.window.autotag_action) menu.addAction(self.window.analyze_action) plugin_actions = list(_clusterlist_actions) elif isinstance(obj, File): if can_view_info: menu.addAction(self.window.view_info_action) menu.addAction(self.window.play_file_action) menu.addAction(self.window.open_folder_action) menu.addAction(self.window.browser_lookup_action) menu.addSeparator() menu.addAction(self.window.autotag_action) menu.addAction(self.window.analyze_action) plugin_actions = list(_file_actions) elif isinstance(obj, Album): if can_view_info: menu.addAction(self.window.view_info_action) menu.addAction(self.window.browser_lookup_action) menu.addSeparator() menu.addAction(self.window.refresh_action) plugin_actions = list(_album_actions) menu.addAction(self.window.save_action) menu.addAction(self.window.remove_action) bottom_separator = False if isinstance(obj, Album) and not isinstance(obj, NatAlbum) and obj.loaded: releases_menu = QtGui.QMenu(_("&Other versions"), menu) menu.addSeparator() menu.addMenu(releases_menu) loading = releases_menu.addAction(_('Loading...')) loading.setDisabled(True) bottom_separator = True if len(self.selectedIndexes()) == len(MainPanel.columns): def _add_other_versions(): releases_menu.removeAction(loading) heading = releases_menu.addAction(obj.release_group.version_headings) heading.setDisabled(True) font = heading.font() font.setBold(True) heading.setFont(font) versions = obj.release_group.versions albumtracks = obj.get_num_total_files() if obj.get_num_total_files() else len(obj.tracks) preferred_countries = set(config.setting["preferred_release_countries"]) preferred_formats = set(config.setting["preferred_release_formats"]) matches = ("trackmatch", "countrymatch", "formatmatch") priorities = {} for version in versions: priority = { "trackmatch": "0" if version['totaltracks'] == albumtracks else "?", "countrymatch": "0" if len(preferred_countries) == 0 or preferred_countries & set(version['countries']) else "?", "formatmatch": "0" if len(preferred_formats) == 0 or preferred_formats & set(version['formats']) else "?", } priorities[version['id']] = "".join(priority[k] for k in matches) versions.sort(key=lambda version: priorities[version['id']] + version['name']) priority = normal = False for version in versions: if not normal and "?" in priorities[version['id']]: if priority: releases_menu.addSeparator() normal = True else: priority = True action = releases_menu.addAction(version["name"]) action.setCheckable(True) if obj.id == version["id"]: action.setChecked(True) action.triggered.connect(partial(obj.switch_release_version, version["id"])) if obj.release_group.loaded: _add_other_versions() else: obj.release_group.load_versions(_add_other_versions) releases_menu.setEnabled(True) else: releases_menu.setEnabled(False) if config.setting["enable_ratings"] and \ len(self.window.selected_objects) == 1 and isinstance(obj, Track): menu.addSeparator() action = QtGui.QWidgetAction(menu) action.setDefaultWidget(RatingWidget(menu, obj)) menu.addAction(action) menu.addSeparator() # Using type here is intentional. isinstance will return true for the # NatAlbum instance, which can't be part of a collection. selected_albums = [a for a in self.window.selected_objects if type(a) == Album] if selected_albums: if not bottom_separator: menu.addSeparator() menu.addMenu(CollectionMenu(selected_albums, _("Collections"), menu)) if plugin_actions: plugin_menu = QtGui.QMenu(_("P&lugins"), menu) plugin_menu.setIcon(self.panel.icon_plugins) menu.addSeparator() menu.addMenu(plugin_menu) plugin_menus = {} for action in plugin_actions: action_menu = plugin_menu for index in xrange(1, len(action.MENU) + 1): key = tuple(action.MENU[:index]) if key in plugin_menus: action_menu = plugin_menus[key] else: action_menu = plugin_menus[key] = action_menu.addMenu(key[-1]) action_menu.addAction(action) if isinstance(obj, Cluster) or isinstance(obj, ClusterList) or isinstance(obj, Album): menu.addSeparator() menu.addAction(self.expand_all_action) menu.addAction(self.collapse_all_action) menu.exec_(event.globalPos()) event.accept() def restore_state(self): sizes = config.persist[self.view_sizes.name] header = self.header() sizes = sizes.split(" ") try: for i in range(self.numHeaderSections - 1): header.resizeSection(i, int(sizes[i])) except IndexError: pass def save_state(self): cols = range(self.numHeaderSections - 1) sizes = " ".join(str(self.header().sectionSize(i)) for i in cols) config.persist[self.view_sizes.name] = sizes def supportedDropActions(self): return QtCore.Qt.CopyAction | QtCore.Qt.MoveAction def mimeTypes(self): """List of MIME types accepted by this view.""" return ["text/uri-list", "application/picard.album-list"] def dragEnterEvent(self, event): if event.mimeData().hasUrls(): event.setDropAction(QtCore.Qt.CopyAction) event.accept() else: event.acceptProposedAction() def startDrag(self, supportedActions): """Start drag, *without* using pixmap.""" items = self.selectedItems() if items: drag = QtGui.QDrag(self) drag.setMimeData(self.mimeData(items)) drag.start(supportedActions) def mimeData(self, items): """Return MIME data for specified items.""" album_ids = [] files = [] url = QtCore.QUrl.fromLocalFile for item in items: obj = item.obj if isinstance(obj, Album): album_ids.append(str(obj.id)) elif isinstance(obj, Track): files.extend(url(file.filename) for file in obj.linked_files) elif isinstance(obj, File): files.append(url(obj.filename)) elif isinstance(obj, Cluster): files.extend(url(file.filename) for file in obj.files) elif isinstance(obj, ClusterList): files.extend(url(file.filename) for cluster in obj for file in cluster.files) mimeData = QtCore.QMimeData() mimeData.setData("application/picard.album-list", "\n".join(album_ids)) if files: mimeData.setUrls(files) return mimeData @staticmethod def drop_urls(urls, target): files = [] new_files = [] for url in urls: if url.scheme() == "file" or not url.scheme(): # Dropping a file from iTunes gives a filename with a NULL terminator filename = os.path.normpath(os.path.realpath(unicode(url.toLocalFile()).rstrip("\0"))) file = BaseTreeView.tagger.files.get(filename) if file: files.append(file) elif os.path.isdir(encode_filename(filename)): BaseTreeView.tagger.add_directory(filename) else: new_files.append(filename) elif url.scheme() in ("http", "https"): path = unicode(url.path()) match = re.search(r"/(release|recording)/([0-9a-z\-]{36})", path) if match: entity = match.group(1) mbid = match.group(2) if entity == "release": BaseTreeView.tagger.load_album(mbid) elif entity == "recording": BaseTreeView.tagger.load_nat(mbid) if files: BaseTreeView.tagger.move_files(files, target) if new_files: BaseTreeView.tagger.add_files(new_files, target=target) def dropEvent(self, event): return QtGui.QTreeView.dropEvent(self, event) def dropMimeData(self, parent, index, data, action): target = None if parent: if index == parent.childCount(): item = parent else: item = parent.child(index) if item is not None: target = item.obj log.debug("Drop target = %r", target) handled = False # text/uri-list urls = data.urls() if urls: if target is None: target = self.tagger.unmatched_files self.drop_urls(urls, target) handled = True # application/picard.album-list albums = data.data("application/picard.album-list") if albums: if isinstance(self, FileTreeView) and target is None: target = self.tagger.unmatched_files albums = [self.tagger.load_album(id) for id in str(albums).split("\n")] self.tagger.move_files(self.tagger.get_files_from_objects(albums), target) handled = True return handled def activate_item(self, index): obj = self.itemFromIndex(index).obj # Double-clicking albums should expand them. The album info can be # viewed by using the toolbar button. if not isinstance(obj, Album) and obj.can_view_info(): self.window.view_info() def add_cluster(self, cluster, parent_item=None): if parent_item is None: parent_item = self.clusters cluster_item = ClusterItem(cluster, not cluster.special, parent_item) if cluster.hide_if_empty and not cluster.files: cluster_item.update() cluster_item.setHidden(True) else: cluster_item.add_files(cluster.files) def moveCursor(self, action, modifiers): if action in (QtGui.QAbstractItemView.MoveUp, QtGui.QAbstractItemView.MoveDown): item = self.currentItem() if item and not item.isSelected(): self.setCurrentItem(item) return QtGui.QTreeWidget.moveCursor(self, action, modifiers) class FileTreeView(BaseTreeView): view_sizes = config.TextOption("persist", "file_view_sizes", "250 40 100") def __init__(self, window, parent=None): BaseTreeView.__init__(self, window, parent) self.setAccessibleName(_("file view")) self.setAccessibleDescription(_("Contains unmatched files and clusters")) self.unmatched_files = ClusterItem(self.tagger.unmatched_files, False, self) self.unmatched_files.update() self.setItemExpanded(self.unmatched_files, True) self.clusters = ClusterItem(self.tagger.clusters, False, self) self.set_clusters_text() self.setItemExpanded(self.clusters, True) self.tagger.cluster_added.connect(self.add_file_cluster) self.tagger.cluster_removed.connect(self.remove_file_cluster) def add_file_cluster(self, cluster, parent_item=None): self.add_cluster(cluster, parent_item) self.set_clusters_text() def remove_file_cluster(self, cluster): cluster.item.setSelected(False) self.clusters.removeChild(cluster.item) self.set_clusters_text() def set_clusters_text(self): self.clusters.setText(0, '%s (%d)' % (_(u"Clusters"), len(self.tagger.clusters))) class AlbumTreeView(BaseTreeView): view_sizes = config.TextOption("persist", "album_view_sizes", "250 40 100") def __init__(self, window, parent=None): BaseTreeView.__init__(self, window, parent) self.setAccessibleName(_("album view")) self.setAccessibleDescription(_("Contains albums and matched files")) self.tagger.album_added.connect(self.add_album) self.tagger.album_removed.connect(self.remove_album) def add_album(self, album): item = AlbumItem(album, True, self) item.setIcon(0, AlbumItem.icon_cd) for i, column in enumerate(MainPanel.columns): font = item.font(i) font.setBold(True) item.setFont(i, font) item.setText(i, album.column(column[1])) self.add_cluster(album.unmatched_files, item) def remove_album(self, album): album.item.setSelected(False) self.takeTopLevelItem(self.indexOfTopLevelItem(album.item)) class TreeItem(QtGui.QTreeWidgetItem): __lt__ = lambda self, other: False def __init__(self, obj, sortable, *args): QtGui.QTreeWidgetItem.__init__(self, *args) self.obj = obj if obj is not None: obj.item = self if sortable: self.__lt__ = self._lt self.setTextAlignment(1, QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) def _lt(self, other): column = self.treeWidget().sortColumn() if column == 1: return (self.obj.metadata.length or 0) < (other.obj.metadata.length or 0) return self.text(column).lower() < other.text(column).lower() class ClusterItem(TreeItem): def __init__(self, *args): TreeItem.__init__(self, *args) self.setIcon(0, ClusterItem.icon_dir) def update(self): for i, column in enumerate(MainPanel.columns): self.setText(i, self.obj.column(column[1])) album = self.obj.related_album if self.obj.special and album and album.loaded: album.item.update(update_tracks=False) if self.isSelected(): TreeItem.window.update_selection() def add_file(self, file): self.add_files([file]) def add_files(self, files): if self.obj.hide_if_empty and self.obj.files: self.setHidden(False) self.update() # addChild used (rather than building an items list and adding with addChildren) # to be certain about item order in the cluster (addChildren adds in reverse order). # Benchmarked performance was not noticeably different. for file in files: item = FileItem(file, True) item.update() self.addChild(item) def remove_file(self, file): file.item.setSelected(False) self.removeChild(file.item) self.update() if self.obj.hide_if_empty and not self.obj.files: self.setHidden(True) class AlbumItem(TreeItem): def update(self, update_tracks=True): album = self.obj if update_tracks: oldnum = self.childCount() - 1 newnum = len(album.tracks) if oldnum > newnum: # remove old items for i in xrange(oldnum - newnum): self.takeChild(newnum - 1) oldnum = newnum # update existing items for i in xrange(oldnum): item = self.child(i) track = album.tracks[i] item.obj = track track.item = item item.update(update_album=False) if newnum > oldnum: # add new items items = [] for i in xrange(newnum - 1, oldnum - 1, -1): # insertChildren is backwards item = TrackItem(album.tracks[i], False) item.setHidden(False) # Workaround to make sure the parent state gets updated items.append(item) self.insertChildren(oldnum, items) for item in items: # Update after insertChildren so that setExpanded works item.update(update_album=False) if album.errors: self.setIcon(0, AlbumItem.icon_error) elif album.is_complete(): if album.is_modified(): self.setIcon(0, AlbumItem.icon_cd_saved_modified) else: self.setIcon(0, AlbumItem.icon_cd_saved) else: if album.is_modified(): self.setIcon(0, AlbumItem.icon_cd_modified) else: self.setIcon(0, AlbumItem.icon_cd) for i, column in enumerate(MainPanel.columns): self.setText(i, album.column(column[1])) if self.isSelected(): TreeItem.window.update_selection() class TrackItem(TreeItem): def update(self, update_album=True): track = self.obj if track.num_linked_files == 1: file = track.linked_files[0] file.item = self color = TrackItem.track_colors[file.state] bgcolor = get_match_color(file.similarity, TreeItem.base_color) icon = FileItem.decide_file_icon(file) self.takeChildren() else: color = TreeItem.text_color bgcolor = get_match_color(1, TreeItem.base_color) icon = TrackItem.icon_note oldnum = self.childCount() newnum = track.num_linked_files if oldnum > newnum: # remove old items for i in xrange(oldnum - newnum): self.takeChild(newnum - 1).obj.item = None oldnum = newnum for i in xrange(oldnum): # update existing items item = self.child(i) file = track.linked_files[i] item.obj = file file.item = item item.update() if newnum > oldnum: # add new items items = [] for i in xrange(newnum - 1, oldnum - 1, -1): item = FileItem(track.linked_files[i], False) item.update() items.append(item) self.addChildren(items) self.setExpanded(True) self.setIcon(0, icon) for i, column in enumerate(MainPanel.columns): self.setText(i, track.column(column[1])) self.setForeground(i, color) self.setBackground(i, bgcolor) if self.isSelected(): TreeItem.window.update_selection() if update_album: self.parent().update(update_tracks=False) class FileItem(TreeItem): def update(self): file = self.obj self.setIcon(0, FileItem.decide_file_icon(file)) color = FileItem.file_colors[file.state] bgcolor = get_match_color(file.similarity, TreeItem.base_color) for i, column in enumerate(MainPanel.columns): self.setText(i, file.column(column[1])) self.setForeground(i, color) self.setBackground(i, bgcolor) if self.isSelected(): TreeItem.window.update_selection() @staticmethod def decide_file_icon(file): if file.state == File.ERROR: return FileItem.icon_error elif isinstance(file.parent, Track): if file.state == File.NORMAL: return FileItem.icon_saved elif file.state == File.PENDING: return FileItem.match_pending_icons[int(file.similarity * 5 + 0.5)] else: return FileItem.match_icons[int(file.similarity * 5 + 0.5)] elif file.state == File.PENDING: return FileItem.icon_file_pending else: return FileItem.icon_file picard-release-1.3.2/picard/ui/logview.py000066400000000000000000000123321245305550700203110ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui from picard import config, log from picard.ui import PicardDialog class LogViewCommon(PicardDialog): def __init__(self, title, logger, w=740, h=340, parent=None): PicardDialog.__init__(self, parent) self.logger = logger self.setWindowFlags(QtCore.Qt.Window) self.resize(w, h) self.setWindowTitle(title) self.doc = QtGui.QTextDocument(self) self.textCursor = QtGui.QTextCursor(self.doc) self.browser = QtGui.QTextBrowser(self) self.browser.setDocument(self.doc) self.vbox = QtGui.QVBoxLayout(self) self.vbox.addWidget(self.browser) self._display() def _setup_formats(self): font = QtGui.QFont() font.setFamily("Monospace") self.textFormatInfo = QtGui.QTextCharFormat() self.textFormatInfo.setFont(font) self.textFormatInfo.setForeground(QtGui.QColor('black')) self.textFormatDebug = QtGui.QTextCharFormat() self.textFormatDebug.setFont(font) self.textFormatDebug.setForeground(QtGui.QColor('purple')) self.textFormatWarning = QtGui.QTextCharFormat() self.textFormatWarning.setFont(font) self.textFormatWarning.setForeground(QtGui.QColor('darkorange')) self.textFormatError = QtGui.QTextCharFormat() self.textFormatError.setFont(font) self.textFormatError.setForeground(QtGui.QColor('red')) self.formats = { log.LOG_INFO: self.textFormatInfo, log.LOG_WARNING: self.textFormatWarning, log.LOG_ERROR: self.textFormatError, log.LOG_DEBUG: self.textFormatDebug, } def _format(self, level): return self.formats[level] def _display(self): self._setup_formats() for level, time, msg in self.logger.entries: self._add_entry(level, time, msg) self.logger.register_receiver(self._add_entry) def _add_entry(self, level, time, msg): self.textCursor.movePosition(QtGui.QTextCursor.End) self.textCursor.insertText(self._formatted_log_line(level, time, msg), self._format(level)) self.textCursor.insertBlock() sb = self.browser.verticalScrollBar() sb.setValue(sb.maximum()) def _formatted_log_line(self, level, time, msg): return log.formatted_log_line(level, time, msg) def closeEvent(self, event): self.logger.unregister_receiver(self._add_entry) return QtGui.QDialog.closeEvent(self, event) def saveWindowState(self, position, size): pos = self.pos() if not pos.isNull(): config.persist[position] = pos config.persist[size] = self.size() def restoreWindowState(self, position, size): pos = config.persist[position] if pos.x() > 0 and pos.y() > 0: self.move(pos) self.resize(config.persist[size]) class LogView(LogViewCommon): options = [ config.Option("persist", "logview_position", QtCore.QPoint()), config.Option("persist", "logview_size", QtCore.QSize(560, 400)), ] def __init__(self, parent=None): title = _("Log") logger = log.main_logger LogViewCommon.__init__(self, title, logger, parent=parent) self.restoreWindowState("logview_position", "logview_size") cb = QtGui.QCheckBox(_('Debug mode'), self) cb.setChecked(QtCore.QObject.tagger._debug) cb.stateChanged.connect(self.toggleDebug) self.vbox.addWidget(cb) def toggleDebug(self, state): QtCore.QObject.tagger.debug(state == QtCore.Qt.Checked) def closeEvent(self, event): self.saveWindowState("logview_position", "logview_size") event.accept() class HistoryView(LogViewCommon): options = [ config.Option("persist", "historyview_position", QtCore.QPoint()), config.Option("persist", "historyview_size", QtCore.QSize(560, 400)), ] def __init__(self, parent=None): title = _("Activity History") logger = log.history_logger LogViewCommon.__init__(self, title, logger, parent=parent) self.restoreWindowState("historyview_position", "historyview_size") def _formatted_log_line(self, level, time, msg): return log.formatted_log_line(level, time, msg, level_prefixes=False) def closeEvent(self, event): self.saveWindowState("historyview_position", "historyview_size") event.accept() picard-release-1.3.2/picard/ui/mainwindow.py000066400000000000000000001167731245305550700210270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui import sys import os.path from picard import config, log from picard.file import File from picard.track import Track from picard.album import Album from picard.formats import supported_formats from picard.ui.coverartbox import CoverArtBox from picard.ui.itemviews import MainPanel from picard.ui.metadatabox import MetadataBox from picard.ui.filebrowser import FileBrowser from picard.ui.tagsfromfilenames import TagsFromFileNamesDialog from picard.ui.options.dialog import OptionsDialog from picard.ui.infodialog import FileInfoDialog, AlbumInfoDialog from picard.ui.infostatus import InfoStatus from picard.ui.passworddialog import PasswordDialog from picard.ui.util import find_starting_directory, ButtonLineEdit from picard.util import icontheme, webbrowser2, throttle, thread from picard.util.cdrom import discid, get_cdrom_drives from picard.plugin import ExtensionPoint ui_init = ExtensionPoint() def register_ui_init(function): ui_init.register(function.__module__, function) class MainWindow(QtGui.QMainWindow): selection_updated = QtCore.pyqtSignal(object) options = [ config.Option("persist", "window_state", QtCore.QByteArray()), config.Option("persist", "window_position", QtCore.QPoint()), config.Option("persist", "window_size", QtCore.QSize(780, 560)), config.Option("persist", "bottom_splitter_state", QtCore.QByteArray()), config.BoolOption("persist", "window_maximized", False), config.BoolOption("persist", "view_cover_art", True), config.BoolOption("persist", "view_file_browser", False), config.TextOption("persist", "current_directory", ""), ] def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.selected_objects = [] self.ignore_selection_changes = False self.setupUi() def setupUi(self): self.setWindowTitle(_("MusicBrainz Picard")) icon = QtGui.QIcon() icon.addFile(":/images/16x16/picard.png", QtCore.QSize(16, 16)) icon.addFile(":/images/24x24/picard.png", QtCore.QSize(24, 24)) icon.addFile(":/images/32x32/picard.png", QtCore.QSize(32, 32)) icon.addFile(":/images/48x48/picard.png", QtCore.QSize(48, 48)) icon.addFile(":/images/128x128/picard.png", QtCore.QSize(128, 128)) icon.addFile(":/images/256x256/picard.png", QtCore.QSize(256, 256)) self.setWindowIcon(icon) self.create_actions() self.create_statusbar() self.create_toolbar() self.create_menus() mainLayout = QtGui.QSplitter(QtCore.Qt.Vertical) mainLayout.setContentsMargins(0, 0, 0, 0) mainLayout.setHandleWidth(1) self.panel = MainPanel(self, mainLayout) self.file_browser = FileBrowser(self.panel) if not self.show_file_browser_action.isChecked(): self.file_browser.hide() self.panel.insertWidget(0, self.file_browser) self.panel.restore_state() self.metadata_box = MetadataBox(self) self.cover_art_box = CoverArtBox(self) if not self.show_cover_art_action.isChecked(): self.cover_art_box.hide() bottomLayout = QtGui.QHBoxLayout() bottomLayout.setContentsMargins(0, 0, 0, 0) bottomLayout.setSpacing(0) bottomLayout.addWidget(self.metadata_box, 1) bottomLayout.addWidget(self.cover_art_box, 0) bottom = QtGui.QWidget() bottom.setLayout(bottomLayout) mainLayout.addWidget(self.panel) mainLayout.addWidget(bottom) self.setCentralWidget(mainLayout) # accessibility self.set_tab_order() # FIXME: use QApplication's clipboard self._clipboard = [] for function in ui_init: function(self) def keyPressEvent(self, event): if event.matches(QtGui.QKeySequence.Delete): if self.metadata_box.hasFocus(): self.metadata_box.remove_selected_tags() else: self.remove() else: QtGui.QMainWindow.keyPressEvent(self, event) def show(self): self.restoreWindowState() QtGui.QMainWindow.show(self) self.metadata_box.restore_state() def closeEvent(self, event): if config.setting["quit_confirmation"] and not self.show_quit_confirmation(): event.ignore() return self.saveWindowState() event.accept() def show_quit_confirmation(self): unsaved_files = sum(a.get_num_unsaved_files() for a in self.tagger.albums.itervalues()) QMessageBox = QtGui.QMessageBox if unsaved_files > 0: msg = QMessageBox(self) msg.setIcon(QMessageBox.Question) msg.setWindowModality(QtCore.Qt.WindowModal) msg.setWindowTitle(_(u"Unsaved Changes")) msg.setText(_(u"Are you sure you want to quit Picard?")) txt = ungettext( "There is %d unsaved file. Closing Picard will lose all unsaved changes.", "There are %d unsaved files. Closing Picard will lose all unsaved changes.", unsaved_files) % unsaved_files msg.setInformativeText(txt) cancel = msg.addButton(QMessageBox.Cancel) msg.setDefaultButton(cancel) msg.addButton(_(u"&Quit Picard"), QMessageBox.YesRole) ret = msg.exec_() if ret == QMessageBox.Cancel: return False return True def saveWindowState(self): config.persist["window_state"] = self.saveState() isMaximized = int(self.windowState()) & QtCore.Qt.WindowMaximized != 0 if isMaximized: # FIXME: this doesn't include the window frame geom = self.normalGeometry() config.persist["window_position"] = geom.topLeft() config.persist["window_size"] = geom.size() else: pos = self.pos() if not pos.isNull(): config.persist["window_position"] = pos config.persist["window_size"] = self.size() config.persist["window_maximized"] = isMaximized config.persist["view_cover_art"] = self.show_cover_art_action.isChecked() config.persist["view_file_browser"] = self.show_file_browser_action.isChecked() config.persist["bottom_splitter_state"] = self.centralWidget().saveState() self.file_browser.save_state() self.panel.save_state() self.metadata_box.save_state() def restoreWindowState(self): self.restoreState(config.persist["window_state"]) pos = config.persist["window_position"] size = config.persist["window_size"] self._desktopgeo = self.tagger.desktop().screenGeometry() if (pos.x() > 0 and pos.y() > 0 and pos.x() + size.width() < self._desktopgeo.width() and pos.y() + size.height() < self._desktopgeo.height()): self.move(pos) if size.width() <= 0 or size.height() <= 0: size = QtCore.QSize(780, 560) self.resize(size) if config.persist["window_maximized"]: self.setWindowState(QtCore.Qt.WindowMaximized) bottom_splitter_state = config.persist["bottom_splitter_state"] if bottom_splitter_state.isEmpty(): self.centralWidget().setSizes([366, 194]) else: self.centralWidget().restoreState(bottom_splitter_state) self.file_browser.restore_state() def create_statusbar(self): """Creates a new status bar.""" self.statusBar().showMessage(_("Ready")) self.infostatus = InfoStatus(self) self.listening_label = QtGui.QLabel() self.listening_label.setVisible(False) self.listening_label.setToolTip("" + _( "Picard listens on this port to integrate with your browser. When " "you \"Search\" or \"Open in Browser\" from Picard, clicking the " "\"Tagger\" button on the web page loads the release into Picard." )) self.statusBar().addPermanentWidget(self.infostatus) self.statusBar().addPermanentWidget(self.listening_label) self.tagger.tagger_stats_changed.connect(self.update_statusbar_stats) self.tagger.listen_port_changed.connect(self.update_statusbar_listen_port) self.update_statusbar_stats() @throttle(100) def update_statusbar_stats(self): """Updates the status bar information.""" self.infostatus.setFiles(len(self.tagger.files)) self.infostatus.setAlbums(len(self.tagger.albums)) self.infostatus.setPendingFiles(File.num_pending_files) ws = self.tagger.xmlws self.infostatus.setPendingRequests(ws.num_pending_web_requests) def update_statusbar_listen_port(self, listen_port): if listen_port: self.listening_label.setVisible(True) self.listening_label.setText(_(" Listening on port %(port)d ") % {"port": listen_port}) else: self.listening_label.setVisible(False) def set_statusbar_message(self, message, *args, **kwargs): """Set the status bar message. *args are passed to % operator, if args[0] is a mapping it is used for named place holders values >>> w.set_statusbar_message("File %(filename)s", {'filename': 'x.txt'}) Keyword arguments: `echo` parameter defaults to `log.debug`, called before message is translated, it can be disabled passing None or replaced by ie. `log.error`. If None, skipped. `translate` is a method called on message before it is sent to history log and status bar, it defaults to `_()`. If None, skipped. `timeout` defines duration of the display in milliseconds `history` is a method called with translated message as argument, it defaults to `log.history_info`. If None, skipped. Empty messages are never passed to echo and history functions but they are sent to status bar (ie. to clear it). """ def isdict(obj): return hasattr(obj, 'keys') and hasattr(obj, '__getitem__') echo = kwargs.get('echo', log.debug) # _ is defined using __builtin__.__dict__, so setting it as default named argument # value doesn't work as expected translate = kwargs.get('translate', _) timeout = kwargs.get('timeout', 0) history = kwargs.get('history', log.history_info) if len(args) == 1 and isdict(args[0]): # named place holders mparms = args[0] else: # simple place holders, ensure compatibility mparms = args if message: if echo: echo(message % mparms) if translate: message = translate(message) message = message % mparms if history: history(message) thread.to_main(self.statusBar().showMessage, message, timeout) def _on_submit(self): if self.tagger.use_acoustid: if not config.setting["acoustid_apikey"]: QtGui.QMessageBox.warning(self, _(u"Submission Error"), _(u"You need to configure your AcoustID API key before you can submit fingerprints.")) else: self.tagger.acoustidmanager.submit() def create_actions(self): self.options_action = QtGui.QAction(icontheme.lookup('preferences-desktop'), _("&Options..."), self) self.options_action.setMenuRole(QtGui.QAction.PreferencesRole) self.options_action.triggered.connect(self.show_options) self.cut_action = QtGui.QAction(icontheme.lookup('edit-cut', icontheme.ICON_SIZE_MENU), _(u"&Cut"), self) self.cut_action.setShortcut(QtGui.QKeySequence.Cut) self.cut_action.setEnabled(False) self.cut_action.triggered.connect(self.cut) self.paste_action = QtGui.QAction(icontheme.lookup('edit-paste', icontheme.ICON_SIZE_MENU), _(u"&Paste"), self) self.paste_action.setShortcut(QtGui.QKeySequence.Paste) self.paste_action.setEnabled(False) self.paste_action.triggered.connect(self.paste) self.help_action = QtGui.QAction(_("&Help..."), self) self.help_action.setShortcut(QtGui.QKeySequence.HelpContents) self.help_action.triggered.connect(self.show_help) self.about_action = QtGui.QAction(_("&About..."), self) self.about_action.setMenuRole(QtGui.QAction.AboutRole) self.about_action.triggered.connect(self.show_about) self.donate_action = QtGui.QAction(_("&Donate..."), self) self.donate_action.triggered.connect(self.open_donation_page) self.report_bug_action = QtGui.QAction(_("&Report a Bug..."), self) self.report_bug_action.triggered.connect(self.open_bug_report) self.support_forum_action = QtGui.QAction(_("&Support Forum..."), self) self.support_forum_action.triggered.connect(self.open_support_forum) self.add_files_action = QtGui.QAction(icontheme.lookup('document-open'), _(u"&Add Files..."), self) self.add_files_action.setStatusTip(_(u"Add files to the tagger")) # TR: Keyboard shortcut for "Add Files..." self.add_files_action.setShortcut(QtGui.QKeySequence.Open) self.add_files_action.triggered.connect(self.add_files) self.add_directory_action = QtGui.QAction(icontheme.lookup('folder'), _(u"A&dd Folder..."), self) self.add_directory_action.setStatusTip(_(u"Add a folder to the tagger")) # TR: Keyboard shortcut for "Add Directory..." self.add_directory_action.setShortcut(QtGui.QKeySequence(_(u"Ctrl+D"))) self.add_directory_action.triggered.connect(self.add_directory) self.save_action = QtGui.QAction(icontheme.lookup('document-save'), _(u"&Save"), self) self.save_action.setStatusTip(_(u"Save selected files")) # TR: Keyboard shortcut for "Save" self.save_action.setShortcut(QtGui.QKeySequence.Save) self.save_action.setEnabled(False) self.save_action.triggered.connect(self.save) self.submit_action = QtGui.QAction(icontheme.lookup('picard-submit'), _(u"S&ubmit"), self) self.submit_action.setStatusTip(_(u"Submit acoustic fingerprints")) self.submit_action.setEnabled(False) self.submit_action.triggered.connect(self._on_submit) self.exit_action = QtGui.QAction(_(u"E&xit"), self) self.exit_action.setMenuRole(QtGui.QAction.QuitRole) # TR: Keyboard shortcut for "Exit" self.exit_action.setShortcut(QtGui.QKeySequence(_(u"Ctrl+Q"))) self.exit_action.triggered.connect(self.close) self.remove_action = QtGui.QAction(icontheme.lookup('list-remove'), _(u"&Remove"), self) self.remove_action.setStatusTip(_(u"Remove selected files/albums")) self.remove_action.setEnabled(False) self.remove_action.triggered.connect(self.remove) self.browser_lookup_action = QtGui.QAction(icontheme.lookup('lookup-musicbrainz'), _(u"Lookup in &Browser"), self) self.browser_lookup_action.setStatusTip(_(u"Lookup selected item on MusicBrainz website")) self.browser_lookup_action.setEnabled(False) self.browser_lookup_action.triggered.connect(self.browser_lookup) self.show_file_browser_action = QtGui.QAction(_(u"File &Browser"), self) self.show_file_browser_action.setCheckable(True) if config.persist["view_file_browser"]: self.show_file_browser_action.setChecked(True) self.show_file_browser_action.setShortcut(QtGui.QKeySequence(_(u"Ctrl+B"))) self.show_file_browser_action.triggered.connect(self.show_file_browser) self.show_cover_art_action = QtGui.QAction(_(u"&Cover Art"), self) self.show_cover_art_action.setCheckable(True) if config.persist["view_cover_art"]: self.show_cover_art_action.setChecked(True) self.show_cover_art_action.triggered.connect(self.show_cover_art) self.search_action = QtGui.QAction(icontheme.lookup('system-search'), _(u"Search"), self) self.search_action.triggered.connect(self.search) self.cd_lookup_action = QtGui.QAction(icontheme.lookup('media-optical'), _(u"Lookup &CD..."), self) self.cd_lookup_action.setStatusTip(_(u"Lookup the details of the CD in your drive")) # TR: Keyboard shortcut for "Lookup CD" self.cd_lookup_action.setShortcut(QtGui.QKeySequence(_("Ctrl+K"))) self.cd_lookup_action.triggered.connect(self.tagger.lookup_cd) self.analyze_action = QtGui.QAction(icontheme.lookup('picard-analyze'), _(u"&Scan"), self) self.analyze_action.setEnabled(False) # TR: Keyboard shortcut for "Analyze" self.analyze_action.setShortcut(QtGui.QKeySequence(_(u"Ctrl+Y"))) self.analyze_action.triggered.connect(self.analyze) self.cluster_action = QtGui.QAction(icontheme.lookup('picard-cluster'), _(u"Cl&uster"), self) self.cluster_action.setEnabled(False) # TR: Keyboard shortcut for "Cluster" self.cluster_action.setShortcut(QtGui.QKeySequence(_(u"Ctrl+U"))) self.cluster_action.triggered.connect(self.cluster) self.autotag_action = QtGui.QAction(icontheme.lookup('picard-auto-tag'), _(u"&Lookup"), self) tip = _(u"Lookup selected items in MusicBrainz") self.autotag_action.setToolTip(tip) self.autotag_action.setStatusTip(tip) self.autotag_action.setEnabled(False) # TR: Keyboard shortcut for "Lookup" self.autotag_action.setShortcut(QtGui.QKeySequence(_(u"Ctrl+L"))) self.autotag_action.triggered.connect(self.autotag) self.view_info_action = QtGui.QAction(icontheme.lookup('picard-edit-tags'), _(u"&Info..."), self) self.view_info_action.setEnabled(False) # TR: Keyboard shortcut for "Info" self.view_info_action.setShortcut(QtGui.QKeySequence(_(u"Ctrl+I"))) self.view_info_action.triggered.connect(self.view_info) self.refresh_action = QtGui.QAction(icontheme.lookup('view-refresh', icontheme.ICON_SIZE_MENU), _("&Refresh"), self) self.refresh_action.setShortcut(QtGui.QKeySequence(_(u"Ctrl+R"))) self.refresh_action.triggered.connect(self.refresh) self.enable_renaming_action = QtGui.QAction(_(u"&Rename Files"), self) self.enable_renaming_action.setCheckable(True) self.enable_renaming_action.setChecked(config.setting["rename_files"]) self.enable_renaming_action.triggered.connect(self.toggle_rename_files) self.enable_moving_action = QtGui.QAction(_(u"&Move Files"), self) self.enable_moving_action.setCheckable(True) self.enable_moving_action.setChecked(config.setting["move_files"]) self.enable_moving_action.triggered.connect(self.toggle_move_files) self.enable_tag_saving_action = QtGui.QAction(_(u"Save &Tags"), self) self.enable_tag_saving_action.setCheckable(True) self.enable_tag_saving_action.setChecked(not config.setting["dont_write_tags"]) self.enable_tag_saving_action.triggered.connect(self.toggle_tag_saving) self.tags_from_filenames_action = QtGui.QAction(_(u"Tags From &File Names..."), self) self.tags_from_filenames_action.triggered.connect(self.open_tags_from_filenames) self.open_collection_in_browser_action = QtGui.QAction(_(u"&Open My Collections in Browser"), self) self.open_collection_in_browser_action.triggered.connect(self.open_collection_in_browser) self.open_collection_in_browser_action.setEnabled(config.setting["username"] != u'') self.view_log_action = QtGui.QAction(_(u"View Error/Debug &Log"), self) self.view_log_action.triggered.connect(self.show_log) self.view_history_action = QtGui.QAction(_(u"View Activity &History"), self) self.view_history_action.triggered.connect(self.show_history) xmlws_manager = self.tagger.xmlws.manager xmlws_manager.authenticationRequired.connect(self.show_password_dialog) xmlws_manager.proxyAuthenticationRequired.connect(self.show_proxy_dialog) self.play_file_action = QtGui.QAction(icontheme.lookup('play-music'), _(u"&Play file"), self) self.play_file_action.setStatusTip(_(u"Play the file in your default media player")) self.play_file_action.setEnabled(False) self.play_file_action.triggered.connect(self.play_file) self.open_folder_action = QtGui.QAction(icontheme.lookup('folder', icontheme.ICON_SIZE_MENU), _(u"Open Containing &Folder"), self) self.open_folder_action.setStatusTip(_(u"Open the containing folder in your file explorer")) self.open_folder_action.setEnabled(False) self.open_folder_action.triggered.connect(self.open_folder) def toggle_rename_files(self, checked): config.setting["rename_files"] = checked def toggle_move_files(self, checked): config.setting["move_files"] = checked def toggle_tag_saving(self, checked): config.setting["dont_write_tags"] = not checked def open_tags_from_filenames(self): files = self.tagger.get_files_from_objects(self.selected_objects) if not files: files = self.tagger.unmatched_files.files if files: dialog = TagsFromFileNamesDialog(files, self) dialog.exec_() def open_collection_in_browser(self): self.tagger.collection_lookup() def create_menus(self): menu = self.menuBar().addMenu(_(u"&File")) menu.addAction(self.add_directory_action) menu.addAction(self.add_files_action) menu.addSeparator() menu.addAction(self.play_file_action) menu.addAction(self.open_folder_action) menu.addSeparator() menu.addAction(self.save_action) menu.addAction(self.submit_action) menu.addSeparator() menu.addAction(self.exit_action) menu = self.menuBar().addMenu(_(u"&Edit")) menu.addAction(self.cut_action) menu.addAction(self.paste_action) menu.addSeparator() menu.addAction(self.view_info_action) menu.addAction(self.remove_action) menu = self.menuBar().addMenu(_(u"&View")) menu.addAction(self.show_file_browser_action) menu.addAction(self.show_cover_art_action) menu.addSeparator() menu.addAction(self.toolbar_toggle_action) menu.addAction(self.search_toolbar_toggle_action) menu = self.menuBar().addMenu(_(u"&Options")) menu.addAction(self.enable_renaming_action) menu.addAction(self.enable_moving_action) menu.addAction(self.enable_tag_saving_action) menu.addSeparator() menu.addAction(self.options_action) menu = self.menuBar().addMenu(_(u"&Tools")) menu.addAction(self.refresh_action) menu.addAction(self.cd_lookup_action) menu.addAction(self.autotag_action) menu.addAction(self.analyze_action) menu.addAction(self.cluster_action) menu.addAction(self.browser_lookup_action) menu.addSeparator() menu.addAction(self.tags_from_filenames_action) menu.addAction(self.open_collection_in_browser_action) self.menuBar().addSeparator() menu = self.menuBar().addMenu(_(u"&Help")) menu.addAction(self.help_action) menu.addSeparator() menu.addAction(self.view_history_action) menu.addSeparator() menu.addAction(self.support_forum_action) menu.addAction(self.report_bug_action) menu.addAction(self.view_log_action) menu.addSeparator() menu.addAction(self.donate_action) menu.addAction(self.about_action) def update_toolbar_style(self): if config.setting["toolbar_show_labels"]: self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) else: self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.cd_lookup_action.setEnabled(len(get_cdrom_drives()) > 0 and discid is not None) def create_toolbar(self): self.toolbar = toolbar = self.addToolBar(_(u"Actions")) self.toolbar_toggle_action = self.toolbar.toggleViewAction() self.update_toolbar_style() toolbar.setObjectName("main_toolbar") def add_toolbar_action(action): toolbar.addAction(action) widget = toolbar.widgetForAction(action) widget.setFocusPolicy(QtCore.Qt.TabFocus) widget.setAttribute(QtCore.Qt.WA_MacShowFocusRect) add_toolbar_action(self.add_directory_action) add_toolbar_action(self.add_files_action) toolbar.addSeparator() add_toolbar_action(self.play_file_action) toolbar.addSeparator() add_toolbar_action(self.save_action) add_toolbar_action(self.submit_action) toolbar.addSeparator() add_toolbar_action(self.cd_lookup_action) drives = get_cdrom_drives() if len(drives) > 1: self.cd_lookup_menu = QtGui.QMenu() for drive in drives: self.cd_lookup_menu.addAction(drive) self.cd_lookup_menu.triggered.connect(self.tagger.lookup_cd) button = toolbar.widgetForAction(self.cd_lookup_action) button.setPopupMode(QtGui.QToolButton.MenuButtonPopup) button.setMenu(self.cd_lookup_menu) add_toolbar_action(self.cluster_action) add_toolbar_action(self.autotag_action) add_toolbar_action(self.analyze_action) add_toolbar_action(self.view_info_action) add_toolbar_action(self.remove_action) add_toolbar_action(self.browser_lookup_action) self.search_toolbar = toolbar = self.addToolBar(_(u"Search")) self.search_toolbar_toggle_action = self.search_toolbar.toggleViewAction() toolbar.setObjectName("search_toolbar") search_panel = QtGui.QWidget(toolbar) hbox = QtGui.QHBoxLayout(search_panel) self.search_combo = QtGui.QComboBox(search_panel) self.search_combo.addItem(_(u"Album"), "album") self.search_combo.addItem(_(u"Artist"), "artist") self.search_combo.addItem(_(u"Track"), "track") hbox.addWidget(self.search_combo, 0) self.search_edit = ButtonLineEdit(search_panel) self.search_edit.returnPressed.connect(self.search) hbox.addWidget(self.search_edit, 0) self.search_button = QtGui.QToolButton(search_panel) self.search_button.setAutoRaise(True) self.search_button.setDefaultAction(self.search_action) self.search_button.setIconSize(QtCore.QSize(22, 22)) self.search_button.setAttribute(QtCore.Qt.WA_MacShowFocusRect) hbox.addWidget(self.search_button) toolbar.addWidget(search_panel) def set_tab_order(self): tab_order = self.setTabOrder tw = self.toolbar.widgetForAction # toolbar tab_order(tw(self.add_directory_action), tw(self.add_files_action)) tab_order(tw(self.add_files_action), tw(self.play_file_action)) tab_order(tw(self.play_file_action), tw(self.save_action)) tab_order(tw(self.save_action), tw(self.submit_action)) tab_order(tw(self.submit_action), tw(self.cd_lookup_action)) tab_order(tw(self.cd_lookup_action), tw(self.cluster_action)) tab_order(tw(self.cluster_action), tw(self.autotag_action)) tab_order(tw(self.autotag_action), tw(self.analyze_action)) tab_order(tw(self.analyze_action), tw(self.view_info_action)) tab_order(tw(self.view_info_action), tw(self.remove_action)) tab_order(tw(self.remove_action), tw(self.browser_lookup_action)) tab_order(tw(self.browser_lookup_action), self.search_combo) tab_order(self.search_combo, self.search_edit) tab_order(self.search_edit, self.search_button) # panels tab_order(self.search_button, self.file_browser) tab_order(self.file_browser, self.panel.views[0]) tab_order(self.panel.views[0], self.panel.views[1]) tab_order(self.panel.views[1], self.metadata_box) def enable_submit(self, enabled): """Enable/disable the 'Submit fingerprints' action.""" self.submit_action.setEnabled(enabled) def enable_cluster(self, enabled): """Enable/disable the 'Cluster' action.""" self.cluster_action.setEnabled(enabled) def search(self): """Search for album, artist or track on the MusicBrainz website.""" text = self.search_edit.text() type = self.search_combo.itemData(self.search_combo.currentIndex()) self.tagger.search(text, type, config.setting["use_adv_search_syntax"]) def add_files(self): """Add files to the tagger.""" current_directory = find_starting_directory() formats = [] extensions = [] for exts, name in supported_formats(): exts = ["*" + e for e in exts] formats.append("%s (%s)" % (name, " ".join(exts))) extensions.extend(exts) formats.sort() extensions.sort() formats.insert(0, _("All Supported Formats") + " (%s)" % " ".join(extensions)) files = QtGui.QFileDialog.getOpenFileNames(self, "", current_directory, u";;".join(formats)) if files: files = map(unicode, files) config.persist["current_directory"] = os.path.dirname(files[0]) self.tagger.add_files(files) def add_directory(self): """Add directory to the tagger.""" current_directory = find_starting_directory() dir_list = [] if not config.setting["toolbar_multiselect"]: directory = QtGui.QFileDialog.getExistingDirectory(self, "", current_directory) if directory: dir_list.append(directory) else: # Use a custom file selection dialog to allow the selection of multiple directories file_dialog = QtGui.QFileDialog(self, "", current_directory) file_dialog.setFileMode(QtGui.QFileDialog.DirectoryOnly) if sys.platform == "darwin": # The native dialog doesn't allow selecting >1 directory file_dialog.setOption(QtGui.QFileDialog.DontUseNativeDialog) tree_view = file_dialog.findChild(QtGui.QTreeView) tree_view.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) list_view = file_dialog.findChild(QtGui.QListView, "listView") list_view.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) if file_dialog.exec_() == QtGui.QDialog.Accepted: dir_list = file_dialog.selectedFiles() if len(dir_list) == 1: config.persist["current_directory"] = dir_list[0] self.set_statusbar_message( N_("Adding directory: '%(directory)s' ..."), {'directory': dir_list[0]} ) elif len(dir_list) > 1: (parent, dir) = os.path.split(str(dir_list[0])) config.persist["current_directory"] = parent self.set_statusbar_message( N_("Adding multiple directories from '%(directory)s' ..."), {'directory': parent} ) for directory in dir_list: directory = unicode(directory) self.tagger.add_directory(directory) def show_about(self): self.show_options("about") def show_options(self, page=None): dialog = OptionsDialog(page, self) dialog.exec_() def show_help(self): webbrowser2.goto('documentation') def show_log(self): from picard.ui.logview import LogView LogView(self).show() def show_history(self): from picard.ui.logview import HistoryView HistoryView(self).show() def open_bug_report(self): webbrowser2.goto('troubleshooting') def open_support_forum(self): webbrowser2.goto('forum') def open_donation_page(self): webbrowser2.goto('donate') def save(self): """Tell the tagger to save the selected objects.""" self.tagger.save(self.selected_objects) def remove(self): """Tell the tagger to remove the selected objects.""" self.panel.remove(self.selected_objects) def analyze(self): if not config.setting['fingerprinting_system']: if self.show_analyze_settings_info(): self.show_options("fingerprinting") if not config.setting['fingerprinting_system']: return return self.tagger.analyze(self.selected_objects) def play_file(self): files = self.tagger.get_files_from_objects(self.selected_objects) for file in files: url = QtCore.QUrl.fromLocalFile(file.filename) QtGui.QDesktopServices.openUrl(url) def open_folder(self): files = self.tagger.get_files_from_objects(self.selected_objects) for file in files: url = QtCore.QUrl.fromLocalFile(os.path.dirname(file.filename)) QtGui.QDesktopServices.openUrl(url) def show_analyze_settings_info(self): ret = QtGui.QMessageBox.question(self, _(u"Configuration Required"), _(u"Audio fingerprinting is not yet configured. Would you like to configure it now?"), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.Yes) return ret == QtGui.QMessageBox.Yes def view_info(self): if isinstance(self.selected_objects[0], Album): album = self.selected_objects[0] dialog = AlbumInfoDialog(album, self) else: file = self.tagger.get_files_from_objects(self.selected_objects)[0] dialog = FileInfoDialog(file, self) dialog.exec_() def cluster(self): self.tagger.cluster(self.selected_objects) def refresh(self): self.tagger.refresh(self.selected_objects) def browser_lookup(self): self.tagger.browser_lookup(self.selected_objects[0]) @throttle(100) def update_actions(self): can_remove = False can_save = False can_analyze = False can_refresh = False can_autotag = False single = self.selected_objects[0] if len(self.selected_objects) == 1 else None can_view_info = bool(single and single.can_view_info()) can_browser_lookup = bool(single and single.can_browser_lookup()) have_files = len(self.tagger.get_files_from_objects(self.selected_objects)) > 0 for obj in self.selected_objects: if obj is None: continue if obj.can_analyze(): can_analyze = True if obj.can_save(): can_save = True if obj.can_remove(): can_remove = True if obj.can_refresh(): can_refresh = True if obj.can_autotag(): can_autotag = True # Skip further loops if all values now True. if can_analyze and can_save and can_remove and can_refresh and can_autotag: break self.remove_action.setEnabled(can_remove) self.save_action.setEnabled(can_save) self.view_info_action.setEnabled(can_view_info) self.analyze_action.setEnabled(can_analyze) self.refresh_action.setEnabled(can_refresh) self.autotag_action.setEnabled(can_autotag) self.browser_lookup_action.setEnabled(can_browser_lookup) self.play_file_action.setEnabled(have_files) self.open_folder_action.setEnabled(have_files) self.cut_action.setEnabled(bool(self.selected_objects)) def update_selection(self, objects=None): if self.ignore_selection_changes: return if objects is not None: self.selected_objects = objects else: objects = self.selected_objects self.update_actions() metadata = None obj = None if len(objects) == 1: obj = list(objects)[0] if isinstance(obj, File): metadata = obj.metadata if obj.state == obj.ERROR: msg = N_("%(filename)s (error: %(error)s)") mparms = { 'filename': obj.filename, 'error': obj.error } else: msg = N_("%(filename)s") mparms = { 'filename': obj.filename, } self.set_statusbar_message(msg, mparms, echo=None, history=None) elif isinstance(obj, Track): metadata = obj.metadata if obj.num_linked_files == 1: file = obj.linked_files[0] if file.state == File.ERROR: msg = N_("%(filename)s (%(similarity)d%%) (error: %(error)s)") mparms = { 'filename': file.filename, 'similarity': file.similarity * 100, 'error': file.error } else: msg = N_("%(filename)s (%(similarity)d%%)") mparms = { 'filename': file.filename, 'similarity': file.similarity * 100, } self.set_statusbar_message(msg, mparms, echo=None, history=None) elif obj.can_edit_tags(): metadata = obj.metadata self.metadata_box.selection_dirty = True self.metadata_box.update() self.cover_art_box.set_metadata(metadata, obj) self.selection_updated.emit(objects) def show_cover_art(self): """Show/hide the cover art box.""" if self.show_cover_art_action.isChecked(): self.cover_art_box.show() self.metadata_box.resize_columns() else: self.cover_art_box.hide() def show_file_browser(self): """Show/hide the file browser.""" if self.show_file_browser_action.isChecked(): sizes = self.panel.sizes() if sizes[0] == 0: sizes[0] = sum(sizes) / 4 self.panel.setSizes(sizes) self.file_browser.show() else: self.file_browser.hide() def show_password_dialog(self, reply, authenticator): dialog = PasswordDialog(authenticator, reply, parent=self) dialog.exec_() def show_proxy_dialog(self, proxy, authenticator): dialog = ProxyDialog(authenticator, proxy, parent=self) dialog.exec_() def autotag(self): self.tagger.autotag(self.selected_objects) def cut(self): self._clipboard = self.selected_objects self.paste_action.setEnabled(bool(self._clipboard)) def paste(self): selected_objects = self.selected_objects if not selected_objects: target = self.tagger.unmatched_files else: target = selected_objects[0] self.tagger.move_files(self.tagger.get_files_from_objects(self._clipboard), target) self._clipboard = [] self.paste_action.setEnabled(False) picard-release-1.3.2/picard/ui/metadatabox.py000066400000000000000000000424401245305550700211310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui from collections import defaultdict from functools import partial from picard import config from picard.album import Album from picard.cluster import Cluster from picard.track import Track from picard.file import File from picard.util import format_time, throttle, thread from picard.util.tags import display_tag_name from picard.ui.edittagdialog import EditTagDialog from picard.metadata import MULTI_VALUED_JOINER COMMON_TAGS = [ "title", "artist", "album", "tracknumber", "~length", "date", ] class TagStatus: NoChange = 1 Added = 2 Removed = 4 # Added | Removed = Changed Changed = 6 Empty = 8 NotRemovable = 16 class TagCounter(dict): __slots__ = ("parent", "counts", "different") def __init__(self, parent): self.parent = parent self.counts = defaultdict(lambda: 0) self.different = set() def __getitem__(self, tag): return dict.get(self, tag, [""]) def add(self, tag, values): if tag not in self.different: if tag not in self: self[tag] = values elif self[tag] != values: self.different.add(tag) self[tag] = [""] self.counts[tag] += 1 def display_value(self, tag): count = self.counts[tag] missing = self.parent.objects - count if tag in self.different: return (ungettext("(different across %d item)", "(different across %d items)", count) % count, True) else: if tag == "~length": msg = format_time(self.get(tag, 0)) else: msg = MULTI_VALUED_JOINER.join(self[tag]) if count > 0 and missing > 0: return (msg + " " + (ungettext("(missing from %d item)", "(missing from %d items)", missing) % missing), True) else: return (msg, False) class TagDiff(object): __slots__ = ("tag_names", "new", "orig", "status", "objects") def __init__(self): self.tag_names = [] self.new = TagCounter(self) self.orig = TagCounter(self) self.status = defaultdict(lambda: 0) self.objects = 0 def __tag_ne(self, tag, orig, new): if tag == "~length": return abs(float(orig) - float(new)) > 2000 else: return orig != new def add(self, tag, orig_values, new_values, removable): if orig_values: self.orig.add(tag, orig_values) if new_values: self.new.add(tag, new_values) if orig_values and not new_values: self.status[tag] |= TagStatus.Removed removable = False elif new_values and not orig_values: self.status[tag] |= TagStatus.Added removable = True elif orig_values and new_values and self.__tag_ne(tag, orig_values, new_values): self.status[tag] |= TagStatus.Changed elif not (orig_values or new_values or tag in COMMON_TAGS): self.status[tag] |= TagStatus.Empty else: self.status[tag] |= TagStatus.NoChange if not removable: self.status[tag] |= TagStatus.NotRemovable def tag_status(self, tag): status = self.status[tag] for s in (TagStatus.Changed, TagStatus.Added, TagStatus.Removed, TagStatus.Empty): if status & s == s: return s return TagStatus.NoChange class MetadataBox(QtGui.QTableWidget): options = ( config.Option("persist", "metadatabox_header_state", QtCore.QByteArray()), config.BoolOption("persist", "show_changes_first", False) ) def __init__(self, parent): QtGui.QTableWidget.__init__(self, parent) self.parent = parent self.setAccessibleName(_("metadata view")) self.setAccessibleDescription(_("Displays original and new tags for the selected files")) self.setColumnCount(3) self.setHorizontalHeaderLabels((_("Tag"), _("Original Value"), _("New Value"))) self.horizontalHeader().setStretchLastSection(True) self.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch) self.horizontalHeader().setClickable(False) self.verticalHeader().setDefaultSectionSize(21) self.verticalHeader().setVisible(False) self.setHorizontalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.setTabKeyNavigation(False) self.setStyleSheet("QTableWidget {border: none;}") self.setAttribute(QtCore.Qt.WA_MacShowFocusRect, 1) self.colors = { TagStatus.NoChange: self.palette().color(QtGui.QPalette.Text), TagStatus.Removed: QtGui.QBrush(QtGui.QColor("red")), TagStatus.Added: QtGui.QBrush(QtGui.QColor("green")), TagStatus.Changed: QtGui.QBrush(QtGui.QColor("darkgoldenrod")) } self.files = set() self.tracks = set() self.objects = set() self.selection_mutex = QtCore.QMutex() self.selection_dirty = False self.editing = None # the QTableWidgetItem being edited self.clipboard = [""] self.add_tag_action = QtGui.QAction(_(u"Add New Tag..."), parent) self.add_tag_action.triggered.connect(partial(self.edit_tag, "")) self.changes_first_action = QtGui.QAction(_(u"Show Changes First"), parent) self.changes_first_action.setCheckable(True) self.changes_first_action.setChecked(config.persist["show_changes_first"]) self.changes_first_action.toggled.connect(self.toggle_changes_first) def edit(self, index, trigger, event): if index.column() != 2: return False item = self.itemFromIndex(index) if item.flags() & QtCore.Qt.ItemIsEditable and \ trigger in (QtGui.QAbstractItemView.DoubleClicked, QtGui.QAbstractItemView.EditKeyPressed, QtGui.QAbstractItemView.AnyKeyPressed): tag = self.tag_diff.tag_names[item.row()] values = self.tag_diff.new[tag] if len(values) > 1: self.edit_tag(tag) return False else: self.editing = item item.setText(values[0]) return QtGui.QTableWidget.edit(self, index, trigger, event) return False def event(self, e): item = self.currentItem() if (item and e.type() == QtCore.QEvent.KeyPress and e.modifiers() == QtCore.Qt.ControlModifier): column = item.column() tag = self.tag_diff.tag_names[item.row()] if e.key() == QtCore.Qt.Key_C: if column == 1: self.clipboard = list(self.tag_diff.orig[tag]) elif column == 2: self.clipboard = list(self.tag_diff.new[tag]) elif e.key() == QtCore.Qt.Key_V and column == 2 and tag != "~length": self.set_tag_values(tag, list(self.clipboard)) return QtGui.QTableWidget.event(self, e) def closeEditor(self, editor, hint): QtGui.QTableWidget.closeEditor(self, editor, hint) tag = self.tag_diff.tag_names[self.editing.row()] old = self.tag_diff.new[tag] new = [unicode(editor.text())] if old == new: self.editing.setText(old[0]) else: self.set_tag_values(tag, new) self.editing = None self.update() def contextMenuEvent(self, event): menu = QtGui.QMenu(self) if self.objects: tags = self.selected_tags() if len(tags) == 1: edit_tag_action = QtGui.QAction(_(u"Edit..."), self.parent) edit_tag_action.triggered.connect(partial(self.edit_tag, list(tags)[0])) menu.addAction(edit_tag_action) removals = [] useorigs = [] for tag in tags: if self.tag_is_removable(tag): removals.append(partial(self.remove_tag, tag)) status = self.tag_diff.status[tag] & TagStatus.Changed if status == TagStatus.Changed or status == TagStatus.Removed: for file in self.files: objects = [file] if file.parent in self.tracks and len(self.files & set(file.parent.linked_files)) == 1: objects.append(file.parent) orig_values = list(file.orig_metadata.getall(tag)) or [""] useorigs.append(partial(self.set_tag_values, tag, orig_values, objects)) if removals: remove_tag_action = QtGui.QAction(_(u"Remove"), self.parent) remove_tag_action.triggered.connect(lambda: [f() for f in removals]) menu.addAction(remove_tag_action) if useorigs: name = ungettext("Use Original Value", "Use Original Values", len(useorigs)) use_orig_value_action = QtGui.QAction(name, self.parent) use_orig_value_action.triggered.connect(lambda: [f() for f in useorigs]) menu.addAction(use_orig_value_action) menu.addSeparator() if len(tags) == 1 or removals or useorigs: menu.addSeparator() menu.addAction(self.add_tag_action) menu.addSeparator() menu.addAction(self.changes_first_action) menu.exec_(event.globalPos()) event.accept() def edit_tag(self, tag): EditTagDialog(self.parent, tag).exec_() def toggle_changes_first(self, checked): config.persist["show_changes_first"] = checked self.update() def set_tag_values(self, tag, values, objects=None): if objects is None: objects = self.objects self.parent.ignore_selection_changes = True if values != [""] or self.tag_is_removable(tag): for obj in objects: obj.metadata[tag] = values obj.update() self.update() self.parent.ignore_selection_changes = False def remove_tag(self, tag): self.set_tag_values(tag, [""]) def remove_selected_tags(self): for tag in self.selected_tags(): if self.tag_is_removable(tag): self.remove_tag(tag) def tag_is_removable(self, tag): return self.tag_diff.status[tag] & TagStatus.NotRemovable == 0 def selected_tags(self): tags = set(self.tag_diff.tag_names[item.row()] for item in self.selectedItems()) tags.discard("~length") return tags def _update_selection(self): files = set() tracks = set() objects = set() for obj in self.parent.selected_objects: if isinstance(obj, File): files.add(obj) elif isinstance(obj, Track): tracks.add(obj) files.update(obj.linked_files) elif isinstance(obj, Cluster) and obj.can_edit_tags(): objects.add(obj) files.update(obj.files) elif isinstance(obj, Album): objects.add(obj) tracks.update(obj.tracks) for track in obj.tracks: files.update(track.linked_files) objects.update(files) objects.update(tracks) self.selection_dirty = False self.selection_mutex.lock() self.files = files self.tracks = tracks self.objects = objects self.selection_mutex.unlock() @throttle(100) def update(self): if self.editing: return if self.selection_dirty: self._update_selection() thread.run_task(self._update_tags, self._update_items) def _update_tags(self): self.selection_mutex.lock() files = self.files tracks = self.tracks self.selection_mutex.unlock() if not (files or tracks): return None tag_diff = TagDiff() orig_tags = tag_diff.orig new_tags = tag_diff.new # existing_tags are orig_tags that would not be overwritten by # any new_tags, assuming clear_existing_tags is disabled. existing_tags = set() tag_diff.objects = len(files) clear_existing_tags = config.setting["clear_existing_tags"] for file in files: new_metadata = file.new_metadata orig_metadata = file.orig_metadata tags = set(new_metadata.keys() + orig_metadata.keys()) for name in filter(lambda x: not x.startswith("~"), tags): new_values = new_metadata.getall(name) orig_values = orig_metadata.getall(name) if not ((new_values and not name in existing_tags) or clear_existing_tags): new_values = list(orig_values or [""]) existing_tags.add(name) tag_diff.add(name, orig_values, new_values, clear_existing_tags) tag_diff.add("~length", str(orig_metadata.length), str(new_metadata.length), False) for track in tracks: if track.num_linked_files == 0: for name, values in dict.iteritems(track.metadata): if not name.startswith("~"): tag_diff.add(name, values, values, True) length = str(track.metadata.length) tag_diff.add("~length", length, length, False) tag_diff.objects += 1 all_tags = set(orig_tags.keys() + new_tags.keys()) tag_names = COMMON_TAGS + \ sorted(all_tags.difference(COMMON_TAGS), key=lambda x: display_tag_name(x).lower()) if config.persist["show_changes_first"]: tags_by_status = {} for tag in tag_names: tags_by_status.setdefault(tag_diff.tag_status(tag), []).append(tag) for status in (TagStatus.Changed, TagStatus.Added, TagStatus.Removed, TagStatus.NoChange): tag_diff.tag_names += tags_by_status.pop(status, []) else: tag_diff.tag_names = [ tag for tag in tag_names if tag_diff.status[tag] != TagStatus.Empty] return tag_diff def _update_items(self, result=None, error=None): if self.editing: return if not (self.files or self.tracks): result = None self.tag_diff = result if result is None: self.setRowCount(0) return self.setRowCount(len(result.tag_names)) orig_flags = QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled new_flags = orig_flags | QtCore.Qt.ItemIsEditable for i, name in enumerate(result.tag_names): length = name == "~length" tag_item = self.item(i, 0) orig_item = self.item(i, 1) new_item = self.item(i, 2) if not tag_item: tag_item = QtGui.QTableWidgetItem() tag_item.setFlags(orig_flags) font = tag_item.font() font.setBold(True) tag_item.setFont(font) self.setItem(i, 0, tag_item) if not orig_item: orig_item = QtGui.QTableWidgetItem() orig_item.setFlags(orig_flags) self.setItem(i, 1, orig_item) if not new_item: new_item = QtGui.QTableWidgetItem() self.setItem(i, 2, new_item) tag_item.setText(display_tag_name(name)) self.set_item_value(orig_item, self.tag_diff.orig, name) new_item.setFlags(orig_flags if length else new_flags) self.set_item_value(new_item, self.tag_diff.new, name) color = self.colors.get(result.tag_status(name), self.colors[TagStatus.NoChange]) orig_item.setForeground(color) new_item.setForeground(color) def set_item_value(self, item, tags, name): text, italic = tags.display_value(name) item.setText(text) font = item.font() font.setItalic(italic) item.setFont(font) def restore_state(self): state = config.persist["metadatabox_header_state"] header = self.horizontalHeader() header.restoreState(state) header.setResizeMode(QtGui.QHeaderView.Interactive) def save_state(self): header = self.horizontalHeader() state = header.saveState() config.persist["metadatabox_header_state"] = state picard-release-1.3.2/picard/ui/options/000077500000000000000000000000001245305550700177555ustar00rootroot00000000000000picard-release-1.3.2/picard/ui/options/__init__.py000066400000000000000000000031731245305550700220720ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtGui from picard.plugin import ExtensionPoint class OptionsCheckError(Exception): def __init__(self, title, info): self.title = title self.info = info class OptionsPage(QtGui.QWidget): PARENT = None SORT_ORDER = 1000 ACTIVE = True STYLESHEET_ERROR = "QWidget { background-color: #f55; color: white; font-weight:bold }" def info(self): raise NotImplementedError def check(self): pass def load(self): pass def save(self): pass def display_error(self, error): dialog = QtGui.QMessageBox(QtGui.QMessageBox.Warning, error.title, error.info, QtGui.QMessageBox.Ok, self) dialog.exec_() _pages = ExtensionPoint() def register_options_page(page_class): _pages.register(page_class.__module__, page_class) picard-release-1.3.2/picard/ui/options/about.py000066400000000000000000000063311245305550700214440ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006-2014 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard.const import PICARD_URLS from picard.formats import supported_formats from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_about import Ui_AboutOptionsPage from picard.util import versions class AboutOptionsPage(OptionsPage): NAME = "about" TITLE = N_("About") PARENT = None SORT_ORDER = 100 ACTIVE = True def __init__(self, parent=None): super(AboutOptionsPage, self).__init__(parent) self.ui = Ui_AboutOptionsPage() self.ui.setupUi(self) def load(self): args = { "picard-doc-url": PICARD_URLS['home'], "picard-donate-url": PICARD_URLS['donate'], } args.update(versions.as_dict(i18n=True)) formats = [] for exts, name in supported_formats(): formats.extend(exts) args["formats"] = ", ".join(formats) # TR: Replace this with your name to have it appear in the "About" dialog. args["translator-credits"] = _("translator-credits") if args["translator-credits"] != "translator-credits": # TR: Replace LANG with language you are translatig to. args["translator-credits"] = _("
Translated to LANG by %s") % args["translator-credits"].replace("\n", "
") else: args["translator-credits"] = "" text = _(u"""

MusicBrainz Picard
Version %(version)s

PyQt %(pyqt-version)s
Mutagen %(mutagen-version)s
Discid %(discid-version)s

Supported formats
%(formats)s

Please donate
Thank you for using Picard. Picard relies on the MusicBrainz database, which is operated by the MetaBrainz Foundation with the help of thousands of volunteers. If you like this application please consider donating to the MetaBrainz Foundation to keep the service running.

Donate now!

Credits
Copyright © 2004-2014 Robert Kaye, Lukáš Lalinský and others%(translator-credits)s

%(picard-doc-url)s

""") % args self.ui.label.setOpenExternalLinks(True) self.ui.label.setText(text) register_options_page(AboutOptionsPage) picard-release-1.3.2/picard/ui/options/advanced.py000066400000000000000000000047211245305550700221000ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4.QtGui import QPalette, QColor import re from picard import config from picard.ui.options import OptionsPage, OptionsCheckError, register_options_page from picard.ui.ui_options_advanced import Ui_AdvancedOptionsPage class AdvancedOptionsPage(OptionsPage): NAME = "advanced" TITLE = N_("Advanced") PARENT = None SORT_ORDER = 90 ACTIVE = True options = [ config.TextOption("setting", "ignore_regex", ""), config.BoolOption("setting", "ignore_hidden_files", False), ] def __init__(self, parent=None): super(AdvancedOptionsPage, self).__init__(parent) self.ui = Ui_AdvancedOptionsPage() self.ui.setupUi(self) self.ui.ignore_regex.textChanged.connect(self.live_checker) def load(self): self.ui.ignore_regex.setText(config.setting["ignore_regex"]) self.ui.ignore_hidden_files.setChecked(config.setting["ignore_hidden_files"]) def save(self): config.setting["ignore_regex"] = unicode(self.ui.ignore_regex.text()) config.setting["ignore_hidden_files"] = self.ui.ignore_hidden_files.isChecked() def live_checker(self, text): self.ui.regex_error.setStyleSheet("") self.ui.regex_error.setText("") try: self.check() except OptionsCheckError as e: self.ui.regex_error.setStyleSheet(self.STYLESHEET_ERROR) self.ui.regex_error.setText(e.info) return def check(self): try: re.compile(unicode(self.ui.ignore_regex.text())) except re.error as e: raise OptionsCheckError(_("Regex Error"), str(e)) register_options_page(AdvancedOptionsPage) picard-release-1.3.2/picard/ui/options/cdlookup.py000066400000000000000000000046001245305550700221470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (c) 2004 Robert Kaye # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui.options import OptionsPage, register_options_page from picard.util.cdrom import ( get_cdrom_drives, AUTO_DETECT_DRIVES, DEFAULT_DRIVES ) if AUTO_DETECT_DRIVES: from picard.ui.ui_options_cdlookup_select import Ui_CDLookupOptionsPage else: from picard.ui.ui_options_cdlookup import Ui_CDLookupOptionsPage class CDLookupOptionsPage(OptionsPage): NAME = "cdlookup" TITLE = N_("CD Lookup") PARENT = None SORT_ORDER = 50 ACTIVE = True options = [ config.TextOption("setting", "cd_lookup_device", ",".join(DEFAULT_DRIVES)), ] def __init__(self, parent=None): super(CDLookupOptionsPage, self).__init__(parent) self.ui = Ui_CDLookupOptionsPage() self.ui.setupUi(self) if AUTO_DETECT_DRIVES: self.drives = get_cdrom_drives() self.ui.cd_lookup_device.addItems(self.drives) def load(self): if AUTO_DETECT_DRIVES: try: self.ui.cd_lookup_device.setCurrentIndex(self.drives.index(config.setting["cd_lookup_device"])) except ValueError: pass else: self.ui.cd_lookup_device.setText(config.setting["cd_lookup_device"]) def save(self): if AUTO_DETECT_DRIVES: config.setting["cd_lookup_device"] = unicode(self.ui.cd_lookup_device.currentText()) else: config.setting["cd_lookup_device"] = unicode(self.ui.cd_lookup_device.text()) register_options_page(CDLookupOptionsPage) picard-release-1.3.2/picard/ui/options/cover.py000066400000000000000000000216051245305550700214510ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui from picard import config from picard.coverart.utils import CAA_TYPES, translate_caa_type from picard.ui.options import OptionsPage, register_options_page from picard.ui.util import StandardButton from picard.ui.ui_options_cover import Ui_CoverOptionsPage from picard.util import webbrowser2 class CAATypesSelectorDialog(QtGui.QDialog): _columns = 4 def __init__(self, parent=None, types=[]): super(CAATypesSelectorDialog, self).__init__(parent) self.setWindowTitle(_("Cover art types")) self._items = {} self.layout = QtGui.QVBoxLayout(self) grid = QtGui.QWidget() gridlayout = QtGui.QGridLayout() grid.setLayout(gridlayout) rows = len(CAA_TYPES) // self._columns + 1 positions = [(i, j) for i in range(rows) for j in range(self._columns)] for position, caa_type in zip(positions, CAA_TYPES): name = caa_type["name"] text = translate_caa_type(name) item = QtGui.QCheckBox(text) item.setChecked(name in types) self._items[item] = caa_type gridlayout.addWidget(item, *position) self.layout.addWidget(grid) self.buttonbox = QtGui.QDialogButtonBox(self) self.buttonbox.setOrientation(QtCore.Qt.Horizontal) self.buttonbox.addButton( StandardButton(StandardButton.OK), QtGui.QDialogButtonBox.AcceptRole) self.buttonbox.addButton(StandardButton(StandardButton.CANCEL), QtGui.QDialogButtonBox.RejectRole) self.buttonbox.addButton( StandardButton(StandardButton.HELP), QtGui.QDialogButtonBox.HelpRole) self.buttonbox.accepted.connect(self.accept) self.buttonbox.rejected.connect(self.reject) self.buttonbox.helpRequested.connect(self.help) extrabuttons = [ (N_("Chec&k all"), self.checkall), (N_("&Uncheck all"), self.uncheckall), ] for label, callback in extrabuttons: button = QtGui.QPushButton(_(label)) button.setSizePolicy( QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Expanding) self.buttonbox.addButton(button, QtGui.QDialogButtonBox.ActionRole) button.clicked.connect(callback) self.layout.addWidget(self.buttonbox) self.buttonbox.accepted.connect(self.accept) self.buttonbox.rejected.connect(self.reject) def help(self): webbrowser2.goto('doc_cover_art_types') def uncheckall(self): self._set_checked_all(False) def checkall(self): self._set_checked_all(True) def _set_checked_all(self, value): for item in self._items.keys(): item.setChecked(value) def get_selected_types(self): types = [] for item, typ in self._items.iteritems(): if item.isChecked(): types.append(typ['name']) if not types: return [u'front'] return types @staticmethod def run(parent=None, types=[]): dialog = CAATypesSelectorDialog(parent, types) result = dialog.exec_() return (dialog.get_selected_types(), result == QtGui.QDialog.Accepted) class CoverOptionsPage(OptionsPage): NAME = "cover" TITLE = N_("Cover Art") PARENT = None SORT_ORDER = 35 ACTIVE = True options = [ config.BoolOption("setting", "save_images_to_tags", True), config.BoolOption("setting", "save_only_front_images_to_tags", True), config.BoolOption("setting", "save_images_to_files", False), config.TextOption("setting", "cover_image_filename", "cover"), config.BoolOption("setting", "save_images_overwrite", False), config.BoolOption("setting", "ca_provider_use_amazon", True), config.BoolOption("setting", "ca_provider_use_caa", True), config.BoolOption("setting", "ca_provider_use_caa_release_group_fallback", False), config.BoolOption("setting", "ca_provider_use_whitelist", True), config.BoolOption("setting", "caa_approved_only", True), config.BoolOption("setting", "caa_image_type_as_filename", False), config.IntOption("setting", "caa_image_size", 1), config.ListOption("setting", "caa_image_types", [u"front"]), config.BoolOption("setting", "caa_restrict_image_types", True), ] def __init__(self, parent=None): super(CoverOptionsPage, self).__init__(parent) self.ui = Ui_CoverOptionsPage() self.ui.setupUi(self) self.ui.save_images_to_files.clicked.connect(self.update_filename) self.ui.restrict_images_types.clicked.connect(self.update_caa_types) def load(self): self.ui.save_images_to_tags.setChecked(config.setting["save_images_to_tags"]) self.ui.cb_embed_front_only.setChecked(config.setting["save_only_front_images_to_tags"]) self.ui.save_images_to_files.setChecked(config.setting["save_images_to_files"]) self.ui.cover_image_filename.setText(config.setting["cover_image_filename"]) self.ui.save_images_overwrite.setChecked(config.setting["save_images_overwrite"]) self.update_filename() self.ui.caprovider_amazon.setChecked(config.setting["ca_provider_use_amazon"]) self.ui.caprovider_caa.setChecked(config.setting["ca_provider_use_caa"]) self.ui.caprovider_caa_release_group.setChecked( config.setting["ca_provider_use_caa_release_group_fallback"]) self.ui.caprovider_whitelist.setChecked(config.setting["ca_provider_use_whitelist"]) self.ui.gb_caa.setEnabled(config.setting["ca_provider_use_caa"]) self.ui.cb_image_size.setCurrentIndex(config.setting["caa_image_size"]) self.ui.cb_approved_only.setChecked(config.setting["caa_approved_only"]) self.ui.cb_type_as_filename.setChecked(config.setting["caa_image_type_as_filename"]) self.connect(self.ui.caprovider_caa, QtCore.SIGNAL("toggled(bool)"), self.ui.gb_caa.setEnabled) self.ui.select_caa_types.clicked.connect(self.select_caa_types) self.ui.restrict_images_types.setChecked( config.setting["caa_restrict_image_types"]) self.update_caa_types() self.update_filename() def save(self): config.setting["save_images_to_tags"] = self.ui.save_images_to_tags.isChecked() config.setting["save_only_front_images_to_tags"] = self.ui.cb_embed_front_only.isChecked() config.setting["save_images_to_files"] = self.ui.save_images_to_files.isChecked() config.setting["cover_image_filename"] = unicode(self.ui.cover_image_filename.text()) config.setting["ca_provider_use_amazon"] =\ self.ui.caprovider_amazon.isChecked() config.setting["ca_provider_use_caa"] =\ self.ui.caprovider_caa.isChecked() config.setting["ca_provider_use_caa_release_group_fallback"] =\ self.ui.caprovider_caa_release_group.isChecked() config.setting["ca_provider_use_whitelist"] =\ self.ui.caprovider_whitelist.isChecked() config.setting["caa_image_size"] =\ self.ui.cb_image_size.currentIndex() config.setting["caa_approved_only"] =\ self.ui.cb_approved_only.isChecked() config.setting["caa_image_type_as_filename"] = \ self.ui.cb_type_as_filename.isChecked() config.setting["save_images_overwrite"] = self.ui.save_images_overwrite.isChecked() config.setting["caa_restrict_image_types"] = \ self.ui.restrict_images_types.isChecked() def update_filename(self): enabled = self.ui.save_images_to_files.isChecked() self.ui.cover_image_filename.setEnabled(enabled) self.ui.save_images_overwrite.setEnabled(enabled) def update_caa_types(self): enabled = self.ui.restrict_images_types.isChecked() self.ui.select_caa_types.setEnabled(enabled) def select_caa_types(self): (types, ok) = CAATypesSelectorDialog.run( self, config.setting["caa_image_types"]) if ok: config.setting["caa_image_types"] = types register_options_page(CoverOptionsPage) picard-release-1.3.2/picard/ui/options/dialog.py000066400000000000000000000116611245305550700215730ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006-2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui from picard import config from picard.util import webbrowser2 from picard.ui import PicardDialog from picard.ui.util import StandardButton from picard.ui.options import ( about, advanced, cdlookup, cover, general, interface, folksonomy, ratings, matching, metadata, releases, renaming, plugins, network, scripting, tags, fingerprinting, OptionsCheckError, _pages as page_classes ) class OptionsDialog(PicardDialog): options = [ config.Option("persist", "options_position", QtCore.QPoint()), config.Option("persist", "options_size", QtCore.QSize(560, 400)), config.Option("persist", "options_splitter", QtCore.QByteArray()), ] def add_pages(self, parent, default_page, parent_item): pages = [(p.SORT_ORDER, p.NAME, p) for p in self.pages if p.PARENT == parent] items = [] for foo, bar, page in sorted(pages): item = QtGui.QTreeWidgetItem(parent_item) item.setText(0, _(page.TITLE)) if page.ACTIVE: self.item_to_page[item] = page self.page_to_item[page.NAME] = item self.ui.pages_stack.addWidget(page) else: item.setFlags(QtCore.Qt.ItemIsEnabled) self.add_pages(page.NAME, default_page, item) if page.NAME == default_page: self.default_item = item items.append(item) if not self.default_item and not parent: self.default_item = items[0] def __init__(self, default_page=None, parent=None): PicardDialog.__init__(self, parent) from picard.ui.ui_options import Ui_Dialog self.ui = Ui_Dialog() self.ui.setupUi(self) self.ui.buttonbox.addButton(StandardButton(StandardButton.OK), QtGui.QDialogButtonBox.AcceptRole) self.ui.buttonbox.addButton(StandardButton(StandardButton.CANCEL), QtGui.QDialogButtonBox.RejectRole) self.ui.buttonbox.addButton(StandardButton(StandardButton.HELP), QtGui.QDialogButtonBox.HelpRole) self.ui.buttonbox.accepted.connect(self.accept) self.ui.buttonbox.rejected.connect(self.reject) self.ui.buttonbox.helpRequested.connect(self.help) self.pages = [] for Page in page_classes: page = Page(self.ui.pages_stack) self.pages.append(page) self.item_to_page = {} self.page_to_item = {} self.default_item = None self.add_pages(None, default_page, self.ui.pages_tree) self.ui.pages_tree.setHeaderLabels([""]) self.ui.pages_tree.header().hide() self.ui.pages_tree.itemSelectionChanged.connect(self.switch_page) self.restoreWindowState() for page in self.pages: page.load() self.ui.pages_tree.setCurrentItem(self.default_item) def switch_page(self): items = self.ui.pages_tree.selectedItems() if items: page = self.item_to_page[items[0]] self.ui.pages_stack.setCurrentWidget(page) def help(self): webbrowser2.goto('doc_options') def accept(self): for page in self.pages: try: page.check() except OptionsCheckError as e: self.ui.pages_tree.setCurrentItem(self.page_to_item[page.NAME]) page.display_error(e) return for page in self.pages: page.save() self.saveWindowState() QtGui.QDialog.accept(self) def closeEvent(self, event): self.saveWindowState() event.accept() def saveWindowState(self): pos = self.pos() if not pos.isNull(): config.persist["options_position"] = pos config.persist["options_size"] = self.size() config.persist["options_splitter"] = self.ui.splitter.saveState() def restoreWindowState(self): pos = config.persist["options_position"] if pos.x() > 0 and pos.y() > 0: self.move(pos) self.resize(config.persist["options_size"]) self.ui.splitter.restoreState(config.persist["options_splitter"]) picard-release-1.3.2/picard/ui/options/fingerprinting.py000066400000000000000000000072051245305550700233600ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2011 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os from PyQt4 import QtGui from picard import config from picard.util import webbrowser2, find_executable from picard.const import FPCALC_NAMES from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_fingerprinting import Ui_FingerprintingOptionsPage class FingerprintingOptionsPage(OptionsPage): NAME = "fingerprinting" TITLE = N_("Fingerprinting") PARENT = None SORT_ORDER = 45 ACTIVE = True options = [ config.TextOption("setting", "fingerprinting_system", "acoustid"), config.TextOption("setting", "acoustid_fpcalc", ""), config.TextOption("setting", "acoustid_apikey", ""), ] def __init__(self, parent=None): super(FingerprintingOptionsPage, self).__init__(parent) self.ui = Ui_FingerprintingOptionsPage() self.ui.setupUi(self) self.ui.disable_fingerprinting.clicked.connect(self.update_groupboxes) self.ui.use_acoustid.clicked.connect(self.update_groupboxes) self.ui.acoustid_fpcalc_browse.clicked.connect(self.acoustid_fpcalc_browse) self.ui.acoustid_fpcalc_download.clicked.connect(self.acoustid_fpcalc_download) self.ui.acoustid_apikey_get.clicked.connect(self.acoustid_apikey_get) def load(self): if config.setting["fingerprinting_system"] == "acoustid": self.ui.use_acoustid.setChecked(True) else: self.ui.disable_fingerprinting.setChecked(True) self.ui.acoustid_fpcalc.setText(config.setting["acoustid_fpcalc"]) self.ui.acoustid_apikey.setText(config.setting["acoustid_apikey"]) self.update_groupboxes() def save(self): if self.ui.use_acoustid.isChecked(): config.setting["fingerprinting_system"] = "acoustid" else: config.setting["fingerprinting_system"] = "" config.setting["acoustid_fpcalc"] = unicode(self.ui.acoustid_fpcalc.text()) config.setting["acoustid_apikey"] = unicode(self.ui.acoustid_apikey.text()) def update_groupboxes(self): if self.ui.use_acoustid.isChecked(): self.ui.acoustid_settings.setEnabled(True) if not self.ui.acoustid_fpcalc.text(): fpcalc_path = find_executable(*FPCALC_NAMES) if fpcalc_path: self.ui.acoustid_fpcalc.setText(fpcalc_path) else: self.ui.acoustid_settings.setEnabled(False) def acoustid_fpcalc_browse(self): path = QtGui.QFileDialog.getOpenFileName(self, "", self.ui.acoustid_fpcalc.text()) if path: path = os.path.normpath(unicode(path)) self.ui.acoustid_fpcalc.setText(path) def acoustid_fpcalc_download(self): webbrowser2.goto('chromaprint') def acoustid_apikey_get(self): webbrowser2.goto('acoustid_apikey') register_options_page(FingerprintingOptionsPage) picard-release-1.3.2/picard/ui/options/folksonomy.py000066400000000000000000000045761245305550700225430ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2008 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_folksonomy import Ui_FolksonomyOptionsPage class FolksonomyOptionsPage(OptionsPage): NAME = "folsonomy" TITLE = N_("Folksonomy Tags") PARENT = "metadata" SORT_ORDER = 20 ACTIVE = True options = [ config.IntOption("setting", "max_tags", 5), config.IntOption("setting", "min_tag_usage", 90), config.TextOption("setting", "ignore_tags", "seen live,favorites,fixme,owned"), config.TextOption("setting", "join_tags", ""), config.BoolOption("setting", "only_my_tags", False), ] def __init__(self, parent=None): super(FolksonomyOptionsPage, self).__init__(parent) self.ui = Ui_FolksonomyOptionsPage() self.ui.setupUi(self) def load(self): self.ui.max_tags.setValue(config.setting["max_tags"]) self.ui.min_tag_usage.setValue(config.setting["min_tag_usage"]) self.ui.join_tags.setEditText(config.setting["join_tags"]) self.ui.ignore_tags.setText(config.setting["ignore_tags"]) self.ui.only_my_tags.setChecked(config.setting["only_my_tags"]) def save(self): config.setting["max_tags"] = self.ui.max_tags.value() config.setting["min_tag_usage"] = self.ui.min_tag_usage.value() config.setting["join_tags"] = self.ui.join_tags.currentText() config.setting["ignore_tags"] = self.ui.ignore_tags.text() config.setting["only_my_tags"] = self.ui.only_my_tags.isChecked() register_options_page(FolksonomyOptionsPage) picard-release-1.3.2/picard/ui/options/general.py000066400000000000000000000061401245305550700217450ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_general import Ui_GeneralOptionsPage from picard.util import rot13 from picard.const import MUSICBRAINZ_SERVERS from picard.collection import load_user_collections class GeneralOptionsPage(OptionsPage): NAME = "general" TITLE = N_("General") PARENT = None SORT_ORDER = 1 ACTIVE = True options = [ config.TextOption("setting", "server_host", MUSICBRAINZ_SERVERS[0]), config.IntOption("setting", "server_port", 80), config.TextOption("setting", "username", ""), config.PasswordOption("setting", "password", ""), config.BoolOption("setting", "analyze_new_files", False), config.BoolOption("setting", "ignore_file_mbids", False), ] def __init__(self, parent=None): super(GeneralOptionsPage, self).__init__(parent) self.ui = Ui_GeneralOptionsPage() self.ui.setupUi(self) self.ui.server_host.addItems(MUSICBRAINZ_SERVERS) def load(self): self.ui.server_host.setEditText(config.setting["server_host"]) self.ui.server_port.setValue(config.setting["server_port"]) self.ui.username.setText(config.setting["username"]) self.ui.password.setText(config.setting["password"]) self.ui.analyze_new_files.setChecked(config.setting["analyze_new_files"]) self.ui.ignore_file_mbids.setChecked(config.setting["ignore_file_mbids"]) def save(self): config.setting["server_host"] = unicode(self.ui.server_host.currentText()).strip() config.setting["server_port"] = self.ui.server_port.value() reload_collections = config.setting["username"] != unicode(self.ui.username.text()) \ or config.setting["password"] != unicode(self.ui.password.text()) config.setting["username"] = unicode(self.ui.username.text()) # trivially encode the password, just to not make it so apparent config.setting["password"] = rot13(unicode(self.ui.password.text())) if reload_collections: load_user_collections() config.setting["analyze_new_files"] = self.ui.analyze_new_files.isChecked() config.setting["ignore_file_mbids"] = self.ui.ignore_file_mbids.isChecked() register_options_page(GeneralOptionsPage) picard-release-1.3.2/picard/ui/options/interface.py000066400000000000000000000121241245305550700222670ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os.path from functools import partial from PyQt4 import QtCore, QtGui from picard import config from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_interface import Ui_InterfaceOptionsPage from picard.ui.util import enabledSlot from picard.const import UI_LANGUAGES import operator import locale class InterfaceOptionsPage(OptionsPage): NAME = "interface" TITLE = N_("User Interface") PARENT = "advanced" SORT_ORDER = 40 ACTIVE = True options = [ config.BoolOption("setting", "toolbar_show_labels", True), config.BoolOption("setting", "toolbar_multiselect", False), config.BoolOption("setting", "use_adv_search_syntax", False), config.BoolOption("setting", "quit_confirmation", True), config.TextOption("setting", "ui_language", u""), config.BoolOption("setting", "starting_directory", False), config.TextOption("setting", "starting_directory_path", ""), ] def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), '') language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] for lang_code, native, translation in sorted(language_list, key=operator.itemgetter(2), cmp=locale.strcoll): if native and native != translation: name = u'%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_path.setEnabled ) ) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_browse.setEnabled ) ) self.ui.starting_directory_browse.clicked.connect(self.starting_directory_browse) def load(self): self.ui.toolbar_show_labels.setChecked(config.setting["toolbar_show_labels"]) self.ui.toolbar_multiselect.setChecked(config.setting["toolbar_multiselect"]) self.ui.use_adv_search_syntax.setChecked(config.setting["use_adv_search_syntax"]) self.ui.quit_confirmation.setChecked(config.setting["quit_confirmation"]) current_ui_language = config.setting["ui_language"] self.ui.ui_language.setCurrentIndex(self.ui.ui_language.findData(current_ui_language)) self.ui.starting_directory.setChecked(config.setting["starting_directory"]) self.ui.starting_directory_path.setText(config.setting["starting_directory_path"]) def save(self): config.setting["toolbar_show_labels"] = self.ui.toolbar_show_labels.isChecked() config.setting["toolbar_multiselect"] = self.ui.toolbar_multiselect.isChecked() config.setting["use_adv_search_syntax"] = self.ui.use_adv_search_syntax.isChecked() config.setting["quit_confirmation"] = self.ui.quit_confirmation.isChecked() self.tagger.window.update_toolbar_style() new_language = self.ui.ui_language.itemData(self.ui.ui_language.currentIndex()) if new_language != config.setting["ui_language"]: config.setting["ui_language"] = self.ui.ui_language.itemData(self.ui.ui_language.currentIndex()) dialog = QtGui.QMessageBox( QtGui.QMessageBox.Information, _('Language changed'), _('You have changed the interface language. You have to restart Picard in order for the change to take effect.'), QtGui.QMessageBox.Ok, self) dialog.exec_() config.setting["starting_directory"] = self.ui.starting_directory.isChecked() config.setting["starting_directory_path"] = os.path.normpath(unicode(self.ui.starting_directory_path.text())) def starting_directory_browse(self): item = self.ui.starting_directory_path path = QtGui.QFileDialog.getExistingDirectory(self, "", item.text()) if path: path = os.path.normpath(unicode(path)) item.setText(path) register_options_page(InterfaceOptionsPage) picard-release-1.3.2/picard/ui/options/matching.py000066400000000000000000000043561245305550700221310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_matching import Ui_MatchingOptionsPage class MatchingOptionsPage(OptionsPage): NAME = "matching" TITLE = N_("Matching") PARENT = "advanced" SORT_ORDER = 30 ACTIVE = True options = [ config.FloatOption("setting", "file_lookup_threshold", 0.7), config.FloatOption("setting", "cluster_lookup_threshold", 0.8), config.FloatOption("setting", "track_matching_threshold", 0.4), ] _release_type_sliders = {} def __init__(self, parent=None): super(MatchingOptionsPage, self).__init__(parent) self.ui = Ui_MatchingOptionsPage() self.ui.setupUi(self) def load(self): self.ui.file_lookup_threshold.setValue(int(config.setting["file_lookup_threshold"] * 100)) self.ui.cluster_lookup_threshold.setValue(int(config.setting["cluster_lookup_threshold"] * 100)) self.ui.track_matching_threshold.setValue(int(config.setting["track_matching_threshold"] * 100)) def save(self): config.setting["file_lookup_threshold"] = float(self.ui.file_lookup_threshold.value()) / 100.0 config.setting["cluster_lookup_threshold"] = float(self.ui.cluster_lookup_threshold.value()) / 100.0 config.setting["track_matching_threshold"] = float(self.ui.track_matching_threshold.value()) / 100.0 register_options_page(MatchingOptionsPage) picard-release-1.3.2/picard/ui/options/metadata.py000066400000000000000000000103621245305550700221110ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_metadata import Ui_MetadataOptionsPage from picard.const import ALIAS_LOCALES class MetadataOptionsPage(OptionsPage): NAME = "metadata" TITLE = N_("Metadata") PARENT = None SORT_ORDER = 20 ACTIVE = True options = [ config.TextOption("setting", "va_name", u"Various Artists"), config.TextOption("setting", "nat_name", u"[non-album tracks]"), config.TextOption("setting", "artist_locale", u"en"), config.BoolOption("setting", "translate_artist_names", False), config.BoolOption("setting", "release_ars", True), config.BoolOption("setting", "track_ars", False), config.BoolOption("setting", "folksonomy_tags", False), config.BoolOption("setting", "convert_punctuation", True), config.BoolOption("setting", "standardize_artists", False), ] def __init__(self, parent=None): super(MetadataOptionsPage, self).__init__(parent) self.ui = Ui_MetadataOptionsPage() self.ui.setupUi(self) self.ui.va_name_default.clicked.connect(self.set_va_name_default) self.ui.nat_name_default.clicked.connect(self.set_nat_name_default) def load(self): self.ui.translate_artist_names.setChecked(config.setting["translate_artist_names"]) combo_box = self.ui.artist_locale locales = sorted(ALIAS_LOCALES.keys()) for i, loc in enumerate(locales): name = ALIAS_LOCALES[loc] if "_" in loc: name = " " + name combo_box.addItem(name, loc) if loc == config.setting["artist_locale"]: combo_box.setCurrentIndex(i) self.ui.convert_punctuation.setChecked(config.setting["convert_punctuation"]) self.ui.release_ars.setChecked(config.setting["release_ars"]) self.ui.track_ars.setChecked(config.setting["track_ars"]) self.ui.folksonomy_tags.setChecked(config.setting["folksonomy_tags"]) self.ui.va_name.setText(config.setting["va_name"]) self.ui.nat_name.setText(config.setting["nat_name"]) self.ui.standardize_artists.setChecked(config.setting["standardize_artists"]) def save(self): config.setting["translate_artist_names"] = self.ui.translate_artist_names.isChecked() config.setting["artist_locale"] = self.ui.artist_locale.itemData(self.ui.artist_locale.currentIndex()) config.setting["convert_punctuation"] = self.ui.convert_punctuation.isChecked() config.setting["release_ars"] = self.ui.release_ars.isChecked() config.setting["track_ars"] = self.ui.track_ars.isChecked() config.setting["folksonomy_tags"] = self.ui.folksonomy_tags.isChecked() config.setting["va_name"] = self.ui.va_name.text() nat_name = unicode(self.ui.nat_name.text()) if nat_name != config.setting["nat_name"]: config.setting["nat_name"] = nat_name if self.tagger.nats is not None: self.tagger.nats.update() config.setting["standardize_artists"] = self.ui.standardize_artists.isChecked() def set_va_name_default(self): self.ui.va_name.setText(self.options[0].default) self.ui.va_name.setCursorPosition(0) def set_nat_name_default(self): self.ui.nat_name.setText(self.options[1].default) self.ui.nat_name.setCursorPosition(0) register_options_page(MetadataOptionsPage) picard-release-1.3.2/picard/ui/options/network.py000066400000000000000000000075431245305550700220310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore from picard import config from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_network import Ui_NetworkOptionsPage class NetworkOptionsPage(OptionsPage): NAME = "network" TITLE = N_("Network") PARENT = "advanced" SORT_ORDER = 10 ACTIVE = True options = [ config.BoolOption("setting", "use_proxy", False), config.TextOption("setting", "proxy_server_host", ""), config.IntOption("setting", "proxy_server_port", 80), config.TextOption("setting", "proxy_username", ""), config.TextOption("setting", "proxy_password", ""), config.BoolOption("setting", "browser_integration", True), config.IntOption("setting", "browser_integration_port", 8000), config.BoolOption("setting", "browser_integration_localhost_only", True) ] def __init__(self, parent=None): super(NetworkOptionsPage, self).__init__(parent) self.ui = Ui_NetworkOptionsPage() self.ui.setupUi(self) def load(self): self.ui.web_proxy.setChecked(config.setting["use_proxy"]) self.ui.server_host.setText(config.setting["proxy_server_host"]) self.ui.server_port.setValue(config.setting["proxy_server_port"]) self.ui.username.setText(config.setting["proxy_username"]) self.ui.password.setText(config.setting["proxy_password"]) self.ui.browser_integration.setChecked(config.setting["browser_integration"]) self.ui.browser_integration_port.setValue(config.setting["browser_integration_port"]) self.ui.browser_integration_localhost_only.setChecked( config.setting["browser_integration_localhost_only"]) QtCore.QObject.connect(self.ui.browser_integration_port, QtCore.SIGNAL('valueChanged(int)'), self.change_browser_integration_port) def save(self): config.setting["use_proxy"] = self.ui.web_proxy.isChecked() config.setting["proxy_server_host"] = unicode(self.ui.server_host.text()) config.setting["proxy_server_port"] = self.ui.server_port.value() config.setting["proxy_username"] = unicode(self.ui.username.text()) config.setting["proxy_password"] = unicode(self.ui.password.text()) self.tagger.xmlws.setup_proxy() config.setting["browser_integration"] = self.ui.browser_integration.isChecked() config.setting["browser_integration_port"] = self.ui.browser_integration_port.value() config.setting["browser_integration_localhost_only"] = \ self.ui.browser_integration_localhost_only.isChecked() self.update_browser_integration() def update_browser_integration(self): if self.ui.browser_integration.isChecked(): self.tagger.browser_integration.start() else: self.tagger.browser_integration.stop() def change_browser_integration_port(self, port): config.setting["browser_integration_port"] = self.ui.browser_integration_port.value() register_options_page(NetworkOptionsPage) picard-release-1.3.2/picard/ui/options/plugins.py000066400000000000000000000146321245305550700220160ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2009 Carlin Mangar # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os.path import sys from PyQt4 import QtCore, QtGui from picard import config from picard.const import USER_PLUGIN_DIR from picard.util import encode_filename, webbrowser2 from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_plugins import Ui_PluginsOptionsPage def cmp_plugins(a, b): return cmp(a.name, b.name) class PluginsOptionsPage(OptionsPage): NAME = "plugins" TITLE = N_("Plugins") PARENT = None SORT_ORDER = 70 ACTIVE = True options = [ config.ListOption("setting", "enabled_plugins", []), ] def __init__(self, parent=None): super(PluginsOptionsPage, self).__init__(parent) self.ui = Ui_PluginsOptionsPage() self.ui.setupUi(self) self.items = {} self.ui.plugins.itemSelectionChanged.connect(self.change_details) self.ui.plugins.mimeTypes = self.mimeTypes self.ui.plugins.dropEvent = self.dropEvent self.ui.plugins.dragEnterEvent = self.dragEnterEvent if sys.platform == "win32": self.loader = "file:///%s" else: self.loader = "file://%s" self.ui.install_plugin.clicked.connect(self.open_plugins) self.ui.folder_open.clicked.connect(self.open_plugin_dir) self.ui.plugin_download.clicked.connect(self.open_plugin_site) self.tagger.pluginmanager.plugin_installed.connect(self.plugin_installed) def load(self): plugins = sorted(self.tagger.pluginmanager.plugins, cmp=cmp_plugins) enabled_plugins = config.setting["enabled_plugins"] firstitem = None for plugin in plugins: enabled = plugin.module_name in enabled_plugins item = self.add_plugin_item(plugin, enabled=enabled) if not firstitem: firstitem = item self.ui.plugins.setCurrentItem(firstitem) def plugin_installed(self, plugin): if not plugin.compatible: msgbox = QtGui.QMessageBox(self) msgbox.setText(u"The plugin ‘%s’ is not compatible with this version of Picard." % plugin.name) msgbox.setStandardButtons(QtGui.QMessageBox.Ok) msgbox.setDefaultButton(QtGui.QMessageBox.Ok) msgbox.exec_() return for i, p in self.items.items(): if plugin.module_name == p.module_name: enabled = i.checkState(0) == QtCore.Qt.Checked self.add_plugin_item(plugin, enabled=enabled, item=i) break else: self.add_plugin_item(plugin) def add_plugin_item(self, plugin, enabled=False, item=None): if item is None: item = QtGui.QTreeWidgetItem(self.ui.plugins) item.setText(0, plugin.name) if enabled: item.setCheckState(0, QtCore.Qt.Checked) else: item.setCheckState(0, QtCore.Qt.Unchecked) item.setText(1, plugin.version) item.setText(2, plugin.author) self.ui.plugins.header().resizeSections(QtGui.QHeaderView.ResizeToContents) self.items[item] = plugin return item def save(self): enabled_plugins = [] for item, plugin in self.items.iteritems(): if item.checkState(0) == QtCore.Qt.Checked: enabled_plugins.append(plugin.module_name) config.setting["enabled_plugins"] = enabled_plugins def change_details(self): plugin = self.items[self.ui.plugins.selectedItems()[0]] text = [] name = plugin.name descr = plugin.description if descr: text.append(descr + "
") text.append('______________________________') if name: text.append("" + _("Name") + ": " + name) author = plugin.author if author: text.append("" + _("Author") + ": " + author) text.append("" + _("File") + ": " + plugin.file[len(plugin.dir)+1:]) self.ui.details.setText("

%s

" % "
\n".join(text)) def open_plugins(self): files = QtGui.QFileDialog.getOpenFileNames(self, "", QtCore.QDir.homePath(), "Picard plugin (*.py *.pyc)") if files: files = map(unicode, files) for path in files: self.install_plugin(path) def install_plugin(self, path): path = encode_filename(path) file = os.path.basename(path) dest = os.path.join(USER_PLUGIN_DIR, file) if os.path.exists(dest): msgbox = QtGui.QMessageBox(self) msgbox.setText("A plugin named %s is already installed." % file) msgbox.setInformativeText("Do you want to overwrite the existing plugin?") msgbox.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) msgbox.setDefaultButton(QtGui.QMessageBox.No) if msgbox.exec_() == QtGui.QMessageBox.No: return self.tagger.pluginmanager.install_plugin(path, dest) def open_plugin_dir(self): QtGui.QDesktopServices.openUrl(QtCore.QUrl(self.loader % USER_PLUGIN_DIR, QtCore.QUrl.TolerantMode)) def open_plugin_site(self): webbrowser2.goto('plugins') def mimeTypes(self): return ["text/uri-list"] def dragEnterEvent(self, event): event.setDropAction(QtCore.Qt.CopyAction) event.accept() def dropEvent(self, event): for path in [os.path.normpath(unicode(u.toLocalFile())) for u in event.mimeData().urls()]: self.install_plugin(path) register_options_page(PluginsOptionsPage) picard-release-1.3.2/picard/ui/options/ratings.py000066400000000000000000000041231245305550700217760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2008 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_ratings import Ui_RatingsOptionsPage class RatingsOptionsPage(OptionsPage): NAME = "ratings" TITLE = N_("Ratings") PARENT = "metadata" SORT_ORDER = 20 ACTIVE = True options = [ config.BoolOption("setting", "enable_ratings", False), config.TextOption("setting", "rating_user_email", "users@musicbrainz.org"), config.BoolOption("setting", "submit_ratings", True), config.IntOption("setting", "rating_steps", 6), ] def __init__(self, parent=None): super(RatingsOptionsPage, self).__init__(parent) self.ui = Ui_RatingsOptionsPage() self.ui.setupUi(self) def load(self): self.ui.enable_ratings.setChecked(config.setting["enable_ratings"]) self.ui.rating_user_email.setText(config.setting["rating_user_email"]) self.ui.submit_ratings.setChecked(config.setting["submit_ratings"]) def save(self): config.setting["enable_ratings"] = self.ui.enable_ratings.isChecked() config.setting["rating_user_email"] = self.ui.rating_user_email.text() config.setting["submit_ratings"] = self.ui.submit_ratings.isChecked() register_options_page(RatingsOptionsPage) picard-release-1.3.2/picard/ui/options/releases.py000066400000000000000000000210761245305550700221400ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from operator import itemgetter from locale import strcoll from PyQt4 import QtCore, QtGui from picard import config from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_releases import Ui_ReleasesOptionsPage from picard.const import (RELEASE_COUNTRIES, RELEASE_FORMATS, RELEASE_PRIMARY_GROUPS, RELEASE_SECONDARY_GROUPS) from picard.i18n import ugettext_attr _DEFAULT_SCORE = 0.5 _release_type_scores = [(g, _DEFAULT_SCORE) for g in RELEASE_PRIMARY_GROUPS.keys() + RELEASE_SECONDARY_GROUPS.keys()] class ReleaseTypeScore: def __init__(self, group, layout, label, cell): row, column = cell # it uses 2 cells (r,c and r,c+1) self.group = group self.layout = layout self.label = QtGui.QLabel(self.group) self.label.setText(label) self.layout.addWidget(self.label, row, column, 1, 1) self.slider = QtGui.QSlider(self.group) self.slider.setMaximum(100) self.slider.setOrientation(QtCore.Qt.Horizontal) self.layout.addWidget(self.slider, row, column + 1, 1, 1) self.reset() def setValue(self, value): self.slider.setValue(int(value * 100)) def value(self): return float(self.slider.value()) / 100.0 def reset(self): self.setValue(_DEFAULT_SCORE) class RowColIter: def __init__(self, max_cells, max_cols=6, step=2): assert(max_cols % step == 0) self.step = step self.cols = max_cols self.rows = int((max_cells - 1) / (self.cols / step)) + 1 self.current = (-1, 0) def __iter__(self): return self def next(self): row, col = self.current row += 1 if row == self.rows: col += self.step row = 0 self.current = (row, col) return self.current class ReleasesOptionsPage(OptionsPage): NAME = "releases" TITLE = N_("Preferred Releases") PARENT = "metadata" SORT_ORDER = 10 ACTIVE = True options = [ config.ListOption("setting", "release_type_scores", _release_type_scores), config.ListOption("setting", "preferred_release_countries", []), config.ListOption("setting", "preferred_release_formats", []), ] def __init__(self, parent=None): super(ReleasesOptionsPage, self).__init__(parent) self.ui = Ui_ReleasesOptionsPage() self.ui.setupUi(self) self._release_type_sliders = {} def add_slider(name, griditer, context): label = ugettext_attr(name, context) self._release_type_sliders[name] = \ ReleaseTypeScore(self.ui.type_group, self.ui.gridLayout, label, griditer.next()) griditer = RowColIter(len(RELEASE_PRIMARY_GROUPS) + len(RELEASE_SECONDARY_GROUPS) + 1) # +1 for Reset button for name in RELEASE_PRIMARY_GROUPS: add_slider(name, griditer, context=u'release_group_primary_type') for name in RELEASE_SECONDARY_GROUPS: add_slider(name, griditer, context=u'release_group_secondary_type') self.reset_preferred_types_btn = QtGui.QPushButton(self.ui.type_group) self.reset_preferred_types_btn.setText(_("Reset all")) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.reset_preferred_types_btn.sizePolicy().hasHeightForWidth()) self.reset_preferred_types_btn.setSizePolicy(sizePolicy) r, c = griditer.next() self.ui.gridLayout.addWidget(self.reset_preferred_types_btn, r, c, 1, 2) self.reset_preferred_types_btn.clicked.connect(self.reset_preferred_types) self.ui.add_countries.clicked.connect(self.add_preferred_countries) self.ui.remove_countries.clicked.connect(self.remove_preferred_countries) self.ui.add_formats.clicked.connect(self.add_preferred_formats) self.ui.remove_formats.clicked.connect(self.remove_preferred_formats) self.ui.country_list.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.ui.preferred_country_list.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.ui.format_list.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.ui.preferred_format_list.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) def load(self): scores = dict(config.setting["release_type_scores"]) for (release_type, release_type_slider) in self._release_type_sliders.iteritems(): release_type_slider.setValue(scores.get(release_type, _DEFAULT_SCORE)) self._load_list_items("preferred_release_countries", RELEASE_COUNTRIES, self.ui.country_list, self.ui.preferred_country_list) self._load_list_items("preferred_release_formats", RELEASE_FORMATS, self.ui.format_list, self.ui.preferred_format_list) def save(self): scores = [] for (release_type, release_type_slider) in self._release_type_sliders.iteritems(): scores.append((release_type, release_type_slider.value())) config.setting["release_type_scores"] = scores self._save_list_items("preferred_release_countries", self.ui.preferred_country_list) self._save_list_items("preferred_release_formats", self.ui.preferred_format_list) def reset_preferred_types(self): for release_type_slider in self._release_type_sliders.values(): release_type_slider.reset() def add_preferred_countries(self): self._move_selected_items(self.ui.country_list, self.ui.preferred_country_list) def remove_preferred_countries(self): self._move_selected_items(self.ui.preferred_country_list, self.ui.country_list) self.ui.country_list.sortItems() def add_preferred_formats(self): self._move_selected_items(self.ui.format_list, self.ui.preferred_format_list) def remove_preferred_formats(self): self._move_selected_items(self.ui.preferred_format_list, self.ui.format_list) self.ui.format_list.sortItems() def _move_selected_items(self, list1, list2): for item in list1.selectedItems(): clone = item.clone() list2.addItem(clone) list1.takeItem(list1.row(item)) def _load_list_items(self, setting, source, list1, list2): if setting == "preferred_release_countries": source_list = [(c[0], ugettext_countries(c[1])) for c in source.items()] elif setting == "preferred_release_formats": source_list = [(c[0], ugettext_attr(c[1], u"medium_format")) for c in source.items()] else: source_list = [(c[0], _(c[1])) for c in source.items()] source_list.sort(key=itemgetter(1), cmp=strcoll) saved_data = config.setting[setting] move = [] for data, name in source_list: item = QtGui.QListWidgetItem(name) item.setData(QtCore.Qt.UserRole, data) try: i = saved_data.index(data) move.append((i, item)) except: list1.addItem(item) move.sort(key=itemgetter(0)) for i, item in move: list2.addItem(item) def _save_list_items(self, setting, list1): data = [] for i in range(list1.count()): item = list1.item(i) data.append(unicode(item.data(QtCore.Qt.UserRole))) config.setting[setting] = data register_options_page(ReleasesOptionsPage) picard-release-1.3.2/picard/ui/options/renaming.py000066400000000000000000000321031245305550700221260ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006-2008 Lukáš Lalinský # Copyright (C) 2009 Nikolai Prokoschenko # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os.path import sys from functools import partial from PyQt4 import QtGui from picard import config from picard.file import File from picard.script import ScriptParser, SyntaxError, ScriptError, UnknownFunction from picard.ui.options import OptionsPage, OptionsCheckError, register_options_page from picard.ui.ui_options_renaming import Ui_RenamingOptionsPage from picard.ui.util import enabledSlot from picard.ui.options.scripting import TaggerScriptSyntaxHighlighter _DEFAULT_FILE_NAMING_FORMAT = "$if2(%albumartist%,%artist%)/" \ "$if($ne(%albumartist%,),%album%/)" \ "$if($gt(%totaldiscs%,1),%discnumber%-,)" \ "$if($ne(%albumartist%,),$num(%tracknumber%,2) ,)" \ "$if(%_multiartist%,%artist% - ,)" \ "%title%" class RenamingOptionsPage(OptionsPage): NAME = "filerenaming" TITLE = N_("File Naming") PARENT = None SORT_ORDER = 40 ACTIVE = True options = [ config.BoolOption("setting", "windows_compatibility", True), config.BoolOption("setting", "ascii_filenames", False), config.BoolOption("setting", "rename_files", False), config.TextOption( "setting", "file_naming_format", _DEFAULT_FILE_NAMING_FORMAT, ), config.BoolOption("setting", "move_files", False), config.TextOption("setting", "move_files_to", ""), config.BoolOption("setting", "move_additional_files", False), config.TextOption("setting", "move_additional_files_pattern", "*.jpg *.png"), config.BoolOption("setting", "delete_empty_dirs", True), ] def __init__(self, parent=None): super(RenamingOptionsPage, self).__init__(parent) self.ui = Ui_RenamingOptionsPage() self.ui.setupUi(self) self.ui.ascii_filenames.clicked.connect(self.update_examples) self.ui.windows_compatibility.clicked.connect(self.update_examples) self.ui.rename_files.clicked.connect(self.update_examples) self.ui.move_files.clicked.connect(self.update_examples) self.ui.move_files_to.editingFinished.connect(self.update_examples) if not sys.platform == "win32": self.ui.rename_files.stateChanged.connect( partial( enabledSlot, self.ui.windows_compatibility.setEnabled ) ) self.ui.move_files.stateChanged.connect( partial( enabledSlot, self.ui.delete_empty_dirs.setEnabled ) ) self.ui.move_files.stateChanged.connect( partial( enabledSlot, self.ui.move_files_to.setEnabled ) ) self.ui.move_files.stateChanged.connect( partial( enabledSlot, self.ui.move_files_to_browse.setEnabled ) ) self.ui.move_files.stateChanged.connect( partial( enabledSlot, self.ui.move_additional_files.setEnabled ) ) self.ui.move_files.stateChanged.connect( partial( enabledSlot, self.ui.move_additional_files_pattern.setEnabled ) ) self.ui.rename_files.stateChanged.connect( partial( enabledSlot, self.ui.ascii_filenames.setEnabled ) ) self.ui.rename_files.stateChanged.connect( partial( enabledSlot, self.ui.file_naming_format.setEnabled ) ) self.ui.rename_files.stateChanged.connect( partial( enabledSlot, self.ui.file_naming_format_default.setEnabled ) ) self.ui.file_naming_format.textChanged.connect(self.check_formats) self.ui.file_naming_format_default.clicked.connect(self.set_file_naming_format_default) self.highlighter = TaggerScriptSyntaxHighlighter(self.ui.file_naming_format.document()) self.ui.move_files_to_browse.clicked.connect(self.move_files_to_browse) def check_formats(self): self.test() self.update_examples() def _example_to_filename(self, file): settings = { 'windows_compatibility': self.ui.windows_compatibility.isChecked(), 'ascii_filenames': self.ui.ascii_filenames.isChecked(), 'rename_files': self.ui.rename_files.isChecked(), 'move_files': self.ui.move_files.isChecked(), 'use_va_format': False, # TODO remove 'file_naming_format': unicode(self.ui.file_naming_format.toPlainText()), 'move_files_to': os.path.normpath(unicode(self.ui.move_files_to.text())) } try: if config.setting["enable_tagger_script"]: script = config.setting["tagger_script"] parser = ScriptParser() parser.eval(script, file.metadata) filename = file._make_filename(file.filename, file.metadata, settings) if not settings["move_files"]: return os.path.basename(filename) return filename except SyntaxError: return "" except ScriptError: return "" except TypeError: return "" except UnknownFunction: return "" def update_examples(self): # TODO: Here should be more examples etc. # TODO: Would be nice to show diffs too.... example1 = self._example_to_filename(self.example_1()) example2 = self._example_to_filename(self.example_2()) self.ui.example_filename.setText(example1) self.ui.example_filename_va.setText(example2) def load(self): if sys.platform == "win32": self.ui.windows_compatibility.setChecked(True) self.ui.windows_compatibility.setEnabled(False) else: self.ui.windows_compatibility.setChecked(config.setting["windows_compatibility"]) self.ui.rename_files.setChecked(config.setting["rename_files"]) self.ui.move_files.setChecked(config.setting["move_files"]) self.ui.ascii_filenames.setChecked(config.setting["ascii_filenames"]) self.ui.file_naming_format.setPlainText(config.setting["file_naming_format"]) self.ui.move_files_to.setText(config.setting["move_files_to"]) self.ui.move_files_to.setCursorPosition(0) self.ui.move_additional_files.setChecked(config.setting["move_additional_files"]) self.ui.move_additional_files_pattern.setText(config.setting["move_additional_files_pattern"]) self.ui.delete_empty_dirs.setChecked(config.setting["delete_empty_dirs"]) self.update_examples() def check(self): self.check_format() if self.ui.move_files.isChecked() and not unicode(self.ui.move_files_to.text()).strip(): raise OptionsCheckError(_("Error"), _("The location to move files to must not be empty.")) def check_format(self): parser = ScriptParser() try: parser.eval(unicode(self.ui.file_naming_format.toPlainText())) except Exception as e: raise OptionsCheckError("", str(e)) if self.ui.rename_files.isChecked(): if not unicode(self.ui.file_naming_format.toPlainText()).strip(): raise OptionsCheckError("", _("The file naming format must not be empty.")) def save(self): config.setting["windows_compatibility"] = self.ui.windows_compatibility.isChecked() config.setting["ascii_filenames"] = self.ui.ascii_filenames.isChecked() config.setting["rename_files"] = self.ui.rename_files.isChecked() config.setting["file_naming_format"] = unicode(self.ui.file_naming_format.toPlainText()) self.tagger.window.enable_renaming_action.setChecked(config.setting["rename_files"]) config.setting["move_files"] = self.ui.move_files.isChecked() config.setting["move_files_to"] = os.path.normpath(unicode(self.ui.move_files_to.text())) config.setting["move_additional_files"] = self.ui.move_additional_files.isChecked() config.setting["move_additional_files_pattern"] = unicode(self.ui.move_additional_files_pattern.text()) config.setting["delete_empty_dirs"] = self.ui.delete_empty_dirs.isChecked() self.tagger.window.enable_moving_action.setChecked(config.setting["move_files"]) def display_error(self, error): pass def set_file_naming_format_default(self): self.ui.file_naming_format.setText(self.options[3].default) # self.ui.file_naming_format.setCursorPosition(0) def example_1(self): file = File("ticket_to_ride.mp3") file.state = File.NORMAL file.metadata['album'] = 'Help!' file.metadata['title'] = 'Ticket to Ride' file.metadata['artist'] = 'The Beatles' file.metadata['artistsort'] = 'Beatles, The' file.metadata['albumartist'] = 'The Beatles' file.metadata['albumartistsort'] = 'Beatles, The' file.metadata['tracknumber'] = '7' file.metadata['totaltracks'] = '14' file.metadata['discnumber'] = '1' file.metadata['totaldiscs'] = '1' file.metadata['date'] = '1965-08-06' file.metadata['releasetype'] = ['album', 'soundtrack'] file.metadata['~primaryreleasetype'] = ['album'] file.metadata['~secondaryreleasetype'] = ['soundtrack'] file.metadata['releasestatus'] = 'official' file.metadata['releasecountry'] = 'US' file.metadata['~extension'] = 'mp3' file.metadata['musicbrainz_albumid'] = '2c053984-4645-4699-9474-d2c35c227028' file.metadata['musicbrainz_albumartistid'] = 'b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d' file.metadata['musicbrainz_artistid'] = 'b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d' file.metadata['musicbrainz_recordingid'] = 'ed052ae1-c950-47f2-8d2b-46e1b58ab76c' file.metadata['musicbrainz_releasetrackid'] = '7668a62a-2fac-3151-a744-5707ac8c883c' return file def example_2(self): file = File("track05.mp3") file.state = File.NORMAL file.metadata['album'] = u"Coup d'État, Volume 1: Ku De Ta / Prologue" file.metadata['title'] = u"I've Got to Learn the Mambo" file.metadata['artist'] = u"Snowboy feat. James Hunter" file.metadata['artistsort'] = u"Snowboy feat. Hunter, James" file.metadata['albumartist'] = config.setting['va_name'] file.metadata['albumartistsort'] = config.setting['va_name'] file.metadata['tracknumber'] = '5' file.metadata['totaltracks'] = '13' file.metadata['discnumber'] = '2' file.metadata['totaldiscs'] = '2' file.metadata['discsubtitle'] = u"Beat Up" file.metadata['date'] = u'2005-07-04' file.metadata['releasetype'] = [u'album', u'compilation'] file.metadata['~primaryreleasetype'] = u'album' file.metadata['~secondaryreleasetype'] = u'compilation' file.metadata['releasestatus'] = u'official' file.metadata['releasecountry'] = u'AU' file.metadata['compilation'] = '1' file.metadata['~multiartist'] = '1' file.metadata['~extension'] = 'mp3' file.metadata['musicbrainz_albumid'] = u'4b50c71e-0a07-46ac-82e4-cb85dc0c9bdd' file.metadata['musicbrainz_recordingid'] = u'b3c487cb-0e55-477d-8df3-01ec6590f099' file.metadata['musicbrainz_releasetrackid'] = u'f8649a05-da39-39ba-957c-7abf8f9012be' file.metadata['musicbrainz_albumartistid'] = u'89ad4ac3-39f7-470e-963a-56509c546377' file.metadata['musicbrainz_artistid'] = [u'7b593455-d207-482c-8c6f-19ce22c94679', u'9e082466-2390-40d1-891e-4803531f43fd'] return file def move_files_to_browse(self): path = QtGui.QFileDialog.getExistingDirectory(self, "", self.ui.move_files_to.text()) if path: path = os.path.normpath(unicode(path)) self.ui.move_files_to.setText(path) def test(self): self.ui.renaming_error.setStyleSheet("") self.ui.renaming_error.setText("") try: self.check_format() except OptionsCheckError as e: self.ui.renaming_error.setStyleSheet(self.STYLESHEET_ERROR) self.ui.renaming_error.setText(e.info) return register_options_page(RenamingOptionsPage) picard-release-1.3.2/picard/ui/options/scripting.py000066400000000000000000000131641245305550700223360ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui from picard import config from picard.script import ScriptParser from picard.ui.options import OptionsPage, OptionsCheckError, register_options_page from picard.ui.ui_options_script import Ui_ScriptingOptionsPage class TaggerScriptSyntaxHighlighter(QtGui.QSyntaxHighlighter): def __init__(self, document): QtGui.QSyntaxHighlighter.__init__(self, document) self.func_re = QtCore.QRegExp(r"\$(?!noop)[a-zA-Z][_a-zA-Z0-9]*\(") self.func_fmt = QtGui.QTextCharFormat() self.func_fmt.setFontWeight(QtGui.QFont.Bold) self.func_fmt.setForeground(QtCore.Qt.blue) self.var_re = QtCore.QRegExp(r"%[_a-zA-Z0-9:]*%") self.var_fmt = QtGui.QTextCharFormat() self.var_fmt.setForeground(QtCore.Qt.darkCyan) self.escape_re = QtCore.QRegExp(r"\\.") self.escape_fmt = QtGui.QTextCharFormat() self.escape_fmt.setForeground(QtCore.Qt.darkRed) self.special_re = QtCore.QRegExp(r"[^\\][(),]") self.special_fmt = QtGui.QTextCharFormat() self.special_fmt.setForeground(QtCore.Qt.blue) self.bracket_re = QtCore.QRegExp(r"[()]") self.noop_re = QtCore.QRegExp(r"\$noop\(") self.noop_fmt = QtGui.QTextCharFormat() self.noop_fmt.setFontWeight(QtGui.QFont.Bold) self.noop_fmt.setFontItalic(True) self.noop_fmt.setForeground(QtCore.Qt.darkGray) self.rules = [ (self.func_re, self.func_fmt, 0, -1), (self.var_re, self.var_fmt, 0, 0), (self.escape_re, self.escape_fmt, 0, 0), (self.special_re, self.special_fmt, 1, -1), ] def highlightBlock(self, text): self.setCurrentBlockState(0) for expr, fmt, a, b in self.rules: index = expr.indexIn(text) while index >= 0: length = expr.matchedLength() self.setFormat(index + a, length + b, fmt) index = expr.indexIn(text, index + length + b) # Ignore everything if we're already in a noop function index = self.noop_re.indexIn(text) if self.previousBlockState() <= 0 else 0 open_brackets = self.previousBlockState() if self.previousBlockState() > 0 else 0 while index >= 0: next_index = self.bracket_re.indexIn(text, index) # Skip escaped brackets if (next_index > 0) and text[next_index - 1] == '\\': next_index += 1 if (next_index > -1) and text[next_index] == '(': open_brackets += 1 elif (next_index > -1) and text[next_index] == ')': open_brackets -= 1 if (next_index > -1): self.setFormat(index, next_index - index + 1, self.noop_fmt) elif (next_index == -1) and (open_brackets > 0): self.setFormat(index, len(text) - index, self.noop_fmt) # Check for next noop operation, necessary for multiple noops in one line if open_brackets == 0: next_index = self.noop_re.indexIn(text, next_index) index = next_index + 1 if (next_index > -1) and (next_index < len(text)) else -1 self.setCurrentBlockState(open_brackets) class ScriptingOptionsPage(OptionsPage): NAME = "scripting" TITLE = N_("Scripting") PARENT = "advanced" SORT_ORDER = 30 ACTIVE = True options = [ config.BoolOption("setting", "enable_tagger_script", False), config.TextOption("setting", "tagger_script", ""), ] def __init__(self, parent=None): super(ScriptingOptionsPage, self).__init__(parent) self.ui = Ui_ScriptingOptionsPage() self.ui.setupUi(self) self.highlighter = TaggerScriptSyntaxHighlighter(self.ui.tagger_script.document()) self.ui.tagger_script.textChanged.connect(self.live_checker) def live_checker(self): self.ui.script_error.setStyleSheet("") self.ui.script_error.setText("") try: self.check() except OptionsCheckError as e: self.ui.script_error.setStyleSheet(self.STYLESHEET_ERROR) self.ui.script_error.setText(e.info) return def check(self): parser = ScriptParser() try: parser.eval(unicode(self.ui.tagger_script.toPlainText())) except Exception as e: raise OptionsCheckError(_("Script Error"), str(e)) def load(self): self.ui.enable_tagger_script.setChecked(config.setting["enable_tagger_script"]) self.ui.tagger_script.document().setPlainText(config.setting["tagger_script"]) def save(self): config.setting["enable_tagger_script"] = self.ui.enable_tagger_script.isChecked() config.setting["tagger_script"] = self.ui.tagger_script.toPlainText() def display_error(self, error): pass register_options_page(ScriptingOptionsPage) picard-release-1.3.2/picard/ui/options/tags.py000066400000000000000000000137421245305550700212740ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui from picard import config from picard.ui.options import OptionsPage, register_options_page from picard.ui.ui_options_tags import Ui_TagsOptionsPage from picard.util.tags import TAG_NAMES class TagsOptionsPage(OptionsPage): NAME = "tags" TITLE = N_("Tags") PARENT = None SORT_ORDER = 30 ACTIVE = True options = [ config.BoolOption("setting", "clear_existing_tags", False), config.TextOption("setting", "preserved_tags", ""), config.BoolOption("setting", "write_id3v1", True), config.BoolOption("setting", "write_id3v23", True), config.TextOption("setting", "id3v2_encoding", "utf-16"), config.TextOption("setting", "id3v23_join_with", "/"), config.BoolOption("setting", "remove_id3_from_flac", False), config.BoolOption("setting", "remove_ape_from_mp3", False), config.BoolOption("setting", "tpe2_albumartist", False), config.BoolOption("setting", "dont_write_tags", False), config.BoolOption("setting", "preserve_timestamps", False), ] def __init__(self, parent=None): super(TagsOptionsPage, self).__init__(parent) self.ui = Ui_TagsOptionsPage() self.ui.setupUi(self) self.ui.write_id3v23.clicked.connect(self.update_encodings) self.ui.write_id3v24.clicked.connect(self.update_encodings) self.completer = QtGui.QCompleter(sorted(TAG_NAMES.keys()), self) self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.completer.setWidget(self.ui.preserved_tags) self.ui.preserved_tags.textEdited.connect(self.preserved_tags_edited) self.completer.activated.connect(self.completer_activated) def load(self): self.ui.write_tags.setChecked(not config.setting["dont_write_tags"]) self.ui.preserve_timestamps.setChecked(config.setting["preserve_timestamps"]) self.ui.clear_existing_tags.setChecked(config.setting["clear_existing_tags"]) self.ui.write_id3v1.setChecked(config.setting["write_id3v1"]) self.ui.write_id3v23.setChecked(config.setting["write_id3v23"]) if config.setting["id3v2_encoding"] == "iso-8859-1": self.ui.enc_iso88591.setChecked(True) elif config.setting["id3v2_encoding"] == "utf-16": self.ui.enc_utf16.setChecked(True) else: self.ui.enc_utf8.setChecked(True) self.ui.id3v23_join_with.setEditText(config.setting["id3v23_join_with"]) self.ui.remove_ape_from_mp3.setChecked(config.setting["remove_ape_from_mp3"]) self.ui.remove_id3_from_flac.setChecked(config.setting["remove_id3_from_flac"]) self.ui.preserved_tags.setText(config.setting["preserved_tags"]) self.update_encodings() def save(self): config.setting["dont_write_tags"] = not self.ui.write_tags.isChecked() config.setting["preserve_timestamps"] = self.ui.preserve_timestamps.isChecked() clear_existing_tags = self.ui.clear_existing_tags.isChecked() if clear_existing_tags != config.setting["clear_existing_tags"]: config.setting["clear_existing_tags"] = clear_existing_tags self.tagger.window.metadata_box.update() config.setting["write_id3v1"] = self.ui.write_id3v1.isChecked() config.setting["write_id3v23"] = self.ui.write_id3v23.isChecked() config.setting["id3v23_join_with"] = unicode(self.ui.id3v23_join_with.currentText()) if self.ui.enc_iso88591.isChecked(): config.setting["id3v2_encoding"] = "iso-8859-1" elif self.ui.enc_utf16.isChecked(): config.setting["id3v2_encoding"] = "utf-16" else: config.setting["id3v2_encoding"] = "utf-8" config.setting["remove_ape_from_mp3"] = self.ui.remove_ape_from_mp3.isChecked() config.setting["remove_id3_from_flac"] = self.ui.remove_id3_from_flac.isChecked() config.setting["preserved_tags"] = unicode(self.ui.preserved_tags.text()) self.tagger.window.enable_tag_saving_action.setChecked(not config.setting["dont_write_tags"]) def update_encodings(self): if self.ui.write_id3v23.isChecked(): if self.ui.enc_utf8.isChecked(): self.ui.enc_utf16.setChecked(True) self.ui.enc_utf8.setEnabled(False) self.ui.label_id3v23_join_with.setEnabled(True) self.ui.id3v23_join_with.setEnabled(True) else: self.ui.enc_utf8.setEnabled(True) self.ui.label_id3v23_join_with.setEnabled(False) self.ui.id3v23_join_with.setEnabled(False) def preserved_tags_edited(self, text): prefix = unicode(text)[:self.ui.preserved_tags.cursorPosition()].split(",")[-1] self.completer.setCompletionPrefix(prefix) if prefix: self.completer.complete() else: self.completer.popup().hide() def completer_activated(self, text): input = self.ui.preserved_tags current = unicode(input.text()) i = input.cursorPosition() p = len(self.completer.completionPrefix()) input.setText("%s%s %s" % (current[:i - p], text, current[i:])) input.setCursorPosition(i - p + len(text) + 1) register_options_page(TagsOptionsPage) picard-release-1.3.2/picard/ui/passworddialog.py000066400000000000000000000076311245305550700216650ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2008 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore from picard import config from picard.ui import PicardDialog from picard.ui.ui_passworddialog import Ui_PasswordDialog from picard.util import rot13 class PasswordDialog(PicardDialog): options = [ config.BoolOption("persist", "save_authentication", True), ] def __init__(self, authenticator, reply, parent=None): PicardDialog.__init__(self, parent) self._authenticator = authenticator self.ui = Ui_PasswordDialog() self.ui.setupUi(self) self.ui.info_text.setText( _("The server %s requires you to login. Please enter your username and password.") % reply.url().host()) # TODO: Implement proper password storage for arbitrary servers if self._is_musicbrainz_server(reply.url().host()): self.ui.save_authentication.setChecked(config.persist["save_authentication"]) self.ui.username.setText(config.setting["username"]) self.ui.password.setText(config.setting["password"]) else: self.ui.username.setText(reply.url().userName()) self.ui.password.setText(reply.url().password()) self.ui.save_authentication.setChecked(False) self.ui.save_authentication.hide() self.ui.buttonbox.accepted.connect(self.set_new_password) def set_new_password(self): config.persist["save_authentication"] = self.ui.save_authentication.isChecked() if config.persist["save_authentication"]: config.setting["username"] = unicode(self.ui.username.text()) config.setting["password"] = rot13(unicode(self.ui.password.text())) self._authenticator.setUser(unicode(self.ui.username.text())) self._authenticator.setPassword(unicode(self.ui.password.text())) self.accept() def _is_musicbrainz_server(self, host): return host == config.setting["server_host"] class ProxyDialog(PicardDialog): options = [ config.BoolOption("persist", "save_authentication", True), ] def __init__(self, authenticator, proxy, parent=None): PicardDialog.__init__(self, parent) self._authenticator = authenticator self._proxy = proxy self.ui = Ui_PasswordDialog() self.ui.setupUi(self) self.ui.info_text.setText(_("The proxy %s requires you to login. Please enter your username and password.") % config.setting["proxy_server_host"]) self.ui.save_authentication.setChecked(config.persist["save_authentication"]) self.ui.username.setText(config.setting["proxy_username"]) self.ui.password.setText(config.setting["proxy_password"]) self.ui.save_authentication.hide() self.ui.buttonbox.accepted.connect(self.set_proxy_password) def set_proxy_password(self): config.setting["proxy_username"] = unicode(self.ui.username.text()) config.setting["proxy_password"] = unicode(self.ui.password.text()) self._authenticator.setUser(unicode(self.ui.username.text())) self._authenticator.setPassword(unicode(self.ui.password.text())) self.accept() picard-release-1.3.2/picard/ui/ratingwidget.py000066400000000000000000000070431245305550700213300ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2008 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt4 import QtCore, QtGui from picard import config class RatingWidget(QtGui.QWidget): def __init__(self, parent, track): QtGui.QWidget.__init__(self, parent) self._track = track self._maximum = config.setting["rating_steps"] - 1 self._rating = int(track.metadata["~rating"] or 0) self._highlight = 0 self._star_pixmap = QtGui.QPixmap(":/images/star.png") self._star_gray_pixmap = QtGui.QPixmap(":/images/star-gray.png") self._star_size = 16 self._star_spacing = 2 self._offset = 16 self._width = self._maximum * (self._star_size + self._star_spacing) + self._offset self._height = self._star_size + 6 self.setMaximumSize(self._width, self._height) self.setMinimumSize(self._width, self._height) self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)) self.setMouseTracking(True) def sizeHint(self): return QtCore.QSize(self._width, self._height) def _setHighlight(self, highlight): assert 0 <= highlight <= self._maximum if highlight != self._highlight: self._highlight = highlight self.update() def mousePressEvent(self, event): if event.button() == QtCore.Qt.LeftButton: x = event.x() if x < self._offset: return rating = self._getRatingFromPosition(x) if self._rating == rating: rating = 0 self._rating = rating self._update_track() self.update() event.accept() def mouseMoveEvent(self, event): self._setHighlight(self._getRatingFromPosition(event.x())) event.accept() def leaveEvent(self, event): self._setHighlight(0) event.accept() def _getRatingFromPosition(self, position): rating = int((position - self._offset) / (self._star_size + self._star_spacing)) + 1 if rating > self._maximum: rating = self._maximum return rating def _update_track(self): track = self._track track.metadata["~rating"] = unicode(self._rating) if config.setting["submit_ratings"]: ratings = {("recording", track.id): self._rating} self.tagger.xmlws.submit_ratings(ratings, None) def paintEvent(self, event=None): painter = QtGui.QPainter(self) offset = self._offset for i in range(1, self._maximum + 1): if i <= self._rating or i <= self._highlight: pixmap = self._star_pixmap else: pixmap = self._star_gray_pixmap painter.drawPixmap(offset, 3, pixmap) offset += self._star_size + self._star_spacing picard-release-1.3.2/picard/ui/tagsfromfilenames.py000066400000000000000000000137341245305550700223520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re import os.path from PyQt4 import QtCore, QtGui from picard import config from picard.ui.util import StandardButton from picard.ui import PicardDialog from picard.ui.ui_tagsfromfilenames import Ui_TagsFromFileNamesDialog from picard.util.tags import display_tag_name class TagsFromFileNamesDialog(PicardDialog): options = [ config.TextOption("persist", "tags_from_filenames_format", ""), config.Option("persist", "tags_from_filenames_position", QtCore.QPoint()), config.Option("persist", "tags_from_filenames_size", QtCore.QSize(560, 400)), ] def __init__(self, files, parent=None): PicardDialog.__init__(self, parent) self.ui = Ui_TagsFromFileNamesDialog() self.ui.setupUi(self) items = [ "%artist%/%album%/%title%", "%artist%/%album%/%tracknumber% %title%", "%artist%/%album%/%tracknumber% - %title%", "%artist%/%album% - %tracknumber% - %title%", "%artist% - %album%/%title%", "%artist% - %album%/%tracknumber% %title%", "%artist% - %album%/%tracknumber% - %title%", ] format = config.persist["tags_from_filenames_format"] if format not in items: selected_index = 0 if format: items.insert(0, format) else: selected_index = items.index(format) self.ui.format.addItems(items) self.ui.format.setCurrentIndex(selected_index) self.ui.buttonbox.addButton(StandardButton(StandardButton.OK), QtGui.QDialogButtonBox.AcceptRole) self.ui.buttonbox.addButton(StandardButton(StandardButton.CANCEL), QtGui.QDialogButtonBox.RejectRole) self.ui.buttonbox.accepted.connect(self.accept) self.ui.buttonbox.rejected.connect(self.reject) self.ui.preview.clicked.connect(self.preview) self.ui.files.setHeaderLabels([_("File Name")]) self.restoreWindowState() self.files = files self.items = [] for file in files: item = QtGui.QTreeWidgetItem(self.ui.files) item.setText(0, os.path.basename(file.filename)) self.items.append(item) self._tag_re = re.compile("(%\w+%)") self.numeric_tags = ('tracknumber', 'totaltracks', 'discnumber', 'totaldiscs') def parse_format(self): format = unicode(self.ui.format.currentText()) columns = [] format_re = ['(?:^|/)'] for part in self._tag_re.split(format): if part.startswith('%') and part.endswith('%'): name = part[1:-1] columns.append(name) if name in self.numeric_tags: format_re.append('(?P<' + name + '>\d+)') elif name in ('date'): format_re.append('(?P<' + name + '>\d+(?:-\d+(?:-\d+)?)?)') else: format_re.append('(?P<' + name + '>[^/]*?)') else: format_re.append(re.escape(part)) format_re.append(r'\.(\w+)$') format_re = re.compile("".join(format_re)) return format_re, columns def match_file(self, file, format): match = format.search(file.filename.replace('\\','/')) if match: result = {} for name, value in match.groupdict().iteritems(): value = value.strip() if name in self.numeric_tags: value = value.lstrip("0") if self.ui.replace_underscores.isChecked(): value = value.replace('_', ' ') result[name] = value return result else: return {} def preview(self): format, columns = self.parse_format() self.ui.files.setHeaderLabels([_("File Name")] + map(display_tag_name, columns)) for item, file in zip(self.items, self.files): matches = self.match_file(file, format) for i in range(len(columns)): value = matches.get(columns[i], '') item.setText(i + 1, value) self.ui.files.header().resizeSections(QtGui.QHeaderView.ResizeToContents) self.ui.files.header().setStretchLastSection(True) def accept(self): format, columns = self.parse_format() for file in self.files: metadata = self.match_file(file, format) for name, value in metadata.iteritems(): file.metadata[name] = value file.update() config.persist["tags_from_filenames_format"] = self.ui.format.currentText() self.saveWindowState() QtGui.QDialog.accept(self) def reject(self): self.saveWindowState() QtGui.QDialog.reject(self) def closeEvent(self, event): self.saveWindowState() event.accept() def saveWindowState(self): pos = self.pos() if not pos.isNull(): config.persist["tags_from_filenames_position"] = pos config.persist["tags_from_filenames_size"] = self.size() def restoreWindowState(self): pos = config.persist["tags_from_filenames_position"] if pos.x() > 0 and pos.y() > 0: self.move(pos) self.resize(config.persist["tags_from_filenames_size"]) picard-release-1.3.2/picard/ui/ui_cdlookup.py000066400000000000000000000047721245305550700211630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(640, 240) self.vboxlayout = QtGui.QVBoxLayout(Dialog) self.vboxlayout.setSpacing(6) self.vboxlayout.setMargin(9) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.label = QtGui.QLabel(Dialog) self.label.setObjectName(_fromUtf8("label")) self.vboxlayout.addWidget(self.label) self.release_list = QtGui.QTreeWidget(Dialog) self.release_list.setRootIsDecorated(False) self.release_list.setObjectName(_fromUtf8("release_list")) self.vboxlayout.addWidget(self.release_list) self.hboxlayout = QtGui.QHBoxLayout() self.hboxlayout.setSpacing(6) self.hboxlayout.setMargin(0) self.hboxlayout.setObjectName(_fromUtf8("hboxlayout")) spacerItem = QtGui.QSpacerItem(111, 31, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.hboxlayout.addItem(spacerItem) self.ok_button = QtGui.QPushButton(Dialog) self.ok_button.setEnabled(False) self.ok_button.setObjectName(_fromUtf8("ok_button")) self.hboxlayout.addWidget(self.ok_button) self.lookup_button = QtGui.QPushButton(Dialog) self.lookup_button.setObjectName(_fromUtf8("lookup_button")) self.hboxlayout.addWidget(self.lookup_button) self.cancel_button = QtGui.QPushButton(Dialog) self.cancel_button.setObjectName(_fromUtf8("cancel_button")) self.hboxlayout.addWidget(self.cancel_button) self.vboxlayout.addLayout(self.hboxlayout) self.retranslateUi(Dialog) QtCore.QObject.connect(self.ok_button, QtCore.SIGNAL(_fromUtf8("clicked()")), Dialog.accept) QtCore.QObject.connect(self.cancel_button, QtCore.SIGNAL(_fromUtf8("clicked()")), Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.ok_button, self.cancel_button) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("CD Lookup")) self.label.setText(_("The following releases on MusicBrainz match the CD:")) self.ok_button.setText(_("OK")) self.lookup_button.setText(_("Lookup manually")) self.cancel_button.setText(_("Cancel")) picard-release-1.3.2/picard/ui/ui_edittagdialog.py000066400000000000000000000114421245305550700221340ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_EditTagDialog(object): def setupUi(self, EditTagDialog): EditTagDialog.setObjectName(_fromUtf8("EditTagDialog")) EditTagDialog.setWindowModality(QtCore.Qt.ApplicationModal) EditTagDialog.resize(400, 250) EditTagDialog.setFocusPolicy(QtCore.Qt.StrongFocus) EditTagDialog.setModal(True) self.verticalLayout_2 = QtGui.QVBoxLayout(EditTagDialog) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.tag_names = QtGui.QComboBox(EditTagDialog) self.tag_names.setEditable(True) self.tag_names.setObjectName(_fromUtf8("tag_names")) self.verticalLayout_2.addWidget(self.tag_names) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.value_list = QtGui.QListWidget(EditTagDialog) self.value_list.setFocusPolicy(QtCore.Qt.StrongFocus) self.value_list.setTabKeyNavigation(False) self.value_list.setProperty("showDropIndicator", False) self.value_list.setObjectName(_fromUtf8("value_list")) self.horizontalLayout.addWidget(self.value_list) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.edit_value = QtGui.QPushButton(EditTagDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(100) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.edit_value.sizePolicy().hasHeightForWidth()) self.edit_value.setSizePolicy(sizePolicy) self.edit_value.setMinimumSize(QtCore.QSize(100, 0)) self.edit_value.setAutoDefault(False) self.edit_value.setObjectName(_fromUtf8("edit_value")) self.verticalLayout.addWidget(self.edit_value) self.add_value = QtGui.QPushButton(EditTagDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(100) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.add_value.sizePolicy().hasHeightForWidth()) self.add_value.setSizePolicy(sizePolicy) self.add_value.setMinimumSize(QtCore.QSize(100, 0)) self.add_value.setAutoDefault(False) self.add_value.setObjectName(_fromUtf8("add_value")) self.verticalLayout.addWidget(self.add_value) self.remove_value = QtGui.QPushButton(EditTagDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(120) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.remove_value.sizePolicy().hasHeightForWidth()) self.remove_value.setSizePolicy(sizePolicy) self.remove_value.setMinimumSize(QtCore.QSize(120, 0)) self.remove_value.setAutoDefault(False) self.remove_value.setObjectName(_fromUtf8("remove_value")) self.verticalLayout.addWidget(self.remove_value) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.horizontalLayout.addLayout(self.verticalLayout) self.verticalLayout_2.addLayout(self.horizontalLayout) self.buttonbox = QtGui.QDialogButtonBox(EditTagDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(150) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.buttonbox.sizePolicy().hasHeightForWidth()) self.buttonbox.setSizePolicy(sizePolicy) self.buttonbox.setMinimumSize(QtCore.QSize(150, 0)) self.buttonbox.setOrientation(QtCore.Qt.Horizontal) self.buttonbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save) self.buttonbox.setObjectName(_fromUtf8("buttonbox")) self.verticalLayout_2.addWidget(self.buttonbox) self.retranslateUi(EditTagDialog) QtCore.QObject.connect(self.buttonbox, QtCore.SIGNAL(_fromUtf8("accepted()")), EditTagDialog.accept) QtCore.QObject.connect(self.buttonbox, QtCore.SIGNAL(_fromUtf8("rejected()")), EditTagDialog.reject) QtCore.QMetaObject.connectSlotsByName(EditTagDialog) def retranslateUi(self, EditTagDialog): EditTagDialog.setWindowTitle(_("Edit Tag")) self.edit_value.setText(_("Edit value")) self.add_value.setText(_("Add value")) self.remove_value.setText(_("Remove value")) picard-release-1.3.2/picard/ui/ui_infodialog.py000066400000000000000000000075601245305550700214540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_InfoDialog(object): def setupUi(self, InfoDialog): InfoDialog.setObjectName(_fromUtf8("InfoDialog")) InfoDialog.resize(535, 436) self.verticalLayout = QtGui.QVBoxLayout(InfoDialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.tabWidget = QtGui.QTabWidget(InfoDialog) self.tabWidget.setObjectName(_fromUtf8("tabWidget")) self.info_tab = QtGui.QWidget() self.info_tab.setObjectName(_fromUtf8("info_tab")) self.vboxlayout = QtGui.QVBoxLayout(self.info_tab) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.info_scroll = QtGui.QScrollArea(self.info_tab) self.info_scroll.setWidgetResizable(True) self.info_scroll.setObjectName(_fromUtf8("info_scroll")) self.scrollAreaWidgetContents = QtGui.QWidget() self.scrollAreaWidgetContents.setEnabled(True) self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 493, 334)) self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents")) self.verticalLayoutLabel = QtGui.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayoutLabel.setObjectName(_fromUtf8("verticalLayoutLabel")) self.info = QtGui.QLabel(self.scrollAreaWidgetContents) self.info.setText(_fromUtf8("")) self.info.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.info.setWordWrap(True) self.info.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByKeyboard|QtCore.Qt.TextSelectableByMouse) self.info.setObjectName(_fromUtf8("info")) self.verticalLayoutLabel.addWidget(self.info) self.info_scroll.setWidget(self.scrollAreaWidgetContents) self.vboxlayout.addWidget(self.info_scroll) self.tabWidget.addTab(self.info_tab, _fromUtf8("")) self.artwork_tab = QtGui.QWidget() self.artwork_tab.setObjectName(_fromUtf8("artwork_tab")) self.vboxlayout1 = QtGui.QVBoxLayout(self.artwork_tab) self.vboxlayout1.setObjectName(_fromUtf8("vboxlayout1")) self.artwork_list = QtGui.QListWidget(self.artwork_tab) self.artwork_list.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) self.artwork_list.setIconSize(QtCore.QSize(170, 170)) self.artwork_list.setMovement(QtGui.QListView.Static) self.artwork_list.setFlow(QtGui.QListView.LeftToRight) self.artwork_list.setProperty("isWrapping", False) self.artwork_list.setResizeMode(QtGui.QListView.Fixed) self.artwork_list.setSpacing(10) self.artwork_list.setViewMode(QtGui.QListView.IconMode) self.artwork_list.setObjectName(_fromUtf8("artwork_list")) self.vboxlayout1.addWidget(self.artwork_list) self.tabWidget.addTab(self.artwork_tab, _fromUtf8("")) self.verticalLayout.addWidget(self.tabWidget) self.buttonBox = QtGui.QDialogButtonBox(InfoDialog) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(InfoDialog) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(InfoDialog) InfoDialog.setTabOrder(self.tabWidget, self.artwork_list) InfoDialog.setTabOrder(self.artwork_list, self.buttonBox) def retranslateUi(self, InfoDialog): self.tabWidget.setTabText(self.tabWidget.indexOf(self.info_tab), _("&Info")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.artwork_tab), _("A&rtwork")) picard-release-1.3.2/picard/ui/ui_infostatus.py000066400000000000000000000112221245305550700215260ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_InfoStatus(object): def setupUi(self, InfoStatus): InfoStatus.setObjectName(_fromUtf8("InfoStatus")) InfoStatus.resize(350, 24) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(InfoStatus.sizePolicy().hasHeightForWidth()) InfoStatus.setSizePolicy(sizePolicy) InfoStatus.setMinimumSize(QtCore.QSize(0, 0)) self.horizontalLayout = QtGui.QHBoxLayout(InfoStatus) self.horizontalLayout.setSpacing(2) self.horizontalLayout.setMargin(0) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.val1 = QtGui.QLabel(InfoStatus) self.val1.setMinimumSize(QtCore.QSize(40, 0)) self.val1.setText(_fromUtf8("")) self.val1.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.val1.setObjectName(_fromUtf8("val1")) self.horizontalLayout.addWidget(self.val1) self.label1 = QtGui.QLabel(InfoStatus) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label1.sizePolicy().hasHeightForWidth()) self.label1.setSizePolicy(sizePolicy) self.label1.setFrameShape(QtGui.QFrame.NoFrame) self.label1.setTextFormat(QtCore.Qt.AutoText) self.label1.setScaledContents(False) self.label1.setMargin(1) self.label1.setObjectName(_fromUtf8("label1")) self.horizontalLayout.addWidget(self.label1) self.val2 = QtGui.QLabel(InfoStatus) self.val2.setMinimumSize(QtCore.QSize(40, 0)) self.val2.setText(_fromUtf8("")) self.val2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.val2.setObjectName(_fromUtf8("val2")) self.horizontalLayout.addWidget(self.val2) self.label2 = QtGui.QLabel(InfoStatus) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label2.sizePolicy().hasHeightForWidth()) self.label2.setSizePolicy(sizePolicy) self.label2.setText(_fromUtf8("")) self.label2.setObjectName(_fromUtf8("label2")) self.horizontalLayout.addWidget(self.label2) self.val3 = QtGui.QLabel(InfoStatus) self.val3.setMinimumSize(QtCore.QSize(40, 0)) self.val3.setText(_fromUtf8("")) self.val3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.val3.setObjectName(_fromUtf8("val3")) self.horizontalLayout.addWidget(self.val3) self.label3 = QtGui.QLabel(InfoStatus) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label3.sizePolicy().hasHeightForWidth()) self.label3.setSizePolicy(sizePolicy) self.label3.setText(_fromUtf8("")) self.label3.setObjectName(_fromUtf8("label3")) self.horizontalLayout.addWidget(self.label3) self.val4 = QtGui.QLabel(InfoStatus) self.val4.setMinimumSize(QtCore.QSize(40, 0)) self.val4.setText(_fromUtf8("")) self.val4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.val4.setObjectName(_fromUtf8("val4")) self.horizontalLayout.addWidget(self.val4) self.label4 = QtGui.QLabel(InfoStatus) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label4.sizePolicy().hasHeightForWidth()) self.label4.setSizePolicy(sizePolicy) self.label4.setText(_fromUtf8("")) self.label4.setScaledContents(False) self.label4.setObjectName(_fromUtf8("label4")) self.horizontalLayout.addWidget(self.label4) self.retranslateUi(InfoStatus) QtCore.QMetaObject.connectSlotsByName(InfoStatus) def retranslateUi(self, InfoStatus): InfoStatus.setWindowTitle(_("Form")) picard-release-1.3.2/picard/ui/ui_options.py000066400000000000000000000026341245305550700210310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(485, 398) self.vboxlayout = QtGui.QVBoxLayout(Dialog) self.vboxlayout.setMargin(9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.splitter = QtGui.QSplitter(Dialog) self.splitter.setOrientation(QtCore.Qt.Horizontal) self.splitter.setObjectName(_fromUtf8("splitter")) self.pages_tree = QtGui.QTreeWidget(self.splitter) self.pages_tree.setObjectName(_fromUtf8("pages_tree")) self.pages_stack = QtGui.QStackedWidget(self.splitter) self.pages_stack.setObjectName(_fromUtf8("pages_stack")) self.vboxlayout.addWidget(self.splitter) self.buttonbox = QtGui.QDialogButtonBox(Dialog) self.buttonbox.setOrientation(QtCore.Qt.Horizontal) self.buttonbox.setObjectName(_fromUtf8("buttonbox")) self.vboxlayout.addWidget(self.buttonbox) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_("Options")) picard-release-1.3.2/picard/ui/ui_options_about.py000066400000000000000000000042511245305550700222200ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_AboutOptionsPage(object): def setupUi(self, AboutOptionsPage): AboutOptionsPage.setObjectName(_fromUtf8("AboutOptionsPage")) AboutOptionsPage.resize(171, 137) self.vboxlayout = QtGui.QVBoxLayout(AboutOptionsPage) self.vboxlayout.setSpacing(6) self.vboxlayout.setMargin(0) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.scrollArea = QtGui.QScrollArea(AboutOptionsPage) self.scrollArea.setFrameShape(QtGui.QFrame.NoFrame) self.scrollArea.setFrameShadow(QtGui.QFrame.Plain) self.scrollArea.setLineWidth(0) self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.scrollArea.setWidgetResizable(True) self.scrollArea.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.scrollArea.setObjectName(_fromUtf8("scrollArea")) self.scrollAreaWidgetContents = QtGui.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 171, 137)) self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents")) self.verticalLayout = QtGui.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout.setSpacing(6) self.verticalLayout.setMargin(9) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.label = QtGui.QLabel(self.scrollAreaWidgetContents) self.label.setText(_fromUtf8("")) self.label.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop) self.label.setWordWrap(True) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout.addWidget(self.label) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.vboxlayout.addWidget(self.scrollArea) self.retranslateUi(AboutOptionsPage) QtCore.QMetaObject.connectSlotsByName(AboutOptionsPage) def retranslateUi(self, AboutOptionsPage): pass picard-release-1.3.2/picard/ui/ui_options_advanced.py000066400000000000000000000043751245305550700226620ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_AdvancedOptionsPage(object): def setupUi(self, AdvancedOptionsPage): AdvancedOptionsPage.setObjectName(_fromUtf8("AdvancedOptionsPage")) AdvancedOptionsPage.resize(392, 435) self.vboxlayout = QtGui.QVBoxLayout(AdvancedOptionsPage) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.groupBox = QtGui.QGroupBox(AdvancedOptionsPage) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.gridlayout = QtGui.QGridLayout(self.groupBox) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName(_fromUtf8("gridlayout")) self.label_ignore_regex = QtGui.QLabel(self.groupBox) self.label_ignore_regex.setObjectName(_fromUtf8("label_ignore_regex")) self.gridlayout.addWidget(self.label_ignore_regex, 1, 0, 1, 1) self.ignore_regex = QtGui.QLineEdit(self.groupBox) self.ignore_regex.setObjectName(_fromUtf8("ignore_regex")) self.gridlayout.addWidget(self.ignore_regex, 2, 0, 1, 1) self.regex_error = QtGui.QLabel(self.groupBox) self.regex_error.setText(_fromUtf8("")) self.regex_error.setObjectName(_fromUtf8("regex_error")) self.gridlayout.addWidget(self.regex_error, 4, 0, 1, 1) self.ignore_hidden_files = QtGui.QCheckBox(self.groupBox) self.ignore_hidden_files.setObjectName(_fromUtf8("ignore_hidden_files")) self.gridlayout.addWidget(self.ignore_hidden_files, 3, 0, 1, 1) self.vboxlayout.addWidget(self.groupBox) spacerItem = QtGui.QSpacerItem(181, 21, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.retranslateUi(AdvancedOptionsPage) QtCore.QMetaObject.connectSlotsByName(AdvancedOptionsPage) def retranslateUi(self, AdvancedOptionsPage): self.groupBox.setTitle(_("Advanced options")) self.label_ignore_regex.setText(_("Ignore file paths matching the following regular expression:")) self.ignore_hidden_files.setText(_("Ignore hidden files")) picard-release-1.3.2/picard/ui/ui_options_cdlookup.py000066400000000000000000000035631245305550700227330ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_CDLookupOptionsPage(object): def setupUi(self, CDLookupOptionsPage): CDLookupOptionsPage.setObjectName(_fromUtf8("CDLookupOptionsPage")) CDLookupOptionsPage.resize(224, 176) self.vboxlayout = QtGui.QVBoxLayout(CDLookupOptionsPage) self.vboxlayout.setMargin(9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.rename_files = QtGui.QGroupBox(CDLookupOptionsPage) self.rename_files.setObjectName(_fromUtf8("rename_files")) self.gridlayout = QtGui.QGridLayout(self.rename_files) self.gridlayout.setMargin(9) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName(_fromUtf8("gridlayout")) self.cd_lookup_device = QtGui.QLineEdit(self.rename_files) self.cd_lookup_device.setObjectName(_fromUtf8("cd_lookup_device")) self.gridlayout.addWidget(self.cd_lookup_device, 1, 0, 1, 1) self.label_3 = QtGui.QLabel(self.rename_files) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridlayout.addWidget(self.label_3, 0, 0, 1, 1) self.vboxlayout.addWidget(self.rename_files) spacerItem = QtGui.QSpacerItem(161, 81, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.label_3.setBuddy(self.cd_lookup_device) self.retranslateUi(CDLookupOptionsPage) QtCore.QMetaObject.connectSlotsByName(CDLookupOptionsPage) def retranslateUi(self, CDLookupOptionsPage): self.rename_files.setTitle(_("CD Lookup")) self.label_3.setText(_("CD-ROM device to use for lookups:")) picard-release-1.3.2/picard/ui/ui_options_cdlookup_select.py000066400000000000000000000044141245305550700242660ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_CDLookupOptionsPage(object): def setupUi(self, CDLookupOptionsPage): CDLookupOptionsPage.setObjectName(_fromUtf8("CDLookupOptionsPage")) CDLookupOptionsPage.resize(255, 155) self.vboxlayout = QtGui.QVBoxLayout(CDLookupOptionsPage) self.vboxlayout.setMargin(9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.rename_files = QtGui.QGroupBox(CDLookupOptionsPage) self.rename_files.setObjectName(_fromUtf8("rename_files")) self.gridlayout = QtGui.QGridLayout(self.rename_files) self.gridlayout.setMargin(9) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName(_fromUtf8("gridlayout")) self.cd_lookup_ = QtGui.QLabel(self.rename_files) self.cd_lookup_.setObjectName(_fromUtf8("cd_lookup_")) self.gridlayout.addWidget(self.cd_lookup_, 0, 0, 1, 1) self.hboxlayout = QtGui.QHBoxLayout() self.hboxlayout.setMargin(0) self.hboxlayout.setSpacing(6) self.hboxlayout.setObjectName(_fromUtf8("hboxlayout")) self.cd_lookup_device = QtGui.QComboBox(self.rename_files) self.cd_lookup_device.setObjectName(_fromUtf8("cd_lookup_device")) self.hboxlayout.addWidget(self.cd_lookup_device) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.hboxlayout.addItem(spacerItem) self.gridlayout.addLayout(self.hboxlayout, 1, 0, 1, 1) self.vboxlayout.addWidget(self.rename_files) spacerItem1 = QtGui.QSpacerItem(161, 81, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem1) self.cd_lookup_.setBuddy(self.cd_lookup_device) self.retranslateUi(CDLookupOptionsPage) QtCore.QMetaObject.connectSlotsByName(CDLookupOptionsPage) def retranslateUi(self, CDLookupOptionsPage): self.rename_files.setTitle(_("CD Lookup")) self.cd_lookup_.setText(_("Default CD-ROM drive to use for lookups:")) picard-release-1.3.2/picard/ui/ui_options_cover.py000066400000000000000000000234701245305550700222300ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Ui_CoverOptionsPage(object): def setupUi(self, CoverOptionsPage): CoverOptionsPage.setObjectName(_fromUtf8("CoverOptionsPage")) CoverOptionsPage.resize(595, 560) self.verticalLayout = QtGui.QVBoxLayout(CoverOptionsPage) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.rename_files = QtGui.QGroupBox(CoverOptionsPage) self.rename_files.setObjectName(_fromUtf8("rename_files")) self.vboxlayout = QtGui.QVBoxLayout(self.rename_files) self.vboxlayout.setSpacing(2) self.vboxlayout.setMargin(9) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.save_images_to_tags = QtGui.QCheckBox(self.rename_files) self.save_images_to_tags.setObjectName(_fromUtf8("save_images_to_tags")) self.vboxlayout.addWidget(self.save_images_to_tags) self.cb_embed_front_only = QtGui.QCheckBox(self.rename_files) self.cb_embed_front_only.setObjectName(_fromUtf8("cb_embed_front_only")) self.vboxlayout.addWidget(self.cb_embed_front_only) self.save_images_to_files = QtGui.QCheckBox(self.rename_files) self.save_images_to_files.setObjectName(_fromUtf8("save_images_to_files")) self.vboxlayout.addWidget(self.save_images_to_files) self.label_3 = QtGui.QLabel(self.rename_files) self.label_3.setObjectName(_fromUtf8("label_3")) self.vboxlayout.addWidget(self.label_3) self.cover_image_filename = QtGui.QLineEdit(self.rename_files) self.cover_image_filename.setObjectName(_fromUtf8("cover_image_filename")) self.vboxlayout.addWidget(self.cover_image_filename) self.save_images_overwrite = QtGui.QCheckBox(self.rename_files) self.save_images_overwrite.setObjectName(_fromUtf8("save_images_overwrite")) self.vboxlayout.addWidget(self.save_images_overwrite) self.verticalLayout.addWidget(self.rename_files) self.groupBox = QtGui.QGroupBox(CoverOptionsPage) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.caprovider_amazon = QtGui.QCheckBox(self.groupBox) self.caprovider_amazon.setObjectName(_fromUtf8("caprovider_amazon")) self.verticalLayout_2.addWidget(self.caprovider_amazon) self.caprovider_caa = QtGui.QCheckBox(self.groupBox) self.caprovider_caa.setObjectName(_fromUtf8("caprovider_caa")) self.verticalLayout_2.addWidget(self.caprovider_caa) self.caprovider_whitelist = QtGui.QCheckBox(self.groupBox) self.caprovider_whitelist.setObjectName(_fromUtf8("caprovider_whitelist")) self.verticalLayout_2.addWidget(self.caprovider_whitelist) self.verticalLayout.addWidget(self.groupBox) self.gb_caa = QtGui.QGroupBox(CoverOptionsPage) self.gb_caa.setEnabled(False) self.gb_caa.setObjectName(_fromUtf8("gb_caa")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.gb_caa) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.label = QtGui.QLabel(self.gb_caa) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout.addWidget(self.label) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.cb_image_size = QtGui.QComboBox(self.gb_caa) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cb_image_size.sizePolicy().hasHeightForWidth()) self.cb_image_size.setSizePolicy(sizePolicy) self.cb_image_size.setObjectName(_fromUtf8("cb_image_size")) self.cb_image_size.addItem(_fromUtf8("")) self.cb_image_size.addItem(_fromUtf8("")) self.cb_image_size.addItem(_fromUtf8("")) self.horizontalLayout.addWidget(self.cb_image_size) self.verticalLayout_3.addLayout(self.horizontalLayout) self.select_caa_types_group = QtGui.QHBoxLayout() self.select_caa_types_group.setObjectName(_fromUtf8("select_caa_types_group")) self.restrict_images_types = QtGui.QCheckBox(self.gb_caa) self.restrict_images_types.setObjectName(_fromUtf8("restrict_images_types")) self.select_caa_types_group.addWidget(self.restrict_images_types) spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.select_caa_types_group.addItem(spacerItem1) self.select_caa_types = QtGui.QPushButton(self.gb_caa) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(100) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.select_caa_types.sizePolicy().hasHeightForWidth()) self.select_caa_types.setSizePolicy(sizePolicy) self.select_caa_types.setObjectName(_fromUtf8("select_caa_types")) self.select_caa_types_group.addWidget(self.select_caa_types) self.verticalLayout_3.addLayout(self.select_caa_types_group) self.cb_approved_only = QtGui.QCheckBox(self.gb_caa) self.cb_approved_only.setObjectName(_fromUtf8("cb_approved_only")) self.verticalLayout_3.addWidget(self.cb_approved_only) self.cb_type_as_filename = QtGui.QCheckBox(self.gb_caa) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cb_type_as_filename.sizePolicy().hasHeightForWidth()) self.cb_type_as_filename.setSizePolicy(sizePolicy) self.cb_type_as_filename.setObjectName(_fromUtf8("cb_type_as_filename")) self.verticalLayout_3.addWidget(self.cb_type_as_filename) self.caprovider_caa_release_group = QtGui.QCheckBox(self.gb_caa) self.caprovider_caa_release_group.setObjectName(_fromUtf8("caprovider_caa_release_group")) self.verticalLayout_3.addWidget(self.caprovider_caa_release_group) self.verticalLayout.addWidget(self.gb_caa) spacerItem2 = QtGui.QSpacerItem(275, 91, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem2) self.retranslateUi(CoverOptionsPage) QtCore.QObject.connect(self.save_images_to_tags, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.cb_embed_front_only.setEnabled) QtCore.QMetaObject.connectSlotsByName(CoverOptionsPage) CoverOptionsPage.setTabOrder(self.save_images_to_tags, self.cb_embed_front_only) CoverOptionsPage.setTabOrder(self.cb_embed_front_only, self.save_images_to_files) CoverOptionsPage.setTabOrder(self.save_images_to_files, self.cover_image_filename) CoverOptionsPage.setTabOrder(self.cover_image_filename, self.save_images_overwrite) CoverOptionsPage.setTabOrder(self.save_images_overwrite, self.caprovider_amazon) CoverOptionsPage.setTabOrder(self.caprovider_amazon, self.caprovider_caa) CoverOptionsPage.setTabOrder(self.caprovider_caa, self.caprovider_whitelist) CoverOptionsPage.setTabOrder(self.caprovider_whitelist, self.cb_image_size) CoverOptionsPage.setTabOrder(self.cb_image_size, self.select_caa_types) CoverOptionsPage.setTabOrder(self.select_caa_types, self.cb_approved_only) CoverOptionsPage.setTabOrder(self.cb_approved_only, self.cb_type_as_filename) CoverOptionsPage.setTabOrder(self.cb_type_as_filename, self.caprovider_caa_release_group) def retranslateUi(self, CoverOptionsPage): self.rename_files.setTitle(_("Location")) self.save_images_to_tags.setText(_("Embed cover images into tags")) self.cb_embed_front_only.setText(_("Only embed a front image")) self.save_images_to_files.setText(_("Save cover images as separate files")) self.label_3.setText(_("Use the following file name for images:")) self.save_images_overwrite.setText(_("Overwrite the file if it already exists")) self.groupBox.setTitle(_("Coverart Providers")) self.caprovider_amazon.setText(_("Amazon")) self.caprovider_caa.setText(_("Cover Art Archive")) self.caprovider_whitelist.setText(_("Sites on the whitelist")) self.gb_caa.setTitle(_("Cover Art Archive")) self.label.setText(_("Only use images of the following size:")) self.cb_image_size.setItemText(0, _("250 px")) self.cb_image_size.setItemText(1, _("500 px")) self.cb_image_size.setItemText(2, _("Full size")) self.restrict_images_types.setText(_("Download only cover art images matching selected types")) self.select_caa_types.setText(_("Select types...")) self.cb_approved_only.setText(_("Download only approved images")) self.cb_type_as_filename.setText(_("Use the first image type as the filename. This will not change the filename of front images.")) self.caprovider_caa_release_group.setText(_("Use the image of the release group if no front image is associated with the release")) picard-release-1.3.2/picard/ui/ui_options_fingerprinting.py000066400000000000000000000106771245305550700241440ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_FingerprintingOptionsPage(object): def setupUi(self, FingerprintingOptionsPage): FingerprintingOptionsPage.setObjectName(_fromUtf8("FingerprintingOptionsPage")) FingerprintingOptionsPage.resize(371, 408) self.verticalLayout = QtGui.QVBoxLayout(FingerprintingOptionsPage) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.fingerprinting = QtGui.QGroupBox(FingerprintingOptionsPage) self.fingerprinting.setCheckable(False) self.fingerprinting.setObjectName(_fromUtf8("fingerprinting")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.fingerprinting) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.disable_fingerprinting = QtGui.QRadioButton(self.fingerprinting) self.disable_fingerprinting.setObjectName(_fromUtf8("disable_fingerprinting")) self.verticalLayout_3.addWidget(self.disable_fingerprinting) self.use_acoustid = QtGui.QRadioButton(self.fingerprinting) self.use_acoustid.setObjectName(_fromUtf8("use_acoustid")) self.verticalLayout_3.addWidget(self.use_acoustid) self.verticalLayout.addWidget(self.fingerprinting) self.acoustid_settings = QtGui.QGroupBox(FingerprintingOptionsPage) self.acoustid_settings.setObjectName(_fromUtf8("acoustid_settings")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.acoustid_settings) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.label = QtGui.QLabel(self.acoustid_settings) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout_2.addWidget(self.label) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.acoustid_fpcalc = QtGui.QLineEdit(self.acoustid_settings) self.acoustid_fpcalc.setObjectName(_fromUtf8("acoustid_fpcalc")) self.horizontalLayout_2.addWidget(self.acoustid_fpcalc) self.acoustid_fpcalc_browse = QtGui.QPushButton(self.acoustid_settings) self.acoustid_fpcalc_browse.setObjectName(_fromUtf8("acoustid_fpcalc_browse")) self.horizontalLayout_2.addWidget(self.acoustid_fpcalc_browse) self.acoustid_fpcalc_download = QtGui.QPushButton(self.acoustid_settings) self.acoustid_fpcalc_download.setObjectName(_fromUtf8("acoustid_fpcalc_download")) self.horizontalLayout_2.addWidget(self.acoustid_fpcalc_download) self.verticalLayout_2.addLayout(self.horizontalLayout_2) self.label_2 = QtGui.QLabel(self.acoustid_settings) self.label_2.setObjectName(_fromUtf8("label_2")) self.verticalLayout_2.addWidget(self.label_2) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.acoustid_apikey = QtGui.QLineEdit(self.acoustid_settings) self.acoustid_apikey.setObjectName(_fromUtf8("acoustid_apikey")) self.horizontalLayout.addWidget(self.acoustid_apikey) self.acoustid_apikey_get = QtGui.QPushButton(self.acoustid_settings) self.acoustid_apikey_get.setObjectName(_fromUtf8("acoustid_apikey_get")) self.horizontalLayout.addWidget(self.acoustid_apikey_get) self.verticalLayout_2.addLayout(self.horizontalLayout) self.verticalLayout.addWidget(self.acoustid_settings) spacerItem = QtGui.QSpacerItem(181, 21, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.retranslateUi(FingerprintingOptionsPage) QtCore.QMetaObject.connectSlotsByName(FingerprintingOptionsPage) def retranslateUi(self, FingerprintingOptionsPage): self.fingerprinting.setTitle(_("Audio Fingerprinting")) self.disable_fingerprinting.setText(_("Do not use audio fingerprinting")) self.use_acoustid.setText(_("Use AcoustID")) self.acoustid_settings.setTitle(_("AcoustID Settings")) self.label.setText(_("Fingerprint calculator:")) self.acoustid_fpcalc_browse.setText(_("Browse...")) self.acoustid_fpcalc_download.setText(_("Download...")) self.label_2.setText(_("API key:")) self.acoustid_apikey_get.setText(_("Get API key...")) picard-release-1.3.2/picard/ui/ui_options_folksonomy.py000066400000000000000000000132141245305550700233050ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_FolksonomyOptionsPage(object): def setupUi(self, FolksonomyOptionsPage): FolksonomyOptionsPage.setObjectName(_fromUtf8("FolksonomyOptionsPage")) FolksonomyOptionsPage.resize(390, 304) self.verticalLayout_2 = QtGui.QVBoxLayout(FolksonomyOptionsPage) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.rename_files_3 = QtGui.QGroupBox(FolksonomyOptionsPage) self.rename_files_3.setObjectName(_fromUtf8("rename_files_3")) self.verticalLayout = QtGui.QVBoxLayout(self.rename_files_3) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.ignore_tags_2 = QtGui.QLabel(self.rename_files_3) self.ignore_tags_2.setObjectName(_fromUtf8("ignore_tags_2")) self.verticalLayout.addWidget(self.ignore_tags_2) self.ignore_tags = QtGui.QLineEdit(self.rename_files_3) self.ignore_tags.setObjectName(_fromUtf8("ignore_tags")) self.verticalLayout.addWidget(self.ignore_tags) self.only_my_tags = QtGui.QCheckBox(self.rename_files_3) self.only_my_tags.setObjectName(_fromUtf8("only_my_tags")) self.verticalLayout.addWidget(self.only_my_tags) self.hboxlayout = QtGui.QHBoxLayout() self.hboxlayout.setSpacing(6) self.hboxlayout.setMargin(0) self.hboxlayout.setObjectName(_fromUtf8("hboxlayout")) self.label_5 = QtGui.QLabel(self.rename_files_3) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_5.sizePolicy().hasHeightForWidth()) self.label_5.setSizePolicy(sizePolicy) self.label_5.setObjectName(_fromUtf8("label_5")) self.hboxlayout.addWidget(self.label_5) self.min_tag_usage = QtGui.QSpinBox(self.rename_files_3) self.min_tag_usage.setMaximum(100) self.min_tag_usage.setObjectName(_fromUtf8("min_tag_usage")) self.hboxlayout.addWidget(self.min_tag_usage) self.verticalLayout.addLayout(self.hboxlayout) self.hboxlayout1 = QtGui.QHBoxLayout() self.hboxlayout1.setSpacing(6) self.hboxlayout1.setMargin(0) self.hboxlayout1.setObjectName(_fromUtf8("hboxlayout1")) self.label_6 = QtGui.QLabel(self.rename_files_3) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth()) self.label_6.setSizePolicy(sizePolicy) self.label_6.setObjectName(_fromUtf8("label_6")) self.hboxlayout1.addWidget(self.label_6) self.max_tags = QtGui.QSpinBox(self.rename_files_3) self.max_tags.setMaximum(100) self.max_tags.setObjectName(_fromUtf8("max_tags")) self.hboxlayout1.addWidget(self.max_tags) self.verticalLayout.addLayout(self.hboxlayout1) self.hboxlayout2 = QtGui.QHBoxLayout() self.hboxlayout2.setSpacing(6) self.hboxlayout2.setMargin(0) self.hboxlayout2.setObjectName(_fromUtf8("hboxlayout2")) self.ignore_tags_4 = QtGui.QLabel(self.rename_files_3) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(4) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.ignore_tags_4.sizePolicy().hasHeightForWidth()) self.ignore_tags_4.setSizePolicy(sizePolicy) self.ignore_tags_4.setObjectName(_fromUtf8("ignore_tags_4")) self.hboxlayout2.addWidget(self.ignore_tags_4) self.join_tags = QtGui.QComboBox(self.rename_files_3) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.join_tags.sizePolicy().hasHeightForWidth()) self.join_tags.setSizePolicy(sizePolicy) self.join_tags.setEditable(True) self.join_tags.setObjectName(_fromUtf8("join_tags")) self.join_tags.addItem(_fromUtf8("")) self.join_tags.setItemText(0, _fromUtf8("")) self.join_tags.addItem(_fromUtf8("")) self.join_tags.addItem(_fromUtf8("")) self.hboxlayout2.addWidget(self.join_tags) self.verticalLayout.addLayout(self.hboxlayout2) self.verticalLayout_2.addWidget(self.rename_files_3) spacerItem = QtGui.QSpacerItem(181, 31, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem) self.label_5.setBuddy(self.min_tag_usage) self.label_6.setBuddy(self.min_tag_usage) self.retranslateUi(FolksonomyOptionsPage) QtCore.QMetaObject.connectSlotsByName(FolksonomyOptionsPage) def retranslateUi(self, FolksonomyOptionsPage): self.rename_files_3.setTitle(_("Folksonomy Tags")) self.ignore_tags_2.setText(_("Ignore tags:")) self.only_my_tags.setText(_("Only use my tags")) self.label_5.setText(_("Minimal tag usage:")) self.min_tag_usage.setSuffix(_(" %")) self.label_6.setText(_("Maximum number of tags:")) self.ignore_tags_4.setText(_("Join multiple tags with:")) self.join_tags.setItemText(1, _(" / ")) self.join_tags.setItemText(2, _(", ")) picard-release-1.3.2/picard/ui/ui_options_general.py000066400000000000000000000117161245305550700225270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_GeneralOptionsPage(object): def setupUi(self, GeneralOptionsPage): GeneralOptionsPage.setObjectName(_fromUtf8("GeneralOptionsPage")) GeneralOptionsPage.resize(338, 435) self.vboxlayout = QtGui.QVBoxLayout(GeneralOptionsPage) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.groupBox = QtGui.QGroupBox(GeneralOptionsPage) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.gridlayout = QtGui.QGridLayout(self.groupBox) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName(_fromUtf8("gridlayout")) self.server_host = QtGui.QComboBox(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.server_host.sizePolicy().hasHeightForWidth()) self.server_host.setSizePolicy(sizePolicy) self.server_host.setEditable(True) self.server_host.setObjectName(_fromUtf8("server_host")) self.gridlayout.addWidget(self.server_host, 1, 0, 1, 1) self.label_7 = QtGui.QLabel(self.groupBox) self.label_7.setObjectName(_fromUtf8("label_7")) self.gridlayout.addWidget(self.label_7, 0, 1, 1, 1) self.server_port = QtGui.QSpinBox(self.groupBox) self.server_port.setMinimum(1) self.server_port.setMaximum(65535) self.server_port.setProperty("value", 80) self.server_port.setObjectName(_fromUtf8("server_port")) self.gridlayout.addWidget(self.server_port, 1, 1, 1, 1) self.label = QtGui.QLabel(self.groupBox) self.label.setObjectName(_fromUtf8("label")) self.gridlayout.addWidget(self.label, 0, 0, 1, 1) self.vboxlayout.addWidget(self.groupBox) self.rename_files_2 = QtGui.QGroupBox(GeneralOptionsPage) self.rename_files_2.setObjectName(_fromUtf8("rename_files_2")) self.gridlayout1 = QtGui.QGridLayout(self.rename_files_2) self.gridlayout1.setSpacing(2) self.gridlayout1.setObjectName(_fromUtf8("gridlayout1")) self.username = QtGui.QLineEdit(self.rename_files_2) self.username.setObjectName(_fromUtf8("username")) self.gridlayout1.addWidget(self.username, 1, 0, 1, 1) self.label_5 = QtGui.QLabel(self.rename_files_2) self.label_5.setObjectName(_fromUtf8("label_5")) self.gridlayout1.addWidget(self.label_5, 2, 0, 1, 1) self.password = QtGui.QLineEdit(self.rename_files_2) self.password.setEchoMode(QtGui.QLineEdit.Password) self.password.setObjectName(_fromUtf8("password")) self.gridlayout1.addWidget(self.password, 3, 0, 1, 1) self.label_6 = QtGui.QLabel(self.rename_files_2) self.label_6.setObjectName(_fromUtf8("label_6")) self.gridlayout1.addWidget(self.label_6, 0, 0, 1, 1) self.vboxlayout.addWidget(self.rename_files_2) self.groupBox_2 = QtGui.QGroupBox(GeneralOptionsPage) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.verticalLayout = QtGui.QVBoxLayout(self.groupBox_2) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.analyze_new_files = QtGui.QCheckBox(self.groupBox_2) self.analyze_new_files.setObjectName(_fromUtf8("analyze_new_files")) self.verticalLayout.addWidget(self.analyze_new_files) self.ignore_file_mbids = QtGui.QCheckBox(self.groupBox_2) self.ignore_file_mbids.setObjectName(_fromUtf8("ignore_file_mbids")) self.verticalLayout.addWidget(self.ignore_file_mbids) self.vboxlayout.addWidget(self.groupBox_2) spacerItem = QtGui.QSpacerItem(181, 21, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.label_5.setBuddy(self.password) self.label_6.setBuddy(self.username) self.retranslateUi(GeneralOptionsPage) QtCore.QMetaObject.connectSlotsByName(GeneralOptionsPage) GeneralOptionsPage.setTabOrder(self.server_host, self.server_port) GeneralOptionsPage.setTabOrder(self.server_port, self.username) GeneralOptionsPage.setTabOrder(self.username, self.password) def retranslateUi(self, GeneralOptionsPage): self.groupBox.setTitle(_("MusicBrainz Server")) self.label_7.setText(_("Port:")) self.label.setText(_("Server address:")) self.rename_files_2.setTitle(_("Account Information")) self.label_5.setText(_("Password:")) self.label_6.setText(_("Username:")) self.groupBox_2.setTitle(_("General")) self.analyze_new_files.setText(_("Automatically scan all new files")) self.ignore_file_mbids.setText(_("Ignore MBIDs when loading new files")) picard-release-1.3.2/picard/ui/ui_options_interface.py000066400000000000000000000103751245305550700230520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_InterfaceOptionsPage(object): def setupUi(self, InterfaceOptionsPage): InterfaceOptionsPage.setObjectName(_fromUtf8("InterfaceOptionsPage")) InterfaceOptionsPage.resize(421, 275) self.vboxlayout = QtGui.QVBoxLayout(InterfaceOptionsPage) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.groupBox_2 = QtGui.QGroupBox(InterfaceOptionsPage) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.vboxlayout1 = QtGui.QVBoxLayout(self.groupBox_2) self.vboxlayout1.setObjectName(_fromUtf8("vboxlayout1")) self.toolbar_show_labels = QtGui.QCheckBox(self.groupBox_2) self.toolbar_show_labels.setObjectName(_fromUtf8("toolbar_show_labels")) self.vboxlayout1.addWidget(self.toolbar_show_labels) self.toolbar_multiselect = QtGui.QCheckBox(self.groupBox_2) self.toolbar_multiselect.setObjectName(_fromUtf8("toolbar_multiselect")) self.vboxlayout1.addWidget(self.toolbar_multiselect) self.use_adv_search_syntax = QtGui.QCheckBox(self.groupBox_2) self.use_adv_search_syntax.setObjectName(_fromUtf8("use_adv_search_syntax")) self.vboxlayout1.addWidget(self.use_adv_search_syntax) self.quit_confirmation = QtGui.QCheckBox(self.groupBox_2) self.quit_confirmation.setObjectName(_fromUtf8("quit_confirmation")) self.vboxlayout1.addWidget(self.quit_confirmation) self.starting_directory = QtGui.QCheckBox(self.groupBox_2) self.starting_directory.setObjectName(_fromUtf8("starting_directory")) self.vboxlayout1.addWidget(self.starting_directory) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setSpacing(2) self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.starting_directory_path = QtGui.QLineEdit(self.groupBox_2) self.starting_directory_path.setEnabled(False) self.starting_directory_path.setObjectName(_fromUtf8("starting_directory_path")) self.horizontalLayout_4.addWidget(self.starting_directory_path) self.starting_directory_browse = QtGui.QPushButton(self.groupBox_2) self.starting_directory_browse.setEnabled(False) self.starting_directory_browse.setObjectName(_fromUtf8("starting_directory_browse")) self.horizontalLayout_4.addWidget(self.starting_directory_browse) self.vboxlayout1.addLayout(self.horizontalLayout_4) self.label = QtGui.QLabel(self.groupBox_2) self.label.setObjectName(_fromUtf8("label")) self.vboxlayout1.addWidget(self.label) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.ui_language = QtGui.QComboBox(self.groupBox_2) self.ui_language.setObjectName(_fromUtf8("ui_language")) self.horizontalLayout.addWidget(self.ui_language) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.vboxlayout1.addLayout(self.horizontalLayout) self.vboxlayout.addWidget(self.groupBox_2) spacerItem1 = QtGui.QSpacerItem(220, 61, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem1) self.retranslateUi(InterfaceOptionsPage) QtCore.QMetaObject.connectSlotsByName(InterfaceOptionsPage) def retranslateUi(self, InterfaceOptionsPage): self.groupBox_2.setTitle(_("Miscellaneous")) self.toolbar_show_labels.setText(_("Show text labels under icons")) self.toolbar_multiselect.setText(_("Allow selection of multiple directories")) self.use_adv_search_syntax.setText(_("Use advanced query syntax")) self.quit_confirmation.setText(_("Show a quit confirmation dialog for unsaved changes")) self.starting_directory.setText(_("Begin browsing in the following directory:")) self.starting_directory_browse.setText(_("Browse...")) self.label.setText(_("User interface language:")) picard-release-1.3.2/picard/ui/ui_options_matching.py000066400000000000000000000104451245305550700227020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_MatchingOptionsPage(object): def setupUi(self, MatchingOptionsPage): MatchingOptionsPage.setObjectName(_fromUtf8("MatchingOptionsPage")) MatchingOptionsPage.resize(413, 612) self.vboxlayout = QtGui.QVBoxLayout(MatchingOptionsPage) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.rename_files = QtGui.QGroupBox(MatchingOptionsPage) self.rename_files.setObjectName(_fromUtf8("rename_files")) self.gridlayout = QtGui.QGridLayout(self.rename_files) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName(_fromUtf8("gridlayout")) self.label_6 = QtGui.QLabel(self.rename_files) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth()) self.label_6.setSizePolicy(sizePolicy) self.label_6.setObjectName(_fromUtf8("label_6")) self.gridlayout.addWidget(self.label_6, 2, 0, 1, 1) self.track_matching_threshold = QtGui.QSpinBox(self.rename_files) self.track_matching_threshold.setMaximum(100) self.track_matching_threshold.setObjectName(_fromUtf8("track_matching_threshold")) self.gridlayout.addWidget(self.track_matching_threshold, 2, 1, 1, 1) self.cluster_lookup_threshold = QtGui.QSpinBox(self.rename_files) self.cluster_lookup_threshold.setMaximum(100) self.cluster_lookup_threshold.setObjectName(_fromUtf8("cluster_lookup_threshold")) self.gridlayout.addWidget(self.cluster_lookup_threshold, 1, 1, 1, 1) self.file_lookup_threshold = QtGui.QSpinBox(self.rename_files) self.file_lookup_threshold.setMaximum(100) self.file_lookup_threshold.setObjectName(_fromUtf8("file_lookup_threshold")) self.gridlayout.addWidget(self.file_lookup_threshold, 0, 1, 1, 1) self.label_4 = QtGui.QLabel(self.rename_files) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_4.sizePolicy().hasHeightForWidth()) self.label_4.setSizePolicy(sizePolicy) self.label_4.setObjectName(_fromUtf8("label_4")) self.gridlayout.addWidget(self.label_4, 0, 0, 1, 1) self.label_5 = QtGui.QLabel(self.rename_files) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_5.sizePolicy().hasHeightForWidth()) self.label_5.setSizePolicy(sizePolicy) self.label_5.setObjectName(_fromUtf8("label_5")) self.gridlayout.addWidget(self.label_5, 1, 0, 1, 1) self.vboxlayout.addWidget(self.rename_files) spacerItem = QtGui.QSpacerItem(20, 41, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.label_6.setBuddy(self.file_lookup_threshold) self.label_4.setBuddy(self.file_lookup_threshold) self.label_5.setBuddy(self.file_lookup_threshold) self.retranslateUi(MatchingOptionsPage) QtCore.QMetaObject.connectSlotsByName(MatchingOptionsPage) MatchingOptionsPage.setTabOrder(self.file_lookup_threshold, self.cluster_lookup_threshold) MatchingOptionsPage.setTabOrder(self.cluster_lookup_threshold, self.track_matching_threshold) def retranslateUi(self, MatchingOptionsPage): self.rename_files.setTitle(_("Thresholds")) self.label_6.setText(_("Minimal similarity for matching files to tracks:")) self.track_matching_threshold.setSuffix(_(" %")) self.cluster_lookup_threshold.setSuffix(_(" %")) self.file_lookup_threshold.setSuffix(_(" %")) self.label_4.setText(_("Minimal similarity for file lookups:")) self.label_5.setText(_("Minimal similarity for cluster lookups:")) picard-release-1.3.2/picard/ui/ui_options_metadata.py000066400000000000000000000154401245305550700226700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_MetadataOptionsPage(object): def setupUi(self, MetadataOptionsPage): MetadataOptionsPage.setObjectName(_fromUtf8("MetadataOptionsPage")) MetadataOptionsPage.resize(423, 553) self.verticalLayout = QtGui.QVBoxLayout(MetadataOptionsPage) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.metadata_groupbox = QtGui.QGroupBox(MetadataOptionsPage) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.metadata_groupbox.sizePolicy().hasHeightForWidth()) self.metadata_groupbox.setSizePolicy(sizePolicy) self.metadata_groupbox.setMinimumSize(QtCore.QSize(397, 135)) self.metadata_groupbox.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.metadata_groupbox.setObjectName(_fromUtf8("metadata_groupbox")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.metadata_groupbox) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.translate_artist_names = QtGui.QCheckBox(self.metadata_groupbox) self.translate_artist_names.setObjectName(_fromUtf8("translate_artist_names")) self.verticalLayout_3.addWidget(self.translate_artist_names) self.artist_locale = QtGui.QComboBox(self.metadata_groupbox) self.artist_locale.setObjectName(_fromUtf8("artist_locale")) self.verticalLayout_3.addWidget(self.artist_locale) self.standardize_artists = QtGui.QCheckBox(self.metadata_groupbox) self.standardize_artists.setObjectName(_fromUtf8("standardize_artists")) self.verticalLayout_3.addWidget(self.standardize_artists) self.convert_punctuation = QtGui.QCheckBox(self.metadata_groupbox) self.convert_punctuation.setObjectName(_fromUtf8("convert_punctuation")) self.verticalLayout_3.addWidget(self.convert_punctuation) self.release_ars = QtGui.QCheckBox(self.metadata_groupbox) self.release_ars.setObjectName(_fromUtf8("release_ars")) self.verticalLayout_3.addWidget(self.release_ars) self.track_ars = QtGui.QCheckBox(self.metadata_groupbox) self.track_ars.setObjectName(_fromUtf8("track_ars")) self.verticalLayout_3.addWidget(self.track_ars) self.folksonomy_tags = QtGui.QCheckBox(self.metadata_groupbox) self.folksonomy_tags.setObjectName(_fromUtf8("folksonomy_tags")) self.verticalLayout_3.addWidget(self.folksonomy_tags) self.verticalLayout.addWidget(self.metadata_groupbox) self.custom_fields_groupbox = QtGui.QGroupBox(MetadataOptionsPage) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.custom_fields_groupbox.sizePolicy().hasHeightForWidth()) self.custom_fields_groupbox.setSizePolicy(sizePolicy) self.custom_fields_groupbox.setMinimumSize(QtCore.QSize(397, 0)) self.custom_fields_groupbox.setObjectName(_fromUtf8("custom_fields_groupbox")) self.gridlayout = QtGui.QGridLayout(self.custom_fields_groupbox) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName(_fromUtf8("gridlayout")) self.label_6 = QtGui.QLabel(self.custom_fields_groupbox) self.label_6.setObjectName(_fromUtf8("label_6")) self.gridlayout.addWidget(self.label_6, 0, 0, 1, 2) self.label_7 = QtGui.QLabel(self.custom_fields_groupbox) self.label_7.setObjectName(_fromUtf8("label_7")) self.gridlayout.addWidget(self.label_7, 2, 0, 1, 2) self.nat_name = QtGui.QLineEdit(self.custom_fields_groupbox) self.nat_name.setObjectName(_fromUtf8("nat_name")) self.gridlayout.addWidget(self.nat_name, 3, 0, 1, 1) self.nat_name_default = QtGui.QPushButton(self.custom_fields_groupbox) self.nat_name_default.setObjectName(_fromUtf8("nat_name_default")) self.gridlayout.addWidget(self.nat_name_default, 3, 1, 1, 1) self.va_name_default = QtGui.QPushButton(self.custom_fields_groupbox) self.va_name_default.setObjectName(_fromUtf8("va_name_default")) self.gridlayout.addWidget(self.va_name_default, 1, 1, 1, 1) self.va_name = QtGui.QLineEdit(self.custom_fields_groupbox) self.va_name.setObjectName(_fromUtf8("va_name")) self.gridlayout.addWidget(self.va_name, 1, 0, 1, 1) self.verticalLayout.addWidget(self.custom_fields_groupbox) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.MinimumExpanding) self.verticalLayout.addItem(spacerItem) self.label_6.setBuddy(self.va_name_default) self.label_7.setBuddy(self.nat_name_default) self.retranslateUi(MetadataOptionsPage) QtCore.QMetaObject.connectSlotsByName(MetadataOptionsPage) MetadataOptionsPage.setTabOrder(self.translate_artist_names, self.artist_locale) MetadataOptionsPage.setTabOrder(self.artist_locale, self.standardize_artists) MetadataOptionsPage.setTabOrder(self.standardize_artists, self.convert_punctuation) MetadataOptionsPage.setTabOrder(self.convert_punctuation, self.release_ars) MetadataOptionsPage.setTabOrder(self.release_ars, self.track_ars) MetadataOptionsPage.setTabOrder(self.track_ars, self.folksonomy_tags) MetadataOptionsPage.setTabOrder(self.folksonomy_tags, self.va_name) MetadataOptionsPage.setTabOrder(self.va_name, self.va_name_default) MetadataOptionsPage.setTabOrder(self.va_name_default, self.nat_name) MetadataOptionsPage.setTabOrder(self.nat_name, self.nat_name_default) def retranslateUi(self, MetadataOptionsPage): self.metadata_groupbox.setTitle(_("Metadata")) self.translate_artist_names.setText(_("Translate artist names to this locale where possible:")) self.standardize_artists.setText(_("Use standardized artist names")) self.convert_punctuation.setText(_("Convert Unicode punctuation characters to ASCII")) self.release_ars.setText(_("Use release relationships")) self.track_ars.setText(_("Use track relationships")) self.folksonomy_tags.setText(_("Use folksonomy tags as genre")) self.custom_fields_groupbox.setTitle(_("Custom Fields")) self.label_6.setText(_("Various artists:")) self.label_7.setText(_("Non-album tracks:")) self.nat_name_default.setText(_("Default")) self.va_name_default.setText(_("Default")) picard-release-1.3.2/picard/ui/ui_options_network.py000066400000000000000000000141131245305550700225750ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_NetworkOptionsPage(object): def setupUi(self, NetworkOptionsPage): NetworkOptionsPage.setObjectName(_fromUtf8("NetworkOptionsPage")) NetworkOptionsPage.resize(316, 337) self.vboxlayout = QtGui.QVBoxLayout(NetworkOptionsPage) self.vboxlayout.setSpacing(6) self.vboxlayout.setMargin(9) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.web_proxy = QtGui.QGroupBox(NetworkOptionsPage) self.web_proxy.setCheckable(True) self.web_proxy.setObjectName(_fromUtf8("web_proxy")) self.gridlayout = QtGui.QGridLayout(self.web_proxy) self.gridlayout.setSpacing(2) self.gridlayout.setMargin(9) self.gridlayout.setObjectName(_fromUtf8("gridlayout")) self.password = QtGui.QLineEdit(self.web_proxy) self.password.setEchoMode(QtGui.QLineEdit.Password) self.password.setObjectName(_fromUtf8("password")) self.gridlayout.addWidget(self.password, 5, 0, 1, 2) self.username = QtGui.QLineEdit(self.web_proxy) self.username.setObjectName(_fromUtf8("username")) self.gridlayout.addWidget(self.username, 3, 0, 1, 2) self.label_5 = QtGui.QLabel(self.web_proxy) self.label_5.setObjectName(_fromUtf8("label_5")) self.gridlayout.addWidget(self.label_5, 4, 0, 1, 2) self.label_6 = QtGui.QLabel(self.web_proxy) self.label_6.setObjectName(_fromUtf8("label_6")) self.gridlayout.addWidget(self.label_6, 2, 0, 1, 2) self.server_host = QtGui.QLineEdit(self.web_proxy) self.server_host.setObjectName(_fromUtf8("server_host")) self.gridlayout.addWidget(self.server_host, 1, 0, 1, 1) self.label_7 = QtGui.QLabel(self.web_proxy) self.label_7.setObjectName(_fromUtf8("label_7")) self.gridlayout.addWidget(self.label_7, 0, 1, 1, 1) self.server_port = QtGui.QSpinBox(self.web_proxy) self.server_port.setMinimum(1) self.server_port.setMaximum(65535) self.server_port.setProperty("value", 80) self.server_port.setObjectName(_fromUtf8("server_port")) self.gridlayout.addWidget(self.server_port, 1, 1, 1, 1) self.label = QtGui.QLabel(self.web_proxy) self.label.setObjectName(_fromUtf8("label")) self.gridlayout.addWidget(self.label, 0, 0, 1, 1) self.vboxlayout.addWidget(self.web_proxy) self.browser_integration = QtGui.QGroupBox(NetworkOptionsPage) self.browser_integration.setCheckable(True) self.browser_integration.setChecked(True) self.browser_integration.setObjectName(_fromUtf8("browser_integration")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.browser_integration) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.widget = QtGui.QWidget(self.browser_integration) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.widget.sizePolicy().hasHeightForWidth()) self.widget.setSizePolicy(sizePolicy) self.widget.setObjectName(_fromUtf8("widget")) self.horizontalLayout = QtGui.QHBoxLayout(self.widget) self.horizontalLayout.setContentsMargins(6, 0, 0, 0) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.label_2 = QtGui.QLabel(self.widget) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth()) self.label_2.setSizePolicy(sizePolicy) self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_2.setObjectName(_fromUtf8("label_2")) self.horizontalLayout.addWidget(self.label_2) self.browser_integration_port = QtGui.QSpinBox(self.widget) self.browser_integration_port.setMinimum(1) self.browser_integration_port.setMaximum(65535) self.browser_integration_port.setProperty("value", 8000) self.browser_integration_port.setObjectName(_fromUtf8("browser_integration_port")) self.horizontalLayout.addWidget(self.browser_integration_port) self.verticalLayout_2.addWidget(self.widget) self.browser_integration_localhost_only = QtGui.QCheckBox(self.browser_integration) self.browser_integration_localhost_only.setChecked(False) self.browser_integration_localhost_only.setObjectName(_fromUtf8("browser_integration_localhost_only")) self.verticalLayout_2.addWidget(self.browser_integration_localhost_only) self.vboxlayout.addWidget(self.browser_integration) spacerItem = QtGui.QSpacerItem(101, 31, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.label_5.setBuddy(self.password) self.label_6.setBuddy(self.username) self.label.setBuddy(self.server_host) self.retranslateUi(NetworkOptionsPage) QtCore.QMetaObject.connectSlotsByName(NetworkOptionsPage) NetworkOptionsPage.setTabOrder(self.server_host, self.server_port) NetworkOptionsPage.setTabOrder(self.server_port, self.username) NetworkOptionsPage.setTabOrder(self.username, self.password) def retranslateUi(self, NetworkOptionsPage): self.web_proxy.setTitle(_("Web Proxy")) self.label_5.setText(_("Password:")) self.label_6.setText(_("Username:")) self.label_7.setText(_("Port:")) self.label.setText(_("Server address:")) self.browser_integration.setTitle(_("Browser Integration")) self.label_2.setText(_("Default listening port:")) self.browser_integration_localhost_only.setText(_("Listen only on localhost")) picard-release-1.3.2/picard/ui/ui_options_plugins.py000066400000000000000000000165711245305550700225770ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_PluginsOptionsPage(object): def setupUi(self, PluginsOptionsPage): PluginsOptionsPage.setObjectName(_fromUtf8("PluginsOptionsPage")) PluginsOptionsPage.resize(513, 312) self.vboxlayout = QtGui.QVBoxLayout(PluginsOptionsPage) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.splitter = QtGui.QSplitter(PluginsOptionsPage) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setHandleWidth(2) self.splitter.setObjectName(_fromUtf8("splitter")) self.groupBox_2 = QtGui.QGroupBox(self.splitter) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.vboxlayout1 = QtGui.QVBoxLayout(self.groupBox_2) self.vboxlayout1.setSpacing(2) self.vboxlayout1.setObjectName(_fromUtf8("vboxlayout1")) self.plugins = QtGui.QTreeWidget(self.groupBox_2) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.plugins.sizePolicy().hasHeightForWidth()) self.plugins.setSizePolicy(sizePolicy) self.plugins.setAcceptDrops(True) self.plugins.setDragDropMode(QtGui.QAbstractItemView.DropOnly) self.plugins.setRootIsDecorated(False) self.plugins.setObjectName(_fromUtf8("plugins")) self.vboxlayout1.addWidget(self.plugins) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.install_plugin = QtGui.QPushButton(self.groupBox_2) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.install_plugin.sizePolicy().hasHeightForWidth()) self.install_plugin.setSizePolicy(sizePolicy) self.install_plugin.setObjectName(_fromUtf8("install_plugin")) self.horizontalLayout.addWidget(self.install_plugin) self.folder_open = QtGui.QPushButton(self.groupBox_2) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.folder_open.sizePolicy().hasHeightForWidth()) self.folder_open.setSizePolicy(sizePolicy) self.folder_open.setObjectName(_fromUtf8("folder_open")) self.horizontalLayout.addWidget(self.folder_open) self.plugin_download = QtGui.QPushButton(self.groupBox_2) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.plugin_download.sizePolicy().hasHeightForWidth()) self.plugin_download.setSizePolicy(sizePolicy) self.plugin_download.setObjectName(_fromUtf8("plugin_download")) self.horizontalLayout.addWidget(self.plugin_download) self.vboxlayout1.addLayout(self.horizontalLayout) self.groupBox = QtGui.QGroupBox(self.splitter) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) self.groupBox.setSizePolicy(sizePolicy) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.vboxlayout2 = QtGui.QVBoxLayout(self.groupBox) self.vboxlayout2.setSpacing(0) self.vboxlayout2.setObjectName(_fromUtf8("vboxlayout2")) self.scrollArea = QtGui.QScrollArea(self.groupBox) self.scrollArea.setEnabled(True) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scrollArea.sizePolicy().hasHeightForWidth()) self.scrollArea.setSizePolicy(sizePolicy) self.scrollArea.setFrameShape(QtGui.QFrame.HLine) self.scrollArea.setFrameShadow(QtGui.QFrame.Plain) self.scrollArea.setLineWidth(0) self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) self.scrollArea.setWidgetResizable(True) self.scrollArea.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.scrollArea.setObjectName(_fromUtf8("scrollArea")) self.scrollAreaWidgetContents = QtGui.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 459, 76)) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scrollAreaWidgetContents.sizePolicy().hasHeightForWidth()) self.scrollAreaWidgetContents.setSizePolicy(sizePolicy) self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents")) self.verticalLayout = QtGui.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout.setSizeConstraint(QtGui.QLayout.SetNoConstraint) self.verticalLayout.setContentsMargins(0, 0, 6, 0) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.details = QtGui.QLabel(self.scrollAreaWidgetContents) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.details.sizePolicy().hasHeightForWidth()) self.details.setSizePolicy(sizePolicy) self.details.setMinimumSize(QtCore.QSize(0, 0)) self.details.setFrameShape(QtGui.QFrame.Box) self.details.setLineWidth(0) self.details.setText(_fromUtf8("")) self.details.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.details.setWordWrap(True) self.details.setIndent(0) self.details.setOpenExternalLinks(True) self.details.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.details.setObjectName(_fromUtf8("details")) self.verticalLayout.addWidget(self.details) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.vboxlayout2.addWidget(self.scrollArea) self.vboxlayout.addWidget(self.splitter) self.retranslateUi(PluginsOptionsPage) QtCore.QMetaObject.connectSlotsByName(PluginsOptionsPage) def retranslateUi(self, PluginsOptionsPage): self.groupBox_2.setTitle(_("Plugins")) self.plugins.headerItem().setText(0, _("Name")) self.plugins.headerItem().setText(1, _("Version")) self.plugins.headerItem().setText(2, _("Author")) self.install_plugin.setText(_("Install plugin...")) self.folder_open.setText(_("Open plugin folder")) self.plugin_download.setText(_("Download plugins")) self.groupBox.setTitle(_("Details")) picard-release-1.3.2/picard/ui/ui_options_ratings.py000066400000000000000000000051551245305550700225610ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_RatingsOptionsPage(object): def setupUi(self, RatingsOptionsPage): RatingsOptionsPage.setObjectName(_fromUtf8("RatingsOptionsPage")) RatingsOptionsPage.resize(397, 267) self.vboxlayout = QtGui.QVBoxLayout(RatingsOptionsPage) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.enable_ratings = QtGui.QGroupBox(RatingsOptionsPage) self.enable_ratings.setCheckable(True) self.enable_ratings.setChecked(True) self.enable_ratings.setObjectName(_fromUtf8("enable_ratings")) self.vboxlayout1 = QtGui.QVBoxLayout(self.enable_ratings) self.vboxlayout1.setObjectName(_fromUtf8("vboxlayout1")) self.label = QtGui.QLabel(self.enable_ratings) self.label.setWordWrap(True) self.label.setObjectName(_fromUtf8("label")) self.vboxlayout1.addWidget(self.label) self.ignore_tags_2 = QtGui.QLabel(self.enable_ratings) self.ignore_tags_2.setEnabled(True) self.ignore_tags_2.setWordWrap(True) self.ignore_tags_2.setObjectName(_fromUtf8("ignore_tags_2")) self.vboxlayout1.addWidget(self.ignore_tags_2) self.rating_user_email = QtGui.QLineEdit(self.enable_ratings) self.rating_user_email.setReadOnly(False) self.rating_user_email.setObjectName(_fromUtf8("rating_user_email")) self.vboxlayout1.addWidget(self.rating_user_email) self.submit_ratings = QtGui.QCheckBox(self.enable_ratings) self.submit_ratings.setObjectName(_fromUtf8("submit_ratings")) self.vboxlayout1.addWidget(self.submit_ratings) self.vboxlayout.addWidget(self.enable_ratings) spacerItem = QtGui.QSpacerItem(181, 31, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.retranslateUi(RatingsOptionsPage) QtCore.QMetaObject.connectSlotsByName(RatingsOptionsPage) def retranslateUi(self, RatingsOptionsPage): self.enable_ratings.setTitle(_("Enable track ratings")) self.label.setText(_("Picard saves the ratings together with an e-mail address identifying the user who did the rating. That way different ratings for different users can be stored in the files. Please specify the e-mail you want to use to save your ratings.")) self.ignore_tags_2.setText(_("E-mail:")) self.submit_ratings.setText(_("Submit ratings to MusicBrainz")) picard-release-1.3.2/picard/ui/ui_options_releases.py000066400000000000000000000145321245305550700227140ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_ReleasesOptionsPage(object): def setupUi(self, ReleasesOptionsPage): ReleasesOptionsPage.setObjectName(_fromUtf8("ReleasesOptionsPage")) ReleasesOptionsPage.resize(551, 497) self.verticalLayout_3 = QtGui.QVBoxLayout(ReleasesOptionsPage) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.type_group = QtGui.QGroupBox(ReleasesOptionsPage) self.type_group.setObjectName(_fromUtf8("type_group")) self.gridLayout = QtGui.QGridLayout(self.type_group) self.gridLayout.setVerticalSpacing(6) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.verticalLayout_3.addWidget(self.type_group) self.country_group = QtGui.QGroupBox(ReleasesOptionsPage) self.country_group.setObjectName(_fromUtf8("country_group")) self.horizontalLayout = QtGui.QHBoxLayout(self.country_group) self.horizontalLayout.setSpacing(4) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.country_list = QtGui.QListWidget(self.country_group) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.country_list.sizePolicy().hasHeightForWidth()) self.country_list.setSizePolicy(sizePolicy) self.country_list.setObjectName(_fromUtf8("country_list")) self.horizontalLayout.addWidget(self.country_list) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.add_countries = QtGui.QPushButton(self.country_group) self.add_countries.setObjectName(_fromUtf8("add_countries")) self.verticalLayout.addWidget(self.add_countries) self.remove_countries = QtGui.QPushButton(self.country_group) self.remove_countries.setObjectName(_fromUtf8("remove_countries")) self.verticalLayout.addWidget(self.remove_countries) spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem1) self.horizontalLayout.addLayout(self.verticalLayout) self.preferred_country_list = QtGui.QListWidget(self.country_group) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.preferred_country_list.sizePolicy().hasHeightForWidth()) self.preferred_country_list.setSizePolicy(sizePolicy) self.preferred_country_list.setDragEnabled(True) self.preferred_country_list.setDragDropMode(QtGui.QAbstractItemView.InternalMove) self.preferred_country_list.setObjectName(_fromUtf8("preferred_country_list")) self.horizontalLayout.addWidget(self.preferred_country_list) self.verticalLayout_3.addWidget(self.country_group) self.format_group = QtGui.QGroupBox(ReleasesOptionsPage) self.format_group.setObjectName(_fromUtf8("format_group")) self.horizontalLayout_2 = QtGui.QHBoxLayout(self.format_group) self.horizontalLayout_2.setSpacing(4) self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.format_list = QtGui.QListWidget(self.format_group) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.format_list.sizePolicy().hasHeightForWidth()) self.format_list.setSizePolicy(sizePolicy) self.format_list.setObjectName(_fromUtf8("format_list")) self.horizontalLayout_2.addWidget(self.format_list) self.verticalLayout_2 = QtGui.QVBoxLayout() self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem2) self.add_formats = QtGui.QPushButton(self.format_group) self.add_formats.setObjectName(_fromUtf8("add_formats")) self.verticalLayout_2.addWidget(self.add_formats) self.remove_formats = QtGui.QPushButton(self.format_group) self.remove_formats.setObjectName(_fromUtf8("remove_formats")) self.verticalLayout_2.addWidget(self.remove_formats) spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem3) self.horizontalLayout_2.addLayout(self.verticalLayout_2) self.preferred_format_list = QtGui.QListWidget(self.format_group) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.preferred_format_list.sizePolicy().hasHeightForWidth()) self.preferred_format_list.setSizePolicy(sizePolicy) self.preferred_format_list.setDragEnabled(True) self.preferred_format_list.setDragDropMode(QtGui.QAbstractItemView.InternalMove) self.preferred_format_list.setObjectName(_fromUtf8("preferred_format_list")) self.horizontalLayout_2.addWidget(self.preferred_format_list) self.verticalLayout_3.addWidget(self.format_group) self.retranslateUi(ReleasesOptionsPage) QtCore.QMetaObject.connectSlotsByName(ReleasesOptionsPage) def retranslateUi(self, ReleasesOptionsPage): self.type_group.setTitle(_("Preferred release types")) self.country_group.setTitle(_("Preferred release countries")) self.add_countries.setText(_(">")) self.remove_countries.setText(_("<")) self.format_group.setTitle(_("Preferred release formats")) self.add_formats.setText(_(">")) self.remove_formats.setText(_("<")) picard-release-1.3.2/picard/ui/ui_options_renaming.py000066400000000000000000000214451245305550700227120ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_RenamingOptionsPage(object): def setupUi(self, RenamingOptionsPage): RenamingOptionsPage.setObjectName(_fromUtf8("RenamingOptionsPage")) RenamingOptionsPage.setEnabled(True) RenamingOptionsPage.resize(453, 421) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(RenamingOptionsPage.sizePolicy().hasHeightForWidth()) RenamingOptionsPage.setSizePolicy(sizePolicy) self.verticalLayout_5 = QtGui.QVBoxLayout(RenamingOptionsPage) self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) self.rename_files = QtGui.QCheckBox(RenamingOptionsPage) self.rename_files.setObjectName(_fromUtf8("rename_files")) self.verticalLayout_5.addWidget(self.rename_files) self.ascii_filenames = QtGui.QCheckBox(RenamingOptionsPage) self.ascii_filenames.setObjectName(_fromUtf8("ascii_filenames")) self.verticalLayout_5.addWidget(self.ascii_filenames) self.windows_compatibility = QtGui.QCheckBox(RenamingOptionsPage) self.windows_compatibility.setObjectName(_fromUtf8("windows_compatibility")) self.verticalLayout_5.addWidget(self.windows_compatibility) self.move_files = QtGui.QCheckBox(RenamingOptionsPage) self.move_files.setObjectName(_fromUtf8("move_files")) self.verticalLayout_5.addWidget(self.move_files) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setSpacing(2) self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.move_files_to = QtGui.QLineEdit(RenamingOptionsPage) self.move_files_to.setEnabled(False) self.move_files_to.setObjectName(_fromUtf8("move_files_to")) self.horizontalLayout_4.addWidget(self.move_files_to) self.move_files_to_browse = QtGui.QPushButton(RenamingOptionsPage) self.move_files_to_browse.setEnabled(False) self.move_files_to_browse.setObjectName(_fromUtf8("move_files_to_browse")) self.horizontalLayout_4.addWidget(self.move_files_to_browse) self.verticalLayout_5.addLayout(self.horizontalLayout_4) self.delete_empty_dirs = QtGui.QCheckBox(RenamingOptionsPage) self.delete_empty_dirs.setEnabled(False) self.delete_empty_dirs.setObjectName(_fromUtf8("delete_empty_dirs")) self.verticalLayout_5.addWidget(self.delete_empty_dirs) self.move_additional_files = QtGui.QCheckBox(RenamingOptionsPage) self.move_additional_files.setEnabled(False) self.move_additional_files.setObjectName(_fromUtf8("move_additional_files")) self.verticalLayout_5.addWidget(self.move_additional_files) self.move_additional_files_pattern = QtGui.QLineEdit(RenamingOptionsPage) self.move_additional_files_pattern.setEnabled(False) self.move_additional_files_pattern.setObjectName(_fromUtf8("move_additional_files_pattern")) self.verticalLayout_5.addWidget(self.move_additional_files_pattern) self.groupBox_2 = QtGui.QGroupBox(RenamingOptionsPage) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox_2) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.file_naming_format = QtGui.QTextEdit(self.groupBox_2) self.file_naming_format.setEnabled(False) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.file_naming_format.sizePolicy().hasHeightForWidth()) self.file_naming_format.setSizePolicy(sizePolicy) self.file_naming_format.setMinimumSize(QtCore.QSize(0, 0)) font = QtGui.QFont() font.setFamily(_fromUtf8("Monospace")) self.file_naming_format.setFont(font) self.file_naming_format.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.IBeamCursor)) self.file_naming_format.setTabChangesFocus(False) self.file_naming_format.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.file_naming_format.setTabStopWidth(20) self.file_naming_format.setAcceptRichText(True) self.file_naming_format.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction) self.file_naming_format.setObjectName(_fromUtf8("file_naming_format")) self.verticalLayout_2.addWidget(self.file_naming_format) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setSpacing(2) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.renaming_error = QtGui.QLabel(self.groupBox_2) self.renaming_error.setText(_fromUtf8("")) self.renaming_error.setAlignment(QtCore.Qt.AlignCenter) self.renaming_error.setObjectName(_fromUtf8("renaming_error")) self.horizontalLayout.addWidget(self.renaming_error) self.file_naming_format_default = QtGui.QPushButton(self.groupBox_2) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.file_naming_format_default.sizePolicy().hasHeightForWidth()) self.file_naming_format_default.setSizePolicy(sizePolicy) self.file_naming_format_default.setMinimumSize(QtCore.QSize(0, 0)) self.file_naming_format_default.setObjectName(_fromUtf8("file_naming_format_default")) self.horizontalLayout.addWidget(self.file_naming_format_default) self.verticalLayout_2.addLayout(self.horizontalLayout) self.verticalLayout_5.addWidget(self.groupBox_2) self.groupBox = QtGui.QGroupBox(RenamingOptionsPage) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.verticalLayout = QtGui.QVBoxLayout(self.groupBox) self.verticalLayout.setContentsMargins(2, 0, 2, 0) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.example_filename = QtGui.QLabel(self.groupBox) self.example_filename.setText(_fromUtf8("")) self.example_filename.setTextFormat(QtCore.Qt.RichText) self.example_filename.setWordWrap(True) self.example_filename.setObjectName(_fromUtf8("example_filename")) self.verticalLayout.addWidget(self.example_filename) self.example_filename_va = QtGui.QLabel(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.example_filename_va.sizePolicy().hasHeightForWidth()) self.example_filename_va.setSizePolicy(sizePolicy) self.example_filename_va.setText(_fromUtf8("")) self.example_filename_va.setWordWrap(True) self.example_filename_va.setObjectName(_fromUtf8("example_filename_va")) self.verticalLayout.addWidget(self.example_filename_va) self.verticalLayout_5.addWidget(self.groupBox) self.retranslateUi(RenamingOptionsPage) QtCore.QMetaObject.connectSlotsByName(RenamingOptionsPage) def retranslateUi(self, RenamingOptionsPage): self.rename_files.setText(_("Rename files when saving")) self.ascii_filenames.setText(_("Replace non-ASCII characters")) self.windows_compatibility.setText(_("Windows compatibility")) self.move_files.setText(_("Move files to this directory when saving:")) self.move_files_to_browse.setText(_("Browse...")) self.delete_empty_dirs.setText(_("Delete empty directories")) self.move_additional_files.setText(_("Move additional files:")) self.groupBox_2.setTitle(_("Name files like this")) self.file_naming_format.setHtml(QtGui.QApplication.translate("RenamingOptionsPage", "\n" "\n" "


", None, QtGui.QApplication.UnicodeUTF8)) self.file_naming_format_default.setText(_("Default")) self.groupBox.setTitle(_("Examples")) picard-release-1.3.2/picard/ui/ui_options_script.py000066400000000000000000000037741245305550700224230ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_ScriptingOptionsPage(object): def setupUi(self, ScriptingOptionsPage): ScriptingOptionsPage.setObjectName(_fromUtf8("ScriptingOptionsPage")) ScriptingOptionsPage.resize(605, 377) self.vboxlayout = QtGui.QVBoxLayout(ScriptingOptionsPage) self.vboxlayout.setSpacing(6) self.vboxlayout.setMargin(9) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.enable_tagger_script = QtGui.QGroupBox(ScriptingOptionsPage) self.enable_tagger_script.setCheckable(True) self.enable_tagger_script.setObjectName(_fromUtf8("enable_tagger_script")) self.verticalLayout = QtGui.QVBoxLayout(self.enable_tagger_script) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.tagger_script = QtGui.QTextEdit(self.enable_tagger_script) font = QtGui.QFont() font.setFamily(_fromUtf8("Monospace")) self.tagger_script.setFont(font) self.tagger_script.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.tagger_script.setAcceptRichText(False) self.tagger_script.setObjectName(_fromUtf8("tagger_script")) self.verticalLayout.addWidget(self.tagger_script) self.script_error = QtGui.QLabel(self.enable_tagger_script) self.script_error.setText(_fromUtf8("")) self.script_error.setAlignment(QtCore.Qt.AlignCenter) self.script_error.setObjectName(_fromUtf8("script_error")) self.verticalLayout.addWidget(self.script_error) self.vboxlayout.addWidget(self.enable_tagger_script) self.retranslateUi(ScriptingOptionsPage) QtCore.QMetaObject.connectSlotsByName(ScriptingOptionsPage) def retranslateUi(self, ScriptingOptionsPage): self.enable_tagger_script.setTitle(_("Tagger Script")) picard-release-1.3.2/picard/ui/ui_options_tags.py000066400000000000000000000245151245305550700220510ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_TagsOptionsPage(object): def setupUi(self, TagsOptionsPage): TagsOptionsPage.setObjectName(_fromUtf8("TagsOptionsPage")) TagsOptionsPage.resize(539, 425) self.vboxlayout = QtGui.QVBoxLayout(TagsOptionsPage) self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.write_tags = QtGui.QCheckBox(TagsOptionsPage) self.write_tags.setObjectName(_fromUtf8("write_tags")) self.vboxlayout.addWidget(self.write_tags) self.preserve_timestamps = QtGui.QCheckBox(TagsOptionsPage) self.preserve_timestamps.setObjectName(_fromUtf8("preserve_timestamps")) self.vboxlayout.addWidget(self.preserve_timestamps) self.before_tagging = QtGui.QGroupBox(TagsOptionsPage) self.before_tagging.setObjectName(_fromUtf8("before_tagging")) self.vboxlayout1 = QtGui.QVBoxLayout(self.before_tagging) self.vboxlayout1.setSpacing(2) self.vboxlayout1.setContentsMargins(-1, 6, -1, 7) self.vboxlayout1.setObjectName(_fromUtf8("vboxlayout1")) self.clear_existing_tags = QtGui.QCheckBox(self.before_tagging) self.clear_existing_tags.setObjectName(_fromUtf8("clear_existing_tags")) self.vboxlayout1.addWidget(self.clear_existing_tags) self.remove_id3_from_flac = QtGui.QCheckBox(self.before_tagging) self.remove_id3_from_flac.setObjectName(_fromUtf8("remove_id3_from_flac")) self.vboxlayout1.addWidget(self.remove_id3_from_flac) self.remove_ape_from_mp3 = QtGui.QCheckBox(self.before_tagging) self.remove_ape_from_mp3.setObjectName(_fromUtf8("remove_ape_from_mp3")) self.vboxlayout1.addWidget(self.remove_ape_from_mp3) spacerItem = QtGui.QSpacerItem(20, 6, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) self.vboxlayout1.addItem(spacerItem) self.preserved_tags_label = QtGui.QLabel(self.before_tagging) self.preserved_tags_label.setObjectName(_fromUtf8("preserved_tags_label")) self.vboxlayout1.addWidget(self.preserved_tags_label) self.preserved_tags = QtGui.QLineEdit(self.before_tagging) self.preserved_tags.setObjectName(_fromUtf8("preserved_tags")) self.vboxlayout1.addWidget(self.preserved_tags) self.preserved_tags_help = QtGui.QLabel(self.before_tagging) self.preserved_tags_help.setObjectName(_fromUtf8("preserved_tags_help")) self.vboxlayout1.addWidget(self.preserved_tags_help) self.vboxlayout.addWidget(self.before_tagging) self.tag_compatibility = QtGui.QGroupBox(TagsOptionsPage) self.tag_compatibility.setObjectName(_fromUtf8("tag_compatibility")) self.vboxlayout2 = QtGui.QVBoxLayout(self.tag_compatibility) self.vboxlayout2.setSpacing(2) self.vboxlayout2.setContentsMargins(-1, 6, -1, 7) self.vboxlayout2.setObjectName(_fromUtf8("vboxlayout2")) self.id3v2_version = QtGui.QGroupBox(self.tag_compatibility) self.id3v2_version.setFlat(False) self.id3v2_version.setCheckable(False) self.id3v2_version.setObjectName(_fromUtf8("id3v2_version")) self.horizontalLayout = QtGui.QHBoxLayout(self.id3v2_version) self.horizontalLayout.setContentsMargins(-1, 6, -1, 7) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.write_id3v24 = QtGui.QRadioButton(self.id3v2_version) self.write_id3v24.setChecked(True) self.write_id3v24.setObjectName(_fromUtf8("write_id3v24")) self.horizontalLayout.addWidget(self.write_id3v24) self.write_id3v23 = QtGui.QRadioButton(self.id3v2_version) self.write_id3v23.setChecked(False) self.write_id3v23.setObjectName(_fromUtf8("write_id3v23")) self.horizontalLayout.addWidget(self.write_id3v23) self.label = QtGui.QLabel(self.id3v2_version) self.label.setText(_fromUtf8("")) self.label.setWordWrap(True) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout.addWidget(self.label) spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.vboxlayout2.addWidget(self.id3v2_version) self.id3v2_text_encoding = QtGui.QGroupBox(self.tag_compatibility) self.id3v2_text_encoding.setObjectName(_fromUtf8("id3v2_text_encoding")) self.horizontalLayout_2 = QtGui.QHBoxLayout(self.id3v2_text_encoding) self.horizontalLayout_2.setContentsMargins(-1, 6, -1, 7) self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.enc_utf8 = QtGui.QRadioButton(self.id3v2_text_encoding) self.enc_utf8.setObjectName(_fromUtf8("enc_utf8")) self.horizontalLayout_2.addWidget(self.enc_utf8) self.enc_utf16 = QtGui.QRadioButton(self.id3v2_text_encoding) self.enc_utf16.setObjectName(_fromUtf8("enc_utf16")) self.horizontalLayout_2.addWidget(self.enc_utf16) self.enc_iso88591 = QtGui.QRadioButton(self.id3v2_text_encoding) self.enc_iso88591.setObjectName(_fromUtf8("enc_iso88591")) self.horizontalLayout_2.addWidget(self.enc_iso88591) spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem2) self.label_2 = QtGui.QLabel(self.id3v2_text_encoding) self.label_2.setText(_fromUtf8("")) self.label_2.setWordWrap(True) self.label_2.setObjectName(_fromUtf8("label_2")) self.horizontalLayout_2.addWidget(self.label_2) self.vboxlayout2.addWidget(self.id3v2_text_encoding) self.hbox_id3v23_join_with = QtGui.QHBoxLayout() self.hbox_id3v23_join_with.setObjectName(_fromUtf8("hbox_id3v23_join_with")) self.label_id3v23_join_with = QtGui.QLabel(self.tag_compatibility) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(4) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_id3v23_join_with.sizePolicy().hasHeightForWidth()) self.label_id3v23_join_with.setSizePolicy(sizePolicy) self.label_id3v23_join_with.setObjectName(_fromUtf8("label_id3v23_join_with")) self.hbox_id3v23_join_with.addWidget(self.label_id3v23_join_with) self.id3v23_join_with = QtGui.QComboBox(self.tag_compatibility) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.id3v23_join_with.sizePolicy().hasHeightForWidth()) self.id3v23_join_with.setSizePolicy(sizePolicy) self.id3v23_join_with.setEditable(True) self.id3v23_join_with.setObjectName(_fromUtf8("id3v23_join_with")) self.id3v23_join_with.addItem(_fromUtf8("")) self.id3v23_join_with.setItemText(0, _fromUtf8("/")) self.id3v23_join_with.addItem(_fromUtf8("")) self.id3v23_join_with.setItemText(1, _fromUtf8("; ")) self.id3v23_join_with.addItem(_fromUtf8("")) self.id3v23_join_with.setItemText(2, _fromUtf8(" / ")) self.hbox_id3v23_join_with.addWidget(self.id3v23_join_with) self.vboxlayout2.addLayout(self.hbox_id3v23_join_with) self.write_id3v1 = QtGui.QCheckBox(self.tag_compatibility) self.write_id3v1.setObjectName(_fromUtf8("write_id3v1")) self.vboxlayout2.addWidget(self.write_id3v1) self.vboxlayout.addWidget(self.tag_compatibility) spacerItem3 = QtGui.QSpacerItem(274, 41, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem3) self.retranslateUi(TagsOptionsPage) QtCore.QMetaObject.connectSlotsByName(TagsOptionsPage) TagsOptionsPage.setTabOrder(self.write_tags, self.preserve_timestamps) TagsOptionsPage.setTabOrder(self.preserve_timestamps, self.clear_existing_tags) TagsOptionsPage.setTabOrder(self.clear_existing_tags, self.remove_id3_from_flac) TagsOptionsPage.setTabOrder(self.remove_id3_from_flac, self.remove_ape_from_mp3) TagsOptionsPage.setTabOrder(self.remove_ape_from_mp3, self.preserved_tags) TagsOptionsPage.setTabOrder(self.preserved_tags, self.write_id3v24) TagsOptionsPage.setTabOrder(self.write_id3v24, self.write_id3v23) TagsOptionsPage.setTabOrder(self.write_id3v23, self.enc_utf8) TagsOptionsPage.setTabOrder(self.enc_utf8, self.enc_utf16) TagsOptionsPage.setTabOrder(self.enc_utf16, self.enc_iso88591) TagsOptionsPage.setTabOrder(self.enc_iso88591, self.id3v23_join_with) TagsOptionsPage.setTabOrder(self.id3v23_join_with, self.write_id3v1) def retranslateUi(self, TagsOptionsPage): self.write_tags.setText(_("Write tags to files")) self.preserve_timestamps.setText(_("Preserve timestamps of tagged files")) self.before_tagging.setTitle(_("Before Tagging")) self.clear_existing_tags.setText(_("Clear existing tags")) self.remove_id3_from_flac.setText(_("Remove ID3 tags from FLAC files")) self.remove_ape_from_mp3.setText(_("Remove APEv2 tags from MP3 files")) self.preserved_tags_label.setText(_("Preserve these tags from being cleared or overwritten with MusicBrainz data:")) self.preserved_tags_help.setText(_("Tags are separated by commas, and are case-sensitive.")) self.tag_compatibility.setTitle(_("Tag Compatibility")) self.id3v2_version.setTitle(_("ID3v2 Version")) self.write_id3v24.setText(_("2.4")) self.write_id3v23.setText(_("2.3")) self.id3v2_text_encoding.setTitle(_("ID3v2 Text Encoding")) self.enc_utf8.setText(_("UTF-8")) self.enc_utf16.setText(_("UTF-16")) self.enc_iso88591.setText(_("ISO-8859-1")) self.label_id3v23_join_with.setText(_("Join multiple ID3v2.3 tags with:")) self.id3v23_join_with.setToolTip(_("

Default is \'/\' to maintain compatibility with previous Picard releases.

New alternatives are \';_\' or \'_/_\' or type your own.

")) self.write_id3v1.setText(_("Also include ID3v1 tags in the files")) picard-release-1.3.2/picard/ui/ui_passworddialog.py000066400000000000000000000071251245305550700223600ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_PasswordDialog(object): def setupUi(self, PasswordDialog): PasswordDialog.setObjectName(_fromUtf8("PasswordDialog")) PasswordDialog.setWindowModality(QtCore.Qt.WindowModal) PasswordDialog.resize(378, 246) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(PasswordDialog.sizePolicy().hasHeightForWidth()) PasswordDialog.setSizePolicy(sizePolicy) self.verticalLayout = QtGui.QVBoxLayout(PasswordDialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.info_text = QtGui.QLabel(PasswordDialog) self.info_text.setText(_fromUtf8("")) self.info_text.setWordWrap(True) self.info_text.setObjectName(_fromUtf8("info_text")) self.verticalLayout.addWidget(self.info_text) spacerItem = QtGui.QSpacerItem(20, 60, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.label = QtGui.QLabel(PasswordDialog) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout.addWidget(self.label) self.username = QtGui.QLineEdit(PasswordDialog) self.username.setWindowModality(QtCore.Qt.NonModal) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.username.sizePolicy().hasHeightForWidth()) self.username.setSizePolicy(sizePolicy) self.username.setObjectName(_fromUtf8("username")) self.verticalLayout.addWidget(self.username) self.label_2 = QtGui.QLabel(PasswordDialog) self.label_2.setObjectName(_fromUtf8("label_2")) self.verticalLayout.addWidget(self.label_2) self.password = QtGui.QLineEdit(PasswordDialog) self.password.setEchoMode(QtGui.QLineEdit.Password) self.password.setObjectName(_fromUtf8("password")) self.verticalLayout.addWidget(self.password) self.save_authentication = QtGui.QCheckBox(PasswordDialog) self.save_authentication.setChecked(True) self.save_authentication.setObjectName(_fromUtf8("save_authentication")) self.verticalLayout.addWidget(self.save_authentication) spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem1) self.buttonbox = QtGui.QDialogButtonBox(PasswordDialog) self.buttonbox.setOrientation(QtCore.Qt.Horizontal) self.buttonbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonbox.setObjectName(_fromUtf8("buttonbox")) self.verticalLayout.addWidget(self.buttonbox) self.retranslateUi(PasswordDialog) QtCore.QObject.connect(self.buttonbox, QtCore.SIGNAL(_fromUtf8("rejected()")), PasswordDialog.reject) QtCore.QMetaObject.connectSlotsByName(PasswordDialog) def retranslateUi(self, PasswordDialog): PasswordDialog.setWindowTitle(_("Authentication required")) self.label.setText(_("Username:")) self.label_2.setText(_("Password:")) self.save_authentication.setText(_("Save username and password")) picard-release-1.3.2/picard/ui/ui_tagsfromfilenames.py000066400000000000000000000047261245305550700230500ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_TagsFromFileNamesDialog(object): def setupUi(self, TagsFromFileNamesDialog): TagsFromFileNamesDialog.setObjectName(_fromUtf8("TagsFromFileNamesDialog")) TagsFromFileNamesDialog.resize(487, 368) self.gridlayout = QtGui.QGridLayout(TagsFromFileNamesDialog) self.gridlayout.setMargin(9) self.gridlayout.setSpacing(6) self.gridlayout.setObjectName(_fromUtf8("gridlayout")) self.files = QtGui.QTreeWidget(TagsFromFileNamesDialog) self.files.setAlternatingRowColors(True) self.files.setRootIsDecorated(False) self.files.setObjectName(_fromUtf8("files")) self.gridlayout.addWidget(self.files, 1, 0, 1, 2) self.replace_underscores = QtGui.QCheckBox(TagsFromFileNamesDialog) self.replace_underscores.setObjectName(_fromUtf8("replace_underscores")) self.gridlayout.addWidget(self.replace_underscores, 2, 0, 1, 2) self.buttonbox = QtGui.QDialogButtonBox(TagsFromFileNamesDialog) self.buttonbox.setOrientation(QtCore.Qt.Horizontal) self.buttonbox.setObjectName(_fromUtf8("buttonbox")) self.gridlayout.addWidget(self.buttonbox, 3, 0, 1, 2) self.preview = QtGui.QPushButton(TagsFromFileNamesDialog) self.preview.setObjectName(_fromUtf8("preview")) self.gridlayout.addWidget(self.preview, 0, 1, 1, 1) self.format = QtGui.QComboBox(TagsFromFileNamesDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Policy(7), QtGui.QSizePolicy.Policy(0)) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.format.sizePolicy().hasHeightForWidth()) self.format.setSizePolicy(sizePolicy) self.format.setEditable(True) self.format.setObjectName(_fromUtf8("format")) self.gridlayout.addWidget(self.format, 0, 0, 1, 1) self.retranslateUi(TagsFromFileNamesDialog) QtCore.QMetaObject.connectSlotsByName(TagsFromFileNamesDialog) def retranslateUi(self, TagsFromFileNamesDialog): TagsFromFileNamesDialog.setWindowTitle(_("Convert File Names to Tags")) self.replace_underscores.setText(_("Replace underscores with spaces")) self.preview.setText(_("&Preview")) picard-release-1.3.2/picard/ui/util.py000066400000000000000000000070651245305550700176210ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys from PyQt4 import QtCore, QtGui from picard import config from picard.util import find_existing_path, icontheme class StandardButton(QtGui.QPushButton): OK = 0 CANCEL = 1 HELP = 2 __types = { OK: (N_('&Ok'), 'SP_DialogOkButton'), CANCEL: (N_('&Cancel'), 'SP_DialogCancelButton'), HELP: (N_('&Help'), 'SP_DialogHelpButton'), } def __init__(self, btntype): label = _(self.__types[btntype][0]) args = [label] if sys.platform != 'win32' and sys.platform != 'darwin': iconname = self.__types[btntype][1] if hasattr(QtGui.QStyle, iconname): icon = self.tagger.style().standardIcon(getattr(QtGui.QStyle, iconname)) args = [icon, label] QtGui.QPushButton.__init__(self, *args) # The following code is there to fix # http://tickets.musicbrainz.org/browse/PICARD-417 # In some older version of PyQt/sip it's impossible to connect a signal # emitting an `int` to a slot expecting a `bool`. # By using `enabledSlot` instead we can force python to do the # conversion from int (`state`) to bool. def enabledSlot(func, state): """Calls `func` with `state`.""" func(state) def find_starting_directory(): if config.setting["starting_directory"]: path = config.setting["starting_directory_path"] else: path = config.persist["current_directory"] or QtCore.QDir.homePath() return find_existing_path(unicode(path)) class ButtonLineEdit(QtGui.QLineEdit): def __init__(self, parent=None): QtGui.QLineEdit.__init__(self, parent) self.clear_button = QtGui.QToolButton(self) self.clear_button.setVisible(False) self.clear_button.setCursor(QtCore.Qt.PointingHandCursor) self.clear_button.setFocusPolicy(QtCore.Qt.NoFocus) fallback_icon = icontheme.lookup('edit-clear', icontheme.ICON_SIZE_TOOLBAR) self.clear_button.setIcon(QtGui.QIcon.fromTheme("edit-clear", fallback_icon)) self.clear_button.setStyleSheet( "QToolButton { background: transparent; border: none;} QToolButton QWidget { color: black;}") layout = QtGui.QHBoxLayout(self) layout.addWidget(self.clear_button, 0, QtCore.Qt.AlignRight) layout.setSpacing(0) layout.setMargin(5) self.clear_button.setToolTip(_("Clear entry")) self.clear_button.clicked.connect(self.clear) self.textChanged.connect(self._update_clear_button) self._margins = self.getTextMargins() def _update_clear_button(self, text): self.clear_button.setVisible(text != "") left, top, right, bottom = self._margins self.setTextMargins(left, top, right + self.clear_button.width(), bottom) picard-release-1.3.2/picard/util/000077500000000000000000000000001245305550700166225ustar00rootroot00000000000000picard-release-1.3.2/picard/util/__init__.py000066400000000000000000000302661245305550700207420ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os import ntpath import re import sys import unicodedata if sys.platform == 'win32': from ctypes import windll from time import time from PyQt4 import QtCore from encodings import rot_13 from string import Template # Required for compatibility with lastfmplus which imports this from here rather than loading it direct. from functools import partial from collections import defaultdict class LockableObject(QtCore.QObject): """Read/write lockable object.""" def __init__(self): QtCore.QObject.__init__(self) self.__lock = QtCore.QReadWriteLock() def lock_for_read(self): """Lock the object for read operations.""" self.__lock.lockForRead() def lock_for_write(self): """Lock the object for write operations.""" self.__lock.lockForWrite() def unlock(self): """Unlock the object.""" self.__lock.unlock() _io_encoding = sys.getfilesystemencoding() # The following was adapted from k3b's source code: #// On a glibc system the system locale defaults to ANSI_X3.4-1968 #// It is very unlikely that one would set the locale to ANSI_X3.4-1968 #// intentionally def check_io_encoding(): if _io_encoding == "ANSI_X3.4-1968": from picard import log log.warning(""" System locale charset is ANSI_X3.4-1968 Your system's locale charset (i.e. the charset used to encode filenames) is set to ANSI_X3.4-1968. It is highly unlikely that this has been done intentionally. Most likely the locale is not set at all. An invalid setting will result in problems when creating data projects. To properly set the locale charset make sure the LC_* environment variables are set. Normally the distribution setup tools take care of this. Translation: Picard will have problems with non-english characters in filenames until you change your charset. """) def encode_filename(filename): """Encode unicode strings to filesystem encoding.""" if isinstance(filename, unicode): if os.path.supports_unicode_filenames and sys.platform != "darwin": return filename else: return filename.encode(_io_encoding, 'replace') else: return filename def decode_filename(filename): """Decode strings from filesystem encoding to unicode.""" if isinstance(filename, unicode): return filename else: return filename.decode(_io_encoding) def pathcmp(a, b): return os.path.normcase(a) == os.path.normcase(b) def format_time(ms): """Formats time in milliseconds to a string representation.""" ms = float(ms) if ms == 0: return "?:??" else: return "%d:%02d" % (round(ms / 1000.0) / 60, round(ms / 1000.0) % 60) def sanitize_date(datestr): """Sanitize date format. e.g.: "YYYY-00-00" -> "YYYY" "YYYY- - " -> "YYYY" ... """ date = [] for num in datestr.split("-"): try: num = int(num.strip()) except ValueError: break if num: date.append(num) return ("", "%04d", "%04d-%02d", "%04d-%02d-%02d")[len(date)] % tuple(date) _re_win32_incompat = re.compile(r'["*:<>?|]', re.UNICODE) def replace_win32_incompat(string, repl=u"_"): """Replace win32 filename incompatible characters from ``string`` by ``repl``.""" # Don't replace : with _ for windows drive if sys.platform == "win32" and os.path.isabs(string): drive, rest = ntpath.splitdrive(string) return drive + _re_win32_incompat.sub(repl, rest) else: return _re_win32_incompat.sub(repl, string) _re_non_alphanum = re.compile(r'\W+', re.UNICODE) def strip_non_alnum(string): """Remove all non-alphanumeric characters from ``string``.""" return _re_non_alphanum.sub(u" ", string).strip() _re_slashes = re.compile(r'[\\/]', re.UNICODE) def sanitize_filename(string, repl="_"): return _re_slashes.sub(repl, string) def _reverse_sortname(sortname): """Reverse sortnames.""" chunks = [a.strip() for a in sortname.split(",")] if len(chunks) == 2: return "%s %s" % (chunks[1], chunks[0]) elif len(chunks) == 3: return "%s %s %s" % (chunks[2], chunks[1], chunks[0]) elif len(chunks) == 4: return "%s %s, %s %s" % (chunks[1], chunks[0], chunks[3], chunks[2]) else: return sortname.strip() def translate_from_sortname(name, sortname): """'Translate' the artist name by reversing the sortname.""" for c in name: ctg = unicodedata.category(c) if ctg[0] == "L" and unicodedata.name(c).find("LATIN") == -1: for separator in (" & ", "; ", " and ", " vs. ", " with ", " y "): if separator in sortname: parts = sortname.split(separator) break else: parts = [sortname] separator = "" return separator.join(map(_reverse_sortname, parts)) return name def find_existing_path(path): path = encode_filename(path) while path and not os.path.isdir(path): head, tail = os.path.split(path) if head == path: break path = head return decode_filename(path) def find_executable(*executables): if sys.platform == 'win32': executables = [e + '.exe' for e in executables] paths = [os.path.dirname(sys.executable)] if sys.executable else [] paths += os.environ.get('PATH', '').split(os.pathsep) for path in paths: for executable in executables: f = os.path.join(path, executable) if os.path.isfile(f): return f _mbid_format = Template('$h{8}-$h$l-$h$l-$h$l-$h{12}').safe_substitute(h='[0-9a-fA-F]', l='{4}') _re_mbid_val = re.compile(_mbid_format) def mbid_validate(string): return _re_mbid_val.match(string) def rot13(input): return u''.join(unichr(rot_13.encoding_map.get(ord(c), ord(c))) for c in input) def parse_amazon_url(url): """Extract host and asin from an amazon url. It returns a dict with host and asin keys on success, None else """ r = re.compile(r'^http://(?:www.)?(?P.*?)(?:\:[0-9]+)?/.*/(?P[0-9B][0-9A-Z]{9})(?:[^0-9A-Z]|$)') match = r.match(url) if match is not None: return match.groupdict() return None def throttle(interval): """ Throttle a function so that it will only execute once per ``interval`` (specified in milliseconds). """ mutex = QtCore.QMutex() def decorator(func): def later(): mutex.lock() func(*decorator.args, **decorator.kwargs) decorator.prev = time() decorator.is_ticking = False mutex.unlock() def throttled_func(*args, **kwargs): if decorator.is_ticking: mutex.lock() decorator.args = args decorator.kwargs = kwargs mutex.unlock() return mutex.lock() now = time() r = interval - (now-decorator.prev)*1000.0 if r <= 0: func(*args, **kwargs) decorator.prev = now else: decorator.args = args decorator.kwargs = kwargs QtCore.QTimer.singleShot(r, later) decorator.is_ticking = True mutex.unlock() return throttled_func decorator.prev = 0 decorator.is_ticking = False return decorator def uniqify(seq): """Uniqify a list, preserving order""" # Courtesy of Dave Kirby # See http://www.peterbe.com/plog/uniqifiers-benchmark seen = set() add_seen = seen.add return [x for x in seq if x not in seen and not add_seen(x)] # order is important _tracknum_regexps = ( # search for explicit track number (prefix "track") r"track[\s_-]*(?:no|nr)?[\s_-]*(\d+)", # search for 2-digit number at start of string r"^(\d{2})\D?", # search for 2-digit number at end of string r"\D?(\d{2})$", ) def tracknum_from_filename(base_filename): """Guess and extract track number from filename Returns -1 if none found, the number as integer else """ filename, _ = os.path.splitext(base_filename) for r in _tracknum_regexps: match = re.search(r, filename, re.I) if match: n = int(match.group(1)) if n > 0: return n # find all numbers between 1 and 99 # 4-digit or more numbers are very unlikely to be a track number # smaller number is preferred in any case numbers = sorted([int(n) for n in re.findall(r'\d+', filename) if int(n) <= 99 and int(n) > 0]) if numbers: return numbers[0] return -1 # Provide os.path.samefile equivalent which is missing in Python under Windows if sys.platform == 'win32': def os_path_samefile(p1, p2): ap1 = os.path.abspath(p1) ap2 = os.path.abspath(p2) return ap1 == ap2 else: os_path_samefile = os.path.samefile def is_hidden(filepath): """Test whether a file or directory is hidden. A file is considered hidden if it starts with a dot on non-Windows systems or if it has the "hidden" flag set on Windows.""" name = os.path.basename(os.path.abspath(filepath)) return (name.startswith('.') and sys.platform != 'win32') \ or _has_hidden_attribute(filepath) def _has_hidden_attribute(filepath): if sys.platform != 'win32': return False # FIXME: On OSX detecting hidden files involves more # than just checking for dot files, see # https://stackoverflow.com/questions/284115/cross-platform-hidden-file-detection try: attrs = windll.kernel32.GetFileAttributesW(unicode(filepath)) assert attrs != -1 return bool(attrs & 2) except (AttributeError, AssertionError): return False def linear_combination_of_weights(parts): """Produces a probability as a linear combination of weights Parts should be a list of tuples in the form: [(v0, w0), (v1, w1), ..., (vn, wn)] where vn is a value between 0.0 and 1.0 and wn corresponding weight as a positive number """ total = 0.0 sum_of_products = 0.0 for value, weight in parts: if value < 0.0: raise ValueError, "Value must be greater than or equal to 0.0" if value > 1.0: raise ValueError, "Value must be lesser than or equal to 1.0" if weight < 0: raise ValueError, "Weight must be greater than or equal to 0.0" total += weight sum_of_products += value * weight if total == 0.0: return 0.0 return sum_of_products / total def album_artist_from_path(filename, album, artist): """If album is not set, try to extract album and artist from path """ if not album: dirs = os.path.dirname(filename).replace('\\','/').lstrip('/').split('/') if len(dirs) == 0: return album, artist # Strip disc subdirectory from list if len(dirs) > 0: if re.search(r'(^|\s)(CD|DVD|Disc)\s*\d+(\s|$)', dirs[-1], re.I): del dirs[-1] if len(dirs) > 0: # For clustering assume %artist%/%album%/file or %artist% - %album%/file album = dirs[-1] if ' - ' in album: new_artist, album = album.split(' - ', 1) if not artist: artist = new_artist elif not artist and len(dirs) >= 2: artist = dirs[-2] return album, artist picard-release-1.3.2/picard/util/astrcmp.c000066400000000000000000000110521245305550700204360ustar00rootroot00000000000000/* * Picard, the next-generation MusicBrainz tagger * Copyright (C) 2006 Lukáš Lalinský * Copyright (C) 2003 Benbuck Nason * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /*** * * Approximate string comparison * * This work is based on the Levenshtein Metric or "edit distance", which is * well known, simple, and seems to be unencumbered by any usage restrictions. * For more information on the Levenshtein Distance you can refer to the web, * e.g. http://www.merriampark.com/ld.htm * * Accuracy and speed enhancements could probably be made to this algorithm by * implementing the improvements suggested by such people as Esko Ukkonen, Hal * Berghel & David Roach, and Sun Wu and Udi Manber. * * This has been succesfully compiled using: * Microsoft Visual C++ 6 SP 5 * GNU gcc 3.2 & Cygwin * GNU gcc 3.2 & MinGW * * Benbuck Nason, February 28th, 2003 * ***/ #include #include #include #include /*** * Compute Levenshtein distance. Levenshtein distance, also known as * "edit distance," is a measure of the cost to transform one string * into another. ***/ #define MIN(x, y) (((x) > (y)) ? (y) : (x)) #define MAX(x, y) (((x) > (y)) ? (x) : (y)) #define MATRIX(a, b) matrix[(b) * (len1 + 1) + (a)] float LevenshteinDistance(const Py_UNICODE * s1, int len1, const Py_UNICODE * s2, int len2) { int *matrix, index1, index2; float result; /* Step 1 */ /* Check string lengths */ if (len1 == 0) return 0.0f; if (len2 == 0) return 0.0f; /* Step 2 */ /* Allocate matrix for algorithm and fill it with default values */ matrix = malloc(sizeof(int) * (len1 + 1) * (len2 + 1)); for (index1 = 0; index1 <= len1; index1++) MATRIX(index1, 0) = index1; for (index2 = 0; index2 <= len2; index2++) MATRIX(0, index2) = index2; /* Step 3 */ /* Loop through first string */ for (index1 = 1; index1 <= len1; index1++) { Py_UNICODE s1_current = s1[index1 - 1]; /* Step 4 */ /* Loop through second string */ for (index2 = 1; index2 <= len2; index2++) { Py_UNICODE s2_current = s2[index2 - 1]; /* Step 5 */ /* Calculate cost of this iteration (handles deletion, insertion, and substitution) */ int cost = (s1_current == s2_current) ? 0 : 1; /* Step 6 */ /* Calculate the total cost up to this point */ int above = MATRIX(index1 - 1, index2); int left = MATRIX(index1, index2 - 1); int diagonal = MATRIX(index1 - 1, index2 - 1); int cell = MIN(MIN(above + 1, left + 1), diagonal + cost); /* Step 6a */ /* Also cover transposition. This step is taken from: Berghel, Hal ; Roach, David : "An Extension of Ukkonen's Enhanced Dynamic Programming ASM Algorithm" (http://berghel.net/publications/asm/asm.php) */ if (index1 > 2 && index2 > 2) { int trans = MATRIX(index1 - 2, index2 - 2) + 1; if (s1[index1 - 2] != s2_current) trans++; if (s1_current != s2[index2 - 2]) trans++; if (cell > trans) cell = trans; } MATRIX(index1, index2) = cell; } } /* Step 7 */ /* Return result */ result = ((float)1 - ((float)MATRIX(len1, len2) / (float)MAX(len1, len2))); free(matrix); return result; } static PyObject * astrcmp(PyObject *self, PyObject *args) { PyObject *s1, *s2; float d; const Py_UNICODE *us1, *us2; int len1, len2; PyThreadState *_save; if (!PyArg_ParseTuple(args, "UU", &s1, &s2)) return NULL; us1 = PyUnicode_AS_UNICODE(s1); us2 = PyUnicode_AS_UNICODE(s2); len1 = PyUnicode_GetSize(s1); len2 = PyUnicode_GetSize(s2); Py_UNBLOCK_THREADS d = LevenshteinDistance(us1, len1, us2, len2); Py_BLOCK_THREADS return Py_BuildValue("f", d); } static PyMethodDef AstrcmpMethods[] = { {"astrcmp", astrcmp, METH_VARARGS, "Compute Levenshtein distance"}, {NULL, NULL, 0, NULL} }; PyMODINIT_FUNC initastrcmp(void) { (void)Py_InitModule("astrcmp", AstrcmpMethods); } picard-release-1.3.2/picard/util/bytes2human.py000066400000000000000000000062501245305550700214400ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2013 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import locale """ Helper class to convert bytes to human-readable form It supports i18n through gettext, decimal and binary units. >>> n = 1572864 >>> [binary(n), decimal(n)] ['1.5 MiB', '1.6 MB'] """ # used to force gettextization _BYTES_STRINGS_I18N = ( N_('%s B'), N_('%s kB'), N_('%s KiB'), N_('%s MB'), N_('%s MiB'), N_('%s GB'), N_('%s GiB'), N_('%s TB'), N_('%s TiB'), N_('%s PB'), N_('%s PiB'), ) def decimal(number, scale=1): """ Convert bytes to short human-readable string, decimal mode >>> [decimal(n) for n in [1000, 1024, 15500]] ['1 kB', '1 kB', '15.5 kB'] """ return short_string(int(number), 1000, scale) def binary(number, scale=1): """ Convert bytes to short human-readable string, binary mode >>> [binary(n) for n in [1000, 1024, 15500]] ['1000 B', '1 KiB', '15.1 KiB'] """ return short_string(int(number), 1024, scale) def short_string(number, multiple, scale=1): """ Returns short human-readable string for `number` bytes >>> [short_string(n, 1024, 2) for n in [1000, 1100, 15500]] ['1000 B', '1.07 KiB', '15.14 KiB'] >>> [short_string(n, 1000, 1) for n in [10000, 11000, 1550000]] ['10 kB', '11 kB', '1.6 MB'] """ num, unit = calc_unit(number, multiple) n = int(num) nr = round(num, scale) if n == nr or unit == 'B': fmt = '%d' num = n else: fmt = '%%0.%df' % scale num = nr fmtnum = locale.format(fmt, num) return _("%s " + unit) % fmtnum def calc_unit(number, multiple=1000): """ Calculate rounded number of multiple * bytes, finding best unit >>> calc_unit(12456, 1024) (12.1640625, 'KiB') >>> calc_unit(-12456, 1000) (-12.456, 'kB') >>> calc_unit(0, 1001) Traceback (most recent call last): ... ValueError: multiple parameter has to be 1000 or 1024 """ if number < 0: sign = -1 number = -number else: sign = 1 n = float(number) if multiple == 1000: k, b = 'k', 'B' elif multiple == 1024: k, b = 'K', 'iB' else: raise ValueError('multiple parameter has to be 1000 or 1024') suffixes = ["B"] + [i + b for i in k + "MGTP"] for suffix in suffixes: if n < multiple or suffix == suffixes[-1]: return (sign * n, suffix) else: n /= multiple picard-release-1.3.2/picard/util/cdrom.py000066400000000000000000000074241245305550700203070ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (c) 2004 Robert Kaye # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys if sys.platform == 'win32': from ctypes import windll from PyQt4.QtCore import QFile, QIODevice from picard import config from picard.util import uniqify try: from libdiscid.compat import discid except ImportError: try: import discid except ImportError: discid = None DEFAULT_DRIVES = [] if discid is not None: device = discid.get_default_device() if device: DEFAULT_DRIVES.append(device) LINUX_CDROM_INFO = '/proc/sys/dev/cdrom/info' # if get_cdrom_drives() lists ALL drives available on the machine if sys.platform == 'win32': AUTO_DETECT_DRIVES = True elif sys.platform == 'linux2' and QFile.exists(LINUX_CDROM_INFO): AUTO_DETECT_DRIVES = True else: # There might be more drives we couldn't detect # setting uses a text field instead of a drop-down AUTO_DETECT_DRIVES = False def get_cdrom_drives(): """List available disc drives on the machine """ # add default drive from libdiscid to the list drives = list(DEFAULT_DRIVES) if sys.platform == 'win32': GetLogicalDrives = windll.kernel32.GetLogicalDrives GetDriveType = windll.kernel32.GetDriveTypeA DRIVE_CDROM = 5 mask = GetLogicalDrives() for i in range(26): if mask >> i & 1: drive = chr(i + ord("A")) + ":" if GetDriveType(drive) == DRIVE_CDROM: drives.append(drive) elif sys.platform == 'linux2' and QFile.exists(LINUX_CDROM_INFO): # Read info from /proc/sys/dev/cdrom/info cdinfo = QFile(LINUX_CDROM_INFO) if cdinfo.open(QIODevice.ReadOnly | QIODevice.Text): drive_names = [] drive_audio_caps = [] line = unicode(cdinfo.readLine()) while line: if ":" in line: key, values = line.split(':') if key == 'drive name': drive_names = values.split() elif key == 'Can play audio': drive_audio_caps = [v == '1' for v in values.split()] break # no need to continue past this line line = unicode(cdinfo.readLine()) # Show only drives that are capable of playing audio for index, drive in enumerate(drive_names): if drive_audio_caps[index]: device = u'/dev/%s' % drive symlink_target = QFile.symLinkTarget(device) if symlink_target != '': device = symlink_target drives.append(device) else: for device in config.setting["cd_lookup_device"].split(","): # Need to filter out empty strings, # particularly if the device list is empty if device.strip() != u'': drives.append(device.strip()) # make sure no drive is listed twice (given by multiple sources) return sorted(uniqify(drives)) picard-release-1.3.2/picard/util/devutil/000077500000000000000000000000001245305550700202765ustar00rootroot00000000000000picard-release-1.3.2/picard/util/devutil/__init__.py000066400000000000000000000066571245305550700224250ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2014 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. def printable_node(node, indent=0): """ Print a XmlNode so output can used in test scripts Useful to debug mbxml.py mostly and to create unit tests using "real" nodes. Exemple of usage: from picard.util.devutil import printable_node from picard import log def _translate_artist_node(node): log.debug(printable_node(node)) ... will output to debug log something like: D: 01:35:56 XmlNode( attribs={u'id': u'28503ab7-8bf2-4666-a7bd-2644bfc7cb1d'}, children={ u'name': [XmlNode(text=u'Dream Theater')], u'alias_list': [XmlNode( attribs={u'count': u'3'}, children={u'alias': [ XmlNode( text=u'Dream Theatre', attribs={u'sort_name': u'Dream Theatre'} ), XmlNode( text=u'DreamTheater', attribs={u'sort_name': u'DreamTheater'} ), XmlNode( text=u'Majesty', attribs={u'sort_name': u'Majesty'} ) ]} )], u'sort_name': [XmlNode(text=u'Dream Theater')] } ) """ indentstr = u" "*4 def indented(front, l, back, indent): ind0 = indentstr*indent ind1 = indentstr*(indent+1) if not l: return front + back if len(l) > 1: return front + u"\n" + u',\n'.join([ind1 + x for x in l]) + u"\n" + ind0 + back else: return front + l[0] + back el = [] if node.text: el.append(u'text=' + repr(node.text).decode('unicode-escape')) if node.attribs: l = [] for k,v in node.attribs.iteritems(): l.append(repr(k).decode('unicode-escape') + u': ' + repr(v).decode('unicode-escape')) el.append(indented(u'attribs={', l, u'}', indent+1)) if node.children: l = [] for k, v in node.children.iteritems(): l.append( indented( repr(k).decode('unicode-escape') + u': [', [printable_node(x, indent+3) for x in v], u']', indent+2 ) ) el.append(indented(u'children={', l, u'}', indent+1)) return indented(u'XmlNode(', el, u')', indent) picard-release-1.3.2/picard/util/filenaming.py000066400000000000000000000325021245305550700213070ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import math import os import re import struct import sys import unicodedata from picard.util import _io_encoding, decode_filename, encode_filename def _get_utf16_length(text): """Returns the number of code points used by a unicode object in its UTF-16 representation. """ if isinstance(text, str): return len(text) # if this is a narrow Python build, len will in fact return exactly # what we're looking for if sys.maxunicode == 0xFFFF: return len(text) # otherwise, encode the string in UTF-16 using the system's endianness, # and divide the resulting length by 2 return len(text.encode("utf-16%ce" % sys.byteorder[0])) // 2 def _shorten_to_utf16_length(text, length): """Truncates a unicode object to the given number of UTF-16 code points. """ assert isinstance(text, unicode), "This function only works on unicode" # if this is a narrow Python build, regular slicing will do exactly # what we're looking for if sys.maxunicode == 0xFFFF: shortened = text[:length] # before returning, we need to check if we didn't cut in the middle # of a surrogate pair last = shortened[-1:] if last and 0xD800 <= ord(last) <= 0xDBFF: # it's a leading surrogate alright return shortened[:-1] # else... return shortened # otherwise, encode the string in UTF-16 using the system's endianness, # and shorten by twice the length enc = "utf-16%ce" % sys.byteorder[0] shortened = text.encode(enc)[:length * 2] # if we hit a surrogate pair, get rid of the last codepoint last = shortened[-2:] if last and 0xD800 <= struct.unpack("=H", last)[0] <= 0xDBFF: shortened = shortened[:-2] return shortened.decode(enc) def _shorten_to_utf16_nfd_length(text, length): text = unicodedata.normalize('NFD', text) newtext = _shorten_to_utf16_length(text, length) # if the first cut-off character was a combining one, remove our last try: if unicodedata.combining(text[len(newtext)]): newtext = newtext[:-1] except IndexError: pass return unicodedata.normalize('NFC', newtext) _re_utf8 = re.compile(r'^utf([-_]?8)$', re.IGNORECASE) def _shorten_to_bytes_length(text, length): """Truncates a unicode object to the given number of bytes it would take when encoded in the "filesystem encoding". """ assert isinstance(text, unicode), "This function only works on unicode" raw = encode_filename(text) # maybe there's no need to truncate anything if len(raw) <= length: return text # or maybe there's nothing multi-byte here if len(raw) == len(text): return text[:length] # if we're dealing with utf-8, we can use an efficient algorithm # to deal with character boundaries if _re_utf8.match(_io_encoding): i = length # a UTF-8 intermediate byte starts with the bits 10xxxxxx, # so ord(char) & 0b11000000 = 0b10000000 while i > 0 and (ord(raw[i]) & 0xC0) == 0x80: i -= 1 return decode_filename(raw[:i]) # finally, a brute force approach i = length while i > 0: try: return decode_filename(raw[:i]) except UnicodeDecodeError: pass i -= 1 # hmm. we got here? return u"" SHORTEN_BYTES, SHORTEN_UTF16, SHORTEN_UTF16_NFD = 0, 1, 2 def shorten_filename(filename, length, mode): """Truncates a filename to the given number of thingies, as implied by `mode`. """ if isinstance(filename, str): return filename[:length] if mode == SHORTEN_BYTES: return _shorten_to_bytes_length(filename, length) if mode == SHORTEN_UTF16: return _shorten_to_utf16_length(filename, length) if mode == SHORTEN_UTF16_NFD: return _shorten_to_utf16_nfd_length(filename, length) def shorten_path(path, length, mode): """Reduce path nodes' length to given limit(s). path: Absolute or relative path to shorten. length: Maximum number of code points / bytes allowed in a node. mode: One of SHORTEN_BYTES, SHORTEN_UTF16, SHORTEN_UTF16_NFD. """ shorten = lambda n, l: n and shorten_filename(n, l, mode).strip() or u"" dirpath, filename = os.path.split(path) fileroot, ext = os.path.splitext(filename) return os.path.join( os.path.join(*[shorten(node, length) for node in dirpath.split(os.path.sep)]), shorten(fileroot, length - len(ext)) + ext ) def _shorten_to_utf16_ratio(text, ratio): """Shortens the string to the given ratio (and strips it).""" length = _get_utf16_length(text) limit = max(1, int(math.floor(length / ratio))) if isinstance(text, str): return text[:limit].strip() else: return _shorten_to_utf16_length(text, limit).strip() def _make_win_short_filename(relpath, reserved=0): """Shorten a relative file path according to WinAPI quirks. relpath: The file's path. reserved: Number of characters reserved for the parent path to be joined with, e.g. 3 if it will be joined with "X:\", respectively 5 for "X:\y\". (note the inclusion of the final backslash) """ # See: # http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx # # The MAX_PATH is 260 characters, with this possible format for a file: # "X:\<244-char dir path>\<11-char filename>". # Our constraints: # the entire path's length MAX_FILEPATH_LEN = 259 # the entire parent directory path's length, *excluding* the final separator MAX_DIRPATH_LEN = 247 # a single node's length (this seems to be the case for older NTFS) MAX_NODE_LEN = 226 # to make predictable directory paths we need to fit the directories in # MAX_DIRPATH_LEN, and truncate the filename to whatever's left remaining = MAX_DIRPATH_LEN - reserved # to make things more readable... shorten = lambda p, l: shorten_path(p, l, mode=SHORTEN_UTF16) xlength = _get_utf16_length # shorten to MAX_NODE_LEN from the beginning relpath = shorten(relpath, MAX_NODE_LEN) dirpath, filename = os.path.split(relpath) # what if dirpath is already the right size? dplen = xlength(dirpath) if dplen <= remaining: filename_max = MAX_FILEPATH_LEN - (reserved + dplen + 1) # the final separator filename = shorten(filename, filename_max) return os.path.join(dirpath, filename) # compute the directory path and the maximum number of characters # in a filename, and cache them try: computed = _make_win_short_filename._computed except AttributeError: computed = _make_win_short_filename._computed = {} try: finaldirpath, filename_max = computed[(dirpath, reserved)] except KeyError: dirnames = dirpath.split(os.path.sep) # allocate space for the separators, # but don't include the final one remaining -= len(dirnames) - 1 # make sure we can have at least single-character dirnames average = float(remaining) / len(dirnames) if average < 1: # TODO: a nice exception raise IOError("Path too long. You need to move renamed files \ to a different directory.") # try to reduce directories exceeding average with a ratio proportional # to how much they exceed with; if not possible, reduce all dirs # proportionally to their initial length shortdirnames = [dn for dn in dirnames if len(dn) <= average] totalchars = sum(map(xlength, dirnames)) shortdirchars = sum(map(xlength, shortdirnames)) # do we have at least 1 char for longdirs? if remaining > shortdirchars + len(dirnames) - len(shortdirnames): ratio = float(totalchars - shortdirchars) / (remaining - shortdirchars) for i, dn in enumerate(dirnames): if len(dn) > average: dirnames[i] = _shorten_to_utf16_ratio(dn, ratio) else: ratio = float(totalchars) / remaining dirnames = [_shorten_to_utf16_ratio(dn, ratio) for dn in dirnames] # here it is: finaldirpath = os.path.join(*dirnames) # did we win back some chars from .floor()s and .strip()s? recovered = remaining - sum(map(xlength, dirnames)) # so how much do we have left for the filename? filename_max = MAX_FILEPATH_LEN - MAX_DIRPATH_LEN - 1 + recovered # ^ the final separator # and don't forget to cache computed[(dirpath, reserved)] = (finaldirpath, filename_max) # finally... filename = shorten(filename, filename_max) return os.path.join(finaldirpath, filename) def _get_mount_point(target): """Finds the target's mountpoint.""" # and caches it for future lookups try: mounts = _get_mount_point._mounts except AttributeError: mounts = _get_mount_point._mounts = {} try: mount = mounts[target] except KeyError: mount = target while mount and not os.path.ismount(mount): mount = os.path.dirname(mount) mounts[target] = mount return mount # NOTE: this could be merged with the function above, and get all needed info # in a single call, returning the filesystem type as well. (but python's # posix.statvfs_result doesn't implement f_fsid) def _get_filename_limit(target): """Finds the maximum filename length under the given directory.""" # and caches it try: limits = _get_filename_limit._limits except AttributeError: limits = _get_filename_limit._limits = {} try: limit = limits[target] except KeyError: # we need to call statvfs on an existing target d = target while not os.path.exists(d): d = os.path.dirname(d) # XXX http://bugs.python.org/issue18695 try: limit = os.statvfs(d).f_namemax except UnicodeEncodeError: limit = os.statvfs(d.encode(_io_encoding)).f_namemax limits[target] = limit return limit def make_short_filename(basedir, relpath, win_compat=False, relative_to=""): """Shorten a filename's path to proper limits. basedir: Absolute path of the base directory where files will be moved. relpath: File path, relative from the base directory. win_compat: Windows is quirky. relative_to: An ancestor directory of basedir, against which win_compat will be applied. """ # only deal with absolute paths. it saves a lot of grief, # and is the right thing to do, even for renames. basedir = os.path.abspath(basedir) # also, make sure the relative path is clean relpath = os.path.normpath(relpath) if win_compat and relative_to: relative_to = os.path.abspath(relative_to) assert basedir.startswith(relative_to) and \ basedir.split(relative_to)[1][:1] in (os.path.sep, ''), \ "`relative_to` must be an ancestor of `basedir`" # always strip the relpath parts relpath = os.path.join(*[part.strip() for part in relpath.split(os.path.sep)]) # if we're on windows, delegate the work to a windows-specific function if sys.platform == "win32": reserved = len(basedir) if not basedir.endswith(os.path.sep): reserved += 1 return _make_win_short_filename(relpath, reserved) # if we're being windows compatible, figure out how much # needs to be reserved for the basedir part if win_compat: # if a relative ancestor wasn't provided, # use the basedir's mount point if not relative_to: relative_to = _get_mount_point(basedir) # if it's root, presume the parent will be copied over # to windows, and hope for the best if relative_to == os.path.sep: relative_to = os.path.dirname(basedir) reserved = len(basedir) - len(relative_to) + 3 + 1 # the drive name ^ + ^ the final separator relpath = _make_win_short_filename(relpath, reserved) # on *nix we can consider there is no path limit, but there is # a filename length limit. if sys.platform == "darwin": # on OS X (i.e. HFS+), this is expressed in UTF-16 code points, # in NFD normalization form relpath = shorten_path(relpath, 255, mode=SHORTEN_UTF16_NFD) else: # on everything else the limit is expressed in bytes, # and filesystem-dependent limit = _get_filename_limit(basedir) relpath = shorten_path(relpath, limit, mode=SHORTEN_BYTES) return relpath picard-release-1.3.2/picard/util/icontheme.py000066400000000000000000000042351245305550700211530ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import os.path from PyQt4 import QtGui if sys.platform == 'win32': _search_paths = [] else: _search_paths = [ os.path.expanduser('~/.icons'), os.path.join(os.environ.get('XDG_DATA_DIRS', '/usr/share'), 'icons'), '/usr/share/pixmaps', ] if 'GNOME_DESKTOP_SESSION_ID' in os.environ: _current_theme = os.popen('gconftool-2 -g /desktop/gnome/interface/icon_theme').read().strip() or None elif os.environ.get('KDE_FULL_SESSION'): _current_theme = os.popen("kreadconfig --file kdeglobals --group Icons --key Theme --default crystalsvg").read().strip() or None else: _current_theme = None ICON_SIZE_MENU = ('16x16',) ICON_SIZE_TOOLBAR = ('22x22',) ICON_SIZE_ALL = ('22x22', '16x16') def lookup(name, size=ICON_SIZE_ALL): icon = QtGui.QIcon() if _current_theme: for path in _search_paths: for subdir in ('actions', 'places', 'devices'): fullpath = os.path.join(path, _current_theme, size[0], subdir, name) if os.path.exists(fullpath + '.png'): icon.addFile(fullpath + '.png') for s in size[1:]: icon.addFile(os.path.join(path, _current_theme, s, subdir, name) + '.png') return icon for s in size: icon.addFile('/'.join([':', 'images', s, name]) + '.png') return icon picard-release-1.3.2/picard/util/imageinfo.py000066400000000000000000000074641245305550700211450ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2014 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import StringIO import struct class IdentificationError(Exception): pass class NotEnoughData(IdentificationError): pass class UnrecognizedFormat(IdentificationError): pass class UnexpectedError(IdentificationError): pass def identify(data): """Parse data for jpg, gif, png metadata If successfully recognized, it returns a tuple with: - width - height - mimetype - extension - data length Exceptions: - `NotEnoughData` if data has less than 16 bytes. - `UnrecognizedFormat` if data isn't recognized as a known format. - `UnexpectedError` if unhandled cases (shouldn't happen). - `IdentificationError` is parent class for all preceding exceptions. """ datalen = len(data) if datalen < 16: raise NotEnoughData('Not enough data') w = -1 h = -1 mime = '' extension = '' # http://en.wikipedia.org/wiki/Graphics_Interchange_Format if data[:6] in ('GIF87a', 'GIF89a'): w, h = struct.unpack('LL', data[16:24]) mime = 'image/png' extension = '.png' # http://en.wikipedia.org/wiki/JPEG elif data[:2] == '\xFF\xD8': # Start Of Image (SOI) marker jpeg = StringIO.StringIO(data) # skip SOI jpeg.read(2) b = jpeg.read(1) try: while (b and ord(b) != 0xDA): # Start Of Scan (SOS) while (ord(b) != 0xFF): b = jpeg.read(1) while (ord(b) == 0xFF): b = jpeg.read(1) if ord(b) in (0xC0, 0xC1, 0xC2, 0xC5, 0xC6, 0xC7, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE, 0xCF): jpeg.read(2) # parameter length (2 bytes) jpeg.read(1) # data precision (1 byte) h, w = struct.unpack('>HH', jpeg.read(4)) mime = 'image/jpeg' extension = '.jpg' break else: # read 2 bytes as integer length = int(struct.unpack('>H', jpeg.read(2))[0]) # skip data jpeg.read(length - 2) b = jpeg.read(1) except struct.error: pass except ValueError: pass # PDF elif data[:4] == '%PDF': h, w = 0, 0 mime = 'application/pdf' extension = '.pdf' else: raise UnrecognizedFormat('Unrecognized image data') # this shouldn't happen if w == -1 or h == -1 or mime == '' or extension == '': raise UnexpectedError("Unexpected error: w=%d h=%d mime=%s extension=%s" % (w, h, mime, extension)) return (int(w), int(h), mime, extension, datalen) picard-release-1.3.2/picard/util/tags.py000066400000000000000000000073641245305550700201440ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. TAG_NAMES = { 'album': N_('Album'), 'artist': N_('Artist'), 'title': N_('Title'), 'date': N_('Date'), 'originaldate': N_('Original Release Date'), 'originalyear': N_('Original Year'), 'albumartist': N_('Album Artist'), 'tracknumber': N_('Track Number'), 'totaltracks': N_('Total Tracks'), 'discnumber': N_('Disc Number'), 'totaldiscs': N_('Total Discs'), 'albumartistsort': N_('Album Artist Sort Order'), 'artistsort': N_('Artist Sort Order'), 'titlesort': N_('Title Sort Order'), 'albumsort': N_('Album Sort Order'), 'composersort': N_('Composer Sort Order'), 'asin': N_('ASIN'), 'grouping': N_('Grouping'), 'isrc': N_('ISRC'), 'mood': N_('Mood'), 'bpm': N_('BPM'), 'copyright': N_('Copyright'), 'license': N_('License'), 'composer': N_('Composer'), 'writer': N_('Writer'), 'conductor': N_('Conductor'), 'lyricist': N_('Lyricist'), 'arranger': N_('Arranger'), 'producer': N_('Producer'), 'engineer': N_('Engineer'), 'subtitle': N_('Subtitle'), 'discsubtitle': N_('Disc Subtitle'), 'remixer': N_('Remixer'), 'musicbrainz_recordingid': N_('MusicBrainz Recording Id'), 'musicbrainz_trackid': N_('MusicBrainz Track Id'), 'musicbrainz_albumid': N_('MusicBrainz Release Id'), 'musicbrainz_artistid': N_('MusicBrainz Artist Id'), 'musicbrainz_albumartistid': N_('MusicBrainz Release Artist Id'), 'musicbrainz_workid': N_('MusicBrainz Work Id'), 'musicbrainz_releasegroupid': N_('MusicBrainz Release Group Id'), 'musicbrainz_discid': N_('MusicBrainz Disc Id'), 'musicip_puid': N_('MusicIP PUID'), 'musicip_fingerprint': N_('MusicIP Fingerprint'), 'acoustid_id': N_('AcoustID'), 'acoustid_fingerprint': N_('AcoustID Fingerprint'), 'discid': N_('Disc Id'), 'website': N_('Artist Website'), 'compilation': N_('Compilation (iTunes)'), 'comment:': N_('Comment'), 'genre': N_('Genre'), 'encodedby': N_('Encoded By'), 'encodersettings': N_('Encoder Settings'), 'performer:': N_('Performer'), 'releasetype': N_('Release Type'), 'releasestatus': N_('Release Status'), 'releasecountry': N_('Release Country'), 'label': N_('Record Label'), 'barcode': N_('Barcode'), 'catalognumber': N_('Catalog Number'), 'djmixer': N_('DJ-Mixer'), 'media': N_('Media'), 'lyrics': N_('Lyrics'), 'mixer': N_('Mixer'), 'language': N_('Language'), 'script': N_('Script'), '~length': N_('Length'), '~rating': N_('Rating'), 'artists': N_('Artists'), 'work': N_('Work'), } PRESERVED_TAGS = [ "~bitrate", "~bits_per_sample", "~format", "~channels", "~sample_rate", "~dirname", "~filename", "~extension", ] def display_tag_name(name): desc = '' if ':' in name: name, desc = name.split(':', 1) name = TAG_NAMES.get(name + ':', TAG_NAMES.get(name, name)) if desc: return '%s [%s]' % (_(name), desc) else: return _(name) picard-release-1.3.2/picard/util/textencoding.py000066400000000000000000000616411245305550700216770ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # This modules provides functionality for simplifying unicode strings. # The unicode character set (of over 1m codepoints and 24,000 characters) includes: # Normal ascii (latin) non-accented characters # Combined latin characters e.g. ae in normal usage # Compatibility combined latin characters (retained for compatibility with other character sets) # These can look very similar to normal characters and can be confusing for searches, sort orders etc. # Non-latin (e.g. japanese, greek, hebrew etc.) characters # Both latin and non-latin characters can be accented. Accents can be either: # Provided by separate nonspacing_mark characters which are visually overlaid (visually 1 character is actually 2); or # Integrated accented characters (i.e. non-accented characters combined with a nonspace_mark into a single character) # Again these can be confusing for searches, sort orders etc. # Punctuation can also be confusing in unicode e.g. several types of single or double quote mark. # For latin script: # Combined characters, accents and punctuation can be visually similar but look different to search engines, # sort orders etc. and the number of ways to use similar looking characters can (does) result in inconsistent # usage inside Music metadata. # # Simplifying # the unicode character sets by many-to-one mappings can improve consistency and reduce confusion, # however sometimes the choice of specific characters can be a deliberate part of an album, song title or artist name # (and should not therefore be changed without careful thought) and occasionally the choice of characters can be # malicious (i.e. to defeat firewalls or spam filters or to appear to be something else). # # Finally, given the size of the unicode character set, fonts are unlikely to display all characters, # making simplification a necessity. # # Simplification may also be needed to make tags conform to ISO-8859-1 (extended ascii) or to make tags or filenames # into ascii, perhaps because the file system or player cannot support unicode. # # Non-latin scripts may also need to be converted to latin scripts through: # Translation (e.g. hebrew word for mother is translated to "mother"); or # Transliteration (e.g. the SOUND of the hebrew letter or word is spelt out in latin) # These are non-trivial, and the software to do these is far from comprehensive. # This module provides utility functions to enable simplification of latin and punctuation unicode: # 1. simplify compatibility characters; # 2. split combined characters; # 3. remove accents (entirely or if not in ISO-8859-1 as applicable); # 4. replace remaining non-ascii or non-ISO-8859-1 characters with a default character # This module also provides an extension infrastructure to allow translation and / or transliteration plugins to be added. import re import unicodedata import codecs from functools import partial ######################### LATIN SIMPLIFICATION ########################### # The translation tables for punctuation and latin combined-characters are taken from # http://unicode.org/repos/cldr/trunk/common/transforms/Latin-ASCII.xml # Various bugs and mistakes in this have been ironed out during testing. def _re_any(iterable): return re.compile('([' + ''.join(iterable) + '])', re.UNICODE) _additional_compatibility = { u"\u0276": u"Œ", # LATIN LETTER SMALL CAPITAL OE u"\u1D00": u"A", # LATIN LETTER SMALL CAPITAL A u"\u1D01": u"Æ", # LATIN LETTER SMALL CAPITAL AE u"\u1D04": u"C", # LATIN LETTER SMALL CAPITAL C u"\u1D05": u"D", # LATIN LETTER SMALL CAPITAL D u"\u1D07": u"E", # LATIN LETTER SMALL CAPITAL E u"\u1D0A": u"J", # LATIN LETTER SMALL CAPITAL J u"\u1D0B": u"K", # LATIN LETTER SMALL CAPITAL K u"\u1D0D": u"M", # LATIN LETTER SMALL CAPITAL M u"\u1D0F": u"O", # LATIN LETTER SMALL CAPITAL O u"\u1D18": u"P", # LATIN LETTER SMALL CAPITAL P u"\u1D1B": u"T", # LATIN LETTER SMALL CAPITAL T u"\u1D1C": u"U", # LATIN LETTER SMALL CAPITAL U u"\u1D20": u"V", # LATIN LETTER SMALL CAPITAL V u"\u1D21": u"W", # LATIN LETTER SMALL CAPITAL W u"\u1D22": u"Z", # LATIN LETTER SMALL CAPITAL Z u"\u3007": u"0", # IDEOGRAPHIC NUMBER ZERO u"\u00A0": u" ", # NO-BREAK SPACE u"\u3000": u" ", # IDEOGRAPHIC SPACE (from ‹character-fallback›) u"\u2033": u"”", # DOUBLE PRIME } _re_additional_compatibility = _re_any(_additional_compatibility.keys()) def unicode_simplify_compatibility(string): interim = _re_additional_compatibility.sub(lambda m: _additional_compatibility[m.group(0)], string) return unicodedata.normalize("NFKC", interim) _simplify_punctuation = { u"\u013F": u"L", # LATIN CAPITAL LETTER L WITH MIDDLE DOT (compat) u"\u0140": u"l", # LATIN SMALL LETTER L WITH MIDDLE DOT (compat) u"\u2018": u"'", # LEFT SINGLE QUOTATION MARK (from ‹character-fallback›) u"\u2019": u"'", # RIGHT SINGLE QUOTATION MARK (from ‹character-fallback›) u"\u201A": u"'", # SINGLE LOW-9 QUOTATION MARK (from ‹character-fallback›) u"\u201B": u"'", # SINGLE HIGH-REVERSED-9 QUOTATION MARK (from ‹character-fallback›) u"\u201C": u"\"", # LEFT DOUBLE QUOTATION MARK (from ‹character-fallback›) u"\u201D": u"\"", # RIGHT DOUBLE QUOTATION MARK (from ‹character-fallback›) u"\u201E": u"\"", # DOUBLE LOW-9 QUOTATION MARK (from ‹character-fallback›) u"\u201F": u"\"", # DOUBLE HIGH-REVERSED-9 QUOTATION MARK (from ‹character-fallback›) u"\u2032": u"'", # PRIME u"\u2033": u"\"", # DOUBLE PRIME u"\u301D": u"\"", # REVERSED DOUBLE PRIME QUOTATION MARK u"\u301E": u"\"", # DOUBLE PRIME QUOTATION MARK u"\u00AB": u"<<", # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (from ‹character-fallback›) u"\u00BB": u">>", # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (from ‹character-fallback›) u"\u2039": u"<", # SINGLE LEFT-POINTING ANGLE QUOTATION MARK u"\u203A": u">", # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK u"\u00AD": u"", # SOFT HYPHEN (from ‹character-fallback›) u"\u2010": u"-", # HYPHEN (from ‹character-fallback›) u"\u2011": u"-", # NON-BREAKING HYPHEN (from ‹character-fallback›) u"\u2012": u"-", # FIGURE DASH (from ‹character-fallback›) u"\u2013": u"-", # EN DASH (from ‹character-fallback›) u"\u2014": u"-", # EM DASH (from ‹character-fallback›) u"\u2015": u"-", # HORIZONTAL BAR (from ‹character-fallback›) u"\uFE31": u"|", # PRESENTATION FORM FOR VERTICAL EM DASH (compat) u"\uFE32": u"|", # PRESENTATION FORM FOR VERTICAL EN DASH (compat) u"\uFE58": u"-", # SMALL EM DASH (compat) u"\u2016": u"||", # DOUBLE VERTICAL LINE u"\u2044": u"/", # FRACTION SLASH (from ‹character-fallback›) u"\u2045": u"[", # LEFT SQUARE BRACKET WITH QUILL u"\u2046": u"]", # RIGHT SQUARE BRACKET WITH QUILL u"\u204E": u"*", # LOW ASTERISK u"\u3008": u"<", # LEFT ANGLE BRACKET u"\u3009": u">", # RIGHT ANGLE BRACKET u"\u300A": u"<<", # LEFT DOUBLE ANGLE BRACKET u"\u300B": u">>", # RIGHT DOUBLE ANGLE BRACKET u"\u3014": u"[", # LEFT TORTOISE SHELL BRACKET u"\u3015": u"]", # RIGHT TORTOISE SHELL BRACKET u"\u3018": u"[", # LEFT WHITE TORTOISE SHELL BRACKET u"\u3019": u"]", # RIGHT WHITE TORTOISE SHELL BRACKET u"\u301A": u"[", # LEFT WHITE SQUARE BRACKET u"\u301B": u"]", # RIGHT WHITE SQUARE BRACKET u"\uFE11": u",", # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA (compat) u"\uFE12": u".", # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP (compat) u"\uFE39": u"[", # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET (compat) u"\uFE3A": u"]", # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET (compat) u"\uFE3D": u"<<", # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET (compat) u"\uFE3E": u">>", # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET (compat) u"\uFE3F": u"<", # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET (compat) u"\uFE40": u">", # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET (compat) u"\uFE51": u",", # SMALL IDEOGRAPHIC COMMA (compat) u"\uFE5D": u"[", # SMALL LEFT TORTOISE SHELL BRACKET (compat) u"\uFE5E": u"]", # SMALL RIGHT TORTOISE SHELL BRACKET (compat) u"\uFF5F": u"((", # FULLWIDTH LEFT WHITE PARENTHESIS (compat)(from ‹character-fallback›) u"\uFF60": u"))", # FULLWIDTH RIGHT WHITE PARENTHESIS (compat)(from ‹character-fallback›) u"\uFF61": u".", # HALFWIDTH IDEOGRAPHIC FULL STOP (compat) u"\uFF64": u",", # HALFWIDTH IDEOGRAPHIC COMMA (compat) u"\u2212": u"-", # MINUS SIGN (from ‹character-fallback›) u"\u2215": u"/", # DIVISION SLASH (from ‹character-fallback›) u"\u2216": u"\\", # SET MINUS (from ‹character-fallback›) u"\u2223": u"|", # DIVIDES (from ‹character-fallback›) u"\u2225": u"||", # PARALLEL TO (from ‹character-fallback›) u"\u226A": u"<<", # MUCH LESS-THAN u"\u226B": u">>", # MUCH GREATER-THAN u"\u2985": u"((", # LEFT WHITE PARENTHESIS u"\u2986": u"))", # RIGHT WHITE PARENTHESIS u"\u200B": u"", # Zero Width Space } _re_simplify_punctuation = _re_any(_simplify_punctuation.keys()) def unicode_simplify_punctuation(string): return _re_simplify_punctuation.sub(lambda m: _simplify_punctuation[m.group(0)], string) _simplify_combinations = { u"\u00C6": u"AE", # LATIN CAPITAL LETTER AE (from ‹character-fallback›) u"\u00D0": u"D", # LATIN CAPITAL LETTER ETH u"\u00D8": u"OE", # LATIN CAPITAL LETTER O WITH STROKE (see https://en.wikipedia.org/wiki/%C3%98) u"\u00DE": u"TH", # LATIN CAPITAL LETTER THORN u"\u00DF": u"ss", # LATIN SMALL LETTER SHARP S (from ‹character-fallback›) u"\u00E6": u"ae", # LATIN SMALL LETTER AE (from ‹character-fallback›) u"\u00F0": u"d", # LATIN SMALL LETTER ETH u"\u00F8": u"oe", # LATIN SMALL LETTER O WITH STROKE (see https://en.wikipedia.org/wiki/%C3%98) u"\u00FE": u"th", # LATIN SMALL LETTER THORN u"\u0110": u"D", # LATIN CAPITAL LETTER D WITH STROKE u"\u0111": u"d", # LATIN SMALL LETTER D WITH STROKE u"\u0126": u"H", # LATIN CAPITAL LETTER H WITH STROKE u"\u0127": u"h", # LATIN CAPITAL LETTER H WITH STROKE u"\u0131": u"i", # LATIN SMALL LETTER DOTLESS I u"\u0138": u"q", # LATIN SMALL LETTER KRA (collates with q in DUCET) u"\u0141": u"L", # LATIN CAPITAL LETTER L WITH STROKE u"\u0142": u"l", # LATIN SMALL LETTER L WITH STROKE u"\u0149": u"'n", # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (from ‹character-fallback›) u"\u014A": u"N", # LATIN CAPITAL LETTER ENG u"\u014B": u"n", # LATIN SMALL LETTER ENG u"\u0152": u"OE", # LATIN CAPITAL LIGATURE OE (from ‹character-fallback›) u"\u0153": u"oe", # LATIN SMALL LIGATURE OE (from ‹character-fallback›) u"\u0166": u"T", # LATIN CAPITAL LETTER T WITH STROKE u"\u0167": u"t", # LATIN SMALL LETTER T WITH STROKE u"\u0180": u"b", # LATIN SMALL LETTER B WITH STROKE u"\u0181": u"B", # LATIN CAPITAL LETTER B WITH HOOK u"\u0182": u"B", # LATIN CAPITAL LETTER B WITH TOPBAR u"\u0183": u"b", # LATIN SMALL LETTER B WITH TOPBAR u"\u0187": u"C", # LATIN CAPITAL LETTER C WITH HOOK u"\u0188": u"c", # LATIN SMALL LETTER C WITH HOOK u"\u0189": u"D", # LATIN CAPITAL LETTER AFRICAN D u"\u018A": u"D", # LATIN CAPITAL LETTER D WITH HOOK u"\u018B": u"D", # LATIN CAPITAL LETTER D WITH TOPBAR u"\u018C": u"d", # LATIN SMALL LETTER D WITH TOPBAR u"\u0190": u"E", # LATIN CAPITAL LETTER OPEN E u"\u0191": u"F", # LATIN CAPITAL LETTER F WITH HOOK u"\u0192": u"f", # LATIN SMALL LETTER F WITH HOOK u"\u0193": u"G", # LATIN CAPITAL LETTER G WITH HOOK u"\u0195": u"hv", # LATIN SMALL LETTER HV u"\u0196": u"I", # LATIN CAPITAL LETTER IOTA u"\u0197": u"I", # LATIN CAPITAL LETTER I WITH STROKE u"\u0198": u"K", # LATIN CAPITAL LETTER K WITH HOOK u"\u0199": u"k", # LATIN SMALL LETTER K WITH HOOK u"\u019A": u"l", # LATIN SMALL LETTER L WITH BAR u"\u019D": u"N", # LATIN CAPITAL LETTER N WITH LEFT HOOK u"\u019E": u"n", # LATIN SMALL LETTER N WITH LONG RIGHT LEG u"\u01A2": u"GH", # LATIN CAPITAL LETTER GHA (see http://unicode.org/notes/tn27/) u"\u01A3": u"gh", # LATIN SMALL LETTER GHA (see http://unicode.org/notes/tn27/) u"\u01A4": u"P", # LATIN CAPITAL LETTER P WITH HOOK u"\u01A5": u"p", # LATIN SMALL LETTER P WITH HOOK u"\u01AB": u"t", # LATIN SMALL LETTER T WITH PALATAL HOOK u"\u01AC": u"T", # LATIN CAPITAL LETTER T WITH HOOK u"\u01AD": u"t", # LATIN SMALL LETTER T WITH HOOK u"\u01AE": u"T", # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK u"\u01B2": u"V", # LATIN CAPITAL LETTER V WITH HOOK u"\u01B3": u"Y", # LATIN CAPITAL LETTER Y WITH HOOK u"\u01B4": u"y", # LATIN SMALL LETTER Y WITH HOOK u"\u01B5": u"Z", # LATIN CAPITAL LETTER Z WITH STROKE u"\u01B6": u"z", # LATIN SMALL LETTER Z WITH STROKE u"\u01C4": u"DZ", # LATIN CAPITAL LETTER DZ WITH CARON (compat) u"\u01C5": u"Dz", # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (compat) u"\u01C6": u"dz", # LATIN SMALL LETTER DZ WITH CARON (compat) u"\u01E4": u"G", # LATIN CAPITAL LETTER G WITH STROKE u"\u01E5": u"g", # LATIN SMALL LETTER G WITH STROKE u"\u0221": u"d", # LATIN SMALL LETTER D WITH CURL u"\u0224": u"Z", # LATIN CAPITAL LETTER Z WITH HOOK u"\u0225": u"z", # LATIN SMALL LETTER Z WITH HOOK u"\u0234": u"l", # LATIN SMALL LETTER L WITH CURL u"\u0235": u"n", # LATIN SMALL LETTER N WITH CURL u"\u0236": u"t", # LATIN SMALL LETTER T WITH CURL u"\u0237": u"j", # LATIN SMALL LETTER DOTLESS J u"\u0238": u"db", # LATIN SMALL LETTER DB DIGRAPH u"\u0239": u"qp", # LATIN SMALL LETTER QP DIGRAPH u"\u023A": u"A", # LATIN CAPITAL LETTER A WITH STROKE u"\u023B": u"C", # LATIN CAPITAL LETTER C WITH STROKE u"\u023C": u"c", # LATIN SMALL LETTER C WITH STROKE u"\u023D": u"L", # LATIN CAPITAL LETTER L WITH BAR u"\u023E": u"T", # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE u"\u023F": u"s", # LATIN SMALL LETTER S WITH SWASH TAIL u"\u0240": u"z", # LATIN SMALL LETTER Z WITH SWASH TAIL u"\u0243": u"B", # LATIN CAPITAL LETTER B WITH STROKE u"\u0244": u"U", # LATIN CAPITAL LETTER U BAR u"\u0246": u"E", # LATIN CAPITAL LETTER E WITH STROKE u"\u0247": u"e", # LATIN SMALL LETTER E WITH STROKE u"\u0248": u"J", # LATIN CAPITAL LETTER J WITH STROKE u"\u0249": u"j", # LATIN SMALL LETTER J WITH STROKE u"\u024C": u"R", # LATIN CAPITAL LETTER R WITH STROKE u"\u024D": u"r", # LATIN SMALL LETTER R WITH STROKE u"\u024E": u"Y", # LATIN CAPITAL LETTER Y WITH STROKE u"\u024F": u"y", # LATIN SMALL LETTER Y WITH STROKE u"\u0253": u"b", # LATIN SMALL LETTER B WITH HOOK u"\u0255": u"c", # LATIN SMALL LETTER C WITH CURL u"\u0256": u"d", # LATIN SMALL LETTER D WITH TAIL u"\u0257": u"d", # LATIN SMALL LETTER D WITH HOOK u"\u025B": u"e", # LATIN SMALL LETTER OPEN E u"\u025F": u"j", # LATIN SMALL LETTER DOTLESS J WITH STROKE u"\u0260": u"g", # LATIN SMALL LETTER G WITH HOOK u"\u0261": u"g", # LATIN SMALL LETTER SCRIPT G u"\u0262": u"G", # LATIN LETTER SMALL CAPITAL G u"\u0266": u"h", # LATIN SMALL LETTER H WITH HOOK u"\u0267": u"h", # LATIN SMALL LETTER HENG WITH HOOK u"\u0268": u"i", # LATIN SMALL LETTER I WITH STROKE u"\u026A": u"I", # LATIN LETTER SMALL CAPITAL I u"\u026B": u"l", # LATIN SMALL LETTER L WITH MIDDLE TILDE u"\u026C": u"l", # LATIN SMALL LETTER L WITH BELT u"\u026D": u"l", # LATIN SMALL LETTER L WITH RETROFLEX HOOK u"\u0271": u"m", # LATIN SMALL LETTER M WITH HOOK u"\u0272": u"n", # LATIN SMALL LETTER N WITH LEFT HOOK u"\u0273": u"n", # LATIN SMALL LETTER N WITH RETROFLEX HOOK u"\u0274": u"N", # LATIN LETTER SMALL CAPITAL N u"\u0276": u"OE", # LATIN LETTER SMALL CAPITAL OE u"\u027C": u"r", # LATIN SMALL LETTER R WITH LONG LEG u"\u027D": u"r", # LATIN SMALL LETTER R WITH TAIL u"\u027E": u"r", # LATIN SMALL LETTER R WITH FISHHOOK u"\u0280": u"R", # LATIN LETTER SMALL CAPITAL R u"\u0282": u"s", # LATIN SMALL LETTER S WITH HOOK u"\u0288": u"t", # LATIN SMALL LETTER T WITH RETROFLEX HOOK u"\u0289": u"u", # LATIN SMALL LETTER U BAR u"\u028B": u"v", # LATIN SMALL LETTER V WITH HOOK u"\u028F": u"Y", # LATIN LETTER SMALL CAPITAL Y u"\u0290": u"z", # LATIN SMALL LETTER Z WITH RETROFLEX HOOK u"\u0291": u"z", # LATIN SMALL LETTER Z WITH CURL u"\u0299": u"B", # LATIN LETTER SMALL CAPITAL B u"\u029B": u"G", # LATIN LETTER SMALL CAPITAL G WITH HOOK u"\u029C": u"H", # LATIN LETTER SMALL CAPITAL H u"\u029D": u"j", # LATIN SMALL LETTER J WITH CROSSED-TAIL u"\u029F": u"L", # LATIN LETTER SMALL CAPITAL L u"\u02A0": u"q", # LATIN SMALL LETTER Q WITH HOOK u"\u02A3": u"dz", # LATIN SMALL LETTER DZ DIGRAPH u"\u02A5": u"dz", # LATIN SMALL LETTER DZ DIGRAPH WITH CURL u"\u02A6": u"ts", # LATIN SMALL LETTER TS DIGRAPH u"\u02AA": u"ls", # LATIN SMALL LETTER LS DIGRAPH u"\u02AB": u"lz", # LATIN SMALL LETTER LZ DIGRAPH u"\u1D01": u"AE", # LATIN LETTER SMALL CAPITAL AE u"\u1D03": u"B", # LATIN LETTER SMALL CAPITAL BARRED B u"\u1D06": u"D", # LATIN LETTER SMALL CAPITAL ETH u"\u1D0C": u"L", # LATIN LETTER SMALL CAPITAL L WITH STROKE u"\u1D6B": u"ue", # LATIN SMALL LETTER UE u"\u1D6C": u"b", # LATIN SMALL LETTER B WITH MIDDLE TILDE u"\u1D6D": u"d", # LATIN SMALL LETTER D WITH MIDDLE TILDE u"\u1D6E": u"f", # LATIN SMALL LETTER F WITH MIDDLE TILDE u"\u1D6F": u"m", # LATIN SMALL LETTER M WITH MIDDLE TILDE u"\u1D70": u"n", # LATIN SMALL LETTER N WITH MIDDLE TILDE u"\u1D71": u"p", # LATIN SMALL LETTER P WITH MIDDLE TILDE u"\u1D72": u"r", # LATIN SMALL LETTER R WITH MIDDLE TILDE u"\u1D73": u"r", # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE u"\u1D74": u"s", # LATIN SMALL LETTER S WITH MIDDLE TILDE u"\u1D75": u"t", # LATIN SMALL LETTER T WITH MIDDLE TILDE u"\u1D76": u"z", # LATIN SMALL LETTER Z WITH MIDDLE TILDE u"\u1D7A": u"th", # LATIN SMALL LETTER TH WITH STRIKETHROUGH u"\u1D7B": u"I", # LATIN SMALL CAPITAL LETTER I WITH STROKE u"\u1D7D": u"p", # LATIN SMALL LETTER P WITH STROKE u"\u1D7E": u"U", # LATIN SMALL CAPITAL LETTER U WITH STROKE u"\u1D80": u"b", # LATIN SMALL LETTER B WITH PALATAL HOOK u"\u1D81": u"d", # LATIN SMALL LETTER D WITH PALATAL HOOK u"\u1D82": u"f", # LATIN SMALL LETTER F WITH PALATAL HOOK u"\u1D83": u"g", # LATIN SMALL LETTER G WITH PALATAL HOOK u"\u1D84": u"k", # LATIN SMALL LETTER K WITH PALATAL HOOK u"\u1D85": u"l", # LATIN SMALL LETTER L WITH PALATAL HOOK u"\u1D86": u"m", # LATIN SMALL LETTER M WITH PALATAL HOOK u"\u1D87": u"n", # LATIN SMALL LETTER N WITH PALATAL HOOK u"\u1D88": u"p", # LATIN SMALL LETTER P WITH PALATAL HOOK u"\u1D89": u"r", # LATIN SMALL LETTER R WITH PALATAL HOOK u"\u1D8A": u"s", # LATIN SMALL LETTER S WITH PALATAL HOOK u"\u1D8C": u"v", # LATIN SMALL LETTER V WITH PALATAL HOOK u"\u1D8D": u"x", # LATIN SMALL LETTER X WITH PALATAL HOOK u"\u1D8E": u"z", # LATIN SMALL LETTER Z WITH PALATAL HOOK u"\u1D8F": u"a", # LATIN SMALL LETTER A WITH RETROFLEX HOOK u"\u1D91": u"d", # LATIN SMALL LETTER D WITH HOOK AND TAIL u"\u1D92": u"e", # LATIN SMALL LETTER E WITH RETROFLEX HOOK u"\u1D93": u"e", # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK u"\u1D96": u"i", # LATIN SMALL LETTER I WITH RETROFLEX HOOK u"\u1D99": u"u", # LATIN SMALL LETTER U WITH RETROFLEX HOOK u"\u1E9A": u"a", # LATIN SMALL LETTER A WITH RIGHT HALF RING u"\u1E9C": u"s", # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE u"\u1E9D": u"s", # LATIN SMALL LETTER LONG S WITH HIGH STROKE u"\u1E9E": u"SS", # LATIN CAPITAL LETTER SHARP S u"\u1EFA": u"LL", # LATIN CAPITAL LETTER MIDDLE-WELSH LL u"\u1EFB": u"ll", # LATIN SMALL LETTER MIDDLE-WELSH LL u"\u1EFC": u"V", # LATIN CAPITAL LETTER MIDDLE-WELSH V u"\u1EFD": u"v", # LATIN SMALL LETTER MIDDLE-WELSH V u"\u1EFE": u"Y", # LATIN CAPITAL LETTER Y WITH LOOP u"\u1EFF": u"y", # LATIN SMALL LETTER Y WITH LOOP u"\u00A9": u"(C)", # COPYRIGHT SIGN (from ‹character-fallback›) u"\u00AE": u"(R)", # REGISTERED SIGN (from ‹character-fallback›) u"\u20A0": u"CE", # EURO-CURRENCY SIGN (from ‹character-fallback›) u"\u20A2": u"Cr", # CRUZEIRO SIGN (from ‹character-fallback›) u"\u20A3": u"Fr.", # FRENCH FRANC SIGN (from ‹character-fallback›) u"\u20A4": u"L.", # LIRA SIGN (from ‹character-fallback›) u"\u20A7": u"Pts", # PESETA SIGN (from ‹character-fallback›) u"\u20BA": u"TL", # TURKISH LIRA SIGN (from ‹character-fallback›) u"\u20B9": u"Rs", # INDIAN RUPEE SIGN (from ‹character-fallback›) u"\u211E": u"Rx", # PRESCRIPTION TAKE (from ‹character-fallback›) u"\u33A7": u"m/s", # SQUARE M OVER S (compat) (from ‹character-fallback›) u"\u33AE": u"rad/s", # SQUARE RAD OVER S (compat) (from ‹character-fallback›) u"\u33C6": u"C/kg", # SQUARE C OVER KG (compat) (from ‹character-fallback›) u"\u33DE": u"V/m", # SQUARE V OVER M (compat) (from ‹character-fallback›) u"\u33DF": u"A/m", # SQUARE A OVER M (compat) (from ‹character-fallback›) u"\u00BC": u" 1/4", # VULGAR FRACTION ONE QUARTER (from ‹character-fallback›) u"\u00BD": u" 1/2", # VULGAR FRACTION ONE HALF (from ‹character-fallback›) u"\u00BE": u" 3/4", # VULGAR FRACTION THREE QUARTERS (from ‹character-fallback›) u"\u2153": u" 1/3", # VULGAR FRACTION ONE THIRD (from ‹character-fallback›) u"\u2154": u" 2/3", # VULGAR FRACTION TWO THIRDS (from ‹character-fallback›) u"\u2155": u" 1/5", # VULGAR FRACTION ONE FIFTH (from ‹character-fallback›) u"\u2156": u" 2/5", # VULGAR FRACTION TWO FIFTHS (from ‹character-fallback›) u"\u2157": u" 3/5", # VULGAR FRACTION THREE FIFTHS (from ‹character-fallback›) u"\u2158": u" 4/5", # VULGAR FRACTION FOUR FIFTHS (from ‹character-fallback›) u"\u2159": u" 1/6", # VULGAR FRACTION ONE SIXTH (from ‹character-fallback›) u"\u215A": u" 5/6", # VULGAR FRACTION FIVE SIXTHS (from ‹character-fallback›) u"\u215B": u" 1/8", # VULGAR FRACTION ONE EIGHTH (from ‹character-fallback›) u"\u215C": u" 3/8", # VULGAR FRACTION THREE EIGHTHS (from ‹character-fallback›) u"\u215D": u" 5/8", # VULGAR FRACTION FIVE EIGHTHS (from ‹character-fallback›) u"\u215E": u" 7/8", # VULGAR FRACTION SEVEN EIGHTHS (from ‹character-fallback›) u"\u215F": u" 1/", # FRACTION NUMERATOR ONE (from ‹character-fallback›) u"\u3001": u",", # IDEOGRAPHIC COMMA u"\u3002": u".", # IDEOGRAPHIC FULL STOP u"\u00D7": u"x", # MULTIPLICATION SIGN u"\u00F7": u"/", # DIVISION SIGN u"\u00B7": u".", # MIDDLE DOT u"\u1E9F": u"dd", # LATIN SMALL LETTER DELTA u"\u0184": u"H", # LATIN CAPITAL LETTER TONE SIX u"\u0185": u"h", # LATIN SMALL LETTER TONE SIX u"\u01BE": u"ts", # LATIN LETTER TS LIGATION (see http://unicode.org/notes/tn27/) } _re_simplify_combinations = _re_any(_simplify_combinations) def unicode_simplify_combinations(string): return _re_simplify_combinations.sub(lambda m: _simplify_combinations[m.group(0)], string) def unicode_simplify_accents(string): result = ''.join(c for c in unicodedata.normalize('NFKD', string) if not unicodedata.combining(c)) return result def asciipunct(string): interim = unicode_simplify_compatibility(string) return unicode_simplify_punctuation(interim) def unaccent(string): """Remove accents ``string``.""" return unicode_simplify_accents(string) def replace_non_ascii(string, repl="_"): """Replace non-ASCII characters from ``string`` by ``repl``.""" interim = unicode_simplify_combinations(string) interim = unicode_simplify_accents(interim) interim = unicode_simplify_punctuation(interim) interim = unicode_simplify_compatibility(interim) def error_repl(e, repl=u"_"): return(repl, e.start + 1) codecs.register_error('repl', partial(error_repl, repl=unicode(repl))) return interim.encode('ascii', 'repl') picard-release-1.3.2/picard/util/thread.py000066400000000000000000000036741245305550700204550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import traceback from PyQt4.QtCore import QRunnable, QCoreApplication, QEvent class ProxyToMainEvent(QEvent): def __init__(self, func, *args, **kwargs): QEvent.__init__(self, QEvent.User) self.func = func self.args = args self.kwargs = kwargs def run(self): self.func(*self.args, **self.kwargs) class Runnable(QRunnable): def __init__(self, func, next): QRunnable.__init__(self) self.func = func self.next = next def run(self): try: result = self.func() except: from picard import log log.error(traceback.format_exc()) to_main(self.next, error=sys.exc_info()[1]) else: to_main(self.next, result=result) def run_task(func, next, priority=0, thread_pool=None): if thread_pool is None: thread_pool = QCoreApplication.instance().thread_pool thread_pool.start(Runnable(func, next), priority) def to_main(func, *args, **kwargs): QCoreApplication.postEvent(QCoreApplication.instance(), ProxyToMainEvent(func, *args, **kwargs)) picard-release-1.3.2/picard/util/versions.py000066400000000000000000000034421245305550700210470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006-2014 Lukáš Lalinský # Copyright (C) 2014 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from mutagen import version_string as mutagen_version from PyQt4.QtCore import PYQT_VERSION_STR as pyqt_version from picard import PICARD_FANCY_VERSION_STR from picard.disc import discid_version _versions = { "version": PICARD_FANCY_VERSION_STR, "pyqt-version": pyqt_version, "mutagen-version": mutagen_version, "discid-version": discid_version, } _names = { "version": "Picard", "pyqt-version": "PyQt", "mutagen-version": "Mutagen", "discid-version": "Discid", } def _value_as_text(value, i18n=False): if not value: value = N_("is not installed") if i18n: return _(value) return value def as_dict(i18n=False): return dict([(key, _value_as_text(value, i18n)) for key, value in _versions.iteritems()]) def as_string(i18n=False, separator=", "): return separator.join([_names[key] + " " + value for key, value in as_dict(i18n).items()]) picard-release-1.3.2/picard/util/webbrowser2.py000066400000000000000000000075361245305550700214520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os import sys import webbrowser from PyQt4 import QtGui from picard.const import PICARD_URLS """ A webbrowser extension that respects user's preferred browser on each platform. Python 2.5 already has *some* support for this, but it's not enough, in my opinion. See also: http://sourceforge.net/tracker/index.php?func=detail&aid=1681228&group_id=5470&atid=105470 """ if sys.version_info >= (2, 5): # Cross-platform default tool if webbrowser._iscommand('xdg-open'): webbrowser.register('xdg-open', None, webbrowser.BackgroundBrowser(["xdg-open", "%s"]), update_tryorder=-1) else: # KDE default browser if 'KDE_FULL_SESSION' in os.environ and os.environ['KDE_FULL_SESSION'] == 'true' and webbrowser._iscommand('kfmclient'): webbrowser.register('kfmclient', None, webbrowser.BackgroundBrowser(["kfmclient", "exec", "%s"]), update_tryorder=-1) # GNOME default browser if 'GNOME_DESKTOP_SESSION_ID' in os.environ and webbrowser._iscommand('gnome-open'): webbrowser.register('gnome-open', None, webbrowser.BackgroundBrowser(["gnome-open", "%s"]), update_tryorder=-1) else: # KDE default browser if 'KDE_FULL_SESSION' in os.environ and os.environ['KDE_FULL_SESSION'] == 'true' and webbrowser._iscommand('kfmclient'): webbrowser.register('kfmclient', None, webbrowser.GenericBrowser("kfmclient exec '%s' &")) if 'BROWSER' in os.environ: webbrowser._tryorder.insert(len(os.environ['BROWSER'].split(os.pathsep)), 'kfmclient') else: webbrowser._tryorder.insert(0, 'kfmclient') # GNOME default browser if 'GNOME_DESKTOP_SESSION_ID' in os.environ and webbrowser._iscommand('gnome-open'): webbrowser.register('gnome-open', None, webbrowser.GenericBrowser("gnome-open '%s' &")) if 'BROWSER' in os.environ: webbrowser._tryorder.insert(len(os.environ['BROWSER'].split(os.pathsep)), 'gnome-open') else: webbrowser._tryorder.insert(0, 'gnome-open') if 'windows-default' in webbrowser._tryorder: class WindowsDefault2(webbrowser.BaseBrowser): def open(self, url, new=0, autoraise=1): try: os.startfile(url) except WindowsError: # [Error 22] No application is associated with the specified # file for this operation: '' return False else: return True webbrowser._tryorder.remove('windows-default') webbrowser.register('windows-default-2', WindowsDefault2, update_tryorder=-1) iexplore = webbrowser.BackgroundBrowser( os.path.join(os.environ.get('PROGRAMFILES', 'C:\\Program Files'), 'Internet Explorer\\IEXPLORE.EXE')) webbrowser.register('iexplore', None, iexplore) def open(url): try: webbrowser.open(url) except webbrowser.Error as e: QtGui.QMessageBox.critical(None, _("Web Browser Error"), _("Error while launching a web browser:\n\n%s") % (e,)) def goto(url_id): open(PICARD_URLS[url_id]) picard-release-1.3.2/picard/webservice.py000066400000000000000000000533021245305550700203600ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2009 Carlin Mangar # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ Asynchronous XML web service. """ import sys import re import time import os.path import platform import math from collections import deque, defaultdict from functools import partial from PyQt4 import QtCore, QtNetwork from PyQt4.QtGui import QDesktopServices from PyQt4.QtCore import QUrl, QXmlStreamReader from picard import (PICARD_APP_NAME, PICARD_ORG_NAME, PICARD_VERSION_STR, config, log) from picard.const import (ACOUSTID_KEY, ACOUSTID_HOST, ACOUSTID_PORT, CAA_HOST, CAA_PORT, MUSICBRAINZ_SERVERS) REQUEST_DELAY = defaultdict(lambda: 1000) REQUEST_DELAY[(ACOUSTID_HOST, ACOUSTID_PORT)] = 333 REQUEST_DELAY[(CAA_HOST, CAA_PORT)] = 0 USER_AGENT_STRING = '%s-%s/%s (%s;%s-%s)' % (PICARD_ORG_NAME, PICARD_APP_NAME, PICARD_VERSION_STR, platform.platform(), platform.python_implementation(), platform.python_version()) CLIENT_STRING = str(QUrl.toPercentEncoding('%s %s-%s' % (PICARD_ORG_NAME, PICARD_APP_NAME, PICARD_VERSION_STR))) def _escape_lucene_query(text): return re.sub(r'([+\-&|!(){}\[\]\^"~*?:\\/])', r'\\\1', text) def _wrap_xml_metadata(data): return ('' + '%s' % data) class XmlNode(object): def __init__(self): self.text = u'' self.children = {} self.attribs = {} def __repr__(self): return repr(self.__dict__) def append_child(self, name, node=None): if node is None: node = XmlNode() self.children.setdefault(name, []).append(node) return node def __getattr__(self, name): try: return self.children[name] except KeyError: try: return self.attribs[name] except KeyError: raise AttributeError(name) _node_name_re = re.compile('[^a-zA-Z0-9]') def _node_name(n): return _node_name_re.sub('_', unicode(n)) def _read_xml(stream): document = XmlNode() current_node = document path = [] while not stream.atEnd(): stream.readNext() if stream.isStartElement(): node = XmlNode() attrs = stream.attributes() for i in xrange(attrs.count()): attr = attrs.at(i) node.attribs[_node_name(attr.name())] = unicode(attr.value()) current_node.append_child(_node_name(stream.name()), node) path.append(current_node) current_node = node elif stream.isEndElement(): current_node = path.pop() elif stream.isCharacters(): current_node.text += unicode(stream.text()) return document class XmlWebService(QtCore.QObject): """ Signals: - authentication_required """ def __init__(self, parent=None): QtCore.QObject.__init__(self, parent) self.manager = QtNetwork.QNetworkAccessManager() self.set_cache() self.setup_proxy() self.manager.finished.connect(self._process_reply) self._last_request_times = {} self._active_requests = {} self._high_priority_queues = {} self._low_priority_queues = {} self._hosts = [] self._timer = QtCore.QTimer(self) self._timer.setSingleShot(True) self._timer.timeout.connect(self._run_next_task) self._request_methods = { "GET": self.manager.get, "POST": self.manager.post, "PUT": self.manager.put, "DELETE": self.manager.deleteResource } self.num_pending_web_requests = 0 def set_cache(self, cache_size_in_mb=100): cache = QtNetwork.QNetworkDiskCache() location = QDesktopServices.storageLocation(QDesktopServices.CacheLocation) cache.setCacheDirectory(os.path.join(unicode(location), u'picard')) cache.setMaximumCacheSize(cache_size_in_mb * 1024 * 1024) self.manager.setCache(cache) log.debug("NetworkDiskCache dir: %s", cache.cacheDirectory()) log.debug("NetworkDiskCache size: %s / %s", cache.cacheSize(), cache.maximumCacheSize()) def setup_proxy(self): proxy = QtNetwork.QNetworkProxy() if config.setting["use_proxy"]: proxy.setType(QtNetwork.QNetworkProxy.HttpProxy) proxy.setHostName(config.setting["proxy_server_host"]) proxy.setPort(config.setting["proxy_server_port"]) proxy.setUser(config.setting["proxy_username"]) proxy.setPassword(config.setting["proxy_password"]) self.manager.setProxy(proxy) def _start_request(self, method, host, port, path, data, handler, xml, mblogin=False, cacheloadcontrol=None, refresh=None): if (mblogin and host in MUSICBRAINZ_SERVERS and port == 80) or port == 443: urlstring = "https://%s%s" % (host, path) elif port is None or port == 80: urlstring = "http://%s%s" % (host, path) else: urlstring = "http://%s:%d%s" % (host, port, path) log.debug("%s %s", method, urlstring) url = QUrl.fromEncoded(urlstring) if mblogin: url.setUserName(config.setting["username"]) url.setPassword(config.setting["password"]) request = QtNetwork.QNetworkRequest(url) if mblogin or (method == "GET" and refresh): request.setPriority(QtNetwork.QNetworkRequest.HighPriority) request.setAttribute(QtNetwork.QNetworkRequest.CacheLoadControlAttribute, QtNetwork.QNetworkRequest.AlwaysNetwork) elif method == "PUT" or method == "DELETE": request.setPriority(QtNetwork.QNetworkRequest.HighPriority) elif cacheloadcontrol is not None: request.setAttribute(QtNetwork.QNetworkRequest.CacheLoadControlAttribute, cacheloadcontrol) request.setRawHeader("User-Agent", USER_AGENT_STRING) if xml: request.setRawHeader("Accept", "application/xml") if data is not None: if method == "POST" and host == config.setting["server_host"]: request.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader, "application/xml; charset=utf-8") else: request.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader, "application/x-www-form-urlencoded") send = self._request_methods[method] reply = send(request, data) if data is not None else send(request) key = (host, port) self._last_request_times[key] = time.time() self._active_requests[reply] = (request, handler, xml, refresh) return True @staticmethod def urls_equivalent(leftUrl, rightUrl): """ Lazy method to determine whether two QUrls are equivalent. At the moment it assumes that if ports are unset that they are port 80 - in absence of a URL normalization function in QUrl or ability to use qHash from QT 4.7 """ return leftUrl.port(80) == rightUrl.port(80) and \ leftUrl.toString(QUrl.RemovePort) == rightUrl.toString(QUrl.RemovePort) def _process_reply(self, reply): try: request, handler, xml, refresh = self._active_requests.pop(reply) except KeyError: log.error("Request not found for %s" % reply.request().url().toString(QUrl.RemoveUserInfo)) return error = int(reply.error()) if error: log.error("Network request error for %s: %s (QT code %d, HTTP code %s)", reply.request().url().toString(QUrl.RemoveUserInfo), reply.errorString(), error, repr(reply.attribute(QtNetwork.QNetworkRequest.HttpStatusCodeAttribute)) ) if handler is not None: handler(str(reply.readAll()), reply, error) else: redirect = reply.attribute(QtNetwork.QNetworkRequest.RedirectionTargetAttribute) fromCache = reply.attribute(QtNetwork.QNetworkRequest.SourceIsFromCacheAttribute) cached = ' (CACHED)' if fromCache else '' log.debug("Received reply for %s: HTTP %d (%s) %s", reply.request().url().toString(QUrl.RemoveUserInfo), reply.attribute(QtNetwork.QNetworkRequest.HttpStatusCodeAttribute), reply.attribute(QtNetwork.QNetworkRequest.HttpReasonPhraseAttribute), cached ) if handler is not None: # Redirect if found and not infinite if redirect and not XmlWebService.urls_equivalent(redirect, reply.request().url()): log.debug("Redirect to %s requested", redirect.toString(QUrl.RemoveUserInfo)) redirect_host = str(redirect.host()) redirect_port = redirect.port(80) url = request.url() original_host = str(url.host()) original_port = url.port(80) if ((original_host, original_port) in REQUEST_DELAY and (redirect_host, redirect_port) not in REQUEST_DELAY): log.debug("Setting rate limit for %s:%i to %i" % (redirect_host, redirect_port, REQUEST_DELAY[(original_host, original_port)])) REQUEST_DELAY[(redirect_host, redirect_port)] =\ REQUEST_DELAY[(original_host, original_port)] self.get(redirect_host, redirect_port, # retain path, query string and anchors from redirect URL redirect.toString(QUrl.RemoveAuthority | QUrl.RemoveScheme), handler, xml, priority=True, important=True, refresh=refresh, cacheloadcontrol=request.attribute(QtNetwork.QNetworkRequest.CacheLoadControlAttribute)) elif redirect: log.error("Redirect loop: %s", reply.request().url().toString(QUrl.RemoveUserInfo) ) handler(str(reply.readAll()), reply, error) elif xml: document = _read_xml(QXmlStreamReader(reply)) handler(document, reply, error) else: handler(str(reply.readAll()), reply, error) reply.close() self.num_pending_web_requests -= 1 self.tagger.tagger_stats_changed.emit() def get(self, host, port, path, handler, xml=True, priority=False, important=False, mblogin=False, cacheloadcontrol=None, refresh=False): func = partial(self._start_request, "GET", host, port, path, None, handler, xml, mblogin, cacheloadcontrol=cacheloadcontrol, refresh=refresh) return self.add_task(func, host, port, priority, important=important) def post(self, host, port, path, data, handler, xml=True, priority=False, important=False, mblogin=True): log.debug("POST-DATA %r", data) func = partial(self._start_request, "POST", host, port, path, data, handler, xml, mblogin) return self.add_task(func, host, port, priority, important=important) def put(self, host, port, path, data, handler, priority=True, important=False, mblogin=True): func = partial(self._start_request, "PUT", host, port, path, data, handler, False, mblogin) return self.add_task(func, host, port, priority, important=important) def delete(self, host, port, path, handler, priority=True, important=False, mblogin=True): func = partial(self._start_request, "DELETE", host, port, path, None, handler, False, mblogin) return self.add_task(func, host, port, priority, important=important) def stop(self): self._high_priority_queues = {} self._low_priority_queues = {} for reply in self._active_requests.keys(): reply.abort() def _run_next_task(self): delay = sys.maxint for key in self._hosts: queue = self._high_priority_queues.get(key) or self._low_priority_queues.get(key) if not queue: continue now = time.time() last = self._last_request_times.get(key) request_delay = REQUEST_DELAY[key] last_ms = (now - last) * 1000 if last is not None else request_delay if last_ms >= request_delay: log.debug("Last request to %s was %d ms ago, starting another one", key, last_ms) d = request_delay queue.popleft()() else: d = int(math.ceil(request_delay - last_ms)) log.debug("Waiting %d ms before starting another request to %s", d, key) if d < delay: delay = d if delay < sys.maxint: self._timer.start(delay) def add_task(self, func, host, port, priority, important=False): key = (host, port) if key not in self._hosts: self._hosts.append(key) if priority: queues = self._high_priority_queues else: queues = self._low_priority_queues queues.setdefault(key, deque()) if important: queues[key].appendleft(func) else: queues[key].append(func) self.num_pending_web_requests += 1 self.tagger.tagger_stats_changed.emit() if len(queues[key]) == 1: self._timer.start(0) return (key, func, priority) def remove_task(self, task): key, func, priority = task if priority: queue = self._high_priority_queues[key] else: queue = self._low_priority_queues[key] try: queue.remove(func) except: pass else: self.num_pending_web_requests -= 1 self.tagger.tagger_stats_changed.emit() def _get_by_id(self, entitytype, entityid, handler, inc=[], params=[], priority=False, important=False, mblogin=False, refresh=False): host = config.setting["server_host"] port = config.setting["server_port"] path = "/ws/2/%s/%s?inc=%s" % (entitytype, entityid, "+".join(inc)) if params: path += "&" + "&".join(params) return self.get(host, port, path, handler, priority=priority, important=important, mblogin=mblogin, refresh=refresh) def get_release_by_id(self, releaseid, handler, inc=[], priority=False, important=False, mblogin=False, refresh=False): return self._get_by_id('release', releaseid, handler, inc, priority=priority, important=important, mblogin=mblogin, refresh=refresh) def get_track_by_id(self, trackid, handler, inc=[], priority=False, important=False, mblogin=False, refresh=False): return self._get_by_id('recording', trackid, handler, inc, priority=priority, important=important, mblogin=mblogin, refresh=refresh) def lookup_discid(self, discid, handler, priority=True, important=True, refresh=False): inc = ['artist-credits', 'labels'] return self._get_by_id('discid', discid, handler, inc, params=["cdstubs=no"], priority=priority, important=important, refresh=refresh) def _find(self, entitytype, handler, kwargs): host = config.setting["server_host"] port = config.setting["server_port"] filters = [] query = [] for name, value in kwargs.items(): if name == 'limit': filters.append((name, str(value))) else: value = _escape_lucene_query(value).strip().lower() if value: query.append('%s:(%s)' % (name, value)) if query: filters.append(('query', ' '.join(query))) params = [] for name, value in filters: value = QUrl.toPercentEncoding(unicode(value)) params.append('%s=%s' % (str(name), value)) path = "/ws/2/%s/?%s" % (entitytype, "&".join(params)) return self.get(host, port, path, handler) def find_releases(self, handler, **kwargs): return self._find('release', handler, kwargs) def find_tracks(self, handler, **kwargs): return self._find('recording', handler, kwargs) def _browse(self, entitytype, handler, kwargs, inc=[], priority=False, important=False): host = config.setting["server_host"] port = config.setting["server_port"] params = "&".join(["%s=%s" % (k, v) for k, v in kwargs.items()]) path = "/ws/2/%s?%s&inc=%s" % (entitytype, params, "+".join(inc)) return self.get(host, port, path, handler, priority=priority, important=important) def browse_releases(self, handler, priority=True, important=True, **kwargs): inc = ["media", "labels"] return self._browse("release", handler, kwargs, inc, priority=priority, important=important) def submit_ratings(self, ratings, handler): host = config.setting['server_host'] port = config.setting['server_port'] path = '/ws/2/rating/?client=' + CLIENT_STRING recordings = (''.join(['%s' % (i[1], j*20) for i, j in ratings.items() if i[0] == 'recording'])) data = _wrap_xml_metadata('%s' % recordings) return self.post(host, port, path, data, handler, priority=True) def _encode_acoustid_args(self, args): filters = [] args['client'] = ACOUSTID_KEY args['clientversion'] = PICARD_VERSION_STR args['format'] = 'xml' for name, value in args.items(): value = str(QUrl.toPercentEncoding(value)) filters.append('%s=%s' % (str(name), value)) return '&'.join(filters) def query_acoustid(self, handler, **args): host, port = ACOUSTID_HOST, ACOUSTID_PORT body = self._encode_acoustid_args(args) return self.post(host, port, '/v2/lookup', body, handler, priority=False, important=False, mblogin=False) def submit_acoustid_fingerprints(self, submissions, handler): args = {'user': config.setting["acoustid_apikey"]} for i, submission in enumerate(submissions): args['fingerprint.%d' % i] = str(submission.fingerprint) args['duration.%d' % i] = str(submission.duration) args['mbid.%d' % i] = str(submission.recordingid) if submission.puid: args['puid.%d' % i] = str(submission.puid) host, port = ACOUSTID_HOST, ACOUSTID_PORT body = self._encode_acoustid_args(args) return self.post(host, port, '/v2/submit', body, handler, priority=True, important=False, mblogin=False) def download(self, host, port, path, handler, priority=False, important=False, cacheloadcontrol=None, refresh=False): return self.get(host, port, path, handler, xml=False, priority=priority, important=important, cacheloadcontrol=cacheloadcontrol, refresh=refresh) def get_collection(self, id, handler, limit=100, offset=0): host, port = config.setting['server_host'], config.setting['server_port'] path = "/ws/2/collection" if id is not None: inc = ["releases", "artist-credits", "media"] path += "/%s/releases?inc=%s&limit=%d&offset=%d" % (id, "+".join(inc), limit, offset) return self.get(host, port, path, handler, priority=True, important=True, mblogin=True) def get_collection_list(self, handler): return self.get_collection(None, handler) def _collection_request(self, id, releases): while releases: ids = ";".join(releases if len(releases) <= 400 else releases[:400]) releases = releases[400:] yield "/ws/2/collection/%s/releases/%s?client=%s" % (id, ids, CLIENT_STRING) def put_to_collection(self, id, releases, handler): host, port = config.setting['server_host'], config.setting['server_port'] for path in self._collection_request(id, releases): self.put(host, port, path, "", handler) def delete_from_collection(self, id, releases, handler): host, port = config.setting['server_host'], config.setting['server_port'] for path in self._collection_request(id, releases): self.delete(host, port, path, handler) picard-release-1.3.2/po/000077500000000000000000000000001245305550700150215ustar00rootroot00000000000000picard-release-1.3.2/po/README.md000066400000000000000000000032601245305550700163010ustar00rootroot00000000000000Translations ============ Picard translations are handled by [Transifex](https://www.transifex.com). _Please do not manually edit the PO files._ Required tools -------------- * [Transifex client](http://support.transifex.com/customer/portal/topics/440187-transifex-client/articles) * [Babel](http://babel.pocoo.org/) Picard source tree strings -------------------------- Their translations are handled at https://www.transifex.com/projects/p/musicbrainz/resource/picard/ One can update `picard.pot` using: ```bash $ python setup.py regen_pot_file ``` Transifex will _automatically_ pick `picard.pot` from [Picard git repository master branch](https://github.com/musicbrainz/picard/tree/master) once per day. `picard/countries.py` strings ----------------------------- Their translations are handled at https://www.transifex.com/projects/p/musicbrainz/resource/countries/ `countries.pot` is updated by [musicbrainz-server project](https://bitbucket.org/metabrainz/musicbrainz-server/), outside the Picard project. Picard maintainers can regenerate `picard/countries.py`, which is using `countries.pot` as base, using the command: ```bash $ python setup.py update_countries ``` It will retrieve and parse latest `countries.pot` to rebuild `picard/countries.py`. To fetch latest translations from Transifex ------------------------------------------- Use the following command: ```bash $ python setup.py get_po_files ``` It will fetch all po files from Transifex, but the most incomplete ones. The minimum acceptable percentage of a translation in order to download it can be seen using: ```bash $ python setup.py get_po_files --help ``` The percentage value is passed to the `tx pull` command. picard-release-1.3.2/po/af.po000066400000000000000000001350321245305550700157530ustar00rootroot00000000000000# Translations template for PROJECT. # Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: # FIRST AUTHOR , 2009. msgid "" msgstr "" "Project-Id-Version: MusicBrainz\n" "Report-Msgid-Bugs-To: http://tickets.musicbrainz.org/\n" "POT-Creation-Date: 2012-08-28 15:50+0200\n" "PO-Revision-Date: 2012-08-29 08:53+0000\n" "Last-Translator: Lukáš Lalinský \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" "Language: af\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: contrib/plugins/no_release.py:48 msgid "Enable plugin for all releases by default" msgstr "" #: contrib/plugins/no_release.py:49 msgid "Tags to strip (comma-separated)" msgstr "" #: contrib/plugins/no_release.py:59 msgid "Remove specific release information..." msgstr "" #: contrib/plugins/open_in_gui.py:30 msgid "Open Error" msgstr "" #: contrib/plugins/open_in_gui.py:30 #, python-format msgid "" "Error while opening file:\n" "\n" "%s" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:115 msgid "Last.fm" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:116 msgid "Use track tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:117 msgid "Use artist tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:118 #: picard/ui/options/tags.py:30 msgid "Tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:119 #: picard/ui/ui_options_folksonomy.py:107 msgid "Ignore tags:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:120 #: picard/ui/ui_options_folksonomy.py:112 msgid "Join multiple tags with:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:121 #: picard/ui/ui_options_folksonomy.py:113 msgid " / " msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:122 #: picard/ui/ui_options_folksonomy.py:114 msgid ", " msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:123 #: picard/ui/ui_options_folksonomy.py:109 msgid "Minimal tag usage:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:124 #: picard/ui/ui_options_folksonomy.py:110 picard/ui/ui_options_matching.py:79 #: picard/ui/ui_options_matching.py:80 picard/ui/ui_options_matching.py:81 msgid " %" msgstr "" #: contrib/plugins/replaygain/__init__.py:48 msgid "Calculate replay &gain..." msgstr "" #: contrib/plugins/replaygain/__init__.py:65 #, python-format msgid "Calculating replay gain for \"%s\"..." msgstr "" #: contrib/plugins/replaygain/__init__.py:70 #, python-format msgid "Replay gain for \"%s\" successfully calculated." msgstr "" #: contrib/plugins/replaygain/__init__.py:72 #, python-format msgid "Could not calculate replay gain for \"%s\"." msgstr "" #: contrib/plugins/replaygain/__init__.py:75 msgid "Calculate album &gain..." msgstr "" #: contrib/plugins/replaygain/__init__.py:98 #, python-format msgid "Calculating album gain for \"%s\"..." msgstr "" #: contrib/plugins/replaygain/__init__.py:106 #, python-format msgid "Album gain for \"%s\" successfully calculated." msgstr "" #: contrib/plugins/replaygain/__init__.py:108 #, python-format msgid "Could not calculate album gain for \"%s\"." msgstr "" #: picard/acoustid.py:116 #, python-format msgid "Could not find AcoustID for file %s" msgstr "" #: picard/acoustid.py:120 picard/musicdns/__init__.py:103 #, python-format msgid "Looking up the fingerprint for file %s..." msgstr "" #: picard/acoustidmanager.py:78 msgid "Submitting AcoustIDs..." msgstr "" #: picard/acoustidmanager.py:83 #, python-format msgid "AcoustID submission failed: %s" msgstr "" #: picard/acoustidmanager.py:85 msgid "AcoustIDs successfully submitted!" msgstr "" #: picard/album.py:55 picard/cluster.py:260 msgid "Unmatched Files" msgstr "" #: picard/album.py:180 #, python-format msgid "[could not load album %s]" msgstr "" #: picard/album.py:266 #, python-format msgid "Album %s loaded" msgstr "" #: picard/album.py:282 msgid "[loading album information]" msgstr "" #: picard/cluster.py:177 picard/cluster.py:188 #, python-format msgid "No matching releases for cluster %s" msgstr "" #: picard/cluster.py:190 #, python-format msgid "Cluster %s identified!" msgstr "" #: picard/cluster.py:195 #, python-format msgid "Looking up the metadata for cluster %s..." msgstr "" #: picard/const.py:39 msgid "CD" msgstr "CD" #: picard/const.py:40 msgid "CD-R" msgstr "" #: picard/const.py:41 msgid "HDCD" msgstr "" #: picard/const.py:42 msgid "8cm CD" msgstr "" #: picard/const.py:43 msgid "Vinyl" msgstr "" #: picard/const.py:44 msgid "7\" Vinyl" msgstr "" #: picard/const.py:45 msgid "10\" Vinyl" msgstr "" #: picard/const.py:46 msgid "12\" Vinyl" msgstr "" #: picard/const.py:47 msgid "Digital Media" msgstr "" #: picard/const.py:48 msgid "USB Flash Drive" msgstr "" #: picard/const.py:49 msgid "slotMusic" msgstr "" #: picard/const.py:50 msgid "Cassette" msgstr "Kasset" #: picard/const.py:51 msgid "DVD" msgstr "DVD" #: picard/const.py:52 msgid "DVD-Audio" msgstr "" #: picard/const.py:53 msgid "DVD-Video" msgstr "" #: picard/const.py:54 msgid "SACD" msgstr "SACD" #: picard/const.py:55 msgid "DualDisc" msgstr "" #: picard/const.py:56 msgid "MiniDisc" msgstr "" #: picard/const.py:57 msgid "Blu-ray" msgstr "" #: picard/const.py:58 msgid "HD-DVD" msgstr "" #: picard/const.py:59 msgid "Videotape" msgstr "" #: picard/const.py:60 msgid "VHS" msgstr "" #: picard/const.py:61 msgid "Betamax" msgstr "" #: picard/const.py:62 msgid "VCD" msgstr "" #: picard/const.py:63 msgid "SVCD" msgstr "" #: picard/const.py:64 msgid "UMD" msgstr "" #: picard/const.py:65 picard/ui/ui_options_releases.py:226 msgid "Other" msgstr "" #: picard/const.py:66 msgid "LaserDisc" msgstr "Laser Skyf" #: picard/const.py:67 msgid "Cartridge" msgstr "" #: picard/const.py:68 msgid "Reel-to-reel" msgstr "" #: picard/const.py:69 msgid "DAT" msgstr "" #: picard/const.py:70 msgid "Wax Cylinder" msgstr "" #: picard/const.py:71 msgid "Piano Roll" msgstr "" #: picard/const.py:72 msgid "DCC" msgstr "" #: picard/const.py:77 msgid "Bangladesh" msgstr "" #: picard/const.py:78 msgid "Belgium" msgstr "" #: picard/const.py:79 msgid "Burkina Faso" msgstr "" #: picard/const.py:80 msgid "Bulgaria" msgstr "" #: picard/const.py:81 msgid "Barbados" msgstr "" #: picard/const.py:82 msgid "Wallis and Futuna Islands" msgstr "" #: picard/const.py:83 msgid "Bermuda" msgstr "" #: picard/const.py:84 msgid "Brunei Darussalam" msgstr "" #: picard/const.py:85 msgid "Bolivia" msgstr "" #: picard/const.py:86 msgid "Bahrain" msgstr "" #: picard/const.py:87 msgid "Burundi" msgstr "" #: picard/const.py:88 msgid "Benin" msgstr "" #: picard/const.py:89 msgid "Bhutan" msgstr "" #: picard/const.py:90 msgid "Jamaica" msgstr "" #: picard/const.py:91 msgid "Bouvet Island" msgstr "" #: picard/const.py:92 msgid "Botswana" msgstr "" #: picard/const.py:93 msgid "Samoa" msgstr "" #: picard/const.py:94 msgid "Brazil" msgstr "" #: picard/const.py:95 msgid "Bahamas" msgstr "" #: picard/const.py:96 msgid "Belarus" msgstr "" #: picard/const.py:97 msgid "Belize" msgstr "" #: picard/const.py:98 msgid "Russian Federation" msgstr "Russiese state bond" #: picard/const.py:99 msgid "Rwanda" msgstr "" #: picard/const.py:100 msgid "Reunion" msgstr "" #: picard/const.py:101 msgid "Turkmenistan" msgstr "" #: picard/const.py:102 msgid "Tajikistan" msgstr "" #: picard/const.py:103 msgid "Romania" msgstr "" #: picard/const.py:104 msgid "Tokelau" msgstr "" #: picard/const.py:105 msgid "Guinea-Bissa" msgstr "" #: picard/const.py:106 msgid "Guam" msgstr "" #: picard/const.py:107 msgid "Guatemala" msgstr "" #: picard/const.py:108 msgid "Greece" msgstr "" #: picard/const.py:109 msgid "Equatorial Guinea" msgstr "" #: picard/const.py:110 msgid "Guadeloupe" msgstr "" #: picard/const.py:111 msgid "Japan" msgstr "" #: picard/const.py:112 msgid "Guyana" msgstr "" #: picard/const.py:113 msgid "French Guiana" msgstr "" #: picard/const.py:114 msgid "Georgia" msgstr "" #: picard/const.py:115 msgid "Grenada" msgstr "" #: picard/const.py:116 msgid "United Kingdom" msgstr "" #: picard/const.py:117 msgid "Gabon" msgstr "" #: picard/const.py:118 msgid "El Salvador" msgstr "" #: picard/const.py:119 msgid "Guinea" msgstr "" #: picard/const.py:120 msgid "Gambia" msgstr "" #: picard/const.py:121 msgid "Greenland" msgstr "" #: picard/const.py:122 msgid "Gibraltar" msgstr "" #: picard/const.py:123 msgid "Ghana" msgstr "" #: picard/const.py:124 msgid "Oman" msgstr "" #: picard/const.py:125 msgid "Tunisia" msgstr "" #: picard/const.py:126 msgid "Jordan" msgstr "" #: picard/const.py:127 msgid "Haiti" msgstr "" #: picard/const.py:128 msgid "Hungary" msgstr "" #: picard/const.py:129 msgid "Hong Kong" msgstr "" #: picard/const.py:130 msgid "Honduras" msgstr "" #: picard/const.py:131 msgid "Heard and Mc Donald Islands" msgstr "" #: picard/const.py:132 msgid "Venezuela" msgstr "" #: picard/const.py:133 msgid "Puerto Rico" msgstr "" #: picard/const.py:134 msgid "Palau" msgstr "" #: picard/const.py:135 msgid "Portugal" msgstr "" #: picard/const.py:136 msgid "Svalbard and Jan Mayen Islands" msgstr "" #: picard/const.py:137 msgid "Paraguay" msgstr "" #: picard/const.py:138 msgid "Iraq" msgstr "" #: picard/const.py:139 msgid "Panama" msgstr "" #: picard/const.py:140 msgid "French Polynesia" msgstr "" #: picard/const.py:141 msgid "Papua New Guinea" msgstr "" #: picard/const.py:142 msgid "Peru" msgstr "" #: picard/const.py:143 msgid "Pakistan" msgstr "" #: picard/const.py:144 msgid "Philippines" msgstr "" #: picard/const.py:145 msgid "Pitcairn" msgstr "" #: picard/const.py:146 msgid "Poland" msgstr "" #: picard/const.py:147 msgid "St. Pierre and Miquelon" msgstr "" #: picard/const.py:148 msgid "Zambia" msgstr "" #: picard/const.py:149 msgid "Western Sahara" msgstr "" #: picard/const.py:150 msgid "Estonia" msgstr "" #: picard/const.py:151 msgid "Egypt" msgstr "" #: picard/const.py:152 msgid "South Africa" msgstr "Suid Afrika" #: picard/const.py:153 msgid "Ecuador" msgstr "" #: picard/const.py:154 msgid "Italy" msgstr "Italië" #: picard/const.py:155 msgid "Viet Nam" msgstr "" #: picard/const.py:156 msgid "Solomon Islands" msgstr "" #: picard/const.py:157 msgid "Ethiopia" msgstr "" #: picard/const.py:158 msgid "Somalia" msgstr "" #: picard/const.py:159 msgid "Zimbabwe" msgstr "" #: picard/const.py:160 msgid "Saudi Arabia" msgstr "" #: picard/const.py:161 msgid "Spain" msgstr "Spanje" #: picard/const.py:162 msgid "Eritrea" msgstr "" #: picard/const.py:163 msgid "Moldova, Republic of" msgstr "" #: picard/const.py:164 msgid "Madagascar" msgstr "" #: picard/const.py:165 msgid "Morocco" msgstr "" #: picard/const.py:166 msgid "Monaco" msgstr "" #: picard/const.py:167 msgid "Uzbekistan" msgstr "" #: picard/const.py:168 msgid "Myanmar" msgstr "" #: picard/const.py:169 msgid "Mali" msgstr "" #: picard/const.py:170 msgid "Macau" msgstr "" #: picard/const.py:171 msgid "Mongolia" msgstr "" #: picard/const.py:172 msgid "Marshall Islands" msgstr "" #: picard/const.py:173 msgid "Macedonia, The Former Yugoslav Republic of" msgstr "" #: picard/const.py:174 msgid "Mauritius" msgstr "" #: picard/const.py:175 msgid "Malta" msgstr "" #: picard/const.py:176 msgid "Malawi" msgstr "" #: picard/const.py:177 msgid "Maldives" msgstr "" #: picard/const.py:178 msgid "Martinique" msgstr "" #: picard/const.py:179 msgid "Northern Mariana Islands" msgstr "" #: picard/const.py:180 msgid "Montserrat" msgstr "" #: picard/const.py:181 msgid "Mauritania" msgstr "" #: picard/const.py:182 msgid "Uganda" msgstr "" #: picard/const.py:183 msgid "Malaysia" msgstr "" #: picard/const.py:184 msgid "Mexico" msgstr "" #: picard/const.py:185 msgid "Israel" msgstr "" #: picard/const.py:186 msgid "France" msgstr "Frankryk" #: picard/const.py:187 msgid "British Indian Ocean Territory" msgstr "" #: picard/const.py:188 msgid "St. Helena" msgstr "" #: picard/const.py:189 msgid "Finland" msgstr "" #: picard/const.py:190 msgid "Fiji" msgstr "" #: picard/const.py:191 msgid "Falkland Islands (Malvinas)" msgstr "" #: picard/const.py:192 msgid "Micronesia, Federated States of" msgstr "" #: picard/const.py:193 msgid "Faroe Islands" msgstr "" #: picard/const.py:194 msgid "Nicaragua" msgstr "" #: picard/const.py:195 msgid "Netherlands" msgstr "Nederland" #: picard/const.py:196 msgid "Norway" msgstr "Noorweë" #: picard/const.py:197 msgid "Namibia" msgstr "" #: picard/const.py:198 msgid "Vanuatu" msgstr "" #: picard/const.py:199 msgid "New Caledonia" msgstr "" #: picard/const.py:200 msgid "Niger" msgstr "" #: picard/const.py:201 msgid "Norfolk Island" msgstr "" #: picard/const.py:202 msgid "Nigeria" msgstr "Nigeria" #: picard/const.py:203 msgid "New Zealand" msgstr "" #: picard/const.py:204 msgid "Zaire" msgstr "" #: picard/const.py:205 msgid "Nepal" msgstr "" #: picard/const.py:206 msgid "Nauru" msgstr "" #: picard/const.py:207 msgid "Niue" msgstr "" #: picard/const.py:208 msgid "Cook Islands" msgstr "" #: picard/const.py:209 msgid "Cote d'Ivoire" msgstr "" #: picard/const.py:210 msgid "Switzerland" msgstr "" #: picard/const.py:211 msgid "Colombia" msgstr "" #: picard/const.py:212 msgid "China" msgstr "" #: picard/const.py:213 msgid "Cameroon" msgstr "" #: picard/const.py:214 msgid "Chile" msgstr "" #: picard/const.py:215 msgid "Cocos (Keeling) Islands" msgstr "" #: picard/const.py:216 msgid "Canada" msgstr "" #: picard/const.py:217 msgid "Congo" msgstr "" #: picard/const.py:218 msgid "Central African Republic" msgstr "" #: picard/const.py:219 msgid "Czech Republic" msgstr "" #: picard/const.py:220 msgid "Cyprus" msgstr "" #: picard/const.py:221 msgid "Christmas Island" msgstr "" #: picard/const.py:222 msgid "Costa Rica" msgstr "" #: picard/const.py:223 msgid "Cape Verde" msgstr "" #: picard/const.py:224 msgid "Cuba" msgstr "" #: picard/const.py:225 msgid "Swaziland" msgstr "" #: picard/const.py:226 msgid "Syrian Arab Republic" msgstr "" #: picard/const.py:227 msgid "Kyrgyzstan" msgstr "" #: picard/const.py:228 msgid "Kenya" msgstr "" #: picard/const.py:229 msgid "Suriname" msgstr "" #: picard/const.py:230 msgid "Kiribati" msgstr "" #: picard/const.py:231 msgid "Cambodia" msgstr "" #: picard/const.py:232 msgid "Saint Kitts and Nevis" msgstr "" #: picard/const.py:233 msgid "Comoros" msgstr "" #: picard/const.py:234 msgid "Sao Tome and Principe" msgstr "" #: picard/const.py:235 msgid "Slovenia" msgstr "" #: picard/const.py:236 msgid "Kuwait" msgstr "" #: picard/const.py:237 msgid "Senegal" msgstr "" #: picard/const.py:238 msgid "San Marino" msgstr "" #: picard/const.py:239 msgid "Sierra Leone" msgstr "" #: picard/const.py:240 msgid "Seychelles" msgstr "" #: picard/const.py:241 msgid "Kazakhstan" msgstr "" #: picard/const.py:242 msgid "Cayman Islands" msgstr "" #: picard/const.py:243 msgid "Singapore" msgstr "" #: picard/const.py:244 msgid "Sweden" msgstr "" #: picard/const.py:245 msgid "Sudan" msgstr "" #: picard/const.py:246 msgid "Dominican Republic" msgstr "" #: picard/const.py:247 msgid "Dominica" msgstr "" #: picard/const.py:248 msgid "Djibouti" msgstr "" #: picard/const.py:249 msgid "Denmark" msgstr "" #: picard/const.py:250 msgid "Virgin Islands (British)" msgstr "" #: picard/const.py:251 msgid "Germany" msgstr "" #: picard/const.py:252 msgid "Yemen" msgstr "" #: picard/const.py:253 msgid "Algeria" msgstr "" #: picard/const.py:254 msgid "United States" msgstr "" #: picard/const.py:255 msgid "Uruguay" msgstr "" #: picard/const.py:256 msgid "Mayotte" msgstr "" #: picard/const.py:257 msgid "United States Minor Outlying Islands" msgstr "" #: picard/const.py:258 msgid "Lebanon" msgstr "" #: picard/const.py:259 msgid "Saint Lucia" msgstr "" #: picard/const.py:260 msgid "Lao People's Democratic Republic" msgstr "" #: picard/const.py:261 msgid "Tuvalu" msgstr "" #: picard/const.py:262 msgid "Taiwan" msgstr "" #: picard/const.py:263 msgid "Trinidad and Tobago" msgstr "" #: picard/const.py:264 msgid "Turkey" msgstr "" #: picard/const.py:265 msgid "Sri Lanka" msgstr "" #: picard/const.py:266 msgid "Liechtenstein" msgstr "" #: picard/const.py:267 msgid "Latvia" msgstr "" #: picard/const.py:268 msgid "Tonga" msgstr "" #: picard/const.py:269 msgid "Lithuania" msgstr "" #: picard/const.py:270 msgid "Luxembourg" msgstr "" #: picard/const.py:271 msgid "Liberia" msgstr "" #: picard/const.py:272 msgid "Lesotho" msgstr "" #: picard/const.py:273 msgid "Thailand" msgstr "" #: picard/const.py:274 msgid "French Southern Territories" msgstr "" #: picard/const.py:275 msgid "Togo" msgstr "" #: picard/const.py:276 msgid "Chad" msgstr "" #: picard/const.py:277 msgid "Turks and Caicos Islands" msgstr "" #: picard/const.py:278 msgid "Libyan Arab Jamahiriya" msgstr "" #: picard/const.py:279 msgid "Vatican City State (Holy See)" msgstr "" #: picard/const.py:280 msgid "Saint Vincent and The Grenadines" msgstr "" #: picard/const.py:281 msgid "United Arab Emirates" msgstr "" #: picard/const.py:282 msgid "Andorra" msgstr "" #: picard/const.py:283 msgid "Antigua and Barbuda" msgstr "" #: picard/const.py:284 msgid "Afghanistan" msgstr "" #: picard/const.py:285 msgid "Anguilla" msgstr "" #: picard/const.py:286 msgid "Virgin Islands (U.S.)" msgstr "" #: picard/const.py:287 msgid "Iceland" msgstr "" #: picard/const.py:288 msgid "Iran (Islamic Republic of)" msgstr "" #: picard/const.py:289 msgid "Armenia" msgstr "" #: picard/const.py:290 msgid "Albania" msgstr "" #: picard/const.py:291 msgid "Angola" msgstr "" #: picard/const.py:292 msgid "Netherlands Antilles" msgstr "" #: picard/const.py:293 msgid "Antarctica" msgstr "" #: picard/const.py:294 msgid "American Samoa" msgstr "" #: picard/const.py:295 msgid "Argentina" msgstr "" #: picard/const.py:296 msgid "Australia" msgstr "" #: picard/const.py:297 msgid "Austria" msgstr "" #: picard/const.py:298 msgid "Aruba" msgstr "" #: picard/const.py:299 msgid "India" msgstr "" #: picard/const.py:300 msgid "Tanzania, United Republic of" msgstr "" #: picard/const.py:301 msgid "Azerbaijan" msgstr "" #: picard/const.py:302 msgid "Ireland" msgstr "" #: picard/const.py:303 msgid "Indonesia" msgstr "" #: picard/const.py:304 msgid "Ukraine" msgstr "" #: picard/const.py:305 msgid "Qatar" msgstr "" #: picard/const.py:306 msgid "Mozambique" msgstr "" #: picard/const.py:307 msgid "Bosnia and Herzegovina" msgstr "" #: picard/const.py:308 msgid "Congo, The Democratic Republic of the" msgstr "" #: picard/const.py:309 msgid "Serbia and Montenegro (historical, 2003-2006)" msgstr "" #: picard/const.py:310 msgid "Serbia" msgstr "" #: picard/const.py:311 msgid "Montenegro" msgstr "" #: picard/const.py:312 msgid "Croatia" msgstr "" #: picard/const.py:313 msgid "Korea (North), Democratic People's Republic of" msgstr "" #: picard/const.py:314 msgid "Korea (South), Republic of" msgstr "" #: picard/const.py:315 msgid "Slovakia" msgstr "" #: picard/const.py:316 msgid "Soviet Union (historical, 1922-1991)" msgstr "" #: picard/const.py:317 msgid "East Timor" msgstr "" #: picard/const.py:318 msgid "Czechoslovakia (historical, 1918-1992)" msgstr "" #: picard/const.py:319 msgid "Europe" msgstr "" #: picard/const.py:320 msgid "East Germany (historical, 1949-1990)" msgstr "" #: picard/const.py:321 msgid "[Unknown Country]" msgstr "" #: picard/const.py:322 msgid "[Worldwide]" msgstr "" #: picard/const.py:323 msgid "Yugoslavia (historical, 1918-1992)" msgstr "" #: picard/const.py:335 msgid "Danish" msgstr "" #: picard/const.py:336 msgid "German" msgstr "" #: picard/const.py:338 msgid "English" msgstr "" #: picard/const.py:339 msgid "English (Canada)" msgstr "" #: picard/const.py:340 msgid "English (UK)" msgstr "" #: picard/const.py:342 msgid "Spanish" msgstr "" #: picard/const.py:343 msgid "Estonian" msgstr "" #: picard/const.py:345 msgid "Finnish" msgstr "" #: picard/const.py:347 msgid "French" msgstr "" #: picard/const.py:356 msgid "Italian" msgstr "" #: picard/const.py:363 msgid "Dutch" msgstr "" #: picard/const.py:365 msgid "Polish" msgstr "" #: picard/const.py:367 msgid "Brazilian Portuguese" msgstr "" #: picard/const.py:374 msgid "Swedish" msgstr "" #: picard/file.py:589 #, python-format msgid "No matching tracks for file %s" msgstr "" #: picard/file.py:604 #, python-format msgid "No matching tracks above the threshold for file %s" msgstr "" #: picard/file.py:607 #, python-format msgid "File %s identified!" msgstr "" #: picard/file.py:623 #, python-format msgid "Looking up the PUID for file %s..." msgstr "" #: picard/file.py:629 #, python-format msgid "Looking up the metadata for file %s..." msgstr "" #: picard/puidmanager.py:62 msgid "Submitting PUIDs..." msgstr "" #: picard/puidmanager.py:68 #, python-format msgid "PUIDs submission failed: %d" msgstr "" #: picard/puidmanager.py:70 msgid "PUIDs successfully submitted!" msgstr "" #: picard/tagger.py:528 msgid "CD Lookup Error" msgstr "" #: picard/tagger.py:529 #, python-format msgid "" "Error while reading CD:\n" "\n" "%s" msgstr "" #: picard/tagger.py:555 #, python-format msgid "Could not find PUID for file %s" msgstr "" #: picard/ui/cdlookup.py:33 picard/ui/mainwindow.py:525 #: picard/ui/ui_options_releases.py:216 picard/util/tags.py:21 msgid "Album" msgstr "" #: picard/ui/cdlookup.py:33 picard/ui/itemviews.py:89 #: picard/ui/mainwindow.py:526 picard/util/tags.py:22 msgid "Artist" msgstr "" #: picard/ui/cdlookup.py:33 picard/util/tags.py:24 msgid "Date" msgstr "" #: picard/ui/cdlookup.py:33 msgid "Country" msgstr "" #: picard/ui/cdlookup.py:34 msgid "Labels" msgstr "" #: picard/ui/cdlookup.py:34 msgid "Catalog #s" msgstr "" #: picard/ui/cdlookup.py:34 picard/util/tags.py:75 msgid "Barcode" msgstr "" #: picard/ui/coverartbox.py:122 msgid "View release on MusicBrainz" msgstr "" #: picard/ui/filebrowser.py:38 msgid "&Move Tagged Files Here" msgstr "" #: picard/ui/filebrowser.py:41 msgid "Show &Hidden Files" msgstr "" #: picard/ui/infodialog.py:36 msgid "Info" msgstr "" #: picard/ui/infodialog.py:42 msgid "Filename:" msgstr "" #: picard/ui/infodialog.py:44 msgid "Format:" msgstr "" #: picard/ui/infodialog.py:53 msgid "Size:" msgstr "" #: picard/ui/infodialog.py:57 msgid "Length:" msgstr "" #: picard/ui/infodialog.py:59 msgid "Bitrate:" msgstr "" #: picard/ui/infodialog.py:61 msgid "Sample rate:" msgstr "" #: picard/ui/infodialog.py:63 msgid "Bits per sample:" msgstr "" #: picard/ui/infodialog.py:66 msgid "Mono" msgstr "" #: picard/ui/infodialog.py:67 msgid "Stereo" msgstr "" #: picard/ui/infodialog.py:69 msgid "Channels:" msgstr "" #: picard/ui/itemviews.py:87 picard/util/tags.py:23 msgid "Title" msgstr "" #: picard/ui/itemviews.py:88 picard/util/tags.py:84 msgid "Length" msgstr "" #: picard/ui/itemviews.py:214 msgid "&Expand all" msgstr "" #: picard/ui/itemviews.py:216 msgid "&Collapse all" msgstr "" #: picard/ui/itemviews.py:273 msgid "&Other versions" msgstr "" #: picard/ui/itemviews.py:276 msgid "Loading..." msgstr "" #: picard/ui/itemviews.py:286 msgid "[no release info]" msgstr "" #: picard/ui/itemviews.py:309 msgid "&Plugins" msgstr "" #: picard/ui/itemviews.py:527 msgid "Clusters" msgstr "" #: picard/ui/logview.py:30 msgid "Log" msgstr "" #: picard/ui/mainwindow.py:73 msgid "MusicBrainz Picard" msgstr "" #: picard/ui/mainwindow.py:151 msgid "Unsaved Changes" msgstr "" #: picard/ui/mainwindow.py:152 msgid "Are you sure you want to quit Picard?" msgstr "" #: picard/ui/mainwindow.py:153 #, python-format msgid "" "There is %d unsaved file. Closing Picard will lose all unsaved changes." msgid_plural "" "There are %d unsaved files. Closing Picard will lose all unsaved changes." msgstr[0] "" msgstr[1] "" #: picard/ui/mainwindow.py:160 msgid "&Quit Picard" msgstr "" #: picard/ui/mainwindow.py:210 msgid "Ready" msgstr "" #: picard/ui/mainwindow.py:214 msgid "" "Picard listens on a port to integrate with your browser and downloads " "release information when you click the \"Tagger\" buttons on the MusicBrainz" " website" msgstr "" #: picard/ui/mainwindow.py:224 #, python-format msgid " Files: %(files)d, Pending Files: %(pending)d " msgstr "" #: picard/ui/mainwindow.py:229 #, python-format msgid " Listening on port %(port)d " msgstr "" #: picard/ui/mainwindow.py:257 msgid "Submission Error" msgstr "" #: picard/ui/mainwindow.py:258 msgid "" "You need to configure your AcoustID API key before you can submit " "fingerprints." msgstr "" #: picard/ui/mainwindow.py:265 msgid "&Options..." msgstr "" #: picard/ui/mainwindow.py:268 msgid "&Cut" msgstr "" #: picard/ui/mainwindow.py:273 msgid "&Paste" msgstr "" #: picard/ui/mainwindow.py:278 msgid "&Help..." msgstr "" #: picard/ui/mainwindow.py:283 msgid "&About..." msgstr "" #: picard/ui/mainwindow.py:286 msgid "&Donate..." msgstr "" #: picard/ui/mainwindow.py:289 msgid "&Report a Bug..." msgstr "" #: picard/ui/mainwindow.py:292 msgid "&Support Forum..." msgstr "" #: picard/ui/mainwindow.py:295 msgid "&Add Files..." msgstr "" #: picard/ui/mainwindow.py:296 msgid "Add files to the tagger" msgstr "" #: picard/ui/mainwindow.py:301 msgid "A&dd Folder..." msgstr "" #: picard/ui/mainwindow.py:302 msgid "Add a folder to the tagger" msgstr "" #: picard/ui/mainwindow.py:304 msgid "Ctrl+D" msgstr "" #: picard/ui/mainwindow.py:308 msgid "&Save" msgstr "" #: picard/ui/mainwindow.py:309 msgid "Save selected files" msgstr "" #: picard/ui/mainwindow.py:315 msgid "S&ubmit" msgstr "" #: picard/ui/mainwindow.py:316 msgid "Submit fingerprints" msgstr "" #: picard/ui/mainwindow.py:320 msgid "E&xit" msgstr "" #: picard/ui/mainwindow.py:322 msgid "Ctrl+Q" msgstr "" #: picard/ui/mainwindow.py:325 msgid "&Remove" msgstr "" #: picard/ui/mainwindow.py:326 msgid "Remove selected files/albums" msgstr "" #: picard/ui/mainwindow.py:330 msgid "Lookup in &Browser" msgstr "" #: picard/ui/mainwindow.py:331 msgid "Lookup selected item on MusicBrainz website" msgstr "" #: picard/ui/mainwindow.py:335 msgid "File &Browser" msgstr "" #: picard/ui/mainwindow.py:339 msgid "Ctrl+B" msgstr "" #: picard/ui/mainwindow.py:342 msgid "&Cover Art" msgstr "" #: picard/ui/mainwindow.py:348 msgid "Search" msgstr "" #: picard/ui/mainwindow.py:351 msgid "&CD Lookup..." msgstr "" #: picard/ui/mainwindow.py:352 picard/ui/mainwindow.py:353 msgid "Lookup CD" msgstr "" #: picard/ui/mainwindow.py:355 msgid "Ctrl+K" msgstr "" #: picard/ui/mainwindow.py:358 msgid "&Scan" msgstr "" #: picard/ui/mainwindow.py:361 msgid "Ctrl+Y" msgstr "" #: picard/ui/mainwindow.py:364 msgid "Cl&uster" msgstr "" #: picard/ui/mainwindow.py:367 msgid "Ctrl+U" msgstr "" #: picard/ui/mainwindow.py:370 msgid "&Lookup" msgstr "" #: picard/ui/mainwindow.py:371 picard/ui/mainwindow.py:372 msgid "Lookup metadata" msgstr "" #: picard/ui/mainwindow.py:375 msgid "Ctrl+L" msgstr "" #: picard/ui/mainwindow.py:378 msgid "&Info..." msgstr "" #: picard/ui/mainwindow.py:381 msgid "Ctrl+I" msgstr "" #: picard/ui/mainwindow.py:384 msgid "&Refresh" msgstr "" #: picard/ui/mainwindow.py:385 msgid "Ctrl+R" msgstr "" #: picard/ui/mainwindow.py:388 msgid "&Rename Files" msgstr "" #: picard/ui/mainwindow.py:393 msgid "&Move Files" msgstr "" #: picard/ui/mainwindow.py:398 msgid "Save &Tags" msgstr "" #: picard/ui/mainwindow.py:403 msgid "Tags From &File Names..." msgstr "" #: picard/ui/mainwindow.py:406 msgid "View &Log..." msgstr "" #: picard/ui/mainwindow.py:412 msgid "&Open..." msgstr "" #: picard/ui/mainwindow.py:413 msgid "Open the file" msgstr "" #: picard/ui/mainwindow.py:416 msgid "Open &Folder..." msgstr "" #: picard/ui/mainwindow.py:417 msgid "Open the containing folder" msgstr "" #: picard/ui/mainwindow.py:438 msgid "&File" msgstr "" #: picard/ui/mainwindow.py:446 msgid "&Edit" msgstr "" #: picard/ui/mainwindow.py:452 msgid "&View" msgstr "" #: picard/ui/mainwindow.py:460 msgid "&Options" msgstr "" #: picard/ui/mainwindow.py:466 msgid "&Tools" msgstr "" #: picard/ui/mainwindow.py:475 picard/ui/util.py:33 msgid "&Help" msgstr "" #: picard/ui/mainwindow.py:493 msgid "&Toolbar" msgstr "" #: picard/ui/mainwindow.py:520 msgid "&Search Bar" msgstr "" #: picard/ui/mainwindow.py:527 picard/ui/puidsubmit.py:31 msgid "Track" msgstr "" #: picard/ui/mainwindow.py:566 msgid "All Supported Formats" msgstr "" #: picard/ui/mainwindow.py:624 picard/ui/mainwindow.py:633 msgid "Various Artists file naming scheme removal" msgstr "" #: picard/ui/mainwindow.py:625 msgid "" "The separate file naming scheme for various artists albums has been\n" "removed in this version of Picard. You currently do not use the this option,\n" "but have a separate file naming scheme defined. Do you want to remove it or\n" "merge it with your file naming scheme for single artist albums?" msgstr "" #: picard/ui/mainwindow.py:629 msgid "Merge" msgstr "" #: picard/ui/mainwindow.py:629 picard/ui/metadatabox.py:185 msgid "Remove" msgstr "" #: picard/ui/mainwindow.py:634 msgid "" "The separate file naming scheme for various artists albums has been\n" "removed in this version of Picard. Your file naming scheme has automatically\n" "been merged with that of single artist albums." msgstr "" #: picard/ui/mainwindow.py:682 msgid "Configuration Required" msgstr "" #: picard/ui/mainwindow.py:683 msgid "" "Audio fingerprinting is not yet configured. Would you like to configure it " "now?" msgstr "" #: picard/ui/mainwindow.py:756 picard/ui/mainwindow.py:763 #, python-format msgid " (Error: %s)" msgstr "" #: picard/ui/metadatabox.py:64 #, python-format msgid "(missing from %d item)" msgid_plural "(missing from %d items)" msgstr[0] "" msgstr[1] "" #: picard/ui/metadatabox.py:66 #, python-format msgid "(different across %d item)" msgid_plural "(different across %d items)" msgstr[0] "" msgstr[1] "" #: picard/ui/metadatabox.py:90 msgid "Tag" msgstr "" #: picard/ui/metadatabox.py:90 msgid "Original Value" msgstr "" #: picard/ui/metadatabox.py:90 msgid "New Value" msgstr "" #: picard/ui/metadatabox.py:117 msgid "Add New Tag..." msgstr "" #: picard/ui/metadatabox.py:119 msgid "Show Changes First" msgstr "" #: picard/ui/metadatabox.py:166 msgid "Edit..." msgstr "" #: picard/ui/metadatabox.py:189 msgid "Use Original Value" msgid_plural "Use Original Values" msgstr[0] "" msgstr[1] "" #: picard/ui/passworddialog.py:38 #, python-format msgid "" "The server %s requires you to login. Please enter your username and " "password." msgstr "" #: picard/ui/passworddialog.py:76 #, python-format msgid "" "The proxy %s requires you to login. Please enter your username and password." msgstr "" #: picard/ui/puidsubmit.py:31 picard/ui/options/plugins.py:125 msgid "File" msgstr "" #: picard/ui/puidsubmit.py:31 msgid "PUID" msgstr "" #: picard/ui/puidsubmit.py:31 msgid "Release" msgstr "" #: picard/ui/puidsubmit.py:31 msgid "Release ID" msgstr "" #: picard/ui/tagsfromfilenames.py:54 picard/ui/tagsfromfilenames.py:99 msgid "File Name" msgstr "" #: picard/ui/ui_cdlookup.py:57 picard/ui/ui_options_cdlookup.py:46 #: picard/ui/ui_options_cdlookup_select.py:53 picard/ui/options/cdlookup.py:36 msgid "CD Lookup" msgstr "" #: picard/ui/ui_cdlookup.py:58 msgid "The following releases on MusicBrainz match the CD:" msgstr "" #: picard/ui/ui_cdlookup.py:59 picard/ui/ui_puidsubmit.py:52 msgid "OK" msgstr "" #: picard/ui/ui_cdlookup.py:60 msgid " Lookup manually " msgstr "" #: picard/ui/ui_cdlookup.py:61 picard/ui/ui_puidsubmit.py:53 msgid "Cancel" msgstr "" #: picard/ui/ui_edittagdialog.py:92 msgid "Edit Tag" msgstr "" #: picard/ui/ui_edittagdialog.py:93 msgid "Edit value" msgstr "" #: picard/ui/ui_edittagdialog.py:94 msgid "Add value" msgstr "" #: picard/ui/ui_edittagdialog.py:95 msgid "Remove value" msgstr "" #: picard/ui/ui_infodialog.py:66 msgid "&Info" msgstr "" #: picard/ui/ui_infodialog.py:67 msgid "A&rtwork" msgstr "" #: picard/ui/ui_options.py:42 msgid "Options" msgstr "" #: picard/ui/ui_options_cdlookup.py:47 msgid "CD-ROM device to use for lookups:" msgstr "" #: picard/ui/ui_options_cdlookup_select.py:54 msgid "Default CD-ROM drive to use for lookups:" msgstr "" #: picard/ui/ui_options_cover.py:53 msgid "Location" msgstr "" #: picard/ui/ui_options_cover.py:54 msgid "Embed cover images into tags" msgstr "" #: picard/ui/ui_options_cover.py:55 msgid "Save cover images as separate files" msgstr "" #: picard/ui/ui_options_cover.py:56 msgid "Overwrite the file if it already exists" msgstr "" #: picard/ui/ui_options_fingerprinting.py:74 msgid "Audio Fingerprinting" msgstr "" #: picard/ui/ui_options_fingerprinting.py:75 msgid "Use AcoustID" msgstr "" #: picard/ui/ui_options_fingerprinting.py:76 msgid "Use AmpliFIND (formerly MusicDNS)" msgstr "" #: picard/ui/ui_options_fingerprinting.py:77 msgid "AcoustID Settings" msgstr "" #: picard/ui/ui_options_fingerprinting.py:78 msgid "Fingerprint calculator:" msgstr "" #: picard/ui/ui_options_fingerprinting.py:79 #: picard/ui/ui_options_renaming.py:138 msgid "Browse..." msgstr "" #: picard/ui/ui_options_fingerprinting.py:80 msgid "Download..." msgstr "" #: picard/ui/ui_options_fingerprinting.py:81 msgid "API key:" msgstr "" #: picard/ui/ui_options_fingerprinting.py:82 msgid "Get API key..." msgstr "" #: picard/ui/ui_options_folksonomy.py:106 picard/ui/options/folksonomy.py:29 msgid "Folksonomy Tags" msgstr "" #: picard/ui/ui_options_folksonomy.py:108 msgid "Only use my tags" msgstr "" #: picard/ui/ui_options_folksonomy.py:111 msgid "Maximum number of tags:" msgstr "" #: picard/ui/ui_options_general.py:92 msgid "MusicBrainz Server" msgstr "" #: picard/ui/ui_options_general.py:93 picard/ui/ui_options_proxy.py:77 msgid "Port:" msgstr "" #: picard/ui/ui_options_general.py:94 picard/ui/ui_options_proxy.py:78 msgid "Server address:" msgstr "" #: picard/ui/ui_options_general.py:95 msgid "Account Information" msgstr "" #: picard/ui/ui_options_general.py:96 picard/ui/ui_options_proxy.py:75 #: picard/ui/ui_passworddialog.py:74 msgid "Password:" msgstr "" #: picard/ui/ui_options_general.py:97 picard/ui/ui_options_proxy.py:76 #: picard/ui/ui_passworddialog.py:73 msgid "Username:" msgstr "" #: picard/ui/ui_options_general.py:98 picard/ui/options/general.py:29 msgid "General" msgstr "" #: picard/ui/ui_options_general.py:99 msgid "Automatically scan all new files" msgstr "" #: picard/ui/ui_options_general.py:100 msgid "Ignore MBIDs when loading new files" msgstr "" #: picard/ui/ui_options_interface.py:58 msgid "Miscellaneous" msgstr "" #: picard/ui/ui_options_interface.py:59 msgid "Show text labels under icons" msgstr "" #: picard/ui/ui_options_interface.py:60 msgid "Allow selection of multiple directories" msgstr "" #: picard/ui/ui_options_interface.py:61 msgid "Use advanced query syntax" msgstr "" #: picard/ui/ui_options_interface.py:62 msgid "Show a quit confirmation dialog for unsaved changes" msgstr "" #: picard/ui/ui_options_interface.py:63 msgid "User interface language:" msgstr "" #: picard/ui/ui_options_matching.py:77 msgid "Thresholds" msgstr "" #: picard/ui/ui_options_matching.py:78 msgid "Minimal similarity for matching files to tracks:" msgstr "" #: picard/ui/ui_options_matching.py:82 msgid "Minimal similarity for file lookups:" msgstr "" #: picard/ui/ui_options_matching.py:83 msgid "Minimal similarity for cluster lookups:" msgstr "" #: picard/ui/ui_options_metadata.py:101 picard/ui/options/metadata.py:30 msgid "Metadata" msgstr "" #: picard/ui/ui_options_metadata.py:102 msgid "Translate artist names to this locale where possible:" msgstr "" #: picard/ui/ui_options_metadata.py:103 msgid "Use standardized artist names" msgstr "" #: picard/ui/ui_options_metadata.py:104 msgid "Convert Unicode punctuation characters to ASCII" msgstr "" #: picard/ui/ui_options_metadata.py:105 msgid "Use release relationships" msgstr "" #: picard/ui/ui_options_metadata.py:106 msgid "Use track relationships" msgstr "" #: picard/ui/ui_options_metadata.py:107 msgid "Use folksonomy tags as genre" msgstr "" #: picard/ui/ui_options_metadata.py:108 msgid "Custom Fields" msgstr "" #: picard/ui/ui_options_metadata.py:109 msgid "Various artists:" msgstr "" #: picard/ui/ui_options_metadata.py:110 msgid "Non-album tracks:" msgstr "" #: picard/ui/ui_options_metadata.py:111 picard/ui/ui_options_metadata.py:112 #: picard/ui/ui_options_renaming.py:147 msgid "Default" msgstr "" #: picard/ui/ui_options_plugins.py:131 picard/ui/options/plugins.py:37 msgid "Plugins" msgstr "" #: picard/ui/ui_options_plugins.py:132 picard/ui/options/plugins.py:121 msgid "Name" msgstr "" #: picard/ui/ui_options_plugins.py:133 picard/util/tags.py:37 msgid "Version" msgstr "" #: picard/ui/ui_options_plugins.py:134 picard/ui/options/plugins.py:124 msgid "Author" msgstr "" #: picard/ui/ui_options_plugins.py:135 msgid "Install plugin..." msgstr "" #: picard/ui/ui_options_plugins.py:136 msgid "Open plugin folder" msgstr "" #: picard/ui/ui_options_plugins.py:137 msgid "Download plugins" msgstr "" #: picard/ui/ui_options_plugins.py:138 msgid "Details" msgstr "" #: picard/ui/ui_options_proxy.py:74 picard/ui/options/proxy.py:28 msgid "Web Proxy" msgstr "" #: picard/ui/ui_options_ratings.py:53 msgid "Enable track ratings" msgstr "" #: picard/ui/ui_options_ratings.py:54 msgid "" "Picard saves the ratings together with an e-mail address identifying the " "user who did the rating. That way different ratings for different users can " "be stored in the files. Please specify the e-mail you want to use to save " "your ratings." msgstr "" #: picard/ui/ui_options_ratings.py:55 msgid "E-mail:" msgstr "" #: picard/ui/ui_options_ratings.py:56 msgid "Submit ratings to MusicBrainz" msgstr "" #: picard/ui/ui_options_releases.py:215 msgid "Preferred release types" msgstr "" #: picard/ui/ui_options_releases.py:217 msgid "Single" msgstr "" #: picard/ui/ui_options_releases.py:218 msgid "EP" msgstr "" #: picard/ui/ui_options_releases.py:219 picard/util/tags.py:66 msgid "Compilation" msgstr "Kompilasie" #: picard/ui/ui_options_releases.py:220 msgid "Soundtrack" msgstr "" #: picard/ui/ui_options_releases.py:221 msgid "Spokenword" msgstr "" #: picard/ui/ui_options_releases.py:222 msgid "Interview" msgstr "" #: picard/ui/ui_options_releases.py:223 msgid "Audiobook" msgstr "" #: picard/ui/ui_options_releases.py:224 msgid "Live" msgstr "" #: picard/ui/ui_options_releases.py:225 msgid "Remix" msgstr "" #: picard/ui/ui_options_releases.py:227 msgid "Reset all" msgstr "" #: picard/ui/ui_options_releases.py:228 msgid "Preferred release countries" msgstr "" #: picard/ui/ui_options_releases.py:229 picard/ui/ui_options_releases.py:232 msgid ">" msgstr "" #: picard/ui/ui_options_releases.py:230 picard/ui/ui_options_releases.py:233 msgid "<" msgstr "" #: picard/ui/ui_options_releases.py:231 msgid "Preferred release formats" msgstr "" #: picard/ui/ui_options_renaming.py:134 msgid "Rename files when saving" msgstr "" #: picard/ui/ui_options_renaming.py:135 msgid "Replace non-ASCII characters" msgstr "" #: picard/ui/ui_options_renaming.py:136 msgid "Replace Windows-incompatible characters" msgstr "" #: picard/ui/ui_options_renaming.py:137 msgid "Move files to this directory when saving:" msgstr "" #: picard/ui/ui_options_renaming.py:139 msgid "Delete empty directories" msgstr "" #: picard/ui/ui_options_renaming.py:140 msgid "Move additional files:" msgstr "" #: picard/ui/ui_options_renaming.py:141 msgid "Name files like this" msgstr "" #: picard/ui/ui_options_renaming.py:148 msgid "Examples" msgstr "" #: picard/ui/ui_options_script.py:49 msgid "Tagger Script" msgstr "" #: picard/ui/ui_options_tags.py:114 msgid "Write tags to files" msgstr "" #: picard/ui/ui_options_tags.py:115 msgid "Preserve timestamps of tagged files" msgstr "" #: picard/ui/ui_options_tags.py:116 msgid "Before tagging" msgstr "" #: picard/ui/ui_options_tags.py:117 msgid "Clear existing tags" msgstr "" #: picard/ui/ui_options_tags.py:118 msgid "Remove ID3 tags from FLAC files" msgstr "" #: picard/ui/ui_options_tags.py:119 msgid "Remove APEv2 tags from MP3 files" msgstr "" #: picard/ui/ui_options_tags.py:120 msgid "" "Preserve these tags from being cleared or overwritten with MusicBrainz data:" msgstr "" #: picard/ui/ui_options_tags.py:121 msgid "Tags are separated by spaces, and are case-sensitive." msgstr "" #: picard/ui/ui_options_tags.py:122 msgid "Tag compatibility" msgstr "" #: picard/ui/ui_options_tags.py:123 msgid "ID3v2 version" msgstr "" #: picard/ui/ui_options_tags.py:124 msgid "2.4" msgstr "" #: picard/ui/ui_options_tags.py:125 msgid "2.3" msgstr "" #: picard/ui/ui_options_tags.py:126 msgid "Also include ID3v1 tags in the files" msgstr "" #: picard/ui/ui_options_tags.py:127 msgid "ID3v2 text encoding" msgstr "" #: picard/ui/ui_options_tags.py:128 msgid "UTF-8" msgstr "" #: picard/ui/ui_options_tags.py:129 msgid "UTF-16" msgstr "" #: picard/ui/ui_options_tags.py:130 msgid "ISO-8859-1" msgstr "" #: picard/ui/ui_passworddialog.py:72 msgid "Authentication required" msgstr "" #: picard/ui/ui_passworddialog.py:75 msgid "Save username and password" msgstr "" #: picard/ui/ui_puidsubmit.py:51 msgid "Submit PUIDs" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:54 msgid "Convert File Names to Tags" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:55 msgid "Replace underscores with spaces" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:56 msgid "&Preview" msgstr "" #: picard/ui/util.py:31 msgid "&Ok" msgstr "" #: picard/ui/util.py:32 msgid "&Cancel" msgstr "" #: picard/ui/options/about.py:29 msgid "About" msgstr "" #: picard/ui/options/about.py:48 msgid "translator-credits" msgstr "Launchpad Contributions:\n Darryl Smith https://launchpad.net/~semiintel" #: picard/ui/options/about.py:51 #, python-format msgid "
Translated to LANG by %s" msgstr "" #: picard/ui/options/about.py:55 #, python-format msgid "" "

MusicBrainz Picard
\n" "Version %(version)s

\n" "

Supported formats
%(formats)s

\n" "

Please donate
\n" "Thank you for using Picard. Picard relies on the MusicBrainz database, which is operated by the MetaBrainz Foundation with the help of thousands of volunteers. If you like this application please consider donating to the MetaBrainz Foundation to keep the service running.

\n" "

Donate now!

\n" "

Credits
\n" "Copyright © 2004-2011 Robert Kaye, Lukáš Lalinský and others%(translator-credits)s

\n" "

http://musicbrainz.org/doc/MusicBrainz_Picard

\n" msgstr "" #: picard/ui/options/advanced.py:26 msgid "Advanced" msgstr "" #: picard/ui/options/cover.py:29 msgid "Cover Art" msgstr "" #: picard/ui/options/fingerprinting.py:32 msgid "Fingerprinting" msgstr "" #: picard/ui/options/interface.py:32 msgid "User Interface" msgstr "" #: picard/ui/options/interface.py:49 msgid "System default" msgstr "" #: picard/ui/options/interface.py:76 msgid "Language changed" msgstr "" #: picard/ui/options/interface.py:76 msgid "" "You have changed the interface language. You have to restart Picard in order" " for the change to take effect." msgstr "" #: picard/ui/options/matching.py:29 msgid "Matching" msgstr "" #: picard/ui/options/ratings.py:29 msgid "Ratings" msgstr "" #: picard/ui/options/releases.py:33 msgid "Preferred Releases" msgstr "" #: picard/ui/options/renaming.py:34 msgid "File naming" msgstr "" #: picard/ui/options/renaming.py:143 msgid "Error" msgstr "" #: picard/ui/options/renaming.py:143 msgid "The location to move files to must not be empty." msgstr "" #: picard/ui/options/renaming.py:153 msgid "The file naming format must not be empty." msgstr "" #: picard/ui/options/scripting.py:63 msgid "Scripting" msgstr "" #: picard/ui/options/scripting.py:97 msgid "Script Error" msgstr "" #: picard/util/tags.py:25 msgid "Original Release Date" msgstr "" #: picard/util/tags.py:26 msgid "Album Artist" msgstr "" #: picard/util/tags.py:27 msgid "Track Number" msgstr "" #: picard/util/tags.py:28 msgid "Total Tracks" msgstr "" #: picard/util/tags.py:29 msgid "Disc Number" msgstr "" #: picard/util/tags.py:30 msgid "Total Discs" msgstr "" #: picard/util/tags.py:31 msgid "Album Artist Sort Order" msgstr "" #: picard/util/tags.py:32 msgid "Artist Sort Order" msgstr "" #: picard/util/tags.py:33 msgid "Title Sort Order" msgstr "" #: picard/util/tags.py:34 msgid "Album Sort Order" msgstr "" #: picard/util/tags.py:35 msgid "ASIN" msgstr "" #: picard/util/tags.py:36 msgid "Grouping" msgstr "" #: picard/util/tags.py:38 msgid "ISRC" msgstr "" #: picard/util/tags.py:39 msgid "Mood" msgstr "" #: picard/util/tags.py:40 msgid "BPM" msgstr "" #: picard/util/tags.py:41 msgid "Copyright" msgstr "" #: picard/util/tags.py:42 msgid "License" msgstr "" #: picard/util/tags.py:43 msgid "Composer" msgstr "" #: picard/util/tags.py:44 msgid "Writer" msgstr "" #: picard/util/tags.py:45 msgid "Conductor" msgstr "" #: picard/util/tags.py:46 msgid "Lyricist" msgstr "" #: picard/util/tags.py:47 msgid "Arranger" msgstr "" #: picard/util/tags.py:48 msgid "Producer" msgstr "" #: picard/util/tags.py:49 msgid "Engineer" msgstr "" #: picard/util/tags.py:50 msgid "Subtitle" msgstr "" #: picard/util/tags.py:51 msgid "Disc Subtitle" msgstr "" #: picard/util/tags.py:52 msgid "Remixer" msgstr "" #: picard/util/tags.py:53 msgid "MusicBrainz Recording Id" msgstr "" #: picard/util/tags.py:54 msgid "MusicBrainz Release Id" msgstr "" #: picard/util/tags.py:55 msgid "MusicBrainz Artist Id" msgstr "" #: picard/util/tags.py:56 msgid "MusicBrainz Release Artist Id" msgstr "" #: picard/util/tags.py:57 msgid "MusicBrainz Work Id" msgstr "" #: picard/util/tags.py:58 msgid "MusicBrainz Disc Id" msgstr "" #: picard/util/tags.py:59 msgid "MusicBrainz Sort Name" msgstr "" #: picard/util/tags.py:60 msgid "MusicIP PUID" msgstr "" #: picard/util/tags.py:61 msgid "MusicIP Fingerprint" msgstr "" #: picard/util/tags.py:62 msgid "AcoustID" msgstr "" #: picard/util/tags.py:63 msgid "AcoustID Fingerprint" msgstr "" #: picard/util/tags.py:64 msgid "Disc Id" msgstr "" #: picard/util/tags.py:65 msgid "Website" msgstr "Webwerf" #: picard/util/tags.py:67 msgid "Comment" msgstr "Aanmerking" #: picard/util/tags.py:68 msgid "Genre" msgstr "" #: picard/util/tags.py:69 msgid "Encoded By" msgstr "" #: picard/util/tags.py:70 msgid "Performer" msgstr "" #: picard/util/tags.py:71 msgid "Release Type" msgstr "" #: picard/util/tags.py:72 msgid "Release Status" msgstr "" #: picard/util/tags.py:73 msgid "Release Country" msgstr "" #: picard/util/tags.py:74 msgid "Record Label" msgstr "" #: picard/util/tags.py:76 msgid "Catalog Number" msgstr "" #: picard/util/tags.py:77 msgid "Format" msgstr "" #: picard/util/tags.py:78 msgid "DJ-Mixer" msgstr "" #: picard/util/tags.py:79 msgid "Media" msgstr "Media" #: picard/util/tags.py:80 msgid "Lyrics" msgstr "" #: picard/util/tags.py:81 msgid "Mixer" msgstr "" #: picard/util/tags.py:82 msgid "Language" msgstr "Taal" #: picard/util/tags.py:83 msgid "Script" msgstr "" #: picard/util/tags.py:85 msgid "Rating" msgstr "" #: picard/util/webbrowser2.py:88 msgid "Web Browser Error" msgstr "" #: picard/util/webbrowser2.py:88 #, python-format msgid "" "Error while launching a web browser:\n" "\n" "%s" msgstr "" picard-release-1.3.2/po/ar.po000066400000000000000000001436461245305550700160010ustar00rootroot00000000000000# Translations template for PROJECT. # Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: # FIRST AUTHOR , 2009. msgid "" msgstr "" "Project-Id-Version: MusicBrainz\n" "Report-Msgid-Bugs-To: http://tickets.musicbrainz.org/\n" "POT-Creation-Date: 2012-08-28 15:50+0200\n" "PO-Revision-Date: 2012-08-29 08:53+0000\n" "Last-Translator: Lukáš Lalinský \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" "Language: ar\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" #: contrib/plugins/no_release.py:48 msgid "Enable plugin for all releases by default" msgstr "" #: contrib/plugins/no_release.py:49 msgid "Tags to strip (comma-separated)" msgstr "" #: contrib/plugins/no_release.py:59 msgid "Remove specific release information..." msgstr "" #: contrib/plugins/open_in_gui.py:30 msgid "Open Error" msgstr "" #: contrib/plugins/open_in_gui.py:30 #, python-format msgid "" "Error while opening file:\n" "\n" "%s" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:115 msgid "Last.fm" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:116 msgid "Use track tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:117 msgid "Use artist tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:118 #: picard/ui/options/tags.py:30 msgid "Tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:119 #: picard/ui/ui_options_folksonomy.py:107 msgid "Ignore tags:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:120 #: picard/ui/ui_options_folksonomy.py:112 msgid "Join multiple tags with:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:121 #: picard/ui/ui_options_folksonomy.py:113 msgid " / " msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:122 #: picard/ui/ui_options_folksonomy.py:114 msgid ", " msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:123 #: picard/ui/ui_options_folksonomy.py:109 msgid "Minimal tag usage:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:124 #: picard/ui/ui_options_folksonomy.py:110 picard/ui/ui_options_matching.py:79 #: picard/ui/ui_options_matching.py:80 picard/ui/ui_options_matching.py:81 msgid " %" msgstr "" #: contrib/plugins/replaygain/__init__.py:48 msgid "Calculate replay &gain..." msgstr "" #: contrib/plugins/replaygain/__init__.py:65 #, python-format msgid "Calculating replay gain for \"%s\"..." msgstr "" #: contrib/plugins/replaygain/__init__.py:70 #, python-format msgid "Replay gain for \"%s\" successfully calculated." msgstr "" #: contrib/plugins/replaygain/__init__.py:72 #, python-format msgid "Could not calculate replay gain for \"%s\"." msgstr "" #: contrib/plugins/replaygain/__init__.py:75 msgid "Calculate album &gain..." msgstr "" #: contrib/plugins/replaygain/__init__.py:98 #, python-format msgid "Calculating album gain for \"%s\"..." msgstr "" #: contrib/plugins/replaygain/__init__.py:106 #, python-format msgid "Album gain for \"%s\" successfully calculated." msgstr "" #: contrib/plugins/replaygain/__init__.py:108 #, python-format msgid "Could not calculate album gain for \"%s\"." msgstr "" #: picard/acoustid.py:116 #, python-format msgid "Could not find AcoustID for file %s" msgstr "" #: picard/acoustid.py:120 picard/musicdns/__init__.py:103 #, python-format msgid "Looking up the fingerprint for file %s..." msgstr "" #: picard/acoustidmanager.py:78 msgid "Submitting AcoustIDs..." msgstr "" #: picard/acoustidmanager.py:83 #, python-format msgid "AcoustID submission failed: %s" msgstr "" #: picard/acoustidmanager.py:85 msgid "AcoustIDs successfully submitted!" msgstr "" #: picard/album.py:55 picard/cluster.py:260 msgid "Unmatched Files" msgstr "" #: picard/album.py:180 #, python-format msgid "[could not load album %s]" msgstr "" #: picard/album.py:266 #, python-format msgid "Album %s loaded" msgstr "" #: picard/album.py:282 msgid "[loading album information]" msgstr "تحميل معلومات الألبوم" #: picard/cluster.py:177 picard/cluster.py:188 #, python-format msgid "No matching releases for cluster %s" msgstr "" #: picard/cluster.py:190 #, python-format msgid "Cluster %s identified!" msgstr "" #: picard/cluster.py:195 #, python-format msgid "Looking up the metadata for cluster %s..." msgstr "" #: picard/const.py:39 msgid "CD" msgstr "قرص مدمج" #: picard/const.py:40 msgid "CD-R" msgstr "" #: picard/const.py:41 msgid "HDCD" msgstr "" #: picard/const.py:42 msgid "8cm CD" msgstr "" #: picard/const.py:43 msgid "Vinyl" msgstr "Vinyl" #: picard/const.py:44 msgid "7\" Vinyl" msgstr "" #: picard/const.py:45 msgid "10\" Vinyl" msgstr "" #: picard/const.py:46 msgid "12\" Vinyl" msgstr "" #: picard/const.py:47 msgid "Digital Media" msgstr "وسائط رقمية" #: picard/const.py:48 msgid "USB Flash Drive" msgstr "" #: picard/const.py:49 msgid "slotMusic" msgstr "" #: picard/const.py:50 msgid "Cassette" msgstr "Cassette" #: picard/const.py:51 msgid "DVD" msgstr "دي‌ڤي‌دي" #: picard/const.py:52 msgid "DVD-Audio" msgstr "" #: picard/const.py:53 msgid "DVD-Video" msgstr "" #: picard/const.py:54 msgid "SACD" msgstr "SACD" #: picard/const.py:55 msgid "DualDisc" msgstr "" #: picard/const.py:56 msgid "MiniDisc" msgstr "MiniDisc" #: picard/const.py:57 msgid "Blu-ray" msgstr "" #: picard/const.py:58 msgid "HD-DVD" msgstr "" #: picard/const.py:59 msgid "Videotape" msgstr "" #: picard/const.py:60 msgid "VHS" msgstr "" #: picard/const.py:61 msgid "Betamax" msgstr "" #: picard/const.py:62 msgid "VCD" msgstr "" #: picard/const.py:63 msgid "SVCD" msgstr "" #: picard/const.py:64 msgid "UMD" msgstr "" #: picard/const.py:65 picard/ui/ui_options_releases.py:226 msgid "Other" msgstr "أخرى" #: picard/const.py:66 msgid "LaserDisc" msgstr "" #: picard/const.py:67 msgid "Cartridge" msgstr "" #: picard/const.py:68 msgid "Reel-to-reel" msgstr "" #: picard/const.py:69 msgid "DAT" msgstr "DAT" #: picard/const.py:70 msgid "Wax Cylinder" msgstr "" #: picard/const.py:71 msgid "Piano Roll" msgstr "" #: picard/const.py:72 msgid "DCC" msgstr "" #: picard/const.py:77 msgid "Bangladesh" msgstr "بنجلاديش" #: picard/const.py:78 msgid "Belgium" msgstr "بلجيكا" #: picard/const.py:79 msgid "Burkina Faso" msgstr "بوركينا فاسو" #: picard/const.py:80 msgid "Bulgaria" msgstr "بلغاريا" #: picard/const.py:81 msgid "Barbados" msgstr "باربادوس" #: picard/const.py:82 msgid "Wallis and Futuna Islands" msgstr "" #: picard/const.py:83 msgid "Bermuda" msgstr "برمودا" #: picard/const.py:84 msgid "Brunei Darussalam" msgstr "بروناي دار السّلام" #: picard/const.py:85 msgid "Bolivia" msgstr "بوليفيا" #: picard/const.py:86 msgid "Bahrain" msgstr "البحرين" #: picard/const.py:87 msgid "Burundi" msgstr "بوروندي" #: picard/const.py:88 msgid "Benin" msgstr "بينين" #: picard/const.py:89 msgid "Bhutan" msgstr "بوتان" #: picard/const.py:90 msgid "Jamaica" msgstr "جامايكا" #: picard/const.py:91 msgid "Bouvet Island" msgstr "جزيرة بوفي" #: picard/const.py:92 msgid "Botswana" msgstr "بوتسوانا" #: picard/const.py:93 msgid "Samoa" msgstr "ساماوا" #: picard/const.py:94 msgid "Brazil" msgstr "البرازيل" #: picard/const.py:95 msgid "Bahamas" msgstr "جزر الباهاما" #: picard/const.py:96 msgid "Belarus" msgstr "روسيا البيضاء" #: picard/const.py:97 msgid "Belize" msgstr "بيليز" #: picard/const.py:98 msgid "Russian Federation" msgstr "روسيا" #: picard/const.py:99 msgid "Rwanda" msgstr "راوندا" #: picard/const.py:100 msgid "Reunion" msgstr "" #: picard/const.py:101 msgid "Turkmenistan" msgstr "تركمانستان" #: picard/const.py:102 msgid "Tajikistan" msgstr "طاجاكستان" #: picard/const.py:103 msgid "Romania" msgstr "رومانيا" #: picard/const.py:104 msgid "Tokelau" msgstr "" #: picard/const.py:105 msgid "Guinea-Bissa" msgstr "غينيا-بيساو" #: picard/const.py:106 msgid "Guam" msgstr "غوام" #: picard/const.py:107 msgid "Guatemala" msgstr "غواتيمالا" #: picard/const.py:108 msgid "Greece" msgstr "اليونان" #: picard/const.py:109 msgid "Equatorial Guinea" msgstr "غينيا الاستوائية" #: picard/const.py:110 msgid "Guadeloupe" msgstr "جوادلوب" #: picard/const.py:111 msgid "Japan" msgstr "اليابان" #: picard/const.py:112 msgid "Guyana" msgstr "غويانا" #: picard/const.py:113 msgid "French Guiana" msgstr "جويانا الفرنسية" #: picard/const.py:114 msgid "Georgia" msgstr "جورجيا" #: picard/const.py:115 msgid "Grenada" msgstr "" #: picard/const.py:116 msgid "United Kingdom" msgstr "المملكة المتحدة" #: picard/const.py:117 msgid "Gabon" msgstr "الجابون" #: picard/const.py:118 msgid "El Salvador" msgstr "السلفادور" #: picard/const.py:119 msgid "Guinea" msgstr "غينيا" #: picard/const.py:120 msgid "Gambia" msgstr "جامبيا" #: picard/const.py:121 msgid "Greenland" msgstr "جرينلاند" #: picard/const.py:122 msgid "Gibraltar" msgstr "" #: picard/const.py:123 msgid "Ghana" msgstr "غانا" #: picard/const.py:124 msgid "Oman" msgstr "عُمان" #: picard/const.py:125 msgid "Tunisia" msgstr "تونس" #: picard/const.py:126 msgid "Jordan" msgstr "الأردن" #: picard/const.py:127 msgid "Haiti" msgstr "هاييتي" #: picard/const.py:128 msgid "Hungary" msgstr "هنغاريا" #: picard/const.py:129 msgid "Hong Kong" msgstr "هونج كونج" #: picard/const.py:130 msgid "Honduras" msgstr "هندوراس" #: picard/const.py:131 msgid "Heard and Mc Donald Islands" msgstr "" #: picard/const.py:132 msgid "Venezuela" msgstr "فنزويلا" #: picard/const.py:133 msgid "Puerto Rico" msgstr "بورتو ريكو" #: picard/const.py:134 msgid "Palau" msgstr "" #: picard/const.py:135 msgid "Portugal" msgstr "البرتغال" #: picard/const.py:136 msgid "Svalbard and Jan Mayen Islands" msgstr "" #: picard/const.py:137 msgid "Paraguay" msgstr "البارجواي" #: picard/const.py:138 msgid "Iraq" msgstr "العراق" #: picard/const.py:139 msgid "Panama" msgstr "بنما" #: picard/const.py:140 msgid "French Polynesia" msgstr "" #: picard/const.py:141 msgid "Papua New Guinea" msgstr "" #: picard/const.py:142 msgid "Peru" msgstr "البيرو" #: picard/const.py:143 msgid "Pakistan" msgstr "باكستان" #: picard/const.py:144 msgid "Philippines" msgstr "الفلبين" #: picard/const.py:145 msgid "Pitcairn" msgstr "" #: picard/const.py:146 msgid "Poland" msgstr "بولندا" #: picard/const.py:147 msgid "St. Pierre and Miquelon" msgstr "" #: picard/const.py:148 msgid "Zambia" msgstr "زامبيا" #: picard/const.py:149 msgid "Western Sahara" msgstr "الصحراء الغربية" #: picard/const.py:150 msgid "Estonia" msgstr "إستونيا" #: picard/const.py:151 msgid "Egypt" msgstr "مصر" #: picard/const.py:152 msgid "South Africa" msgstr "جنوب أفريقيا" #: picard/const.py:153 msgid "Ecuador" msgstr "الإكوادور" #: picard/const.py:154 msgid "Italy" msgstr "إيطاليا" #: picard/const.py:155 msgid "Viet Nam" msgstr "فيتنام" #: picard/const.py:156 msgid "Solomon Islands" msgstr "جزر سليمان" #: picard/const.py:157 msgid "Ethiopia" msgstr "إثيوبيا" #: picard/const.py:158 msgid "Somalia" msgstr "الصومال" #: picard/const.py:159 msgid "Zimbabwe" msgstr "زمبابوي" #: picard/const.py:160 msgid "Saudi Arabia" msgstr "السعودية" #: picard/const.py:161 msgid "Spain" msgstr "إسبانيا" #: picard/const.py:162 msgid "Eritrea" msgstr "إرتيريا" #: picard/const.py:163 msgid "Moldova, Republic of" msgstr "مولدوفا" #: picard/const.py:164 msgid "Madagascar" msgstr "مدغشقر" #: picard/const.py:165 msgid "Morocco" msgstr "المغرب" #: picard/const.py:166 msgid "Monaco" msgstr "موناكو" #: picard/const.py:167 msgid "Uzbekistan" msgstr "أوزباكستان" #: picard/const.py:168 msgid "Myanmar" msgstr "مينمار" #: picard/const.py:169 msgid "Mali" msgstr "مالي" #: picard/const.py:170 msgid "Macau" msgstr "موناكو" #: picard/const.py:171 msgid "Mongolia" msgstr "منغوليا" #: picard/const.py:172 msgid "Marshall Islands" msgstr "جزر المارشال" #: picard/const.py:173 msgid "Macedonia, The Former Yugoslav Republic of" msgstr "مقدونيا" #: picard/const.py:174 msgid "Mauritius" msgstr "موريشيوس" #: picard/const.py:175 msgid "Malta" msgstr "مالطا" #: picard/const.py:176 msgid "Malawi" msgstr "الملاوي" #: picard/const.py:177 msgid "Maldives" msgstr "مولدافيا" #: picard/const.py:178 msgid "Martinique" msgstr "" #: picard/const.py:179 msgid "Northern Mariana Islands" msgstr "جزر ماريانا الشمالية" #: picard/const.py:180 msgid "Montserrat" msgstr "" #: picard/const.py:181 msgid "Mauritania" msgstr "موريتانيا" #: picard/const.py:182 msgid "Uganda" msgstr "أوغندا" #: picard/const.py:183 msgid "Malaysia" msgstr "ماليزيا" #: picard/const.py:184 msgid "Mexico" msgstr "المكسيك" #: picard/const.py:185 msgid "Israel" msgstr "فلسطين المحتلة" #: picard/const.py:186 msgid "France" msgstr "فرنسا" #: picard/const.py:187 msgid "British Indian Ocean Territory" msgstr "إقليم المحيط الهندي البريطاني" #: picard/const.py:188 msgid "St. Helena" msgstr "سانت هيلانة" #: picard/const.py:189 msgid "Finland" msgstr "فنلندا" #: picard/const.py:190 msgid "Fiji" msgstr "فيجي" #: picard/const.py:191 msgid "Falkland Islands (Malvinas)" msgstr "جزر فوكلاند (مالفيناس)" #: picard/const.py:192 msgid "Micronesia, Federated States of" msgstr "ميكرونيزيا" #: picard/const.py:193 msgid "Faroe Islands" msgstr "جزر فورو" #: picard/const.py:194 msgid "Nicaragua" msgstr "نيكاراجوا" #: picard/const.py:195 msgid "Netherlands" msgstr "هولندا" #: picard/const.py:196 msgid "Norway" msgstr "النرويج" #: picard/const.py:197 msgid "Namibia" msgstr "ناميبيا" #: picard/const.py:198 msgid "Vanuatu" msgstr "" #: picard/const.py:199 msgid "New Caledonia" msgstr "كاليدونيا الجديدة" #: picard/const.py:200 msgid "Niger" msgstr "النجير" #: picard/const.py:201 msgid "Norfolk Island" msgstr "جزيرة نورفولك" #: picard/const.py:202 msgid "Nigeria" msgstr "نيجيريا" #: picard/const.py:203 msgid "New Zealand" msgstr "نيوزيلاندا" #: picard/const.py:204 msgid "Zaire" msgstr "زائير" #: picard/const.py:205 msgid "Nepal" msgstr "نيبال" #: picard/const.py:206 msgid "Nauru" msgstr "ناورو" #: picard/const.py:207 msgid "Niue" msgstr "نيوي" #: picard/const.py:208 msgid "Cook Islands" msgstr "جزر كوك" #: picard/const.py:209 msgid "Cote d'Ivoire" msgstr "ساحل العاج" #: picard/const.py:210 msgid "Switzerland" msgstr "سويسرا" #: picard/const.py:211 msgid "Colombia" msgstr "كولومبيا" #: picard/const.py:212 msgid "China" msgstr "الصين" #: picard/const.py:213 msgid "Cameroon" msgstr "الكاميرون" #: picard/const.py:214 msgid "Chile" msgstr "تشيلي" #: picard/const.py:215 msgid "Cocos (Keeling) Islands" msgstr "جزر كوكوس (كيلينج)" #: picard/const.py:216 msgid "Canada" msgstr "كندا" #: picard/const.py:217 msgid "Congo" msgstr "الكونغو" #: picard/const.py:218 msgid "Central African Republic" msgstr "جمهورية افريقيا الوسطى" #: picard/const.py:219 msgid "Czech Republic" msgstr "التشيك" #: picard/const.py:220 msgid "Cyprus" msgstr "قبرص" #: picard/const.py:221 msgid "Christmas Island" msgstr "جزر الكريسماس" #: picard/const.py:222 msgid "Costa Rica" msgstr "كوستاريكا" #: picard/const.py:223 msgid "Cape Verde" msgstr "الرأس الأخضر" #: picard/const.py:224 msgid "Cuba" msgstr "كوبا" #: picard/const.py:225 msgid "Swaziland" msgstr "سوازيلاند" #: picard/const.py:226 msgid "Syrian Arab Republic" msgstr "سوريا" #: picard/const.py:227 msgid "Kyrgyzstan" msgstr "قيرغيزستان" #: picard/const.py:228 msgid "Kenya" msgstr "كينيا" #: picard/const.py:229 msgid "Suriname" msgstr "سوارينام" #: picard/const.py:230 msgid "Kiribati" msgstr "كيريباس" #: picard/const.py:231 msgid "Cambodia" msgstr "كمبوديا" #: picard/const.py:232 msgid "Saint Kitts and Nevis" msgstr "سانت كيتس ونيفيس" #: picard/const.py:233 msgid "Comoros" msgstr "جزر القمر" #: picard/const.py:234 msgid "Sao Tome and Principe" msgstr "ساو تومي وبرينسيبي" #: picard/const.py:235 msgid "Slovenia" msgstr "سلوفينا" #: picard/const.py:236 msgid "Kuwait" msgstr "الكويت" #: picard/const.py:237 msgid "Senegal" msgstr "السنغال" #: picard/const.py:238 msgid "San Marino" msgstr "سان مارينو" #: picard/const.py:239 msgid "Sierra Leone" msgstr "سيراليون" #: picard/const.py:240 msgid "Seychelles" msgstr "سيشيل" #: picard/const.py:241 msgid "Kazakhstan" msgstr "كازاخستان" #: picard/const.py:242 msgid "Cayman Islands" msgstr "جزر كايمان" #: picard/const.py:243 msgid "Singapore" msgstr "سنغافورة" #: picard/const.py:244 msgid "Sweden" msgstr "السويد" #: picard/const.py:245 msgid "Sudan" msgstr "السودان" #: picard/const.py:246 msgid "Dominican Republic" msgstr "الدومينيكان" #: picard/const.py:247 msgid "Dominica" msgstr "دومينيكا" #: picard/const.py:248 msgid "Djibouti" msgstr "جيبوتي" #: picard/const.py:249 msgid "Denmark" msgstr "الدنمارك" #: picard/const.py:250 msgid "Virgin Islands (British)" msgstr "جزر العذراء (بريطانيا)" #: picard/const.py:251 msgid "Germany" msgstr "المانيا" #: picard/const.py:252 msgid "Yemen" msgstr "اليمن" #: picard/const.py:253 msgid "Algeria" msgstr "الجزائر" #: picard/const.py:254 msgid "United States" msgstr "الولايات المتحدة" #: picard/const.py:255 msgid "Uruguay" msgstr "الأورغواي" #: picard/const.py:256 msgid "Mayotte" msgstr "مايوت" #: picard/const.py:257 msgid "United States Minor Outlying Islands" msgstr "جزر الولايات المتحدة البعيدة الصغيرة" #: picard/const.py:258 msgid "Lebanon" msgstr "لبنان" #: picard/const.py:259 msgid "Saint Lucia" msgstr "سانت لوسيا" #: picard/const.py:260 msgid "Lao People's Democratic Republic" msgstr "لاوس" #: picard/const.py:261 msgid "Tuvalu" msgstr "توفالو" #: picard/const.py:262 msgid "Taiwan" msgstr "تايوان" #: picard/const.py:263 msgid "Trinidad and Tobago" msgstr "ترينيداد وتوباغو" #: picard/const.py:264 msgid "Turkey" msgstr "تركيا" #: picard/const.py:265 msgid "Sri Lanka" msgstr "سريلانكا" #: picard/const.py:266 msgid "Liechtenstein" msgstr "ليختنشتاين" #: picard/const.py:267 msgid "Latvia" msgstr "لاتيفيا" #: picard/const.py:268 msgid "Tonga" msgstr "تونجا" #: picard/const.py:269 msgid "Lithuania" msgstr "ليتوانيا" #: picard/const.py:270 msgid "Luxembourg" msgstr "لكسمبورج" #: picard/const.py:271 msgid "Liberia" msgstr "ليبيريا" #: picard/const.py:272 msgid "Lesotho" msgstr "ليسوتو" #: picard/const.py:273 msgid "Thailand" msgstr "تايلاند" #: picard/const.py:274 msgid "French Southern Territories" msgstr "المقاطعات الجنوبية الفرنسية" #: picard/const.py:275 msgid "Togo" msgstr "توغو" #: picard/const.py:276 msgid "Chad" msgstr "تشاد" #: picard/const.py:277 msgid "Turks and Caicos Islands" msgstr "" #: picard/const.py:278 msgid "Libyan Arab Jamahiriya" msgstr "" #: picard/const.py:279 msgid "Vatican City State (Holy See)" msgstr "" #: picard/const.py:280 msgid "Saint Vincent and The Grenadines" msgstr "" #: picard/const.py:281 msgid "United Arab Emirates" msgstr "" #: picard/const.py:282 msgid "Andorra" msgstr "" #: picard/const.py:283 msgid "Antigua and Barbuda" msgstr "" #: picard/const.py:284 msgid "Afghanistan" msgstr "" #: picard/const.py:285 msgid "Anguilla" msgstr "" #: picard/const.py:286 msgid "Virgin Islands (U.S.)" msgstr "" #: picard/const.py:287 msgid "Iceland" msgstr "" #: picard/const.py:288 msgid "Iran (Islamic Republic of)" msgstr "" #: picard/const.py:289 msgid "Armenia" msgstr "" #: picard/const.py:290 msgid "Albania" msgstr "" #: picard/const.py:291 msgid "Angola" msgstr "" #: picard/const.py:292 msgid "Netherlands Antilles" msgstr "" #: picard/const.py:293 msgid "Antarctica" msgstr "" #: picard/const.py:294 msgid "American Samoa" msgstr "" #: picard/const.py:295 msgid "Argentina" msgstr "" #: picard/const.py:296 msgid "Australia" msgstr "" #: picard/const.py:297 msgid "Austria" msgstr "" #: picard/const.py:298 msgid "Aruba" msgstr "" #: picard/const.py:299 msgid "India" msgstr "" #: picard/const.py:300 msgid "Tanzania, United Republic of" msgstr "" #: picard/const.py:301 msgid "Azerbaijan" msgstr "" #: picard/const.py:302 msgid "Ireland" msgstr "" #: picard/const.py:303 msgid "Indonesia" msgstr "" #: picard/const.py:304 msgid "Ukraine" msgstr "" #: picard/const.py:305 msgid "Qatar" msgstr "" #: picard/const.py:306 msgid "Mozambique" msgstr "" #: picard/const.py:307 msgid "Bosnia and Herzegovina" msgstr "" #: picard/const.py:308 msgid "Congo, The Democratic Republic of the" msgstr "" #: picard/const.py:309 msgid "Serbia and Montenegro (historical, 2003-2006)" msgstr "" #: picard/const.py:310 msgid "Serbia" msgstr "" #: picard/const.py:311 msgid "Montenegro" msgstr "" #: picard/const.py:312 msgid "Croatia" msgstr "" #: picard/const.py:313 msgid "Korea (North), Democratic People's Republic of" msgstr "" #: picard/const.py:314 msgid "Korea (South), Republic of" msgstr "" #: picard/const.py:315 msgid "Slovakia" msgstr "" #: picard/const.py:316 msgid "Soviet Union (historical, 1922-1991)" msgstr "" #: picard/const.py:317 msgid "East Timor" msgstr "" #: picard/const.py:318 msgid "Czechoslovakia (historical, 1918-1992)" msgstr "" #: picard/const.py:319 msgid "Europe" msgstr "" #: picard/const.py:320 msgid "East Germany (historical, 1949-1990)" msgstr "" #: picard/const.py:321 msgid "[Unknown Country]" msgstr "" #: picard/const.py:322 msgid "[Worldwide]" msgstr "" #: picard/const.py:323 msgid "Yugoslavia (historical, 1918-1992)" msgstr "" #: picard/const.py:335 msgid "Danish" msgstr "" #: picard/const.py:336 msgid "German" msgstr "" #: picard/const.py:338 msgid "English" msgstr "" #: picard/const.py:339 msgid "English (Canada)" msgstr "" #: picard/const.py:340 msgid "English (UK)" msgstr "" #: picard/const.py:342 msgid "Spanish" msgstr "" #: picard/const.py:343 msgid "Estonian" msgstr "" #: picard/const.py:345 msgid "Finnish" msgstr "" #: picard/const.py:347 msgid "French" msgstr "" #: picard/const.py:356 msgid "Italian" msgstr "" #: picard/const.py:363 msgid "Dutch" msgstr "" #: picard/const.py:365 msgid "Polish" msgstr "" #: picard/const.py:367 msgid "Brazilian Portuguese" msgstr "" #: picard/const.py:374 msgid "Swedish" msgstr "" #: picard/file.py:589 #, python-format msgid "No matching tracks for file %s" msgstr "" #: picard/file.py:604 #, python-format msgid "No matching tracks above the threshold for file %s" msgstr "" #: picard/file.py:607 #, python-format msgid "File %s identified!" msgstr "" #: picard/file.py:623 #, python-format msgid "Looking up the PUID for file %s..." msgstr "" #: picard/file.py:629 #, python-format msgid "Looking up the metadata for file %s..." msgstr "" #: picard/puidmanager.py:62 msgid "Submitting PUIDs..." msgstr "" #: picard/puidmanager.py:68 #, python-format msgid "PUIDs submission failed: %d" msgstr "" #: picard/puidmanager.py:70 msgid "PUIDs successfully submitted!" msgstr "" #: picard/tagger.py:528 msgid "CD Lookup Error" msgstr "" #: picard/tagger.py:529 #, python-format msgid "" "Error while reading CD:\n" "\n" "%s" msgstr "" #: picard/tagger.py:555 #, python-format msgid "Could not find PUID for file %s" msgstr "" #: picard/ui/cdlookup.py:33 picard/ui/mainwindow.py:525 #: picard/ui/ui_options_releases.py:216 picard/util/tags.py:21 msgid "Album" msgstr "" #: picard/ui/cdlookup.py:33 picard/ui/itemviews.py:89 #: picard/ui/mainwindow.py:526 picard/util/tags.py:22 msgid "Artist" msgstr "" #: picard/ui/cdlookup.py:33 picard/util/tags.py:24 msgid "Date" msgstr "" #: picard/ui/cdlookup.py:33 msgid "Country" msgstr "" #: picard/ui/cdlookup.py:34 msgid "Labels" msgstr "" #: picard/ui/cdlookup.py:34 msgid "Catalog #s" msgstr "" #: picard/ui/cdlookup.py:34 picard/util/tags.py:75 msgid "Barcode" msgstr "" #: picard/ui/coverartbox.py:122 msgid "View release on MusicBrainz" msgstr "" #: picard/ui/filebrowser.py:38 msgid "&Move Tagged Files Here" msgstr "" #: picard/ui/filebrowser.py:41 msgid "Show &Hidden Files" msgstr "" #: picard/ui/infodialog.py:36 msgid "Info" msgstr "" #: picard/ui/infodialog.py:42 msgid "Filename:" msgstr "" #: picard/ui/infodialog.py:44 msgid "Format:" msgstr "" #: picard/ui/infodialog.py:53 msgid "Size:" msgstr "" #: picard/ui/infodialog.py:57 msgid "Length:" msgstr "" #: picard/ui/infodialog.py:59 msgid "Bitrate:" msgstr "" #: picard/ui/infodialog.py:61 msgid "Sample rate:" msgstr "" #: picard/ui/infodialog.py:63 msgid "Bits per sample:" msgstr "" #: picard/ui/infodialog.py:66 msgid "Mono" msgstr "" #: picard/ui/infodialog.py:67 msgid "Stereo" msgstr "" #: picard/ui/infodialog.py:69 msgid "Channels:" msgstr "" #: picard/ui/itemviews.py:87 picard/util/tags.py:23 msgid "Title" msgstr "" #: picard/ui/itemviews.py:88 picard/util/tags.py:84 msgid "Length" msgstr "" #: picard/ui/itemviews.py:214 msgid "&Expand all" msgstr "" #: picard/ui/itemviews.py:216 msgid "&Collapse all" msgstr "" #: picard/ui/itemviews.py:273 msgid "&Other versions" msgstr "" #: picard/ui/itemviews.py:276 msgid "Loading..." msgstr "" #: picard/ui/itemviews.py:286 msgid "[no release info]" msgstr "" #: picard/ui/itemviews.py:309 msgid "&Plugins" msgstr "" #: picard/ui/itemviews.py:527 msgid "Clusters" msgstr "" #: picard/ui/logview.py:30 msgid "Log" msgstr "" #: picard/ui/mainwindow.py:73 msgid "MusicBrainz Picard" msgstr "" #: picard/ui/mainwindow.py:151 msgid "Unsaved Changes" msgstr "" #: picard/ui/mainwindow.py:152 msgid "Are you sure you want to quit Picard?" msgstr "" #: picard/ui/mainwindow.py:153 #, python-format msgid "" "There is %d unsaved file. Closing Picard will lose all unsaved changes." msgid_plural "" "There are %d unsaved files. Closing Picard will lose all unsaved changes." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/ui/mainwindow.py:160 msgid "&Quit Picard" msgstr "" #: picard/ui/mainwindow.py:210 msgid "Ready" msgstr "" #: picard/ui/mainwindow.py:214 msgid "" "Picard listens on a port to integrate with your browser and downloads " "release information when you click the \"Tagger\" buttons on the MusicBrainz" " website" msgstr "" #: picard/ui/mainwindow.py:224 #, python-format msgid " Files: %(files)d, Pending Files: %(pending)d " msgstr "" #: picard/ui/mainwindow.py:229 #, python-format msgid " Listening on port %(port)d " msgstr "" #: picard/ui/mainwindow.py:257 msgid "Submission Error" msgstr "" #: picard/ui/mainwindow.py:258 msgid "" "You need to configure your AcoustID API key before you can submit " "fingerprints." msgstr "" #: picard/ui/mainwindow.py:265 msgid "&Options..." msgstr "" #: picard/ui/mainwindow.py:268 msgid "&Cut" msgstr "" #: picard/ui/mainwindow.py:273 msgid "&Paste" msgstr "" #: picard/ui/mainwindow.py:278 msgid "&Help..." msgstr "" #: picard/ui/mainwindow.py:283 msgid "&About..." msgstr "" #: picard/ui/mainwindow.py:286 msgid "&Donate..." msgstr "" #: picard/ui/mainwindow.py:289 msgid "&Report a Bug..." msgstr "" #: picard/ui/mainwindow.py:292 msgid "&Support Forum..." msgstr "" #: picard/ui/mainwindow.py:295 msgid "&Add Files..." msgstr "" #: picard/ui/mainwindow.py:296 msgid "Add files to the tagger" msgstr "" #: picard/ui/mainwindow.py:301 msgid "A&dd Folder..." msgstr "" #: picard/ui/mainwindow.py:302 msgid "Add a folder to the tagger" msgstr "" #: picard/ui/mainwindow.py:304 msgid "Ctrl+D" msgstr "" #: picard/ui/mainwindow.py:308 msgid "&Save" msgstr "" #: picard/ui/mainwindow.py:309 msgid "Save selected files" msgstr "" #: picard/ui/mainwindow.py:315 msgid "S&ubmit" msgstr "" #: picard/ui/mainwindow.py:316 msgid "Submit fingerprints" msgstr "" #: picard/ui/mainwindow.py:320 msgid "E&xit" msgstr "" #: picard/ui/mainwindow.py:322 msgid "Ctrl+Q" msgstr "" #: picard/ui/mainwindow.py:325 msgid "&Remove" msgstr "" #: picard/ui/mainwindow.py:326 msgid "Remove selected files/albums" msgstr "" #: picard/ui/mainwindow.py:330 msgid "Lookup in &Browser" msgstr "" #: picard/ui/mainwindow.py:331 msgid "Lookup selected item on MusicBrainz website" msgstr "" #: picard/ui/mainwindow.py:335 msgid "File &Browser" msgstr "" #: picard/ui/mainwindow.py:339 msgid "Ctrl+B" msgstr "" #: picard/ui/mainwindow.py:342 msgid "&Cover Art" msgstr "" #: picard/ui/mainwindow.py:348 msgid "Search" msgstr "" #: picard/ui/mainwindow.py:351 msgid "&CD Lookup..." msgstr "" #: picard/ui/mainwindow.py:352 picard/ui/mainwindow.py:353 msgid "Lookup CD" msgstr "" #: picard/ui/mainwindow.py:355 msgid "Ctrl+K" msgstr "" #: picard/ui/mainwindow.py:358 msgid "&Scan" msgstr "" #: picard/ui/mainwindow.py:361 msgid "Ctrl+Y" msgstr "" #: picard/ui/mainwindow.py:364 msgid "Cl&uster" msgstr "" #: picard/ui/mainwindow.py:367 msgid "Ctrl+U" msgstr "" #: picard/ui/mainwindow.py:370 msgid "&Lookup" msgstr "" #: picard/ui/mainwindow.py:371 picard/ui/mainwindow.py:372 msgid "Lookup metadata" msgstr "" #: picard/ui/mainwindow.py:375 msgid "Ctrl+L" msgstr "" #: picard/ui/mainwindow.py:378 msgid "&Info..." msgstr "" #: picard/ui/mainwindow.py:381 msgid "Ctrl+I" msgstr "" #: picard/ui/mainwindow.py:384 msgid "&Refresh" msgstr "" #: picard/ui/mainwindow.py:385 msgid "Ctrl+R" msgstr "" #: picard/ui/mainwindow.py:388 msgid "&Rename Files" msgstr "" #: picard/ui/mainwindow.py:393 msgid "&Move Files" msgstr "" #: picard/ui/mainwindow.py:398 msgid "Save &Tags" msgstr "" #: picard/ui/mainwindow.py:403 msgid "Tags From &File Names..." msgstr "" #: picard/ui/mainwindow.py:406 msgid "View &Log..." msgstr "" #: picard/ui/mainwindow.py:412 msgid "&Open..." msgstr "" #: picard/ui/mainwindow.py:413 msgid "Open the file" msgstr "" #: picard/ui/mainwindow.py:416 msgid "Open &Folder..." msgstr "" #: picard/ui/mainwindow.py:417 msgid "Open the containing folder" msgstr "" #: picard/ui/mainwindow.py:438 msgid "&File" msgstr "" #: picard/ui/mainwindow.py:446 msgid "&Edit" msgstr "" #: picard/ui/mainwindow.py:452 msgid "&View" msgstr "" #: picard/ui/mainwindow.py:460 msgid "&Options" msgstr "" #: picard/ui/mainwindow.py:466 msgid "&Tools" msgstr "" #: picard/ui/mainwindow.py:475 picard/ui/util.py:33 msgid "&Help" msgstr "" #: picard/ui/mainwindow.py:493 msgid "&Toolbar" msgstr "" #: picard/ui/mainwindow.py:520 msgid "&Search Bar" msgstr "" #: picard/ui/mainwindow.py:527 picard/ui/puidsubmit.py:31 msgid "Track" msgstr "" #: picard/ui/mainwindow.py:566 msgid "All Supported Formats" msgstr "" #: picard/ui/mainwindow.py:624 picard/ui/mainwindow.py:633 msgid "Various Artists file naming scheme removal" msgstr "" #: picard/ui/mainwindow.py:625 msgid "" "The separate file naming scheme for various artists albums has been\n" "removed in this version of Picard. You currently do not use the this option,\n" "but have a separate file naming scheme defined. Do you want to remove it or\n" "merge it with your file naming scheme for single artist albums?" msgstr "" #: picard/ui/mainwindow.py:629 msgid "Merge" msgstr "" #: picard/ui/mainwindow.py:629 picard/ui/metadatabox.py:185 msgid "Remove" msgstr "" #: picard/ui/mainwindow.py:634 msgid "" "The separate file naming scheme for various artists albums has been\n" "removed in this version of Picard. Your file naming scheme has automatically\n" "been merged with that of single artist albums." msgstr "" #: picard/ui/mainwindow.py:682 msgid "Configuration Required" msgstr "" #: picard/ui/mainwindow.py:683 msgid "" "Audio fingerprinting is not yet configured. Would you like to configure it " "now?" msgstr "" #: picard/ui/mainwindow.py:756 picard/ui/mainwindow.py:763 #, python-format msgid " (Error: %s)" msgstr "" #: picard/ui/metadatabox.py:64 #, python-format msgid "(missing from %d item)" msgid_plural "(missing from %d items)" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/ui/metadatabox.py:66 #, python-format msgid "(different across %d item)" msgid_plural "(different across %d items)" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/ui/metadatabox.py:90 msgid "Tag" msgstr "" #: picard/ui/metadatabox.py:90 msgid "Original Value" msgstr "" #: picard/ui/metadatabox.py:90 msgid "New Value" msgstr "" #: picard/ui/metadatabox.py:117 msgid "Add New Tag..." msgstr "" #: picard/ui/metadatabox.py:119 msgid "Show Changes First" msgstr "" #: picard/ui/metadatabox.py:166 msgid "Edit..." msgstr "" #: picard/ui/metadatabox.py:189 msgid "Use Original Value" msgid_plural "Use Original Values" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/ui/passworddialog.py:38 #, python-format msgid "" "The server %s requires you to login. Please enter your username and " "password." msgstr "" #: picard/ui/passworddialog.py:76 #, python-format msgid "" "The proxy %s requires you to login. Please enter your username and password." msgstr "" #: picard/ui/puidsubmit.py:31 picard/ui/options/plugins.py:125 msgid "File" msgstr "" #: picard/ui/puidsubmit.py:31 msgid "PUID" msgstr "" #: picard/ui/puidsubmit.py:31 msgid "Release" msgstr "" #: picard/ui/puidsubmit.py:31 msgid "Release ID" msgstr "" #: picard/ui/tagsfromfilenames.py:54 picard/ui/tagsfromfilenames.py:99 msgid "File Name" msgstr "" #: picard/ui/ui_cdlookup.py:57 picard/ui/ui_options_cdlookup.py:46 #: picard/ui/ui_options_cdlookup_select.py:53 picard/ui/options/cdlookup.py:36 msgid "CD Lookup" msgstr "" #: picard/ui/ui_cdlookup.py:58 msgid "The following releases on MusicBrainz match the CD:" msgstr "" #: picard/ui/ui_cdlookup.py:59 picard/ui/ui_puidsubmit.py:52 msgid "OK" msgstr "" #: picard/ui/ui_cdlookup.py:60 msgid " Lookup manually " msgstr "" #: picard/ui/ui_cdlookup.py:61 picard/ui/ui_puidsubmit.py:53 msgid "Cancel" msgstr "" #: picard/ui/ui_edittagdialog.py:92 msgid "Edit Tag" msgstr "" #: picard/ui/ui_edittagdialog.py:93 msgid "Edit value" msgstr "" #: picard/ui/ui_edittagdialog.py:94 msgid "Add value" msgstr "" #: picard/ui/ui_edittagdialog.py:95 msgid "Remove value" msgstr "" #: picard/ui/ui_infodialog.py:66 msgid "&Info" msgstr "" #: picard/ui/ui_infodialog.py:67 msgid "A&rtwork" msgstr "" #: picard/ui/ui_options.py:42 msgid "Options" msgstr "" #: picard/ui/ui_options_cdlookup.py:47 msgid "CD-ROM device to use for lookups:" msgstr "" #: picard/ui/ui_options_cdlookup_select.py:54 msgid "Default CD-ROM drive to use for lookups:" msgstr "" #: picard/ui/ui_options_cover.py:53 msgid "Location" msgstr "" #: picard/ui/ui_options_cover.py:54 msgid "Embed cover images into tags" msgstr "" #: picard/ui/ui_options_cover.py:55 msgid "Save cover images as separate files" msgstr "" #: picard/ui/ui_options_cover.py:56 msgid "Overwrite the file if it already exists" msgstr "" #: picard/ui/ui_options_fingerprinting.py:74 msgid "Audio Fingerprinting" msgstr "" #: picard/ui/ui_options_fingerprinting.py:75 msgid "Use AcoustID" msgstr "" #: picard/ui/ui_options_fingerprinting.py:76 msgid "Use AmpliFIND (formerly MusicDNS)" msgstr "" #: picard/ui/ui_options_fingerprinting.py:77 msgid "AcoustID Settings" msgstr "" #: picard/ui/ui_options_fingerprinting.py:78 msgid "Fingerprint calculator:" msgstr "" #: picard/ui/ui_options_fingerprinting.py:79 #: picard/ui/ui_options_renaming.py:138 msgid "Browse..." msgstr "" #: picard/ui/ui_options_fingerprinting.py:80 msgid "Download..." msgstr "" #: picard/ui/ui_options_fingerprinting.py:81 msgid "API key:" msgstr "" #: picard/ui/ui_options_fingerprinting.py:82 msgid "Get API key..." msgstr "" #: picard/ui/ui_options_folksonomy.py:106 picard/ui/options/folksonomy.py:29 msgid "Folksonomy Tags" msgstr "" #: picard/ui/ui_options_folksonomy.py:108 msgid "Only use my tags" msgstr "" #: picard/ui/ui_options_folksonomy.py:111 msgid "Maximum number of tags:" msgstr "" #: picard/ui/ui_options_general.py:92 msgid "MusicBrainz Server" msgstr "" #: picard/ui/ui_options_general.py:93 picard/ui/ui_options_proxy.py:77 msgid "Port:" msgstr "" #: picard/ui/ui_options_general.py:94 picard/ui/ui_options_proxy.py:78 msgid "Server address:" msgstr "" #: picard/ui/ui_options_general.py:95 msgid "Account Information" msgstr "" #: picard/ui/ui_options_general.py:96 picard/ui/ui_options_proxy.py:75 #: picard/ui/ui_passworddialog.py:74 msgid "Password:" msgstr "" #: picard/ui/ui_options_general.py:97 picard/ui/ui_options_proxy.py:76 #: picard/ui/ui_passworddialog.py:73 msgid "Username:" msgstr "" #: picard/ui/ui_options_general.py:98 picard/ui/options/general.py:29 msgid "General" msgstr "" #: picard/ui/ui_options_general.py:99 msgid "Automatically scan all new files" msgstr "" #: picard/ui/ui_options_general.py:100 msgid "Ignore MBIDs when loading new files" msgstr "" #: picard/ui/ui_options_interface.py:58 msgid "Miscellaneous" msgstr "" #: picard/ui/ui_options_interface.py:59 msgid "Show text labels under icons" msgstr "" #: picard/ui/ui_options_interface.py:60 msgid "Allow selection of multiple directories" msgstr "" #: picard/ui/ui_options_interface.py:61 msgid "Use advanced query syntax" msgstr "" #: picard/ui/ui_options_interface.py:62 msgid "Show a quit confirmation dialog for unsaved changes" msgstr "" #: picard/ui/ui_options_interface.py:63 msgid "User interface language:" msgstr "" #: picard/ui/ui_options_matching.py:77 msgid "Thresholds" msgstr "" #: picard/ui/ui_options_matching.py:78 msgid "Minimal similarity for matching files to tracks:" msgstr "" #: picard/ui/ui_options_matching.py:82 msgid "Minimal similarity for file lookups:" msgstr "" #: picard/ui/ui_options_matching.py:83 msgid "Minimal similarity for cluster lookups:" msgstr "" #: picard/ui/ui_options_metadata.py:101 picard/ui/options/metadata.py:30 msgid "Metadata" msgstr "" #: picard/ui/ui_options_metadata.py:102 msgid "Translate artist names to this locale where possible:" msgstr "" #: picard/ui/ui_options_metadata.py:103 msgid "Use standardized artist names" msgstr "" #: picard/ui/ui_options_metadata.py:104 msgid "Convert Unicode punctuation characters to ASCII" msgstr "" #: picard/ui/ui_options_metadata.py:105 msgid "Use release relationships" msgstr "" #: picard/ui/ui_options_metadata.py:106 msgid "Use track relationships" msgstr "" #: picard/ui/ui_options_metadata.py:107 msgid "Use folksonomy tags as genre" msgstr "" #: picard/ui/ui_options_metadata.py:108 msgid "Custom Fields" msgstr "" #: picard/ui/ui_options_metadata.py:109 msgid "Various artists:" msgstr "" #: picard/ui/ui_options_metadata.py:110 msgid "Non-album tracks:" msgstr "" #: picard/ui/ui_options_metadata.py:111 picard/ui/ui_options_metadata.py:112 #: picard/ui/ui_options_renaming.py:147 msgid "Default" msgstr "" #: picard/ui/ui_options_plugins.py:131 picard/ui/options/plugins.py:37 msgid "Plugins" msgstr "" #: picard/ui/ui_options_plugins.py:132 picard/ui/options/plugins.py:121 msgid "Name" msgstr "" #: picard/ui/ui_options_plugins.py:133 picard/util/tags.py:37 msgid "Version" msgstr "" #: picard/ui/ui_options_plugins.py:134 picard/ui/options/plugins.py:124 msgid "Author" msgstr "" #: picard/ui/ui_options_plugins.py:135 msgid "Install plugin..." msgstr "" #: picard/ui/ui_options_plugins.py:136 msgid "Open plugin folder" msgstr "" #: picard/ui/ui_options_plugins.py:137 msgid "Download plugins" msgstr "" #: picard/ui/ui_options_plugins.py:138 msgid "Details" msgstr "" #: picard/ui/ui_options_proxy.py:74 picard/ui/options/proxy.py:28 msgid "Web Proxy" msgstr "" #: picard/ui/ui_options_ratings.py:53 msgid "Enable track ratings" msgstr "" #: picard/ui/ui_options_ratings.py:54 msgid "" "Picard saves the ratings together with an e-mail address identifying the " "user who did the rating. That way different ratings for different users can " "be stored in the files. Please specify the e-mail you want to use to save " "your ratings." msgstr "" #: picard/ui/ui_options_ratings.py:55 msgid "E-mail:" msgstr "" #: picard/ui/ui_options_ratings.py:56 msgid "Submit ratings to MusicBrainz" msgstr "" #: picard/ui/ui_options_releases.py:215 msgid "Preferred release types" msgstr "" #: picard/ui/ui_options_releases.py:217 msgid "Single" msgstr "" #: picard/ui/ui_options_releases.py:218 msgid "EP" msgstr "" #: picard/ui/ui_options_releases.py:219 picard/util/tags.py:66 msgid "Compilation" msgstr "" #: picard/ui/ui_options_releases.py:220 msgid "Soundtrack" msgstr "" #: picard/ui/ui_options_releases.py:221 msgid "Spokenword" msgstr "" #: picard/ui/ui_options_releases.py:222 msgid "Interview" msgstr "" #: picard/ui/ui_options_releases.py:223 msgid "Audiobook" msgstr "" #: picard/ui/ui_options_releases.py:224 msgid "Live" msgstr "" #: picard/ui/ui_options_releases.py:225 msgid "Remix" msgstr "" #: picard/ui/ui_options_releases.py:227 msgid "Reset all" msgstr "" #: picard/ui/ui_options_releases.py:228 msgid "Preferred release countries" msgstr "" #: picard/ui/ui_options_releases.py:229 picard/ui/ui_options_releases.py:232 msgid ">" msgstr "" #: picard/ui/ui_options_releases.py:230 picard/ui/ui_options_releases.py:233 msgid "<" msgstr "" #: picard/ui/ui_options_releases.py:231 msgid "Preferred release formats" msgstr "" #: picard/ui/ui_options_renaming.py:134 msgid "Rename files when saving" msgstr "" #: picard/ui/ui_options_renaming.py:135 msgid "Replace non-ASCII characters" msgstr "" #: picard/ui/ui_options_renaming.py:136 msgid "Replace Windows-incompatible characters" msgstr "" #: picard/ui/ui_options_renaming.py:137 msgid "Move files to this directory when saving:" msgstr "" #: picard/ui/ui_options_renaming.py:139 msgid "Delete empty directories" msgstr "" #: picard/ui/ui_options_renaming.py:140 msgid "Move additional files:" msgstr "" #: picard/ui/ui_options_renaming.py:141 msgid "Name files like this" msgstr "" #: picard/ui/ui_options_renaming.py:148 msgid "Examples" msgstr "" #: picard/ui/ui_options_script.py:49 msgid "Tagger Script" msgstr "" #: picard/ui/ui_options_tags.py:114 msgid "Write tags to files" msgstr "" #: picard/ui/ui_options_tags.py:115 msgid "Preserve timestamps of tagged files" msgstr "" #: picard/ui/ui_options_tags.py:116 msgid "Before tagging" msgstr "" #: picard/ui/ui_options_tags.py:117 msgid "Clear existing tags" msgstr "" #: picard/ui/ui_options_tags.py:118 msgid "Remove ID3 tags from FLAC files" msgstr "" #: picard/ui/ui_options_tags.py:119 msgid "Remove APEv2 tags from MP3 files" msgstr "" #: picard/ui/ui_options_tags.py:120 msgid "" "Preserve these tags from being cleared or overwritten with MusicBrainz data:" msgstr "" #: picard/ui/ui_options_tags.py:121 msgid "Tags are separated by spaces, and are case-sensitive." msgstr "" #: picard/ui/ui_options_tags.py:122 msgid "Tag compatibility" msgstr "" #: picard/ui/ui_options_tags.py:123 msgid "ID3v2 version" msgstr "" #: picard/ui/ui_options_tags.py:124 msgid "2.4" msgstr "" #: picard/ui/ui_options_tags.py:125 msgid "2.3" msgstr "" #: picard/ui/ui_options_tags.py:126 msgid "Also include ID3v1 tags in the files" msgstr "" #: picard/ui/ui_options_tags.py:127 msgid "ID3v2 text encoding" msgstr "" #: picard/ui/ui_options_tags.py:128 msgid "UTF-8" msgstr "" #: picard/ui/ui_options_tags.py:129 msgid "UTF-16" msgstr "" #: picard/ui/ui_options_tags.py:130 msgid "ISO-8859-1" msgstr "" #: picard/ui/ui_passworddialog.py:72 msgid "Authentication required" msgstr "" #: picard/ui/ui_passworddialog.py:75 msgid "Save username and password" msgstr "" #: picard/ui/ui_puidsubmit.py:51 msgid "Submit PUIDs" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:54 msgid "Convert File Names to Tags" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:55 msgid "Replace underscores with spaces" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:56 msgid "&Preview" msgstr "" #: picard/ui/util.py:31 msgid "&Ok" msgstr "" #: picard/ui/util.py:32 msgid "&Cancel" msgstr "" #: picard/ui/options/about.py:29 msgid "About" msgstr "" #: picard/ui/options/about.py:48 msgid "translator-credits" msgstr "Launchpad Contributions:\n Ahmed Toulan https://launchpad.net/~thelinuxer\n Hajex https://launchpad.net/~hajex\n MaXeR https://launchpad.net/~themaxer\n Philipp Wolfer https://launchpad.net/~phw" #: picard/ui/options/about.py:51 #, python-format msgid "
Translated to LANG by %s" msgstr "" #: picard/ui/options/about.py:55 #, python-format msgid "" "

MusicBrainz Picard
\n" "Version %(version)s

\n" "

Supported formats
%(formats)s

\n" "

Please donate
\n" "Thank you for using Picard. Picard relies on the MusicBrainz database, which is operated by the MetaBrainz Foundation with the help of thousands of volunteers. If you like this application please consider donating to the MetaBrainz Foundation to keep the service running.

\n" "

Donate now!

\n" "

Credits
\n" "Copyright © 2004-2011 Robert Kaye, Lukáš Lalinský and others%(translator-credits)s

\n" "

http://musicbrainz.org/doc/MusicBrainz_Picard

\n" msgstr "" #: picard/ui/options/advanced.py:26 msgid "Advanced" msgstr "" #: picard/ui/options/cover.py:29 msgid "Cover Art" msgstr "" #: picard/ui/options/fingerprinting.py:32 msgid "Fingerprinting" msgstr "" #: picard/ui/options/interface.py:32 msgid "User Interface" msgstr "" #: picard/ui/options/interface.py:49 msgid "System default" msgstr "" #: picard/ui/options/interface.py:76 msgid "Language changed" msgstr "" #: picard/ui/options/interface.py:76 msgid "" "You have changed the interface language. You have to restart Picard in order" " for the change to take effect." msgstr "" #: picard/ui/options/matching.py:29 msgid "Matching" msgstr "" #: picard/ui/options/ratings.py:29 msgid "Ratings" msgstr "" #: picard/ui/options/releases.py:33 msgid "Preferred Releases" msgstr "" #: picard/ui/options/renaming.py:34 msgid "File naming" msgstr "" #: picard/ui/options/renaming.py:143 msgid "Error" msgstr "" #: picard/ui/options/renaming.py:143 msgid "The location to move files to must not be empty." msgstr "" #: picard/ui/options/renaming.py:153 msgid "The file naming format must not be empty." msgstr "" #: picard/ui/options/scripting.py:63 msgid "Scripting" msgstr "" #: picard/ui/options/scripting.py:97 msgid "Script Error" msgstr "" #: picard/util/tags.py:25 msgid "Original Release Date" msgstr "" #: picard/util/tags.py:26 msgid "Album Artist" msgstr "" #: picard/util/tags.py:27 msgid "Track Number" msgstr "" #: picard/util/tags.py:28 msgid "Total Tracks" msgstr "" #: picard/util/tags.py:29 msgid "Disc Number" msgstr "" #: picard/util/tags.py:30 msgid "Total Discs" msgstr "" #: picard/util/tags.py:31 msgid "Album Artist Sort Order" msgstr "" #: picard/util/tags.py:32 msgid "Artist Sort Order" msgstr "" #: picard/util/tags.py:33 msgid "Title Sort Order" msgstr "" #: picard/util/tags.py:34 msgid "Album Sort Order" msgstr "" #: picard/util/tags.py:35 msgid "ASIN" msgstr "" #: picard/util/tags.py:36 msgid "Grouping" msgstr "" #: picard/util/tags.py:38 msgid "ISRC" msgstr "" #: picard/util/tags.py:39 msgid "Mood" msgstr "" #: picard/util/tags.py:40 msgid "BPM" msgstr "" #: picard/util/tags.py:41 msgid "Copyright" msgstr "" #: picard/util/tags.py:42 msgid "License" msgstr "" #: picard/util/tags.py:43 msgid "Composer" msgstr "" #: picard/util/tags.py:44 msgid "Writer" msgstr "" #: picard/util/tags.py:45 msgid "Conductor" msgstr "" #: picard/util/tags.py:46 msgid "Lyricist" msgstr "" #: picard/util/tags.py:47 msgid "Arranger" msgstr "" #: picard/util/tags.py:48 msgid "Producer" msgstr "" #: picard/util/tags.py:49 msgid "Engineer" msgstr "" #: picard/util/tags.py:50 msgid "Subtitle" msgstr "" #: picard/util/tags.py:51 msgid "Disc Subtitle" msgstr "" #: picard/util/tags.py:52 msgid "Remixer" msgstr "" #: picard/util/tags.py:53 msgid "MusicBrainz Recording Id" msgstr "" #: picard/util/tags.py:54 msgid "MusicBrainz Release Id" msgstr "" #: picard/util/tags.py:55 msgid "MusicBrainz Artist Id" msgstr "" #: picard/util/tags.py:56 msgid "MusicBrainz Release Artist Id" msgstr "" #: picard/util/tags.py:57 msgid "MusicBrainz Work Id" msgstr "" #: picard/util/tags.py:58 msgid "MusicBrainz Disc Id" msgstr "" #: picard/util/tags.py:59 msgid "MusicBrainz Sort Name" msgstr "" #: picard/util/tags.py:60 msgid "MusicIP PUID" msgstr "" #: picard/util/tags.py:61 msgid "MusicIP Fingerprint" msgstr "" #: picard/util/tags.py:62 msgid "AcoustID" msgstr "" #: picard/util/tags.py:63 msgid "AcoustID Fingerprint" msgstr "" #: picard/util/tags.py:64 msgid "Disc Id" msgstr "" #: picard/util/tags.py:65 msgid "Website" msgstr "" #: picard/util/tags.py:67 msgid "Comment" msgstr "" #: picard/util/tags.py:68 msgid "Genre" msgstr "" #: picard/util/tags.py:69 msgid "Encoded By" msgstr "" #: picard/util/tags.py:70 msgid "Performer" msgstr "" #: picard/util/tags.py:71 msgid "Release Type" msgstr "" #: picard/util/tags.py:72 msgid "Release Status" msgstr "" #: picard/util/tags.py:73 msgid "Release Country" msgstr "" #: picard/util/tags.py:74 msgid "Record Label" msgstr "" #: picard/util/tags.py:76 msgid "Catalog Number" msgstr "" #: picard/util/tags.py:77 msgid "Format" msgstr "" #: picard/util/tags.py:78 msgid "DJ-Mixer" msgstr "" #: picard/util/tags.py:79 msgid "Media" msgstr "" #: picard/util/tags.py:80 msgid "Lyrics" msgstr "" #: picard/util/tags.py:81 msgid "Mixer" msgstr "" #: picard/util/tags.py:82 msgid "Language" msgstr "" #: picard/util/tags.py:83 msgid "Script" msgstr "" #: picard/util/tags.py:85 msgid "Rating" msgstr "" #: picard/util/webbrowser2.py:88 msgid "Web Browser Error" msgstr "" #: picard/util/webbrowser2.py:88 #, python-format msgid "" "Error while launching a web browser:\n" "\n" "%s" msgstr "" picard-release-1.3.2/po/ast.po000066400000000000000000001172741245305550700161640ustar00rootroot00000000000000# Translations template for picard. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the picard project. # # Translators: # FIRST AUTHOR , 2011 msgid "" msgstr "" "Project-Id-Version: MusicBrainz\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-20 11:12+0100\n" "PO-Revision-Date: 2014-03-21 08:44+0000\n" "Last-Translator: nikki\n" "Language-Team: Asturian (http://www.transifex.com/projects/p/musicbrainz/language/ast/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ast\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: contrib/plugins/no_release.py:50 msgid "Enable plugin for all releases by default" msgstr "" #: contrib/plugins/no_release.py:51 msgid "Tags to strip (comma-separated)" msgstr "" #: contrib/plugins/no_release.py:63 msgid "Remove specific release information..." msgstr "" #: contrib/plugins/open_in_gui.py:32 msgid "Open Error" msgstr "" #: contrib/plugins/open_in_gui.py:32 #, python-format msgid "" "Error while opening file:\n" "\n" "%s" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:117 msgid "Last.fm" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:118 msgid "Use track tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:119 msgid "Use artist tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:120 #: picard/ui/options/tags.py:30 msgid "Tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:121 #: picard/ui/ui_options_folksonomy.py:116 msgid "Ignore tags:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:122 #: picard/ui/ui_options_folksonomy.py:121 msgid "Join multiple tags with:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:123 #: picard/ui/ui_options_folksonomy.py:122 msgid " / " msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:124 #: picard/ui/ui_options_folksonomy.py:123 msgid ", " msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:125 #: picard/ui/ui_options_folksonomy.py:118 msgid "Minimal tag usage:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:126 #: picard/ui/ui_options_folksonomy.py:119 picard/ui/ui_options_matching.py:88 #: picard/ui/ui_options_matching.py:89 picard/ui/ui_options_matching.py:90 msgid " %" msgstr "" #: contrib/plugins/replaygain/__init__.py:50 msgid "Calculate replay &gain..." msgstr "" #: contrib/plugins/replaygain/__init__.py:66 #, python-format msgid "Calculating replay gain for \"%s\"..." msgstr "" #: contrib/plugins/replaygain/__init__.py:71 #, python-format msgid "Replay gain for \"%s\" successfully calculated." msgstr "" #: contrib/plugins/replaygain/__init__.py:73 #, python-format msgid "Could not calculate replay gain for \"%s\"." msgstr "" #: contrib/plugins/replaygain/__init__.py:76 msgid "Calculate album &gain..." msgstr "" #: contrib/plugins/replaygain/__init__.py:103 #: contrib/plugins/replaygain/__init__.py:111 #, python-format msgid "Calculating album gain for \"%s\"..." msgstr "" #: contrib/plugins/replaygain/__init__.py:119 #, python-format msgid "Album gain for \"%s\" successfully calculated." msgstr "" #: contrib/plugins/replaygain/__init__.py:121 #, python-format msgid "Could not calculate album gain for \"%s\"." msgstr "" #: picard/acoustid.py:102 #, python-format msgid "AcoustID lookup network error for '%s'!" msgstr "" #: picard/acoustid.py:117 #, python-format msgid "AcoustID lookup failed for '%s'!" msgstr "" #: picard/acoustid.py:128 #, python-format msgid "Acoustid lookup returned no result for file '%s'" msgstr "" #: picard/acoustid.py:132 #, python-format msgid "Looking up the fingerprint for file %s..." msgstr "" #: picard/acoustidmanager.py:78 msgid "Submitting AcoustIDs..." msgstr "" #: picard/acoustidmanager.py:83 #, python-format msgid "AcoustID submission failed with error '%s'" msgstr "" #: picard/acoustidmanager.py:85 msgid "AcoustIDs successfully submitted." msgstr "" #: picard/album.py:64 picard/cluster.py:234 msgid "Unmatched Files" msgstr "Ficheros que nun concasen" #: picard/album.py:187 #, python-format msgid "[could not load album %s]" msgstr "[nun se pudo cargar l'álbum %s]" #: picard/album.py:272 #, python-format msgid "Album %s loaded" msgstr "" #: picard/album.py:288 msgid "[loading album information]" msgstr "[cargando información del álbum]" #: picard/album.py:463 #, python-format msgid "; %i image" msgid_plural "; %i images" msgstr[0] "" msgstr[1] "" #: picard/cluster.py:150 picard/cluster.py:159 #, python-format msgid "No matching releases for cluster %s" msgstr "" #: picard/cluster.py:161 #, python-format msgid "Cluster %s identified!" msgstr "" #: picard/cluster.py:168 #, python-format msgid "Looking up the metadata for cluster %s..." msgstr "" #: picard/collection.py:60 #, python-format msgid "Added %i release to collection \"%s\"" msgid_plural "Added %i releases to collection \"%s\"" msgstr[0] "" msgstr[1] "" #: picard/collection.py:72 #, python-format msgid "Removed %i release from collection \"%s\"" msgid_plural "Removed %i releases from collection \"%s\"" msgstr[0] "" msgstr[1] "" #: picard/collection.py:81 #, python-format msgid "Error loading collections: %s" msgstr "" #: picard/config_upgrade.py:57 picard/config_upgrade.py:70 msgid "Various Artists file naming scheme removal" msgstr "" #: picard/config_upgrade.py:58 msgid "" "The separate file naming scheme for various artists albums has been removed in this version of Picard.\n" "Your file naming scheme has automatically been merged with that of single artist albums." msgstr "" #: picard/config_upgrade.py:71 msgid "" "The separate file naming scheme for various artists albums has been removed in this version of Picard.\n" "You currently do not use this option, but have a separate file naming scheme defined.\n" "Do you want to remove it or merge it with your file naming scheme for single artist albums?" msgstr "" #: picard/config_upgrade.py:77 msgid "Merge" msgstr "" #: picard/config_upgrade.py:77 picard/ui/metadatabox.py:254 msgid "Remove" msgstr "" #: picard/const.py:67 msgid "CD" msgstr "CD" #: picard/const.py:68 msgid "CD-R" msgstr "" #: picard/const.py:69 msgid "HDCD" msgstr "" #: picard/const.py:70 msgid "8cm CD" msgstr "" #: picard/const.py:71 msgid "Vinyl" msgstr "Vinilu" #: picard/const.py:72 msgid "7\" Vinyl" msgstr "" #: picard/const.py:73 msgid "10\" Vinyl" msgstr "" #: picard/const.py:74 msgid "12\" Vinyl" msgstr "" #: picard/const.py:75 msgid "Digital Media" msgstr "Mediu Dixital" #: picard/const.py:76 msgid "USB Flash Drive" msgstr "" #: picard/const.py:77 msgid "slotMusic" msgstr "" #: picard/const.py:78 msgid "Cassette" msgstr "Casé" #: picard/const.py:79 msgid "DVD" msgstr "DVD" #: picard/const.py:80 msgid "DVD-Audio" msgstr "" #: picard/const.py:81 msgid "DVD-Video" msgstr "" #: picard/const.py:82 msgid "SACD" msgstr "SACD" #: picard/const.py:83 msgid "DualDisc" msgstr "" #: picard/const.py:84 msgid "MiniDisc" msgstr "Mini Discu" #: picard/const.py:85 msgid "Blu-ray" msgstr "" #: picard/const.py:86 msgid "HD-DVD" msgstr "" #: picard/const.py:87 msgid "Videotape" msgstr "" #: picard/const.py:88 msgid "VHS" msgstr "" #: picard/const.py:89 msgid "Betamax" msgstr "" #: picard/const.py:90 msgid "VCD" msgstr "" #: picard/const.py:91 msgid "SVCD" msgstr "" #: picard/const.py:92 msgid "UMD" msgstr "" #: picard/const.py:93 picard/coverartarchive.py:33 #: picard/ui/ui_options_releases.py:226 msgid "Other" msgstr "Otru" #: picard/const.py:94 msgid "LaserDisc" msgstr "Discu laser" #: picard/const.py:95 msgid "Cartridge" msgstr "" #: picard/const.py:96 msgid "Reel-to-reel" msgstr "" #: picard/const.py:97 msgid "DAT" msgstr "DAT" #: picard/const.py:98 msgid "Wax Cylinder" msgstr "Cilindru Wax" #: picard/const.py:99 msgid "Piano Roll" msgstr "Pianola" #: picard/const.py:100 msgid "DCC" msgstr "" #: picard/const.py:115 msgid "Danish" msgstr "" #: picard/const.py:116 msgid "German" msgstr "Alemán" #: picard/const.py:118 msgid "English" msgstr "Inglés" #: picard/const.py:119 msgid "English (Canada)" msgstr "Inglés (Canadá)" #: picard/const.py:120 msgid "English (UK)" msgstr "Inglés (RX)" #: picard/const.py:122 msgid "Spanish" msgstr "Castellán" #: picard/const.py:123 msgid "Estonian" msgstr "Estoniu" #: picard/const.py:125 msgid "Finnish" msgstr "Finlandés" #: picard/const.py:127 msgid "French" msgstr "Francés" #: picard/const.py:136 msgid "Italian" msgstr "Italianu" #: picard/const.py:143 msgid "Dutch" msgstr "Holandés" #: picard/const.py:145 msgid "Polish" msgstr "Polacu" #: picard/const.py:147 msgid "Brazilian Portuguese" msgstr "Portugés BR" #: picard/const.py:154 msgid "Swedish" msgstr "Suecu" #: picard/coverart.py:84 #, python-format msgid "Coverart %s downloaded" msgstr "" #: picard/coverart.py:240 #, python-format msgid "Downloading http://%s:%i%s" msgstr "" #: picard/coverartarchive.py:24 msgid "Front" msgstr "" #: picard/coverartarchive.py:25 msgid "Back" msgstr "" #: picard/coverartarchive.py:26 msgid "Booklet" msgstr "" #: picard/coverartarchive.py:27 msgid "Medium" msgstr "" #: picard/coverartarchive.py:28 msgid "Tray" msgstr "" #: picard/coverartarchive.py:29 msgid "Obi" msgstr "" #: picard/coverartarchive.py:30 msgid "Spine" msgstr "" #: picard/coverartarchive.py:31 picard/ui/mainwindow.py:546 msgid "Track" msgstr "" #: picard/coverartarchive.py:32 msgid "Sticker" msgstr "" #: picard/coverartarchive.py:34 msgid "Unknown" msgstr "" #: picard/file.py:536 #, python-format msgid "No matching tracks for file %s" msgstr "Nun concasa pista denguna pal ficheru %s" #: picard/file.py:548 #, python-format msgid "No matching tracks above the threshold for file %s" msgstr "Nun concasa pista denguna perriba del umbral pal ficheru %s" #: picard/file.py:551 #, python-format msgid "File %s identified!" msgstr "¡Identificáu el ficheru %s!" #: picard/file.py:567 #, python-format msgid "Looking up the metadata for file %s..." msgstr "Guetando los metadatos del ficheru %s..." #: picard/releasegroup.py:53 msgid "Tracks" msgstr "" #: picard/releasegroup.py:54 msgid "Year" msgstr "" #: picard/releasegroup.py:55 picard/ui/cdlookup.py:34 msgid "Country" msgstr "" #: picard/releasegroup.py:56 picard/util/tags.py:81 msgid "Format" msgstr "" #: picard/releasegroup.py:57 msgid "Label" msgstr "" #: picard/releasegroup.py:58 msgid "Cat No" msgstr "" #: picard/releasegroup.py:88 msgid "[no barcode]" msgstr "" #: picard/releasegroup.py:108 msgid "[no release info]" msgstr "" #: picard/tagger.py:316 #, python-format msgid "Loading directory %s" msgstr "" #: picard/tagger.py:452 msgid "CD Lookup Error" msgstr "" #: picard/tagger.py:453 #, python-format msgid "" "Error while reading CD:\n" "\n" "%s" msgstr "" #: picard/ui/cdlookup.py:34 picard/ui/mainwindow.py:544 #: picard/ui/ui_options_releases.py:216 picard/util/tags.py:21 msgid "Album" msgstr "" #: picard/ui/cdlookup.py:34 picard/ui/itemviews.py:96 #: picard/ui/mainwindow.py:545 picard/util/tags.py:22 msgid "Artist" msgstr "" #: picard/ui/cdlookup.py:34 picard/util/tags.py:24 msgid "Date" msgstr "" #: picard/ui/cdlookup.py:35 msgid "Labels" msgstr "" #: picard/ui/cdlookup.py:35 msgid "Catalog #s" msgstr "" #: picard/ui/cdlookup.py:35 picard/util/tags.py:79 msgid "Barcode" msgstr "" #: picard/ui/collectionmenu.py:31 msgid "Refresh List" msgstr "" #: picard/ui/collectionmenu.py:92 #, python-format msgid "%s (%i release)" msgid_plural "%s (%i releases)" msgstr[0] "" msgstr[1] "" #: picard/ui/coverartbox.py:142 msgid "View release on MusicBrainz" msgstr "" #: picard/ui/filebrowser.py:40 msgid "&Move Tagged Files Here" msgstr "" #: picard/ui/filebrowser.py:43 msgid "Show &Hidden Files" msgstr "" #: picard/ui/filebrowser.py:48 msgid "&Set as starting directory" msgstr "" #: picard/ui/infodialog.py:36 picard/ui/infodialog.py:75 msgid "Info" msgstr "" #: picard/ui/infodialog.py:80 msgid "Filename:" msgstr "" #: picard/ui/infodialog.py:82 msgid "Format:" msgstr "" #: picard/ui/infodialog.py:86 msgid "Size:" msgstr "" #: picard/ui/infodialog.py:90 msgid "Length:" msgstr "" #: picard/ui/infodialog.py:92 msgid "Bitrate:" msgstr "" #: picard/ui/infodialog.py:94 msgid "Sample rate:" msgstr "" #: picard/ui/infodialog.py:96 msgid "Bits per sample:" msgstr "" #: picard/ui/infodialog.py:100 msgid "Mono" msgstr "" #: picard/ui/infodialog.py:102 msgid "Stereo" msgstr "" #: picard/ui/infodialog.py:105 msgid "Channels:" msgstr "" #: picard/ui/infodialog.py:116 msgid "Album Info" msgstr "" #: picard/ui/infodialog.py:124 msgid "&Errors" msgstr "" #: picard/ui/infodialog.py:134 picard/ui/ui_infodialog.py:77 msgid "&Info" msgstr "" #: picard/ui/infostatus.py:51 msgid "Files" msgstr "" #: picard/ui/infostatus.py:52 msgid "Albums" msgstr "" #: picard/ui/infostatus.py:53 msgid "Pending files" msgstr "" #: picard/ui/infostatus.py:54 msgid "Pending requests" msgstr "" #: picard/ui/itemviews.py:94 picard/util/tags.py:23 msgid "Title" msgstr "" #: picard/ui/itemviews.py:95 picard/util/tags.py:88 msgid "Length" msgstr "" #: picard/ui/itemviews.py:231 msgid "&Expand all" msgstr "" #: picard/ui/itemviews.py:233 msgid "&Collapse all" msgstr "" #: picard/ui/itemviews.py:294 msgid "&Other versions" msgstr "" #: picard/ui/itemviews.py:297 msgid "Loading..." msgstr "" #: picard/ui/itemviews.py:362 msgid "Collections" msgstr "" #: picard/ui/itemviews.py:365 msgid "&Plugins" msgstr "" #: picard/ui/itemviews.py:541 msgid "file view" msgstr "" #: picard/ui/itemviews.py:542 msgid "Contains unmatched files and clusters" msgstr "" #: picard/ui/itemviews.py:562 msgid "Clusters" msgstr "" #: picard/ui/itemviews.py:571 msgid "album view" msgstr "" #: picard/ui/itemviews.py:572 msgid "Contains albums and matched files" msgstr "" #: picard/ui/logview.py:91 msgid "Log" msgstr "" #: picard/ui/logview.py:99 msgid "Status History" msgstr "" #: picard/ui/mainwindow.py:74 msgid "MusicBrainz Picard" msgstr "" #: picard/ui/mainwindow.py:155 msgid "Unsaved Changes" msgstr "" #: picard/ui/mainwindow.py:156 msgid "Are you sure you want to quit Picard?" msgstr "" #: picard/ui/mainwindow.py:157 #, python-format msgid "" "There is %d unsaved file. Closing Picard will lose all unsaved changes." msgid_plural "" "There are %d unsaved files. Closing Picard will lose all unsaved changes." msgstr[0] "" msgstr[1] "" #: picard/ui/mainwindow.py:164 msgid "&Quit Picard" msgstr "" #: picard/ui/mainwindow.py:216 msgid "Ready" msgstr "" #: picard/ui/mainwindow.py:220 msgid "" "Picard listens on a port to integrate with your browser and downloads " "release information when you click the \"Tagger\" buttons on the MusicBrainz" " website" msgstr "" #: picard/ui/mainwindow.py:240 #, python-format msgid " Listening on port %(port)d " msgstr "" #: picard/ui/mainwindow.py:263 msgid "Submission Error" msgstr "" #: picard/ui/mainwindow.py:264 msgid "" "You need to configure your AcoustID API key before you can submit " "fingerprints." msgstr "" #: picard/ui/mainwindow.py:269 msgid "&Options..." msgstr "" #: picard/ui/mainwindow.py:273 msgid "&Cut" msgstr "" #: picard/ui/mainwindow.py:278 msgid "&Paste" msgstr "" #: picard/ui/mainwindow.py:283 msgid "&Help..." msgstr "" #: picard/ui/mainwindow.py:288 msgid "&About..." msgstr "" #: picard/ui/mainwindow.py:292 msgid "&Donate..." msgstr "" #: picard/ui/mainwindow.py:295 msgid "&Report a Bug..." msgstr "" #: picard/ui/mainwindow.py:298 msgid "&Support Forum..." msgstr "" #: picard/ui/mainwindow.py:301 msgid "&Add Files..." msgstr "" #: picard/ui/mainwindow.py:302 msgid "Add files to the tagger" msgstr "" #: picard/ui/mainwindow.py:307 msgid "A&dd Folder..." msgstr "" #: picard/ui/mainwindow.py:308 msgid "Add a folder to the tagger" msgstr "" #: picard/ui/mainwindow.py:310 msgid "Ctrl+D" msgstr "" #: picard/ui/mainwindow.py:313 msgid "&Save" msgstr "" #: picard/ui/mainwindow.py:314 msgid "Save selected files" msgstr "" #: picard/ui/mainwindow.py:320 msgid "S&ubmit" msgstr "" #: picard/ui/mainwindow.py:321 msgid "Submit fingerprints" msgstr "" #: picard/ui/mainwindow.py:325 msgid "E&xit" msgstr "" #: picard/ui/mainwindow.py:328 msgid "Ctrl+Q" msgstr "" #: picard/ui/mainwindow.py:331 msgid "&Remove" msgstr "" #: picard/ui/mainwindow.py:332 msgid "Remove selected files/albums" msgstr "" #: picard/ui/mainwindow.py:336 msgid "Lookup in &Browser" msgstr "" #: picard/ui/mainwindow.py:337 msgid "Lookup selected item on MusicBrainz website" msgstr "" #: picard/ui/mainwindow.py:341 msgid "File &Browser" msgstr "" #: picard/ui/mainwindow.py:345 msgid "Ctrl+B" msgstr "" #: picard/ui/mainwindow.py:348 msgid "&Cover Art" msgstr "" #: picard/ui/mainwindow.py:354 picard/ui/mainwindow.py:539 msgid "Search" msgstr "" #: picard/ui/mainwindow.py:357 msgid "&CD Lookup..." msgstr "" #: picard/ui/mainwindow.py:358 picard/ui/mainwindow.py:359 msgid "Lookup CD" msgstr "" #: picard/ui/mainwindow.py:361 msgid "Ctrl+K" msgstr "" #: picard/ui/mainwindow.py:364 msgid "&Scan" msgstr "" #: picard/ui/mainwindow.py:367 msgid "Ctrl+Y" msgstr "" #: picard/ui/mainwindow.py:370 msgid "Cl&uster" msgstr "" #: picard/ui/mainwindow.py:373 msgid "Ctrl+U" msgstr "" #: picard/ui/mainwindow.py:376 msgid "&Lookup" msgstr "" #: picard/ui/mainwindow.py:377 picard/ui/mainwindow.py:378 msgid "Lookup metadata" msgstr "" #: picard/ui/mainwindow.py:381 msgid "Ctrl+L" msgstr "" #: picard/ui/mainwindow.py:384 msgid "&Info..." msgstr "" #: picard/ui/mainwindow.py:387 msgid "Ctrl+I" msgstr "" #: picard/ui/mainwindow.py:390 msgid "&Refresh" msgstr "" #: picard/ui/mainwindow.py:391 msgid "Ctrl+R" msgstr "" #: picard/ui/mainwindow.py:394 msgid "&Rename Files" msgstr "" #: picard/ui/mainwindow.py:399 msgid "&Move Files" msgstr "" #: picard/ui/mainwindow.py:404 msgid "Save &Tags" msgstr "" #: picard/ui/mainwindow.py:409 msgid "Tags From &File Names..." msgstr "" #: picard/ui/mainwindow.py:412 msgid "View &Log..." msgstr "" #: picard/ui/mainwindow.py:415 msgid "View Status &History..." msgstr "" #: picard/ui/mainwindow.py:422 msgid "&Open..." msgstr "" #: picard/ui/mainwindow.py:423 msgid "Open the file" msgstr "" #: picard/ui/mainwindow.py:426 msgid "Open &Folder..." msgstr "" #: picard/ui/mainwindow.py:427 msgid "Open the containing folder" msgstr "" #: picard/ui/mainwindow.py:448 msgid "&File" msgstr "" #: picard/ui/mainwindow.py:456 msgid "&Edit" msgstr "" #: picard/ui/mainwindow.py:462 msgid "&View" msgstr "" #: picard/ui/mainwindow.py:470 msgid "&Options" msgstr "" #: picard/ui/mainwindow.py:476 msgid "&Tools" msgstr "" #: picard/ui/mainwindow.py:485 picard/ui/util.py:35 msgid "&Help" msgstr "" #: picard/ui/mainwindow.py:505 msgid "Actions" msgstr "" #: picard/ui/mainwindow.py:608 msgid "All Supported Formats" msgstr "" #: picard/ui/mainwindow.py:705 msgid "Configuration Required" msgstr "" #: picard/ui/mainwindow.py:706 msgid "" "Audio fingerprinting is not yet configured. Would you like to configure it " "now?" msgstr "" #: picard/ui/mainwindow.py:784 picard/ui/mainwindow.py:791 #, python-format msgid " (Error: %s)" msgstr "" #: picard/ui/metadatabox.py:82 #, python-format msgid "(different across %d item)" msgid_plural "(different across %d items)" msgstr[0] "" msgstr[1] "" #: picard/ui/metadatabox.py:90 #, python-format msgid "(missing from %d item)" msgid_plural "(missing from %d items)" msgstr[0] "" msgstr[1] "" #: picard/ui/metadatabox.py:154 msgid "metadata view" msgstr "" #: picard/ui/metadatabox.py:155 msgid "Displays original and new tags for the selected files" msgstr "" #: picard/ui/metadatabox.py:157 msgid "Tag" msgstr "" #: picard/ui/metadatabox.py:157 msgid "Original Value" msgstr "" #: picard/ui/metadatabox.py:157 msgid "New Value" msgstr "" #: picard/ui/metadatabox.py:180 msgid "Add New Tag..." msgstr "" #: picard/ui/metadatabox.py:182 msgid "Show Changes First" msgstr "" #: picard/ui/metadatabox.py:237 msgid "Edit..." msgstr "" #: picard/ui/metadatabox.py:258 msgid "Use Original Value" msgid_plural "Use Original Values" msgstr[0] "" msgstr[1] "" #: picard/ui/passworddialog.py:37 #, python-format msgid "" "The server %s requires you to login. Please enter your username and " "password." msgstr "" #: picard/ui/passworddialog.py:75 #, python-format msgid "" "The proxy %s requires you to login. Please enter your username and password." msgstr "" #: picard/ui/tagsfromfilenames.py:55 picard/ui/tagsfromfilenames.py:100 msgid "File Name" msgstr "" #: picard/ui/ui_cdlookup.py:66 picard/ui/ui_options_cdlookup.py:55 #: picard/ui/ui_options_cdlookup_select.py:62 picard/ui/options/cdlookup.py:38 msgid "CD Lookup" msgstr "" #: picard/ui/ui_cdlookup.py:67 msgid "The following releases on MusicBrainz match the CD:" msgstr "" #: picard/ui/ui_cdlookup.py:68 msgid "OK" msgstr "" #: picard/ui/ui_cdlookup.py:69 msgid "Lookup manually" msgstr "" #: picard/ui/ui_cdlookup.py:70 msgid "Cancel" msgstr "" #: picard/ui/ui_edittagdialog.py:101 msgid "Edit Tag" msgstr "" #: picard/ui/ui_edittagdialog.py:102 msgid "Edit value" msgstr "" #: picard/ui/ui_edittagdialog.py:103 msgid "Add value" msgstr "" #: picard/ui/ui_edittagdialog.py:104 msgid "Remove value" msgstr "" #: picard/ui/ui_infodialog.py:78 msgid "A&rtwork" msgstr "" #: picard/ui/ui_infostatus.py:100 msgid "Form" msgstr "" #: picard/ui/ui_options.py:51 msgid "Options" msgstr "" #: picard/ui/ui_options_advanced.py:46 msgid "Advanced options" msgstr "" #: picard/ui/ui_options_advanced.py:47 msgid "Ignore file paths matching the following regular expression:" msgstr "" #: picard/ui/ui_options_cdlookup.py:56 msgid "CD-ROM device to use for lookups:" msgstr "" #: picard/ui/ui_options_cdlookup_select.py:63 msgid "Default CD-ROM drive to use for lookups:" msgstr "" #: picard/ui/ui_options_cover.py:145 msgid "Location" msgstr "" #: picard/ui/ui_options_cover.py:146 msgid "Embed cover images into tags" msgstr "" #: picard/ui/ui_options_cover.py:147 msgid "Only embed a front image" msgstr "" #: picard/ui/ui_options_cover.py:148 msgid "Save cover images as separate files" msgstr "" #: picard/ui/ui_options_cover.py:149 msgid "Use the following file name for images:" msgstr "" #: picard/ui/ui_options_cover.py:150 msgid "Overwrite the file if it already exists" msgstr "" #: picard/ui/ui_options_cover.py:151 msgid "Coverart Providers" msgstr "" #: picard/ui/ui_options_cover.py:152 msgid "Amazon" msgstr "" #: picard/ui/ui_options_cover.py:153 picard/ui/ui_options_cover.py:155 msgid "Cover Art Archive" msgstr "" #: picard/ui/ui_options_cover.py:154 msgid "Sites on the whitelist" msgstr "" #: picard/ui/ui_options_cover.py:156 msgid "Only use images of the following size:" msgstr "" #: picard/ui/ui_options_cover.py:157 msgid "250 px" msgstr "" #: picard/ui/ui_options_cover.py:158 msgid "500 px" msgstr "" #: picard/ui/ui_options_cover.py:159 msgid "Full size" msgstr "" #: picard/ui/ui_options_cover.py:160 msgid "Download only images of the following types:" msgstr "" #: picard/ui/ui_options_cover.py:161 msgid "Download only approved images" msgstr "" #: picard/ui/ui_options_cover.py:162 msgid "" "Use the first image type as the filename. This will not change the filename " "of front images." msgstr "" #: picard/ui/ui_options_fingerprinting.py:83 msgid "Audio Fingerprinting" msgstr "" #: picard/ui/ui_options_fingerprinting.py:84 msgid "Do not use audio fingerprinting" msgstr "" #: picard/ui/ui_options_fingerprinting.py:85 msgid "Use AcoustID" msgstr "" #: picard/ui/ui_options_fingerprinting.py:86 msgid "AcoustID Settings" msgstr "" #: picard/ui/ui_options_fingerprinting.py:87 msgid "Fingerprint calculator:" msgstr "" #: picard/ui/ui_options_fingerprinting.py:88 #: picard/ui/ui_options_interface.py:88 picard/ui/ui_options_renaming.py:138 msgid "Browse..." msgstr "" #: picard/ui/ui_options_fingerprinting.py:89 msgid "Download..." msgstr "" #: picard/ui/ui_options_fingerprinting.py:90 msgid "API key:" msgstr "" #: picard/ui/ui_options_fingerprinting.py:91 msgid "Get API key..." msgstr "" #: picard/ui/ui_options_folksonomy.py:115 picard/ui/options/folksonomy.py:28 msgid "Folksonomy Tags" msgstr "" #: picard/ui/ui_options_folksonomy.py:117 msgid "Only use my tags" msgstr "" #: picard/ui/ui_options_folksonomy.py:120 msgid "Maximum number of tags:" msgstr "" #: picard/ui/ui_options_general.py:92 msgid "MusicBrainz Server" msgstr "" #: picard/ui/ui_options_general.py:93 picard/ui/ui_options_network.py:123 msgid "Port:" msgstr "" #: picard/ui/ui_options_general.py:94 picard/ui/ui_options_network.py:124 msgid "Server address:" msgstr "" #: picard/ui/ui_options_general.py:95 msgid "Account Information" msgstr "" #: picard/ui/ui_options_general.py:96 picard/ui/ui_options_network.py:121 #: picard/ui/ui_passworddialog.py:74 msgid "Password:" msgstr "" #: picard/ui/ui_options_general.py:97 picard/ui/ui_options_network.py:122 #: picard/ui/ui_passworddialog.py:73 msgid "Username:" msgstr "" #: picard/ui/ui_options_general.py:98 picard/ui/options/general.py:31 msgid "General" msgstr "" #: picard/ui/ui_options_general.py:99 msgid "Automatically scan all new files" msgstr "" #: picard/ui/ui_options_general.py:100 msgid "Ignore MBIDs when loading new files" msgstr "" #: picard/ui/ui_options_interface.py:82 msgid "Miscellaneous" msgstr "" #: picard/ui/ui_options_interface.py:83 msgid "Show text labels under icons" msgstr "" #: picard/ui/ui_options_interface.py:84 msgid "Allow selection of multiple directories" msgstr "" #: picard/ui/ui_options_interface.py:85 msgid "Use advanced query syntax" msgstr "" #: picard/ui/ui_options_interface.py:86 msgid "Show a quit confirmation dialog for unsaved changes" msgstr "" #: picard/ui/ui_options_interface.py:87 msgid "Begin browsing in the following directory:" msgstr "" #: picard/ui/ui_options_interface.py:89 msgid "User interface language:" msgstr "" #: picard/ui/ui_options_matching.py:86 msgid "Thresholds" msgstr "" #: picard/ui/ui_options_matching.py:87 msgid "Minimal similarity for matching files to tracks:" msgstr "" #: picard/ui/ui_options_matching.py:91 msgid "Minimal similarity for file lookups:" msgstr "" #: picard/ui/ui_options_matching.py:92 msgid "Minimal similarity for cluster lookups:" msgstr "" #: picard/ui/ui_options_metadata.py:114 picard/ui/options/metadata.py:29 msgid "Metadata" msgstr "" #: picard/ui/ui_options_metadata.py:115 msgid "Translate artist names to this locale where possible:" msgstr "" #: picard/ui/ui_options_metadata.py:116 msgid "Use standardized artist names" msgstr "" #: picard/ui/ui_options_metadata.py:117 msgid "Convert Unicode punctuation characters to ASCII" msgstr "" #: picard/ui/ui_options_metadata.py:118 msgid "Use release relationships" msgstr "" #: picard/ui/ui_options_metadata.py:119 msgid "Use track relationships" msgstr "" #: picard/ui/ui_options_metadata.py:120 msgid "Use folksonomy tags as genre" msgstr "" #: picard/ui/ui_options_metadata.py:121 msgid "Custom Fields" msgstr "" #: picard/ui/ui_options_metadata.py:122 msgid "Various artists:" msgstr "" #: picard/ui/ui_options_metadata.py:123 msgid "Non-album tracks:" msgstr "" #: picard/ui/ui_options_metadata.py:124 picard/ui/ui_options_metadata.py:125 #: picard/ui/ui_options_renaming.py:147 msgid "Default" msgstr "" #: picard/ui/ui_options_network.py:120 msgid "Web Proxy" msgstr "" #: picard/ui/ui_options_network.py:125 msgid "Browser Integration" msgstr "" #: picard/ui/ui_options_network.py:126 msgid "Default listening port:" msgstr "" #: picard/ui/ui_options_network.py:127 msgid "Listen only on localhost" msgstr "" #: picard/ui/ui_options_plugins.py:131 picard/ui/options/plugins.py:38 msgid "Plugins" msgstr "" #: picard/ui/ui_options_plugins.py:132 picard/ui/options/plugins.py:122 msgid "Name" msgstr "" #: picard/ui/ui_options_plugins.py:133 picard/util/tags.py:39 msgid "Version" msgstr "" #: picard/ui/ui_options_plugins.py:134 picard/ui/options/plugins.py:125 msgid "Author" msgstr "" #: picard/ui/ui_options_plugins.py:135 msgid "Install plugin..." msgstr "" #: picard/ui/ui_options_plugins.py:136 msgid "Open plugin folder" msgstr "" #: picard/ui/ui_options_plugins.py:137 msgid "Download plugins" msgstr "" #: picard/ui/ui_options_plugins.py:138 msgid "Details" msgstr "" #: picard/ui/ui_options_ratings.py:53 msgid "Enable track ratings" msgstr "" #: picard/ui/ui_options_ratings.py:54 msgid "" "Picard saves the ratings together with an e-mail address identifying the " "user who did the rating. That way different ratings for different users can " "be stored in the files. Please specify the e-mail you want to use to save " "your ratings." msgstr "" #: picard/ui/ui_options_ratings.py:55 msgid "E-mail:" msgstr "" #: picard/ui/ui_options_ratings.py:56 msgid "Submit ratings to MusicBrainz" msgstr "" #: picard/ui/ui_options_releases.py:215 msgid "Preferred release types" msgstr "" #: picard/ui/ui_options_releases.py:217 msgid "Single" msgstr "" #: picard/ui/ui_options_releases.py:218 msgid "EP" msgstr "" #: picard/ui/ui_options_releases.py:219 msgid "Compilation" msgstr "" #: picard/ui/ui_options_releases.py:220 msgid "Soundtrack" msgstr "" #: picard/ui/ui_options_releases.py:221 msgid "Spokenword" msgstr "" #: picard/ui/ui_options_releases.py:222 msgid "Interview" msgstr "" #: picard/ui/ui_options_releases.py:223 msgid "Audiobook" msgstr "" #: picard/ui/ui_options_releases.py:224 msgid "Live" msgstr "" #: picard/ui/ui_options_releases.py:225 msgid "Remix" msgstr "" #: picard/ui/ui_options_releases.py:227 msgid "Reset all" msgstr "" #: picard/ui/ui_options_releases.py:228 msgid "Preferred release countries" msgstr "" #: picard/ui/ui_options_releases.py:229 picard/ui/ui_options_releases.py:232 msgid ">" msgstr "" #: picard/ui/ui_options_releases.py:230 picard/ui/ui_options_releases.py:233 msgid "<" msgstr "" #: picard/ui/ui_options_releases.py:231 msgid "Preferred release formats" msgstr "" #: picard/ui/ui_options_renaming.py:134 msgid "Rename files when saving" msgstr "" #: picard/ui/ui_options_renaming.py:135 msgid "Replace non-ASCII characters" msgstr "" #: picard/ui/ui_options_renaming.py:136 msgid "Windows compatibility" msgstr "" #: picard/ui/ui_options_renaming.py:137 msgid "Move files to this directory when saving:" msgstr "" #: picard/ui/ui_options_renaming.py:139 msgid "Delete empty directories" msgstr "" #: picard/ui/ui_options_renaming.py:140 msgid "Move additional files:" msgstr "" #: picard/ui/ui_options_renaming.py:141 msgid "Name files like this" msgstr "" #: picard/ui/ui_options_renaming.py:148 msgid "Examples" msgstr "" #: picard/ui/ui_options_script.py:49 msgid "Tagger Script" msgstr "" #: picard/ui/ui_options_tags.py:165 msgid "Write tags to files" msgstr "" #: picard/ui/ui_options_tags.py:166 msgid "Preserve timestamps of tagged files" msgstr "" #: picard/ui/ui_options_tags.py:167 msgid "Before Tagging" msgstr "" #: picard/ui/ui_options_tags.py:168 msgid "Clear existing tags" msgstr "" #: picard/ui/ui_options_tags.py:169 msgid "Remove ID3 tags from FLAC files" msgstr "" #: picard/ui/ui_options_tags.py:170 msgid "Remove APEv2 tags from MP3 files" msgstr "" #: picard/ui/ui_options_tags.py:171 msgid "" "Preserve these tags from being cleared or overwritten with MusicBrainz data:" msgstr "" #: picard/ui/ui_options_tags.py:172 msgid "Tags are separated by commas, and are case-sensitive." msgstr "" #: picard/ui/ui_options_tags.py:173 msgid "Tag Compatibility" msgstr "" #: picard/ui/ui_options_tags.py:174 msgid "ID3v2 Version" msgstr "" #: picard/ui/ui_options_tags.py:175 msgid "2.4" msgstr "" #: picard/ui/ui_options_tags.py:176 msgid "2.3" msgstr "" #: picard/ui/ui_options_tags.py:177 msgid "ID3v2 Text Encoding" msgstr "" #: picard/ui/ui_options_tags.py:178 msgid "UTF-8" msgstr "" #: picard/ui/ui_options_tags.py:179 msgid "UTF-16" msgstr "" #: picard/ui/ui_options_tags.py:180 msgid "ISO-8859-1" msgstr "" #: picard/ui/ui_options_tags.py:181 msgid "Join multiple ID3v2.3 tags with:" msgstr "" #: picard/ui/ui_options_tags.py:182 msgid "" "

Default is '/' to maintain compatibility with previous" " Picard releases.

New alternatives are ';_' or '_/_' or type your own." "

" msgstr "" #: picard/ui/ui_options_tags.py:183 msgid "Also include ID3v1 tags in the files" msgstr "" #: picard/ui/ui_passworddialog.py:72 msgid "Authentication required" msgstr "" #: picard/ui/ui_passworddialog.py:75 msgid "Save username and password" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:54 msgid "Convert File Names to Tags" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:55 msgid "Replace underscores with spaces" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:56 msgid "&Preview" msgstr "" #: picard/ui/util.py:33 msgid "&Ok" msgstr "" #: picard/ui/util.py:34 msgid "&Cancel" msgstr "" #: picard/ui/options/about.py:33 msgid "About" msgstr "" #: picard/ui/options/about.py:48 msgid "is not installed" msgstr "" #: picard/ui/options/about.py:59 msgid "translator-credits" msgstr "Launchpad Contributions:\n ASTUR2000 https://launchpad.net/~astur2000\n Xuacu Saturio https://launchpad.net/~xuacusk8" #: picard/ui/options/about.py:62 #, python-format msgid "
Translated to LANG by %s" msgstr "" #: picard/ui/options/about.py:66 #, python-format msgid "" "

MusicBrainz Picard
\n" "Version %(version)s

\n" "

\n" "PyQt %(pyqt-version)s
\n" "Mutagen %(mutagen-version)s
\n" "Discid %(discid-version)s\n" "

\n" "

Supported formats
%(formats)s

\n" "

Please donate
\n" "Thank you for using Picard. Picard relies on the MusicBrainz database, which is operated by the MetaBrainz Foundation with the help of thousands of volunteers. If you like this application please consider donating to the MetaBrainz Foundation to keep the service running.

\n" "

Donate now!

\n" "

Credits
\n" "Copyright © 2004-2014 Robert Kaye, Lukáš Lalinský and others%(translator-credits)s

\n" "

%(picard-doc-url)s

\n" msgstr "" #: picard/ui/options/advanced.py:31 msgid "Advanced" msgstr "" #: picard/ui/options/advanced.py:66 msgid "Regex Error" msgstr "" #: picard/ui/options/cover.py:63 msgid "Cover Art" msgstr "" #: picard/ui/options/fingerprinting.py:32 msgid "Fingerprinting" msgstr "" #: picard/ui/options/interface.py:35 msgid "User Interface" msgstr "" #: picard/ui/options/interface.py:54 msgid "System default" msgstr "" #: picard/ui/options/interface.py:96 msgid "Language changed" msgstr "" #: picard/ui/options/interface.py:96 msgid "" "You have changed the interface language. You have to restart Picard in order" " for the change to take effect." msgstr "" #: picard/ui/options/matching.py:28 msgid "Matching" msgstr "" #: picard/ui/options/network.py:29 msgid "Network" msgstr "" #: picard/ui/options/plugins.py:126 msgid "File" msgstr "" #: picard/ui/options/ratings.py:28 msgid "Ratings" msgstr "" #: picard/ui/options/releases.py:33 msgid "Preferred Releases" msgstr "" #: picard/ui/options/renaming.py:37 msgid "File Naming" msgstr "" #: picard/ui/options/renaming.py:184 msgid "Error" msgstr "" #: picard/ui/options/renaming.py:184 msgid "The location to move files to must not be empty." msgstr "" #: picard/ui/options/renaming.py:194 msgid "The file naming format must not be empty." msgstr "" #: picard/ui/options/scripting.py:63 msgid "Scripting" msgstr "" #: picard/ui/options/scripting.py:95 msgid "Script Error" msgstr "" #: picard/util/bytes2human.py:33 #, python-format msgid "%s B" msgstr "" #: picard/util/bytes2human.py:34 #, python-format msgid "%s kB" msgstr "" #: picard/util/bytes2human.py:35 #, python-format msgid "%s KiB" msgstr "" #: picard/util/bytes2human.py:36 #, python-format msgid "%s MB" msgstr "" #: picard/util/bytes2human.py:37 #, python-format msgid "%s MiB" msgstr "" #: picard/util/bytes2human.py:38 #, python-format msgid "%s GB" msgstr "" #: picard/util/bytes2human.py:39 #, python-format msgid "%s GiB" msgstr "" #: picard/util/bytes2human.py:40 #, python-format msgid "%s TB" msgstr "" #: picard/util/bytes2human.py:41 #, python-format msgid "%s TiB" msgstr "" #: picard/util/bytes2human.py:42 #, python-format msgid "%s PB" msgstr "" #: picard/util/bytes2human.py:43 #, python-format msgid "%s PiB" msgstr "" #: picard/util/bytes2human.py:84 #, python-format msgid "%s " msgstr "" #: picard/util/tags.py:25 msgid "Original Release Date" msgstr "" #: picard/util/tags.py:26 msgid "Original Year" msgstr "" #: picard/util/tags.py:27 msgid "Album Artist" msgstr "" #: picard/util/tags.py:28 msgid "Track Number" msgstr "" #: picard/util/tags.py:29 msgid "Total Tracks" msgstr "" #: picard/util/tags.py:30 msgid "Disc Number" msgstr "" #: picard/util/tags.py:31 msgid "Total Discs" msgstr "" #: picard/util/tags.py:32 msgid "Album Artist Sort Order" msgstr "" #: picard/util/tags.py:33 msgid "Artist Sort Order" msgstr "" #: picard/util/tags.py:34 msgid "Title Sort Order" msgstr "" #: picard/util/tags.py:35 msgid "Album Sort Order" msgstr "" #: picard/util/tags.py:36 msgid "Composer Sort Order" msgstr "" #: picard/util/tags.py:37 msgid "ASIN" msgstr "" #: picard/util/tags.py:38 msgid "Grouping" msgstr "" #: picard/util/tags.py:40 msgid "ISRC" msgstr "" #: picard/util/tags.py:41 msgid "Mood" msgstr "" #: picard/util/tags.py:42 msgid "BPM" msgstr "" #: picard/util/tags.py:43 msgid "Copyright" msgstr "" #: picard/util/tags.py:44 msgid "License" msgstr "" #: picard/util/tags.py:45 msgid "Composer" msgstr "" #: picard/util/tags.py:46 msgid "Writer" msgstr "" #: picard/util/tags.py:47 msgid "Conductor" msgstr "" #: picard/util/tags.py:48 msgid "Lyricist" msgstr "" #: picard/util/tags.py:49 msgid "Arranger" msgstr "" #: picard/util/tags.py:50 msgid "Producer" msgstr "" #: picard/util/tags.py:51 msgid "Engineer" msgstr "" #: picard/util/tags.py:52 msgid "Subtitle" msgstr "" #: picard/util/tags.py:53 msgid "Disc Subtitle" msgstr "" #: picard/util/tags.py:54 msgid "Remixer" msgstr "" #: picard/util/tags.py:55 msgid "MusicBrainz Recording Id" msgstr "" #: picard/util/tags.py:56 msgid "MusicBrainz Track Id" msgstr "" #: picard/util/tags.py:57 msgid "MusicBrainz Release Id" msgstr "" #: picard/util/tags.py:58 msgid "MusicBrainz Artist Id" msgstr "" #: picard/util/tags.py:59 msgid "MusicBrainz Release Artist Id" msgstr "" #: picard/util/tags.py:60 msgid "MusicBrainz Work Id" msgstr "" #: picard/util/tags.py:61 msgid "MusicBrainz Release Group Id" msgstr "" #: picard/util/tags.py:62 msgid "MusicBrainz Disc Id" msgstr "" #: picard/util/tags.py:63 msgid "MusicBrainz Sort Name" msgstr "" #: picard/util/tags.py:64 msgid "MusicIP PUID" msgstr "" #: picard/util/tags.py:65 msgid "MusicIP Fingerprint" msgstr "" #: picard/util/tags.py:66 msgid "AcoustID" msgstr "" #: picard/util/tags.py:67 msgid "AcoustID Fingerprint" msgstr "" #: picard/util/tags.py:68 msgid "Disc Id" msgstr "" #: picard/util/tags.py:69 msgid "Website" msgstr "" #: picard/util/tags.py:70 msgid "Compilation (iTunes)" msgstr "" #: picard/util/tags.py:71 msgid "Comment" msgstr "" #: picard/util/tags.py:72 msgid "Genre" msgstr "" #: picard/util/tags.py:73 msgid "Encoded By" msgstr "" #: picard/util/tags.py:74 msgid "Performer" msgstr "" #: picard/util/tags.py:75 msgid "Release Type" msgstr "" #: picard/util/tags.py:76 msgid "Release Status" msgstr "" #: picard/util/tags.py:77 msgid "Release Country" msgstr "" #: picard/util/tags.py:78 msgid "Record Label" msgstr "" #: picard/util/tags.py:80 msgid "Catalog Number" msgstr "" #: picard/util/tags.py:82 msgid "DJ-Mixer" msgstr "" #: picard/util/tags.py:83 msgid "Media" msgstr "" #: picard/util/tags.py:84 msgid "Lyrics" msgstr "" #: picard/util/tags.py:85 msgid "Mixer" msgstr "" #: picard/util/tags.py:86 msgid "Language" msgstr "" #: picard/util/tags.py:87 msgid "Script" msgstr "" #: picard/util/tags.py:89 msgid "Rating" msgstr "" #: picard/util/tags.py:90 msgid "Artists" msgstr "" #: picard/util/tags.py:91 msgid "Work" msgstr "" #: picard/util/webbrowser2.py:90 msgid "Web Browser Error" msgstr "" #: picard/util/webbrowser2.py:90 #, python-format msgid "" "Error while launching a web browser:\n" "\n" "%s" msgstr "" picard-release-1.3.2/po/attributes/000077500000000000000000000000001245305550700172075ustar00rootroot00000000000000picard-release-1.3.2/po/attributes/.gitignore000066400000000000000000000000001245305550700211650ustar00rootroot00000000000000picard-release-1.3.2/po/attributes/da.po000066400000000000000000001703301245305550700201370ustar00rootroot00000000000000# # Translators: # Freso , 2012 # Freso , 2014 msgid "" msgstr "" "Project-Id-Version: MusicBrainz\n" "PO-Revision-Date: 2014-12-16 07:54+0000\n" "Last-Translator: Ian McEwen \n" "Language-Team: Danish (http://www.transifex.com/projects/p/musicbrainz/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: DB:medium_format/name:30 msgctxt "medium_format" msgid "10\" Vinyl" msgstr "10\" vinyl" #: DB:medium_format/name:31 msgctxt "medium_format" msgid "12\" Vinyl" msgstr "12\" vinyl" #: DB:medium_format/name:49 msgctxt "medium_format" msgid "3.5\" Floppy Disk" msgstr "" #: DB:medium_format/name:29 msgctxt "medium_format" msgid "7\" Vinyl" msgstr "7\" vinyl" #: DB:medium_format/name:34 msgctxt "medium_format" msgid "8cm CD" msgstr "8cm CD" #: DB:medium_format/name:40 msgctxt "medium_format" msgid "8cm CD+G" msgstr "8cm CD+G" #: DB:event_type/description:4 msgctxt "event_type" msgid "" "A convention, expo or trade fair is an event which is not typically " "orientated around music performances, but can include them as side " "activities" msgstr "" #: DB:work_attribute_type_allowed_value/value:28 msgctxt "work_attribute_type_allowed_value" msgid "A major" msgstr "A-dur" #: DB:event_type/description:5 msgctxt "event_type" msgid "" "A masterclass or clinic is an event where an artist meets with a small to " "medium-sized audience and instructs them individually and/or takes questions" " intended to improve the audience members' playing skills." msgstr "" #: DB:work_attribute_type_allowed_value/value:29 msgctxt "work_attribute_type_allowed_value" msgid "A minor" msgstr "A-mol" #: DB:event_type/description:3 msgctxt "event_type" msgid "" "A party, reception or other event held specifically for the launch of a " "release" msgstr "" #: DB:work_attribute_type_allowed_value/value:26 msgctxt "work_attribute_type_allowed_value" msgid "A-flat major" msgstr "Aes-dur" #: DB:work_attribute_type_allowed_value/value:27 msgctxt "work_attribute_type_allowed_value" msgid "A-flat minor" msgstr "Aes-mol" #: DB:work_attribute_type_allowed_value/value:30 msgctxt "work_attribute_type_allowed_value" msgid "A-sharp minor" msgstr "Ais-mol" #: DB:work_attribute_type/name:13 msgctxt "work_attribute_type" msgid "APRA ID" msgstr "APRA-id" #: DB:work_attribute_type/name:6 msgctxt "work_attribute_type" msgid "ASCAP ID" msgstr "ASCAP-id" #: DB:release_group_primary_type/name:1 msgctxt "release_group_primary_type" msgid "Album" msgstr "album" #: DB:series_ordering_type/description:2 msgctxt "series_ordering_type" msgid "Allows for manually setting the position of each item in the series." msgstr "" #: DB:work_attribute_type_allowed_value/value:40 msgctxt "work_attribute_type_allowed_value" msgid "Amṛtavarṣiṇi" msgstr "Amṛtavarṣiṇi" #: DB:work_attribute_type_allowed_value/value:39 msgctxt "work_attribute_type_allowed_value" msgid "Amṛtavāhiṇi" msgstr "Amṛtavāhiṇi" #: DB:event_type/description:2 msgctxt "event_type" msgid "" "An event where a number of different acts perform across the course of the " "day. Larger festivals may be spread across multiple days." msgstr "" #: DB:event_type/description:1 msgctxt "event_type" msgid "" "An individual concert by a single artist or collaboration, often with " "supporting artists who perform before the main act." msgstr "" #: DB:area_alias_type/name:1 msgctxt "alias_type" msgid "Area name" msgstr "områdenavn" #: DB:work_type/name:1 msgctxt "work_type" msgid "Aria" msgstr "arie" #: DB:artist_alias_type/name:1 msgctxt "alias_type" msgid "Artist name" msgstr "kunstnernavn" #: DB:work_attribute_type_allowed_value/value:44 msgctxt "work_attribute_type_allowed_value" msgid "Asāvēri" msgstr "Asāvēri" #: DB:editor_collection_type/name:5 msgctxt "collection_type" msgid "Attending" msgstr "" #: DB:work_type/name:25 msgctxt "work_type" msgid "Audio drama" msgstr "" #: DB:release_group_secondary_type/name:5 msgctxt "release_group_secondary_type" msgid "Audiobook" msgstr "lydbog" #: DB:series_ordering_type/name:1 msgctxt "series_ordering_type" msgid "Automatic" msgstr "" #: DB:work_attribute_type_allowed_value/value:45 msgctxt "work_attribute_type_allowed_value" msgid "Aṭāna" msgstr "Aṭāna" #: DB:work_attribute_type_allowed_value/value:289 msgctxt "work_attribute_type_allowed_value" msgid "Aṭṭa" msgstr "" #: DB:work_attribute_type_allowed_value/value:33 msgctxt "work_attribute_type_allowed_value" msgid "B major" msgstr "H-dur" #: DB:work_attribute_type_allowed_value/value:34 msgctxt "work_attribute_type_allowed_value" msgid "B minor" msgstr "H-mol" #: DB:work_attribute_type_allowed_value/value:31 msgctxt "work_attribute_type_allowed_value" msgid "B-flat major" msgstr "" #: DB:work_attribute_type_allowed_value/value:32 msgctxt "work_attribute_type_allowed_value" msgid "B-flat minor" msgstr "" #: DB:work_attribute_type/name:7 msgctxt "work_attribute_type" msgid "BMI ID" msgstr "BMI-id" #: DB:cover_art_archive.art_type/name:2 msgctxt "cover_art_type" msgid "Back" msgstr "bagside" #: DB:work_attribute_type_allowed_value/value:47 msgctxt "work_attribute_type_allowed_value" msgid "Bahudāri" msgstr "Bahudāri" #: DB:work_attribute_type_allowed_value/value:48 msgctxt "work_attribute_type_allowed_value" msgid "Balahaṁsa" msgstr "Balahaṁsa" #: DB:work_type/name:2 msgctxt "work_type" msgid "Ballet" msgstr "ballet" #: DB:work_attribute_type_allowed_value/value:49 msgctxt "work_attribute_type_allowed_value" msgid "Bauḷi" msgstr "Bauḷi" #: DB:work_attribute_type_allowed_value/value:51 msgctxt "work_attribute_type_allowed_value" msgid "Behāg" msgstr "Behāg" #: DB:work_type/name:26 msgctxt "work_type" msgid "Beijing opera" msgstr "" #: DB:medium_format/name:24 msgctxt "medium_format" msgid "Betamax" msgstr "Betamax" #: DB:work_attribute_type_allowed_value/value:52 msgctxt "work_attribute_type_allowed_value" msgid "Bhairavi" msgstr "Bhairavi" #: DB:work_attribute_type_allowed_value/value:53 msgctxt "work_attribute_type_allowed_value" msgid "Bhavāni" msgstr "Bhavāni" #: DB:work_attribute_type_allowed_value/value:54 msgctxt "work_attribute_type_allowed_value" msgid "Bhāvapriya" msgstr "Bhāvapriya" #: DB:work_attribute_type_allowed_value/value:55 msgctxt "work_attribute_type_allowed_value" msgid "Bhīmpalāsi" msgstr "Bhīmpalāsi" #: DB:work_attribute_type_allowed_value/value:56 msgctxt "work_attribute_type_allowed_value" msgid "Bhōga sāvēri" msgstr "Bhōga sāvēri" #: DB:work_attribute_type_allowed_value/value:57 msgctxt "work_attribute_type_allowed_value" msgid "Bhūpāḷaṁ" msgstr "Bhūpāḷaṁ" #: DB:work_attribute_type_allowed_value/value:58 msgctxt "work_attribute_type_allowed_value" msgid "Bhūṣāvaḷi" msgstr "Bhūṣāvaḷi" #: DB:work_attribute_type_allowed_value/value:59 msgctxt "work_attribute_type_allowed_value" msgid "Bilahari" msgstr "Bilahari" #: DB:medium_format/name:20 msgctxt "medium_format" msgid "Blu-ray" msgstr "Blu-ray" #: DB:medium_format/name:35 msgctxt "medium_format" msgid "Blu-spec CD" msgstr "Blu-spec CD" #: DB:release_packaging/name:9 msgctxt "release_packaging" msgid "Book" msgstr "bog" #: DB:cover_art_archive.art_type/name:3 msgctxt "cover_art_type" msgid "Booklet" msgstr "" #: DB:release_status/name:3 msgctxt "release_status" msgid "Bootleg" msgstr "" #: DB:label_type/name:5 msgctxt "label_type" msgid "Bootleg Production" msgstr "" #: DB:release_group_primary_type/name:12 msgctxt "release_group_primary_type" msgid "Broadcast" msgstr "" #: DB:work_attribute_type_allowed_value/value:62 msgctxt "work_attribute_type_allowed_value" msgid "Budamanōhari" msgstr "Budamanōhari" #: DB:work_attribute_type_allowed_value/value:46 msgctxt "work_attribute_type_allowed_value" msgid "Bāgēśrī" msgstr "Bāgēśrī" #: DB:work_attribute_type_allowed_value/value:50 msgctxt "work_attribute_type_allowed_value" msgid "Bēgaḍa" msgstr "Bēgaḍa" #: DB:work_attribute_type_allowed_value/value:60 msgctxt "work_attribute_type_allowed_value" msgid "Bṛndāvana sāranga" msgstr "Bṛndāvana sāranga" #: DB:work_attribute_type_allowed_value/value:61 msgctxt "work_attribute_type_allowed_value" msgid "Bṛndāvani" msgstr "Bṛndāvani" #: DB:work_attribute_type_allowed_value/value:2 msgctxt "work_attribute_type_allowed_value" msgid "C major" msgstr "C-dur" #: DB:work_attribute_type_allowed_value/value:3 msgctxt "work_attribute_type_allowed_value" msgid "C minor" msgstr "C-mol" #: DB:work_attribute_type_allowed_value/value:1 msgctxt "work_attribute_type_allowed_value" msgid "C-flat major" msgstr "Ces-dur" #: DB:work_attribute_type_allowed_value/value:4 msgctxt "work_attribute_type_allowed_value" msgid "C-sharp major" msgstr "Cis-dur" #: DB:work_attribute_type_allowed_value/value:5 msgctxt "work_attribute_type_allowed_value" msgid "C-sharp minor" msgstr "Cis-mol" #: DB:medium_format/name:1 msgctxt "medium_format" msgid "CD" msgstr "CD" #: DB:medium_format/name:39 msgctxt "medium_format" msgid "CD+G" msgstr "CD+G" #: DB:medium_format/name:33 msgctxt "medium_format" msgid "CD-R" msgstr "CD-R" #: DB:medium_format/name:41 msgctxt "medium_format" msgid "CDV" msgstr "" #: DB:work_attribute_type_allowed_value/value:63 msgctxt "work_attribute_type_allowed_value" msgid "Cakravākaṁ" msgstr "Cakravākaṁ" #: DB:work_attribute_type_allowed_value/value:64 msgctxt "work_attribute_type_allowed_value" msgid "Candrajyōti" msgstr "Candrajyōti" #: DB:work_attribute_type_allowed_value/value:65 msgctxt "work_attribute_type_allowed_value" msgid "Candrakauns" msgstr "Candrakauns" #: DB:work_type/name:3 msgctxt "work_type" msgid "Cantata" msgstr "kantate" #: DB:release_packaging/name:4 msgctxt "release_packaging" msgid "Cardboard/Paper Sleeve" msgstr "" #: DB:medium_format/name:9 msgctxt "medium_format" msgid "Cartridge" msgstr "" #: DB:work_attribute_type_allowed_value/value:66 msgctxt "work_attribute_type_allowed_value" msgid "Carturdaśa rāgamālika" msgstr "Carturdaśa rāgamālika" #: DB:medium_format/name:8 msgctxt "medium_format" msgid "Cassette" msgstr "kassette" #: DB:release_packaging/name:8 msgctxt "release_packaging" msgid "Cassette Case" msgstr "" #: DB:series_type/name:5 msgctxt "series_type" msgid "Catalogue" msgstr "" #: DB:work_attribute_type_allowed_value/value:291 msgctxt "work_attribute_type_allowed_value" msgid "Caturaśra-jāti jhaṁpe" msgstr "Caturaśra-jāti jhaṁpe" #: DB:work_attribute_type_allowed_value/value:70 msgctxt "work_attribute_type_allowed_value" msgid "Cencu kāmbhōji" msgstr "" #: DB:artist_type/name:4 msgctxt "artist_type" msgid "Character" msgstr "figur" #: DB:artist_type/name:6 msgctxt "artist_type" msgid "Choir" msgstr "kor" #: DB:work_attribute_type_allowed_value/value:71 msgctxt "work_attribute_type_allowed_value" msgid "Cintāmaṇi" msgstr "" #: DB:work_attribute_type_allowed_value/value:72 msgctxt "work_attribute_type_allowed_value" msgid "Cittaranjani" msgstr "" #: DB:area_type/name:3 msgctxt "area_type" msgid "City" msgstr "by" #: DB:release_group_secondary_type/name:1 msgctxt "release_group_secondary_type" msgid "Compilation" msgstr "opsamling" #: DB:event_type/name:1 msgctxt "event_type" msgid "Concert" msgstr "" #: DB:work_type/name:4 msgctxt "work_type" msgid "Concerto" msgstr "koncert" #: DB:event_type/name:4 msgctxt "event_type" msgid "Convention/Expo" msgstr "" #: DB:area_type/name:1 msgctxt "area_type" msgid "Country" msgstr "land" #: DB:area_type/name:7 msgctxt "area_type" msgid "County" msgstr "" #: DB:work_attribute_type_allowed_value/value:67 msgctxt "work_attribute_type_allowed_value" msgid "Cārukēśi" msgstr "" #: DB:work_attribute_type_allowed_value/value:68 msgctxt "work_attribute_type_allowed_value" msgid "Cāyānāṭa" msgstr "" #: DB:work_attribute_type_allowed_value/value:69 msgctxt "work_attribute_type_allowed_value" msgid "Cāyātarangiṇi" msgstr "Cāyātarangiṇi" #: DB:work_attribute_type_allowed_value/value:8 msgctxt "work_attribute_type_allowed_value" msgid "D major" msgstr "D-dur" #: DB:work_attribute_type_allowed_value/value:9 msgctxt "work_attribute_type_allowed_value" msgid "D minor" msgstr "D-mol" #: DB:work_attribute_type_allowed_value/value:6 msgctxt "work_attribute_type_allowed_value" msgid "D-flat major" msgstr "Dis-dur" #: DB:work_attribute_type_allowed_value/value:7 msgctxt "work_attribute_type_allowed_value" msgid "D-flat minor" msgstr "Des-mol" #: DB:work_attribute_type_allowed_value/value:10 msgctxt "work_attribute_type_allowed_value" msgid "D-sharp minor" msgstr "Dis-mol" #: DB:medium_format/name:11 msgctxt "medium_format" msgid "DAT" msgstr "DAT" #: DB:medium_format/name:16 msgctxt "medium_format" msgid "DCC" msgstr "DCC" #: DB:release_group_secondary_type/name:8 msgctxt "release_group_secondary_type" msgid "DJ-mix" msgstr "DJ-mix" #: DB:medium_format/name:44 msgctxt "medium_format" msgid "DTS CD" msgstr "" #: DB:medium_format/name:2 msgctxt "medium_format" msgid "DVD" msgstr "DVD" #: DB:medium_format/name:18 msgctxt "medium_format" msgid "DVD-Audio" msgstr "" #: DB:medium_format/name:19 msgctxt "medium_format" msgid "DVD-Video" msgstr "" #: DB:medium_format/name:47 msgctxt "medium_format" msgid "DVDplus" msgstr "" #: DB:work_attribute_type_allowed_value/value:73 msgctxt "work_attribute_type_allowed_value" msgid "Darbār" msgstr "Darbār" #: DB:work_attribute_type_allowed_value/value:74 msgctxt "work_attribute_type_allowed_value" msgid "Darbārī kānaḍa" msgstr "Darbārī kānaḍa" #: DB:medium_format/name:43 msgctxt "medium_format" msgid "Data CD" msgstr "" #: DB:release_group_secondary_type/name:10 msgctxt "release_group_secondary_type" msgid "Demo" msgstr "demo" #: DB:work_attribute_type_allowed_value/value:79 msgctxt "work_attribute_type_allowed_value" msgid "Devāmṛtavarṣiṇi" msgstr "Devāmṛtavarṣiṇi" #: DB:work_attribute_type_allowed_value/value:80 msgctxt "work_attribute_type_allowed_value" msgid "Dhanaśrī" msgstr "Dhanaśrī" #: DB:work_attribute_type_allowed_value/value:81 msgctxt "work_attribute_type_allowed_value" msgid "Dhanyāsi" msgstr "Dhanyāsi" #: DB:work_attribute_type_allowed_value/value:82 msgctxt "work_attribute_type_allowed_value" msgid "Dharmāvati" msgstr "Dharmāvati" #: DB:work_attribute_type_allowed_value/value:285 msgctxt "work_attribute_type_allowed_value" msgid "Dhr̥va" msgstr "Dhr̥va" #: DB:work_attribute_type_allowed_value/value:83 msgctxt "work_attribute_type_allowed_value" msgid "Dhēnuka" msgstr "Dhēnuka" #: DB:release_packaging/name:3 msgctxt "release_packaging" msgid "Digipak" msgstr "" #: DB:medium_format/name:12 msgctxt "medium_format" msgid "Digital Media" msgstr "digitalt medie" #: DB:release_packaging/name:13 msgctxt "release_packaging" msgid "Discbox Slider" msgstr "" #: DB:label_type/name:1 msgctxt "label_type" msgid "Distributor" msgstr "distributør" #: DB:area_type/name:5 msgctxt "area_type" msgid "District" msgstr "distrikt" #: DB:medium_format/name:4 msgctxt "medium_format" msgid "DualDisc" msgstr "DualDisc" #: DB:work_attribute_type_allowed_value/value:86 msgctxt "work_attribute_type_allowed_value" msgid "Durga" msgstr "Durga" #: DB:work_attribute_type_allowed_value/value:87 msgctxt "work_attribute_type_allowed_value" msgid "Dvijāvanti" msgstr "Dvijāvanti" #: DB:work_attribute_type_allowed_value/value:76 msgctxt "work_attribute_type_allowed_value" msgid "Dēvagāndhāri" msgstr "Dēvagāndhāri" #: DB:work_attribute_type_allowed_value/value:77 msgctxt "work_attribute_type_allowed_value" msgid "Dēvakriya" msgstr "Dēvakriya" #: DB:work_attribute_type_allowed_value/value:78 msgctxt "work_attribute_type_allowed_value" msgid "Dēvamanōhari" msgstr "Dēvamanōhari" #: DB:work_attribute_type_allowed_value/value:75 msgctxt "work_attribute_type_allowed_value" msgid "Dēś" msgstr "Dēś" #: DB:work_attribute_type_allowed_value/value:292 msgctxt "work_attribute_type_allowed_value" msgid "Dēśādi" msgstr "Dēśādi" #: DB:work_attribute_type_allowed_value/value:84 msgctxt "work_attribute_type_allowed_value" msgid "Dīpakaṁ" msgstr "Dīpakaṁ" #: DB:work_attribute_type_allowed_value/value:85 msgctxt "work_attribute_type_allowed_value" msgid "Dīpāḷi" msgstr "Dīpāḷi" #: DB:work_attribute_type_allowed_value/value:13 msgctxt "work_attribute_type_allowed_value" msgid "E major" msgstr "E-dur" #: DB:work_attribute_type_allowed_value/value:14 msgctxt "work_attribute_type_allowed_value" msgid "E minor" msgstr "E-mol" #: DB:work_attribute_type_allowed_value/value:11 msgctxt "work_attribute_type_allowed_value" msgid "E-flat major" msgstr "Es-dur" #: DB:work_attribute_type_allowed_value/value:12 msgctxt "work_attribute_type_allowed_value" msgid "E-flat minor" msgstr "Es-mol" #: DB:work_attribute_type_allowed_value/value:15 msgctxt "work_attribute_type_allowed_value" msgid "E-sharp minor" msgstr "Eis-mol" #: DB:release_group_primary_type/name:3 msgctxt "release_group_primary_type" msgid "EP" msgstr "EP" #: DB:medium_format/name:50 msgctxt "medium_format" msgid "Edison Diamond Disc" msgstr "" #: DB:instrument_type/name:4 msgctxt "instrument_type" msgid "Electronic instrument" msgstr "" #: DB:medium_format/name:42 msgctxt "medium_format" msgid "Enhanced CD" msgstr "" #: DB:series_type/name:6 msgctxt "series_type" msgid "Event" msgstr "" #: DB:editor_collection_type/name:4 msgctxt "collection_type" msgid "Event" msgstr "" #: DB:event_alias_type/name:1 msgctxt "alias_type" msgid "Event name" msgstr "" #: DB:work_attribute_type_allowed_value/value:17 msgctxt "work_attribute_type_allowed_value" msgid "F major" msgstr "F-dur" #: DB:work_attribute_type_allowed_value/value:18 msgctxt "work_attribute_type_allowed_value" msgid "F minor" msgstr "F-mol" #: DB:work_attribute_type_allowed_value/value:16 msgctxt "work_attribute_type_allowed_value" msgid "F-flat major" msgstr "Fes-dur" #: DB:work_attribute_type_allowed_value/value:19 msgctxt "work_attribute_type_allowed_value" msgid "F-sharp major" msgstr "Fis-dur" #: DB:work_attribute_type_allowed_value/value:20 msgctxt "work_attribute_type_allowed_value" msgid "F-sharp minor" msgstr "Fis-mol" #: DB:release_packaging/name:10 msgctxt "release_packaging" msgid "Fatbox" msgstr "" #: DB:gender/name:2 msgctxt "gender" msgid "Female" msgstr "" #: DB:event_type/name:2 msgctxt "event_type" msgid "Festival" msgstr "" #: DB:series_type/name:8 msgctxt "series_type" msgid "Festival" msgstr "" #: DB:area_alias_type/name:2 msgctxt "alias_type" msgid "Formal name" msgstr "formelt navn" #: DB:cover_art_archive.art_type/name:1 msgctxt "cover_art_type" msgid "Front" msgstr "forside" #: DB:work_attribute_type_allowed_value/value:22 msgctxt "work_attribute_type_allowed_value" msgid "G major" msgstr "G-dur" #: DB:work_attribute_type_allowed_value/value:23 msgctxt "work_attribute_type_allowed_value" msgid "G minor" msgstr "G-mol" #: DB:work_attribute_type_allowed_value/value:21 msgctxt "work_attribute_type_allowed_value" msgid "G-flat major" msgstr "Ges-dur" #: DB:work_attribute_type_allowed_value/value:24 msgctxt "work_attribute_type_allowed_value" msgid "G-sharp major" msgstr "Gis-dur" #: DB:work_attribute_type_allowed_value/value:25 msgctxt "work_attribute_type_allowed_value" msgid "G-sharp minor" msgstr "Gis-mol" #: DB:work_attribute_type/name:9 msgctxt "work_attribute_type" msgid "GEMA ID" msgstr "GEMA-id" #: DB:work_attribute_type_allowed_value/value:88 msgctxt "work_attribute_type_allowed_value" msgid "Gamakakriya" msgstr "Gamakakriya" #: DB:work_attribute_type_allowed_value/value:89 msgctxt "work_attribute_type_allowed_value" msgid "Gamakakriya/Pūrvīkaḷyāṇi" msgstr "Gamakakriya/Pūrvīkaḷyāṇi" #: DB:work_attribute_type_allowed_value/value:95 msgctxt "work_attribute_type_allowed_value" msgid "Garuḍadhvani" msgstr "Garuḍadhvani" #: DB:release_packaging/name:12 msgctxt "release_packaging" msgid "Gatefold Cover" msgstr "" #: DB:work_attribute_type_allowed_value/value:99 msgctxt "work_attribute_type_allowed_value" msgid "Gaurīmanōhari" msgstr "Gaurīmanōhari" #: DB:work_attribute_type_allowed_value/value:96 msgctxt "work_attribute_type_allowed_value" msgid "Gauḍa malhār" msgstr "Gauḍa malhār" #: DB:work_attribute_type_allowed_value/value:97 msgctxt "work_attribute_type_allowed_value" msgid "Gauḷa" msgstr "Gauḷa" #: DB:work_attribute_type_allowed_value/value:98 msgctxt "work_attribute_type_allowed_value" msgid "Gauḷipantu" msgstr "Gauḷipantu" #: DB:work_attribute_type_allowed_value/value:90 msgctxt "work_attribute_type_allowed_value" msgid "Gaṁbhīra nāṭa" msgstr "Gaṁbhīra nāṭa" #: DB:work_attribute_type_allowed_value/value:91 msgctxt "work_attribute_type_allowed_value" msgid "Gaṁbhīra vāṇi" msgstr "Gaṁbhīra vāṇi" #: DB:work_attribute_type_allowed_value/value:100 msgctxt "work_attribute_type_allowed_value" msgid "Ghanṭa" msgstr "Ghanṭa" #: DB:artist_type/name:2 msgctxt "artist_type" msgid "Group" msgstr "gruppe" #: DB:work_attribute_type_allowed_value/value:102 msgctxt "work_attribute_type_allowed_value" msgid "Gurjāri" msgstr "Gurjāri" #: DB:work_attribute_type_allowed_value/value:92 msgctxt "work_attribute_type_allowed_value" msgid "Gānamūrti" msgstr "Gānamūrti" #: DB:work_attribute_type_allowed_value/value:93 msgctxt "work_attribute_type_allowed_value" msgid "Gānavāridhi" msgstr "Gānavāridhi" #: DB:work_attribute_type_allowed_value/value:94 msgctxt "work_attribute_type_allowed_value" msgid "Gāngēyabhūṣaṇi" msgstr "Gāngēyabhūṣaṇi" #: DB:work_attribute_type_allowed_value/value:101 msgctxt "work_attribute_type_allowed_value" msgid "Gōpikāvasantaṁ" msgstr "Gōpikāvasantaṁ" #: DB:medium_format/name:17 msgctxt "medium_format" msgid "HD-DVD" msgstr "HD-DVD" #: DB:medium_format/name:25 msgctxt "medium_format" msgid "HDCD" msgstr "HDCD" #: DB:medium_format/name:37 msgctxt "medium_format" msgid "HQCD" msgstr "HQCD" #: DB:work_attribute_type_allowed_value/value:104 msgctxt "work_attribute_type_allowed_value" msgid "Hamsadhvani" msgstr "Hamsadhvani" #: DB:work_attribute_type_allowed_value/value:107 msgctxt "work_attribute_type_allowed_value" msgid "Hamsavinōdini" msgstr "Hamsavinōdini" #: DB:work_attribute_type_allowed_value/value:103 msgctxt "work_attribute_type_allowed_value" msgid "Hamīr kaḷyaṇi" msgstr "Hamīr kaḷyaṇi" #: DB:work_attribute_type_allowed_value/value:108 msgctxt "work_attribute_type_allowed_value" msgid "Harikāmbhōji" msgstr "Harikāmbhōji" #: DB:work_attribute_type_allowed_value/value:105 msgctxt "work_attribute_type_allowed_value" msgid "Haṁsanādaṁ" msgstr "Haṁsanādaṁ" #: DB:work_attribute_type_allowed_value/value:106 msgctxt "work_attribute_type_allowed_value" msgid "Haṁsānandi" msgstr "Haṁsānandi" #: DB:work_attribute_type_allowed_value/value:112 msgctxt "work_attribute_type_allowed_value" msgid "Hindustān gāndhāri" msgstr "Hindustān gāndhāri" #: DB:work_attribute_type_allowed_value/value:110 msgctxt "work_attribute_type_allowed_value" msgid "Hindōḷa vasantaṁ" msgstr "Hindōḷa vasantaṁ" #: DB:work_attribute_type_allowed_value/value:111 msgctxt "work_attribute_type_allowed_value" msgid "Hindōḷaṁ" msgstr "Hindōḷaṁ" #: DB:label_type/name:2 msgctxt "label_type" msgid "Holding" msgstr "" #: DB:work_attribute_type_allowed_value/value:113 msgctxt "work_attribute_type_allowed_value" msgid "Hussēnī" msgstr "Hussēnī" #: DB:medium_format/name:38 msgctxt "medium_format" msgid "Hybrid SACD" msgstr "" #: DB:work_attribute_type_allowed_value/value:109 msgctxt "work_attribute_type_allowed_value" msgid "Hēmavati" msgstr "Hēmavati" #: DB:work_attribute_type/name:14 msgctxt "work_attribute_type" msgid "Identifiers" msgstr "" #: DB:label_type/name:9 msgctxt "label_type" msgid "Imprint" msgstr "" #: DB:series_type/description:8 msgctxt "series_type" msgid "" "Indicates a recurring festival, usually happening anually in the same " "location." msgstr "" #: DB:series_type/description:9 msgctxt "series_type" msgid "Indicates a series of performances of the same show at the same place." msgstr "" #: DB:series_type/description:7 msgctxt "series_type" msgid "" "Indicates a series of related concerts by an artist in different locations." msgstr "" #: DB:series_type/description:5 msgctxt "series_type" msgid "Indicates that the series is a work catalogue." msgstr "" #: DB:series_type/description:6 msgctxt "series_type" msgid "Indicates that the series is of events." msgstr "" #: DB:series_type/description:3 msgctxt "series_type" msgid "Indicates that the series is of recordings." msgstr "" #: DB:series_type/description:1 msgctxt "series_type" msgid "Indicates that the series is of release groups." msgstr "" #: DB:series_type/description:2 msgctxt "series_type" msgid "Indicates that the series is of releases." msgstr "" #: DB:series_type/description:4 msgctxt "series_type" msgid "Indicates that the series is of works." msgstr "" #: DB:place_type/name:5 msgctxt "place_type" msgid "Indoor arena" msgstr "Indendørs arena" #: DB:instrument_alias_type/name:1 msgctxt "alias_type" msgid "Instrument name" msgstr "" #: DB:release_group_secondary_type/name:4 msgctxt "release_group_secondary_type" msgid "Interview" msgstr "Interview" #: DB:area_type/name:6 msgctxt "area_type" msgid "Island" msgstr "" #: DB:work_attribute_type/name:3 msgctxt "work_attribute_type" msgid "JASRAC ID" msgstr "JASRAC-id" #: DB:work_attribute_type_allowed_value/value:114 msgctxt "work_attribute_type_allowed_value" msgid "Jaganmōhini" msgstr "Jaganmōhini" #: DB:work_attribute_type_allowed_value/value:115 msgctxt "work_attribute_type_allowed_value" msgid "Janaranjani" msgstr "Janaranjani" #: DB:work_attribute_type_allowed_value/value:116 msgctxt "work_attribute_type_allowed_value" msgid "Jaya manōhari" msgstr "Jaya manōhari" #: DB:work_attribute_type_allowed_value/value:117 msgctxt "work_attribute_type_allowed_value" msgid "Jayantasēna" msgstr "Jayantasēna" #: DB:work_attribute_type_allowed_value/value:118 msgctxt "work_attribute_type_allowed_value" msgid "Jayantaśrī" msgstr "Jayantaśrī" #: DB:release_packaging/name:1 msgctxt "release_packaging" msgid "Jewel Case" msgstr "" #: DB:work_attribute_type_allowed_value/value:119 msgctxt "work_attribute_type_allowed_value" msgid "Jhankāradhvani" msgstr "Jhankāradhvani" #: DB:work_attribute_type_allowed_value/value:120 msgctxt "work_attribute_type_allowed_value" msgid "Jingala" msgstr "Jingala" #: DB:work_attribute_type_allowed_value/value:124 msgctxt "work_attribute_type_allowed_value" msgid "Jyōti svarūpiṇi" msgstr "Jyōti svarūpiṇi" #: DB:work_attribute_type_allowed_value/value:121 msgctxt "work_attribute_type_allowed_value" msgid "Jōg" msgstr "Jōg" #: DB:work_attribute_type_allowed_value/value:122 msgctxt "work_attribute_type_allowed_value" msgid "Jōgiya" msgstr "Jōgiya" #: DB:work_attribute_type_allowed_value/value:123 msgctxt "work_attribute_type_allowed_value" msgid "Jōnpuri" msgstr "Jōnpuri" #: DB:work_attribute_type/name:11 msgctxt "work_attribute_type" msgid "KOMCA ID" msgstr "KOMCA-id" #: DB:work_attribute_type_allowed_value/value:128 msgctxt "work_attribute_type_allowed_value" msgid "Kalgaḍa" msgstr "Kalgaḍa" #: DB:work_attribute_type_allowed_value/value:130 msgctxt "work_attribute_type_allowed_value" msgid "Kalyāṇi" msgstr "Kalyāṇi" #: DB:work_attribute_type_allowed_value/value:127 msgctxt "work_attribute_type_allowed_value" msgid "Kalāvati" msgstr "Kalāvati" #: DB:work_attribute_type_allowed_value/value:131 msgctxt "work_attribute_type_allowed_value" msgid "Kamalāmanōhari" msgstr "Kamalāmanōhari" #: DB:work_attribute_type_allowed_value/value:133 msgctxt "work_attribute_type_allowed_value" msgid "Kamās" msgstr "Kamās" #: DB:work_attribute_type_allowed_value/value:137 msgctxt "work_attribute_type_allowed_value" msgid "Kannaḍa gaula" msgstr "Kannaḍa gaula" #: DB:work_attribute_type_allowed_value/value:141 msgctxt "work_attribute_type_allowed_value" msgid "Karaharapriya" msgstr "Karaharapriya" #: DB:work_attribute_type_allowed_value/value:142 msgctxt "work_attribute_type_allowed_value" msgid "Karṇaranjani" msgstr "Karṇaranjani" #: DB:work_attribute_type_allowed_value/value:143 msgctxt "work_attribute_type_allowed_value" msgid "Karṇāṭaka behāg" msgstr "Karṇāṭaka behāg" #: DB:work_attribute_type_allowed_value/value:144 msgctxt "work_attribute_type_allowed_value" msgid "Karṇāṭaka dēvagāndhāri" msgstr "Karṇāṭaka dēvagāndhāri" #: DB:work_attribute_type_allowed_value/value:145 msgctxt "work_attribute_type_allowed_value" msgid "Karṇāṭaka kāpi" msgstr "Karṇāṭaka kāpi" #: DB:work_attribute_type_allowed_value/value:146 msgctxt "work_attribute_type_allowed_value" msgid "Karṇāṭaka śudda sāvēri" msgstr "Karṇāṭaka śudda sāvēri" #: DB:work_attribute_type_allowed_value/value:147 msgctxt "work_attribute_type_allowed_value" msgid "Kathanakutūhalaṁ" msgstr "Kathanakutūhalaṁ" #: DB:work_attribute_type_allowed_value/value:129 msgctxt "work_attribute_type_allowed_value" msgid "Kaḷyāṇa vasantaṁ" msgstr "Kaḷyāṇa vasantaṁ" #: DB:work_attribute_type_allowed_value/value:125 msgctxt "work_attribute_type_allowed_value" msgid "Kaḷā sāvēri" msgstr "Kaḷā sāvēri" #: DB:work_attribute_type_allowed_value/value:126 msgctxt "work_attribute_type_allowed_value" msgid "Kaḷānidhi" msgstr "Kaḷānidhi" #: DB:work_attribute_type_allowed_value/value:150 msgctxt "work_attribute_type_allowed_value" msgid "Kedāraṁ" msgstr "Kedāraṁ" #: DB:release_packaging/name:6 msgctxt "release_packaging" msgid "Keep Case" msgstr "" #: DB:work_attribute_type/name:1 msgctxt "work_attribute_type" msgid "Key" msgstr "toneart" #: DB:work_attribute_type_allowed_value/value:282 msgctxt "work_attribute_type_allowed_value" msgid "Khaṇḍa chāpu" msgstr "Khaṇḍa chāpu" #: DB:work_attribute_type_allowed_value/value:293 msgctxt "work_attribute_type_allowed_value" msgid "Khaṇḍa-jāti tripuṭa" msgstr "Khaṇḍa-jāti tripuṭa" #: DB:work_attribute_type_allowed_value/value:294 msgctxt "work_attribute_type_allowed_value" msgid "Khaṇḍa-jāti ēka" msgstr "Khaṇḍa-jāti ēka" #: DB:work_attribute_type_allowed_value/value:155 msgctxt "work_attribute_type_allowed_value" msgid "Kuntalavarāḷi" msgstr "Kuntalavarāḷi" #: DB:work_attribute_type_allowed_value/value:156 msgctxt "work_attribute_type_allowed_value" msgid "Kurinji" msgstr "Kurinji" #: DB:work_attribute_type_allowed_value/value:132 msgctxt "work_attribute_type_allowed_value" msgid "Kāmaranjani" msgstr "Kāmaranjani" #: DB:work_attribute_type_allowed_value/value:134 msgctxt "work_attribute_type_allowed_value" msgid "Kāmavardani/Pantuvarāḷi" msgstr "Kāmavardani/Pantuvarāḷi" #: DB:work_attribute_type_allowed_value/value:136 msgctxt "work_attribute_type_allowed_value" msgid "Kānaḍa" msgstr "Kānaḍa" #: DB:work_attribute_type_allowed_value/value:138 msgctxt "work_attribute_type_allowed_value" msgid "Kāntāmaṇi" msgstr "Kāntāmaṇi" #: DB:work_attribute_type_allowed_value/value:139 msgctxt "work_attribute_type_allowed_value" msgid "Kāpi" msgstr "Kāpi" #: DB:work_attribute_type_allowed_value/value:140 msgctxt "work_attribute_type_allowed_value" msgid "Kāpi nārāyaṇi" msgstr "Kāpi nārāyaṇi" #: DB:work_attribute_type_allowed_value/value:148 msgctxt "work_attribute_type_allowed_value" msgid "Kāvaḍicindu" msgstr "Kāvaḍicindu" #: DB:work_attribute_type_allowed_value/value:135 msgctxt "work_attribute_type_allowed_value" msgid "Kāṁbhōji" msgstr "Kāṁbhōji" #: DB:work_attribute_type_allowed_value/value:149 msgctxt "work_attribute_type_allowed_value" msgid "Kēdāragauḷa" msgstr "Kēdāragauḷa" #: DB:work_attribute_type_allowed_value/value:152 msgctxt "work_attribute_type_allowed_value" msgid "Kīravāṇi" msgstr "Kīravāṇi" #: DB:work_attribute_type_allowed_value/value:151 msgctxt "work_attribute_type_allowed_value" msgid "Kīraṇāvaḷi" msgstr "Kīraṇāvaḷi" #: DB:work_attribute_type_allowed_value/value:153 msgctxt "work_attribute_type_allowed_value" msgid "Kōkiladhvani" msgstr "Kōkiladhvani" #: DB:work_attribute_type_allowed_value/value:154 msgctxt "work_attribute_type_allowed_value" msgid "Kōkilapriya" msgstr "Kōkilapriya" #: DB:label_alias_type/name:1 msgctxt "alias_type" msgid "Label name" msgstr "selskabsnavn" #: DB:work_attribute_type_allowed_value/value:157 msgctxt "work_attribute_type_allowed_value" msgid "Lalita" msgstr "Lalita" #: DB:work_attribute_type_allowed_value/value:158 msgctxt "work_attribute_type_allowed_value" msgid "Lalita pancamaṁ" msgstr "Lalita pancamaṁ" #: DB:medium_format/name:5 msgctxt "medium_format" msgid "LaserDisc" msgstr "LaserDisc" #: DB:work_attribute_type_allowed_value/value:159 msgctxt "work_attribute_type_allowed_value" msgid "Latāngi" msgstr "Latāngi" #: DB:event_type/name:3 msgctxt "event_type" msgid "Launch event" msgstr "" #: DB:work_attribute_type_allowed_value/value:160 msgctxt "work_attribute_type_allowed_value" msgid "Lavāngi" msgstr "Lavāngi" #: DB:artist_alias_type/name:2 msgctxt "alias_type" msgid "Legal name" msgstr "juridisk navn" #: DB:cover_art_archive.art_type/name:12 msgctxt "cover_art_type" msgid "Liner" msgstr "" #: DB:release_group_secondary_type/name:6 msgctxt "release_group_secondary_type" msgid "Live" msgstr "live" #: DB:work_attribute_type_allowed_value/value:161 msgctxt "work_attribute_type_allowed_value" msgid "Madhyamā varāḷi" msgstr "Madhyamā varāḷi" #: DB:work_attribute_type_allowed_value/value:162 msgctxt "work_attribute_type_allowed_value" msgid "Madhyamāvati" msgstr "Madhyamāvati" #: DB:work_attribute_type_allowed_value/value:295 msgctxt "work_attribute_type_allowed_value" msgid "Madhyādi" msgstr "Madhyādi" #: DB:work_type/name:7 msgctxt "work_type" msgid "Madrigal" msgstr "madrigal" #: DB:work_attribute_type_allowed_value/value:163 msgctxt "work_attribute_type_allowed_value" msgid "Maduvanti" msgstr "Maduvanti" #: DB:work_attribute_type_allowed_value/value:296 msgctxt "work_attribute_type_allowed_value" msgid "Mahālakṣmi" msgstr "Mahālakṣmi" #: DB:work_attribute_type_allowed_value/value:164 msgctxt "work_attribute_type_allowed_value" msgid "Malahari" msgstr "Malahari" #: DB:work_attribute_type_allowed_value/value:166 msgctxt "work_attribute_type_allowed_value" msgid "Malayamārutaṁ" msgstr "Malayamārutaṁ" #: DB:gender/name:1 msgctxt "gender" msgid "Male" msgstr "" #: DB:work_attribute_type_allowed_value/value:168 msgctxt "work_attribute_type_allowed_value" msgid "Mandāri" msgstr "Mandāri" #: DB:series_ordering_type/name:2 msgctxt "series_ordering_type" msgid "Manual" msgstr "" #: DB:work_attribute_type_allowed_value/value:172 msgctxt "work_attribute_type_allowed_value" msgid "Manōranjani" msgstr "Manōranjani" #: DB:work_type/name:8 msgctxt "work_type" msgid "Mass" msgstr "messe" #: DB:event_type/name:5 msgctxt "event_type" msgid "Masterclass/Clinic" msgstr "" #: DB:editor_collection_type/name:6 msgctxt "collection_type" msgid "Maybe attending" msgstr "" #: DB:work_attribute_type_allowed_value/value:175 msgctxt "work_attribute_type_allowed_value" msgid "Mayūra sāvēri" msgstr "Mayūra sāvēri" #: DB:work_attribute_type_allowed_value/value:170 msgctxt "work_attribute_type_allowed_value" msgid "Maṇirangu" msgstr "Maṇirangu" #: DB:work_attribute_type_allowed_value/value:286 msgctxt "work_attribute_type_allowed_value" msgid "Maṭhya" msgstr "Maṭhya" #: DB:cover_art_archive.art_type/name:4 msgctxt "cover_art_type" msgid "Medium" msgstr "medie" #: DB:work_attribute_type_allowed_value/value:176 msgctxt "work_attribute_type_allowed_value" msgid "Meghamalhar" msgstr "Meghamalhar" #: DB:medium_format/name:6 msgctxt "medium_format" msgid "MiniDisc" msgstr "MiniDisc" #: DB:release_group_secondary_type/name:9 msgctxt "release_group_secondary_type" msgid "Mixtape/Street" msgstr "" #: DB:work_attribute_type_allowed_value/value:281 msgctxt "work_attribute_type_allowed_value" msgid "Miśra chāpu" msgstr "Miśra chāpu" #: DB:work_attribute_type_allowed_value/value:177 msgctxt "work_attribute_type_allowed_value" msgid "Miśra khamāj" msgstr "Miśra khamāj" #: DB:work_attribute_type_allowed_value/value:178 msgctxt "work_attribute_type_allowed_value" msgid "Miśra pahāḍi" msgstr "Miśra pahāḍi" #: DB:work_attribute_type_allowed_value/value:180 msgctxt "work_attribute_type_allowed_value" msgid "Miśra yaman" msgstr "Miśra yaman" #: DB:work_attribute_type_allowed_value/value:179 msgctxt "work_attribute_type_allowed_value" msgid "Miśra śivaranjani" msgstr "Miśra śivaranjani" #: DB:work_attribute_type_allowed_value/value:287 msgctxt "work_attribute_type_allowed_value" msgid "Miśra-jāti jhaṁpe" msgstr "Miśra-jāti jhaṁpe" #: DB:work_attribute_type_allowed_value/value:297 msgctxt "work_attribute_type_allowed_value" msgid "Miśra-jāti rūpaka" msgstr "Miśra-jāti rūpaka" #: DB:work_type/name:9 msgctxt "work_type" msgid "Motet" msgstr "motet" #: DB:work_attribute_type_allowed_value/value:183 msgctxt "work_attribute_type_allowed_value" msgid "Mukhāri" msgstr "Mukhāri" #: DB:area_type/name:4 msgctxt "area_type" msgid "Municipality" msgstr "kommune" #: DB:medium_format/name:46 msgctxt "medium_format" msgid "Music Card" msgstr "" #: DB:work_attribute_type/name:12 msgctxt "work_attribute_type" msgid "MÜST ID" msgstr "MÜST-id" #: DB:work_attribute_type_allowed_value/value:167 msgctxt "work_attribute_type_allowed_value" msgid "Mānavati" msgstr "Mānavati" #: DB:work_attribute_type_allowed_value/value:171 msgctxt "work_attribute_type_allowed_value" msgid "Mānji" msgstr "Mānji" #: DB:work_attribute_type_allowed_value/value:169 msgctxt "work_attribute_type_allowed_value" msgid "Mānḍu" msgstr "Mānḍu" #: DB:work_attribute_type_allowed_value/value:173 msgctxt "work_attribute_type_allowed_value" msgid "Mārgahindōḷaṁ" msgstr "Mārgahindōḷaṁ" #: DB:work_attribute_type_allowed_value/value:174 msgctxt "work_attribute_type_allowed_value" msgid "Māyāmāḷavagauḷa" msgstr "Māyāmāḷavagauḷa" #: DB:work_attribute_type_allowed_value/value:165 msgctxt "work_attribute_type_allowed_value" msgid "Māḷavi" msgstr "Māḷavi" #: DB:work_attribute_type_allowed_value/value:181 msgctxt "work_attribute_type_allowed_value" msgid "Mōhan kaḷyāṇi" msgstr "Mōhan kaḷyāṇi" #: DB:work_attribute_type_allowed_value/value:182 msgctxt "work_attribute_type_allowed_value" msgid "Mōhanaṁ" msgstr "Mōhanaṁ" #: DB:work_attribute_type_allowed_value/value:196 msgctxt "work_attribute_type_allowed_value" msgid "Navarasa kannaḍa" msgstr "Navarasa kannaḍa" #: DB:work_attribute_type_allowed_value/value:195 msgctxt "work_attribute_type_allowed_value" msgid "Navarāgamālika" msgstr "Navarāgamālika" #: DB:work_attribute_type_allowed_value/value:197 msgctxt "work_attribute_type_allowed_value" msgid "Navrōj" msgstr "Navrōj" #: DB:work_attribute_type_allowed_value/value:187 msgctxt "work_attribute_type_allowed_value" msgid "Naḷinakānti" msgstr "Naḷinakānti" #: DB:work_attribute_type_allowed_value/value:191 msgctxt "work_attribute_type_allowed_value" msgid "Naṭabhairavi" msgstr "Naṭabhairavi" #: DB:work_attribute_type_allowed_value/value:194 msgctxt "work_attribute_type_allowed_value" msgid "Naṭanārāyaṇi" msgstr "Naṭanārāyaṇi" #: DB:work_attribute_type_allowed_value/value:200 msgctxt "work_attribute_type_allowed_value" msgid "Nirōṣita" msgstr "Nirōṣita" #: DB:release_packaging/name:7 msgctxt "release_packaging" msgid "None" msgstr "" #: DB:work_attribute_type_allowed_value/value:184 msgctxt "work_attribute_type_allowed_value" msgid "Nādanāmakriya" msgstr "Nādanāmakriya" #: DB:work_attribute_type_allowed_value/value:185 msgctxt "work_attribute_type_allowed_value" msgid "Nāga gāndhāri" msgstr "Nāga gāndhāri" #: DB:work_attribute_type_allowed_value/value:186 msgctxt "work_attribute_type_allowed_value" msgid "Nāgasvarāvaḷi" msgstr "Nāgasvarāvaḷi" #: DB:work_attribute_type_allowed_value/value:188 msgctxt "work_attribute_type_allowed_value" msgid "Nārāyaṇi" msgstr "Nārāyaṇi" #: DB:work_attribute_type_allowed_value/value:189 msgctxt "work_attribute_type_allowed_value" msgid "Nāsikabhūṣaṇi" msgstr "Nāsikabhūṣaṇi" #: DB:work_attribute_type_allowed_value/value:198 msgctxt "work_attribute_type_allowed_value" msgid "Nāyaki" msgstr "Nāyaki" #: DB:work_attribute_type_allowed_value/value:190 msgctxt "work_attribute_type_allowed_value" msgid "Nāṭa" msgstr "Nāṭa" #: DB:work_attribute_type_allowed_value/value:192 msgctxt "work_attribute_type_allowed_value" msgid "Nāṭakapriya" msgstr "Nāṭakapriya" #: DB:work_attribute_type_allowed_value/value:193 msgctxt "work_attribute_type_allowed_value" msgid "Nāṭakurinji" msgstr "Nāṭakurinji" #: DB:work_attribute_type_allowed_value/value:199 msgctxt "work_attribute_type_allowed_value" msgid "Nīlāṁbari" msgstr "Nīlāṁbari" #: DB:cover_art_archive.art_type/name:5 msgctxt "cover_art_type" msgid "Obi" msgstr "obi" #: DB:release_status/name:1 msgctxt "release_status" msgid "Official" msgstr "Officiel" #: DB:work_type/name:10 msgctxt "work_type" msgid "Opera" msgstr "opera" #: DB:work_type/name:24 msgctxt "work_type" msgid "Operetta" msgstr "operette" #: DB:work_type/name:11 msgctxt "work_type" msgid "Oratorio" msgstr "oratorium" #: DB:artist_type/name:5 msgctxt "artist_type" msgid "Orchestra" msgstr "orkester" #: DB:label_type/name:4 msgctxt "label_type" msgid "Original Production" msgstr "" #: DB:artist_type/name:3 msgctxt "artist_type" msgid "Other" msgstr "" #: DB:place_type/name:3 msgctxt "place_type" msgid "Other" msgstr "andet" #: DB:release_group_primary_type/name:11 msgctxt "release_group_primary_type" msgid "Other" msgstr "" #: DB:medium_format/name:13 msgctxt "medium_format" msgid "Other" msgstr "" #: DB:release_packaging/name:5 msgctxt "release_packaging" msgid "Other" msgstr "" #: DB:gender/name:3 msgctxt "gender" msgid "Other" msgstr "" #: DB:cover_art_archive.art_type/name:8 msgctxt "cover_art_type" msgid "Other" msgstr "andet" #: DB:instrument_type/name:5 msgctxt "instrument_type" msgid "Other instrument" msgstr "" #: DB:work_type/name:12 msgctxt "work_type" msgid "Overture" msgstr "ouverture" #: DB:editor_collection_type/name:2 msgctxt "collection_type" msgid "Owned music" msgstr "" #: DB:work_attribute_type_allowed_value/value:203 msgctxt "work_attribute_type_allowed_value" msgid "Paras" msgstr "Paras" #: DB:work_type/name:13 msgctxt "work_type" msgid "Partita" msgstr "partita" #: DB:work_attribute_type_allowed_value/value:204 msgctxt "work_attribute_type_allowed_value" msgid "Paṭdīp" msgstr "Paṭdīp" #: DB:instrument_type/name:3 msgctxt "instrument_type" msgid "Percussion instrument" msgstr "" #: DB:artist_type/name:1 msgctxt "artist_type" msgid "Person" msgstr "person" #: DB:medium_format/name:15 msgctxt "medium_format" msgid "Piano Roll" msgstr "" #: DB:place_alias_type/name:1 msgctxt "alias_type" msgid "Place name" msgstr "stednavn" #: DB:medium_format/name:45 msgctxt "medium_format" msgid "Playbutton" msgstr "" #: DB:work_type/name:21 msgctxt "work_type" msgid "Poem" msgstr "digt" #: DB:cover_art_archive.art_type/name:11 msgctxt "cover_art_type" msgid "Poster" msgstr "plakat" #: DB:label_type/name:3 msgctxt "label_type" msgid "Production" msgstr "" #: DB:release_status/name:2 msgctxt "release_status" msgid "Promotion" msgstr "" #: DB:work_type/name:23 msgctxt "work_type" msgid "Prose" msgstr "prosa" #: DB:release_status/name:4 msgctxt "release_status" msgid "Pseudo-Release" msgstr "pseudo-udgivelse" #: DB:label_type/name:7 msgctxt "label_type" msgid "Publisher" msgstr "" #: DB:work_attribute_type_allowed_value/value:205 msgctxt "work_attribute_type_allowed_value" msgid "Puṇṇāgavarāḷi" msgstr "Puṇṇāgavarāḷi" #: DB:work_attribute_type_allowed_value/value:209 msgctxt "work_attribute_type_allowed_value" msgid "Puṣpalatika" msgstr "Puṣpalatika" #: DB:work_attribute_type_allowed_value/value:202 msgctxt "work_attribute_type_allowed_value" msgid "Pālamanjari" msgstr "Pālamanjari" #: DB:work_attribute_type_allowed_value/value:201 msgctxt "work_attribute_type_allowed_value" msgid "Pāḍi" msgstr "Pāḍi" #: DB:work_attribute_type_allowed_value/value:208 msgctxt "work_attribute_type_allowed_value" msgid "Pūrvi" msgstr "Pūrvi" #: DB:work_attribute_type_allowed_value/value:206 msgctxt "work_attribute_type_allowed_value" msgid "Pūrṇa ṣaḍjaṁ" msgstr "Pūrṇa ṣaḍjaṁ" #: DB:work_attribute_type_allowed_value/value:207 msgctxt "work_attribute_type_allowed_value" msgid "Pūrṇacandrika" msgstr "Pūrṇacandrika" #: DB:work_type/name:14 msgctxt "work_type" msgid "Quartet" msgstr "kvartet" #: DB:work_attribute_type_allowed_value/value:215 msgctxt "work_attribute_type_allowed_value" msgid "Ranjani" msgstr "Ranjani" #: DB:work_attribute_type_allowed_value/value:216 msgctxt "work_attribute_type_allowed_value" msgid "Rasikapriya" msgstr "Rasikapriya" #: DB:work_attribute_type_allowed_value/value:217 msgctxt "work_attribute_type_allowed_value" msgid "Ratipati priya" msgstr "Ratipati priya" #: DB:work_attribute_type_allowed_value/value:218 msgctxt "work_attribute_type_allowed_value" msgid "Ravicandrika" msgstr "Ravicandrika" #: DB:series_type/name:3 msgctxt "series_type" msgid "Recording" msgstr "" #: DB:medium_format/name:10 msgctxt "medium_format" msgid "Reel-to-reel" msgstr "spolebånd" #: DB:label_type/name:6 msgctxt "label_type" msgid "Reissue Production" msgstr "" #: DB:series_type/name:2 msgctxt "series_type" msgid "Release" msgstr "" #: DB:editor_collection_type/name:1 msgctxt "collection_type" msgid "Release" msgstr "" #: DB:series_type/name:1 msgctxt "series_type" msgid "Release group" msgstr "" #: DB:release_group_secondary_type/name:7 msgctxt "release_group_secondary_type" msgid "Remix" msgstr "remix" #: DB:label_type/name:8 msgctxt "label_type" msgid "Rights Society" msgstr "" #: DB:work_attribute_type_allowed_value/value:222 msgctxt "work_attribute_type_allowed_value" msgid "Rudrapriya" msgstr "Rudrapriya" #: DB:series_type/name:9 msgctxt "series_type" msgid "Run" msgstr "" #: DB:work_attribute_type/name:4 msgctxt "work_attribute_type" msgid "Rāga (Carnatic)" msgstr "" #: DB:work_attribute_type_allowed_value/value:210 msgctxt "work_attribute_type_allowed_value" msgid "Rāgamālika" msgstr "Rāgamālika" #: DB:work_attribute_type_allowed_value/value:211 msgctxt "work_attribute_type_allowed_value" msgid "Rāgavinōdini" msgstr "Rāgavinōdini" #: DB:work_attribute_type_allowed_value/value:212 msgctxt "work_attribute_type_allowed_value" msgid "Rāgēśrī" msgstr "Rāgēśrī" #: DB:work_attribute_type_allowed_value/value:213 msgctxt "work_attribute_type_allowed_value" msgid "Rāma manōhari" msgstr "Rāma manōhari" #: DB:work_attribute_type_allowed_value/value:214 msgctxt "work_attribute_type_allowed_value" msgid "Rāmapriya" msgstr "Rāmapriya" #: DB:work_attribute_type_allowed_value/value:219 msgctxt "work_attribute_type_allowed_value" msgid "Rēvagupti" msgstr "Rēvagupti" #: DB:work_attribute_type_allowed_value/value:220 msgctxt "work_attribute_type_allowed_value" msgid "Rēvati" msgstr "Rēvati" #: DB:work_attribute_type_allowed_value/value:221 msgctxt "work_attribute_type_allowed_value" msgid "Rītigauḷa" msgstr "Rītigauḷa" #: DB:work_attribute_type_allowed_value/value:280 msgctxt "work_attribute_type_allowed_value" msgid "Rūpaka" msgstr "Rūpaka" #: DB:medium_format/name:3 msgctxt "medium_format" msgid "SACD" msgstr "SACD" #: DB:work_attribute_type/name:8 msgctxt "work_attribute_type" msgid "SESAC ID" msgstr "SESAC-id" #: DB:medium_format/name:36 msgctxt "medium_format" msgid "SHM-CD" msgstr "SHM-CD" #: DB:work_attribute_type/name:10 msgctxt "work_attribute_type" msgid "SOCAN ID" msgstr "SOCAN-id" #: DB:medium_format/name:23 msgctxt "medium_format" msgid "SVCD" msgstr "SVCD" #: DB:work_attribute_type_allowed_value/value:223 msgctxt "work_attribute_type_allowed_value" msgid "Sahānā" msgstr "Sahānā" #: DB:work_attribute_type_allowed_value/value:231 msgctxt "work_attribute_type_allowed_value" msgid "Sarasvati" msgstr "Sarasvati" #: DB:work_attribute_type_allowed_value/value:232 msgctxt "work_attribute_type_allowed_value" msgid "Sarasvatī manōhari" msgstr "Sarasvatī manōhari" #: DB:work_attribute_type_allowed_value/value:230 msgctxt "work_attribute_type_allowed_value" msgid "Sarasāngi" msgstr "Sarasāngi" #: DB:work_attribute_type_allowed_value/value:233 msgctxt "work_attribute_type_allowed_value" msgid "Saurāṣtraṁ" msgstr "Saurāṣtraṁ" #: DB:artist_alias_type/name:3 DB:label_alias_type/name:2 #: DB:place_alias_type/name:2 DB:work_alias_type/name:2 #: DB:area_alias_type/name:3 DB:instrument_alias_type/name:2 #: DB:series_alias_type/name:2 DB:event_alias_type/name:2 msgctxt "alias_type" msgid "Search hint" msgstr "søgetip" #: DB:work_attribute_type_allowed_value/value:235 msgctxt "work_attribute_type_allowed_value" msgid "Sencuruṭṭi" msgstr "Sencuruṭṭi" #: DB:series_alias_type/name:1 msgctxt "alias_type" msgid "Series name" msgstr "" #: DB:work_attribute_type_allowed_value/value:236 msgctxt "work_attribute_type_allowed_value" msgid "Simhavāhini" msgstr "Simhavāhini" #: DB:work_attribute_type_allowed_value/value:237 msgctxt "work_attribute_type_allowed_value" msgid "Simhēndra madhyamaṁ" msgstr "Simhēndra madhyamaṁ" #: DB:work_attribute_type_allowed_value/value:238 msgctxt "work_attribute_type_allowed_value" msgid "Sindhubhairavi" msgstr "Sindhubhairavi" #: DB:work_attribute_type_allowed_value/value:239 msgctxt "work_attribute_type_allowed_value" msgid "Sindhumandāri" msgstr "Sindhumandāri" #: DB:release_group_primary_type/name:2 msgctxt "release_group_primary_type" msgid "Single" msgstr "single" #: DB:release_packaging/name:2 msgctxt "release_packaging" msgid "Slim Jewel Case" msgstr "" #: DB:release_packaging/name:11 msgctxt "release_packaging" msgid "Snap Case" msgstr "" #: DB:work_type/name:5 msgctxt "work_type" msgid "Sonata" msgstr "sonate" #: DB:work_type/name:17 msgctxt "work_type" msgid "Song" msgstr "sang" #: DB:work_type/name:15 msgctxt "work_type" msgid "Song-cycle" msgstr "sangcyklus" #: DB:series_ordering_type/description:1 msgctxt "series_ordering_type" msgid "" "Sorts the items in the series automatically by their number attributes, " "using a natural sort order." msgstr "" #: DB:work_type/name:22 msgctxt "work_type" msgid "Soundtrack" msgstr "" #: DB:release_group_secondary_type/name:2 msgctxt "release_group_secondary_type" msgid "Soundtrack" msgstr "" #: DB:cover_art_archive.art_type/name:6 msgctxt "cover_art_type" msgid "Spine" msgstr "ryg" #: DB:release_group_secondary_type/name:3 msgctxt "release_group_secondary_type" msgid "Spokenword" msgstr "spokenword" #: DB:place_type/name:4 msgctxt "place_type" msgid "Stadium" msgstr "stadion" #: DB:cover_art_archive.art_type/name:10 msgctxt "cover_art_type" msgid "Sticker" msgstr "klistermærke" #: DB:instrument_type/name:2 msgctxt "instrument_type" msgid "String instrument" msgstr "" #: DB:place_type/name:1 msgctxt "place_type" msgid "Studio" msgstr "studie" #: DB:area_type/name:2 msgctxt "area_type" msgid "Subdivision" msgstr "underafdeling" #: DB:work_attribute_type_allowed_value/value:244 msgctxt "work_attribute_type_allowed_value" msgid "Sucaritra" msgstr "Sucaritra" #: DB:work_type/name:6 msgctxt "work_type" msgid "Suite" msgstr "suite" #: DB:work_attribute_type_allowed_value/value:250 msgctxt "work_attribute_type_allowed_value" msgid "Sumanēśaranjani" msgstr "Sumanēśaranjani" #: DB:work_attribute_type_allowed_value/value:251 msgctxt "work_attribute_type_allowed_value" msgid "Sunādavinōdini" msgstr "Sunādavinōdini" #: DB:work_attribute_type_allowed_value/value:252 msgctxt "work_attribute_type_allowed_value" msgid "Suraṭi" msgstr "Suraṭi" #: DB:work_attribute_type_allowed_value/value:253 msgctxt "work_attribute_type_allowed_value" msgid "Svararanjani" msgstr "Svararanjani" #: DB:work_type/name:18 msgctxt "work_type" msgid "Symphonic poem" msgstr "" #: DB:work_type/name:16 msgctxt "work_type" msgid "Symphony" msgstr "symfoni" #: DB:work_attribute_type_allowed_value/value:224 msgctxt "work_attribute_type_allowed_value" msgid "Sālaga bhairavi" msgstr "Sālaga bhairavi" #: DB:work_attribute_type_allowed_value/value:225 msgctxt "work_attribute_type_allowed_value" msgid "Sāma" msgstr "Sāma" #: DB:work_attribute_type_allowed_value/value:229 msgctxt "work_attribute_type_allowed_value" msgid "Sāranga" msgstr "Sāranga" #: DB:work_attribute_type_allowed_value/value:228 msgctxt "work_attribute_type_allowed_value" msgid "Sārāmati" msgstr "Sārāmati" #: DB:work_attribute_type_allowed_value/value:234 msgctxt "work_attribute_type_allowed_value" msgid "Sāvēri" msgstr "Sāvēri" #: DB:work_attribute_type_allowed_value/value:255 msgctxt "work_attribute_type_allowed_value" msgid "Tanarūpi" msgstr "Tanarūpi" #: DB:work_attribute_type_allowed_value/value:256 msgctxt "work_attribute_type_allowed_value" msgid "Tillāng" msgstr "Tillāng" #: DB:work_attribute_type_allowed_value/value:288 msgctxt "work_attribute_type_allowed_value" msgid "Tiśra-jāti tripuṭa" msgstr "Tiśra-jāti tripuṭa" #: DB:work_attribute_type_allowed_value/value:284 msgctxt "work_attribute_type_allowed_value" msgid "Tiśra-jāti ēka" msgstr "Tiśra-jāti ēka" #: DB:series_type/name:7 msgctxt "series_type" msgid "Tour" msgstr "" #: DB:cover_art_archive.art_type/name:7 msgctxt "cover_art_type" msgid "Track" msgstr "" #: DB:cover_art_archive.art_type/name:9 msgctxt "cover_art_type" msgid "Tray" msgstr "" #: DB:work_attribute_type/name:5 msgctxt "work_attribute_type" msgid "Tāla (Carnatic)" msgstr "" #: DB:work_attribute_type_allowed_value/value:257 msgctxt "work_attribute_type_allowed_value" msgid "Tōḍi" msgstr "Tōḍi" #: DB:medium_format/name:28 msgctxt "medium_format" msgid "UMD" msgstr "UMD" #: DB:medium_format/name:26 msgctxt "medium_format" msgid "USB Flash Drive" msgstr "" #: DB:work_attribute_type_allowed_value/value:258 msgctxt "work_attribute_type_allowed_value" msgid "Udaya ravicandrika" msgstr "Udaya ravicandrika" #: DB:medium_format/name:22 msgctxt "medium_format" msgid "VCD" msgstr "VCD" #: DB:medium_format/name:21 msgctxt "medium_format" msgid "VHS" msgstr "VHS" #: DB:work_attribute_type_allowed_value/value:261 msgctxt "work_attribute_type_allowed_value" msgid "Vakuḷābharaṇaṁ" msgstr "Vakuḷābharaṇaṁ" #: DB:work_attribute_type_allowed_value/value:262 msgctxt "work_attribute_type_allowed_value" msgid "Valaji" msgstr "Valaji" #: DB:work_attribute_type_allowed_value/value:263 msgctxt "work_attribute_type_allowed_value" msgid "Vandanadhāriṇi" msgstr "Vandanadhāriṇi" #: DB:work_attribute_type_allowed_value/value:265 msgctxt "work_attribute_type_allowed_value" msgid "Varamu" msgstr "Varamu" #: DB:work_attribute_type_allowed_value/value:264 msgctxt "work_attribute_type_allowed_value" msgid "Varāḷi" msgstr "Varāḷi" #: DB:work_attribute_type_allowed_value/value:266 msgctxt "work_attribute_type_allowed_value" msgid "Varṇarūpini" msgstr "Varṇarūpini" #: DB:work_attribute_type_allowed_value/value:267 msgctxt "work_attribute_type_allowed_value" msgid "Vasanta" msgstr "Vasanta" #: DB:work_attribute_type_allowed_value/value:268 msgctxt "work_attribute_type_allowed_value" msgid "Vasanta varāḷi" msgstr "Vasanta varāḷi" #: DB:work_attribute_type_allowed_value/value:269 msgctxt "work_attribute_type_allowed_value" msgid "Vasantabhairavi" msgstr "Vasantabhairavi" #: DB:place_type/name:2 msgctxt "place_type" msgid "Venue" msgstr "spillested" #: DB:work_attribute_type_allowed_value/value:273 msgctxt "work_attribute_type_allowed_value" msgid "Vijayanagari" msgstr "Vijayanagari" #: DB:work_attribute_type_allowed_value/value:274 msgctxt "work_attribute_type_allowed_value" msgid "Vijayasarasvati" msgstr "Vijayasarasvati" #: DB:work_attribute_type_allowed_value/value:275 msgctxt "work_attribute_type_allowed_value" msgid "Vijayaśrī" msgstr "Vijayaśrī" #: DB:medium_format/name:7 msgctxt "medium_format" msgid "Vinyl" msgstr "vinyl" #: DB:medium_format/name:48 msgctxt "medium_format" msgid "VinylDisc" msgstr "" #: DB:work_attribute_type_allowed_value/value:259 msgctxt "work_attribute_type_allowed_value" msgid "Vācaspati" msgstr "Vācaspati" #: DB:work_attribute_type_allowed_value/value:260 msgctxt "work_attribute_type_allowed_value" msgid "Vāgadīśvari" msgstr "Vāgadīśvari" #: DB:work_attribute_type_allowed_value/value:270 msgctxt "work_attribute_type_allowed_value" msgid "Vāsanti" msgstr "Vāsanti" #: DB:work_attribute_type_allowed_value/value:271 msgctxt "work_attribute_type_allowed_value" msgid "Vēgavāhiṇi" msgstr "Vēgavāhiṇi" #: DB:work_attribute_type_allowed_value/value:272 msgctxt "work_attribute_type_allowed_value" msgid "Vēlāvali" msgstr "Vēlāvali" #: DB:work_attribute_type_allowed_value/value:276 msgctxt "work_attribute_type_allowed_value" msgid "Vīra vasantaṁ" msgstr "Vīra vasantaṁ" #: DB:cover_art_archive.art_type/name:13 msgctxt "cover_art_type" msgid "Watermark" msgstr "" #: DB:medium_format/name:14 msgctxt "medium_format" msgid "Wax Cylinder" msgstr "voksrulle" #: DB:instrument_type/name:1 msgctxt "instrument_type" msgid "Wind instrument" msgstr "" #: DB:editor_collection_type/name:3 msgctxt "collection_type" msgid "Wishlist" msgstr "" #: DB:series_type/name:4 msgctxt "series_type" msgid "Work" msgstr "" #: DB:work_alias_type/name:1 msgctxt "alias_type" msgid "Work name" msgstr "værknavn" #: DB:work_attribute_type_allowed_value/value:277 msgctxt "work_attribute_type_allowed_value" msgid "Yadukula kāṁbōji" msgstr "Yadukula kāṁbōji" #: DB:work_attribute_type_allowed_value/value:278 msgctxt "work_attribute_type_allowed_value" msgid "Yamuna kalyāṇi" msgstr "Yamuna kalyāṇi" #: DB:work_type/name:19 msgctxt "work_type" msgid "Zarzuela" msgstr "zarzuela" #: DB:medium_format/name:27 msgctxt "medium_format" msgid "slotMusic" msgstr "slotMusic" #: DB:work_type/name:20 msgctxt "work_type" msgid "Étude" msgstr "etude" #: DB:work_attribute_type_allowed_value/value:35 msgctxt "work_attribute_type_allowed_value" msgid "Ābhēri" msgstr "Ābhēri" #: DB:work_attribute_type_allowed_value/value:36 msgctxt "work_attribute_type_allowed_value" msgid "Ābhōgi" msgstr "Ābhōgi" #: DB:work_attribute_type_allowed_value/value:279 msgctxt "work_attribute_type_allowed_value" msgid "Ādi" msgstr "Ādi" #: DB:work_attribute_type_allowed_value/value:290 msgctxt "work_attribute_type_allowed_value" msgid "Ādi (Tiśra naḍe)" msgstr "Ādi (Tiśra naḍe)" #: DB:work_attribute_type_allowed_value/value:37 msgctxt "work_attribute_type_allowed_value" msgid "Āhir bhairav" msgstr "Āhir bhairav" #: DB:work_attribute_type_allowed_value/value:38 msgctxt "work_attribute_type_allowed_value" msgid "Āhiri" msgstr "Āhiri" #: DB:work_attribute_type_allowed_value/value:41 msgctxt "work_attribute_type_allowed_value" msgid "Ānandabhairavi" msgstr "Ānandabhairavi" #: DB:work_attribute_type_allowed_value/value:42 msgctxt "work_attribute_type_allowed_value" msgid "Āndōḷika" msgstr "Āndōḷika" #: DB:work_attribute_type_allowed_value/value:43 msgctxt "work_attribute_type_allowed_value" msgid "Ārabhi" msgstr "Ārabhi" #: DB:work_attribute_type_allowed_value/value:283 msgctxt "work_attribute_type_allowed_value" msgid "Ēka" msgstr "Ēka" #: DB:work_attribute_type_allowed_value/value:226 msgctxt "work_attribute_type_allowed_value" msgid "Śankarābharaṇaṁ" msgstr "Śankarābharaṇaṁ" #: DB:work_attribute_type_allowed_value/value:240 msgctxt "work_attribute_type_allowed_value" msgid "Śivaranjani" msgstr "Śivaranjani" #: DB:work_attribute_type_allowed_value/value:241 msgctxt "work_attribute_type_allowed_value" msgid "Śrī" msgstr "Śrī" #: DB:work_attribute_type_allowed_value/value:242 msgctxt "work_attribute_type_allowed_value" msgid "Śrīranjani" msgstr "Śrīranjani" #: DB:work_attribute_type_allowed_value/value:243 msgctxt "work_attribute_type_allowed_value" msgid "Śubhapantuvarāḷi" msgstr "Śubhapantuvarāḷi" #: DB:work_attribute_type_allowed_value/value:245 msgctxt "work_attribute_type_allowed_value" msgid "Śudda sārang" msgstr "Śudda sārang" #: DB:work_attribute_type_allowed_value/value:246 msgctxt "work_attribute_type_allowed_value" msgid "Śudda sāvēri" msgstr "Śudda sāvēri" #: DB:work_attribute_type_allowed_value/value:247 msgctxt "work_attribute_type_allowed_value" msgid "Śuddadhanyāsi" msgstr "Śuddadhanyāsi" #: DB:work_attribute_type_allowed_value/value:248 msgctxt "work_attribute_type_allowed_value" msgid "Śuddasīmantini" msgstr "Śuddasīmantini" #: DB:work_attribute_type_allowed_value/value:254 msgctxt "work_attribute_type_allowed_value" msgid "Śyāṁ kaḷyāṇ" msgstr "Śyāṁ kaḷyāṇ" #: DB:work_attribute_type_allowed_value/value:249 msgctxt "work_attribute_type_allowed_value" msgid "Śūḷiṇi" msgstr "Śūḷiṇi" #: DB:work_attribute_type_allowed_value/value:227 msgctxt "work_attribute_type_allowed_value" msgid "Ṣanmukhapriya" msgstr "Ṣanmukhapriya" picard-release-1.3.2/po/attributes/de.po000066400000000000000000001745401245305550700201520ustar00rootroot00000000000000# # Translators: # nikki, 2014 # nikki2 , 2012 # Daniel Schury , 2011 # Daniel Schury